@code-yeongyu/senpi 2026.10.19-2 → 2026.10.20-1
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 +18 -0
- package/dist/bundle/chunks/{anthropic-messages-VVRTT7O5.js → anthropic-messages-3QYMAEH2.js} +1 -1
- package/dist/bundle/chunks/{args-35XTBPC7.js → args-NHDT5JG3.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-BUSMTCQ5.js → azure-openai-responses-2DCY6QKO.js} +1 -1
- package/dist/bundle/chunks/chunk-2JGY3V4H.js +395 -0
- package/dist/bundle/chunks/{chunk-2RLZXLXS.js → chunk-2LQZJFKQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-2IK7QUJX.js → chunk-2SM4TR4H.js} +1 -1
- package/dist/bundle/chunks/{chunk-DXOSXUVI.js → chunk-3YKKXTJM.js} +1 -1
- package/dist/bundle/chunks/chunk-6L3H4UVN.js +2 -0
- package/dist/bundle/chunks/{chunk-46NW3UKO.js → chunk-7R4CJDWT.js} +1 -1
- package/dist/bundle/chunks/chunk-AA2L2RHH.js +2 -0
- package/dist/bundle/chunks/chunk-DKBJM22C.js +5 -0
- package/dist/bundle/chunks/{chunk-Z32CYNHC.js → chunk-F4YDU66P.js} +1 -1
- package/dist/bundle/chunks/chunk-FC2YWHEC.js +6 -0
- package/dist/bundle/chunks/{chunk-T2EE5G4S.js → chunk-FRFGJC3I.js} +1 -1
- package/dist/bundle/chunks/{chunk-57RKQONO.js → chunk-GBAS4FFM.js} +1 -1
- package/dist/bundle/chunks/{chunk-FDCYQYBP.js → chunk-JVLIKUBL.js} +1 -1
- package/dist/bundle/chunks/{chunk-EKDY4H2J.js → chunk-JXCHRJA7.js} +1 -1
- package/dist/bundle/chunks/{chunk-YID5W42N.js → chunk-KXTWMPCP.js} +1 -1
- package/dist/bundle/chunks/{chunk-ADNKYKU4.js → chunk-RYQ2FFF5.js} +1 -1
- package/dist/bundle/chunks/chunk-SOMFLLPD.js +3 -0
- package/dist/bundle/chunks/{chunk-4CJJ4SK6.js → chunk-SOWFP3I7.js} +1 -1
- package/dist/bundle/chunks/{chunk-GX7MTG25.js → chunk-TK6RKAB4.js} +4 -4
- package/dist/bundle/chunks/{chunk-NN44F5QF.js → chunk-V6RY5A6T.js} +1 -1
- package/dist/bundle/chunks/{chunk-77PVTNLJ.js → chunk-W557SQYL.js} +2 -2
- package/dist/bundle/chunks/{chunk-F4ZU4RBE.js → chunk-YIRQJCPA.js} +45 -46
- package/dist/bundle/chunks/cli-main-JCQTFUHO.js +3 -0
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-4QEQ7MGK.js +1 -1
- package/dist/bundle/chunks/{dispatch-R37L3FW5.js → dispatch-YPCDRQYI.js} +1 -1
- package/dist/bundle/chunks/{google-generative-ai-4UOGH7RT.js → google-generative-ai-3SKUSCIL.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-2A6KZ5TX.js → google-vertex-YHSIIE4G.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-Z5JGXNCS.js → help-fast-path-TUCMQOOF.js} +1 -1
- package/dist/bundle/chunks/{host-command-IP3QAZYI.js → host-command-WEOS6VD6.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-FRQK5GAC.js → host-lifecycle-ZDCO62Z4.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +6 -6
- package/dist/bundle/chunks/host-session-command-IGTNZ4F6.js +20 -0
- package/dist/bundle/chunks/interactive-mode-5KYT7LMW.js +2 -0
- package/dist/bundle/chunks/{multi-session-host-EMI54PTJ.js → multi-session-host-25XQFXJC.js} +5 -5
- package/dist/bundle/chunks/openai-codex-responses-4BIPACKV.js +10 -0
- package/dist/bundle/chunks/{openai-completions-AGTH2RRA.js → openai-completions-NHDMDAS7.js} +1 -1
- package/dist/bundle/chunks/{openai-images-5UGZHY27.js → openai-images-PNXQDBSP.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-KGXDGHPI.js → openai-responses-2UOPEJLP.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-TK44VHGK.js → package-manager-cli-CF53LR5X.js} +1 -1
- package/dist/bundle/chunks/{role-F6IEUF2N.js → role-OK7RKBGF.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-XX2NXYL3.js → rotation-stream-QRRJ7G5Y.js} +1 -1
- package/dist/bundle/chunks/rpc-mode-LOODTK3J.js +2 -0
- package/dist/bundle/chunks/{schedule-command-DYHRFIX2.js → schedule-command-LKL6DLOT.js} +1 -1
- package/dist/bundle/chunks/session-control-endpoint-MLANJVB2.js +3 -0
- package/dist/bundle/chunks/session-picker-RQDVWJRL.js +2 -0
- package/dist/bundle/chunks/session-worker.js +240 -240
- package/dist/bundle/chunks/session-write-fence-66EMOO4Y.js +2 -0
- package/dist/bundle/chunks/typesafe-system-one-W2ZTYF7X.js +1 -1
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/host-supervisor.js +6 -6
- 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 +0 -2
- package/dist/core/agent-session.js +4 -13
- package/dist/core/credential-pool/classify.d.ts +7 -0
- package/dist/core/credential-pool/classify.js +12 -4
- package/dist/core/credential-pool/failover.js +16 -1
- package/dist/core/credential-pool/rotation-stream.js +2 -0
- package/dist/core/extensions/builtin/anthropic-subscription/auth-lane.js +8 -62
- package/dist/core/extensions/builtin/anthropic-subscription/context-window.d.ts +25 -0
- package/dist/core/extensions/builtin/anthropic-subscription/context-window.js +38 -0
- package/dist/core/extensions/builtin/anthropic-subscription/index.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/index.js +4 -6
- package/dist/core/extensions/builtin/anthropic-subscription/long-context-retry.d.ts +18 -0
- package/dist/core/extensions/builtin/anthropic-subscription/long-context-retry.js +74 -0
- package/dist/core/extensions/builtin/anthropic-subscription/long-context.js +13 -5
- package/dist/core/extensions/builtin/anthropic-subscription/options.d.ts +0 -10
- package/dist/core/extensions/builtin/anthropic-subscription/options.js +8 -16
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-wiring.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-sync.js +3 -0
- package/dist/core/extensions/builtin/terminal/lease-file.d.ts +1 -0
- package/dist/core/extensions/builtin/terminal/lease-file.js +5 -3
- package/dist/core/foreign-session-holders.d.ts +2 -3
- package/dist/core/provider-failure.d.ts +2 -0
- package/dist/core/provider-failure.js +3 -0
- package/dist/core/reserved-keywords.js +1 -1
- package/dist/core/session-hold-errors.d.ts +2 -0
- package/dist/core/session-holder-records.d.ts +21 -0
- package/dist/core/session-holder-records.js +76 -0
- package/dist/core/session-holders.d.ts +3 -3
- package/dist/core/session-holders.js +4 -41
- package/dist/core/session-manager.d.ts +1 -0
- package/dist/core/session-manager.js +8 -1
- package/dist/core/session-write-fence.d.ts +18 -0
- package/dist/core/session-write-fence.js +71 -0
- package/dist/core/user-text-blocks.d.ts +11 -0
- package/dist/core/user-text-blocks.js +19 -1
- package/dist/modes/rpc/host-daemon-registration.js +2 -1
- package/dist/modes/rpc/host-generations.d.ts +6 -0
- package/dist/modes/rpc/host-generations.js +35 -4
- package/dist/modes/rpc/host-lifecycle-scratch.d.ts +9 -2
- package/dist/modes/rpc/host-lifecycle-scratch.js +26 -6
- package/dist/modes/rpc/host-lifecycle.js +1 -1
- package/dist/modes/rpc/host-reservations.d.ts +5 -0
- package/dist/modes/rpc/host-reservations.js +54 -12
- package/dist/modes/rpc/host-stalled-evidence.d.ts +27 -1
- package/dist/modes/rpc/host-stalled-evidence.js +52 -4
- package/dist/modes/rpc/multi-session-host.js +10 -1
- package/dist/modes/rpc/session-command-router.js +2 -0
- package/dist/modes/rpc/session-held.js +2 -0
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-74V6LCWU.js +0 -2
- package/dist/bundle/chunks/chunk-DDQJSVIZ.js +0 -5
- package/dist/bundle/chunks/chunk-DY2EM44T.js +0 -395
- package/dist/bundle/chunks/chunk-HOXW5IHD.js +0 -6
- package/dist/bundle/chunks/chunk-UAQW2T7G.js +0 -2
- package/dist/bundle/chunks/cli-main-RXZVFXK7.js +0 -3
- package/dist/bundle/chunks/host-session-command-KGCQPMES.js +0 -20
- package/dist/bundle/chunks/interactive-mode-DQOPIZSI.js +0 -2
- package/dist/bundle/chunks/openai-codex-responses-I2NSK6AD.js +0 -10
- package/dist/bundle/chunks/rpc-mode-X6J3FC3N.js +0 -2
- package/dist/bundle/chunks/session-control-endpoint-XN4BAZTU.js +0 -3
- package/dist/bundle/chunks/session-picker-US5YPKC7.js +0 -2
- /package/dist/bundle/chunks/{chunk-KW6654UH.js → chunk-RPAHOJ6F.js} +0 -0
|
@@ -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{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-HOXW5IHD.js";import{TIP_DEFINITIONS}from"./chunk-25FRFTSP.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,SessionExtensionUiRequests,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,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,estimateCacheKey,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,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,isTransientMessage,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveReminderSystemPrompt,resolveThresholdContextTokens,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,serializeConversation,serializeForEstimate,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-DY2EM44T.js";import{MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,UNKNOWN_COMMAND_CONFIRM_HINT,UnknownCommandError,assertSessionCwdExists,commandShapedName,findUnknownCommand,formatMissingSessionCwdPrompt,getMissingSessionCwdIssue,isTransportGoneError}from"./chunk-FDCYQYBP.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_RESPONSE_TOO_LARGE,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-MF57DS3V.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,createMcpLogger,delay,fingerprintSecret,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isRetriableMcpError,isTransientTokenError,loadMcpSdkAuth,loadMcpSdkStdioTransport,reapProcessTree,redactMcpLogText,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-KW6654UH.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-SR7DBNWN.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-2MOGCBPT.js";import{AccountUsageLimitError,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,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,configureHttpDispatcher,createFallbackCircuitAccess,describeUsageLimitEntry,describeUsageLimitMessage,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,isBillingErrorMessage,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,takeOverStderr,takeOverStdout,trackTurnAdmission,usageLimitCause,usageLimitScope,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-2RLZXLXS.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-EFJKVUID.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-T2EE5G4S.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,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,loadEntriesFromFile,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-GX7MTG25.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-ZMS6YEAO.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-HMK6F3RG.js";import{CredentialFailoverError,MAX_SLOT_BLOCK_MS,applyAccountOrder,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,withoutOrderedAccount}from"./chunk-74V6LCWU.js";import{activeModelBlockUntil,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,redactSensitiveOutput,redactSensitiveTokenValues,usageLimitResetMs,withModelBlock}from"./chunk-QZBH7PDO.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-Z32CYNHC.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,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-YID5W42N.js";import{listHostEndpoints}from"./chunk-6IWSMXBA.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{discoverEnvSlots}from"./chunk-FM7NDZR5.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-EPQK674G.js";import{source_default}from"./chunk-26UBFF6N.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-77PVTNLJ.js";import{ENDPOINT_REGISTRY_VERSION,MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,createHostDaemonPaths,daemonDirectoryName,serializeJsonLine,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-KUZPBZUK.js";import{createRgEngine,ensureTool}from"./chunk-IQWPR35S.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialSlotRepository,slotHealth}from"./chunk-QXJVKVA2.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{external_exports}from"./chunk-KUPQO7MC.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-4CJJ4SK6.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-JKNUKBS3.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-EKDY4H2J.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-2IK7QUJX.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-XSRM367N.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-T36LJ6MW.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-QGJLZ6BI.js";import{sanitizeProviderDiagnostic}from"./chunk-UAQW2T7G.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{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,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-LAWS3FYQ.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-ADNKYKU4.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-RAIZG6HA.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-4J4ABCCL.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_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL}from"./chunk-WIAXG52U.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(win326){return win326===!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,state2={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state2.prefix="./"),output};exports.wrapOutput=(input,state2={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state2.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 state2={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state2.maxDepth=0,isPathSeparator(code)||tokens.push(token),state2.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]),state2.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]),state2.maxDepth+=tokens[tokens.length-1].depth),state2.slashes=slashes,state2.parts=parts}return state2};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}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=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 state2={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,state2),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state2.index===len-1,peek=state2.peek=(n=1)=>input[state2.index+n],advance=state2.advance=()=>input[++state2.index]||"",remaining=()=>input.slice(state2.index+1),consume=(value2="",num2=0)=>{state2.consumed+=value2,state2.index+=num2},append=token=>{state2.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state2.start++,count2++;return count2%2===0?!1:(state2.negated=!0,state2.start++,!0)},increment=type2=>{state2[type2]++,stack.push(type2)},decrement=type2=>{state2[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state2.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&&(state2.output=state2.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state2.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=state2.parens,token.output=state2.output,token.startIndex=state2.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state2.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state2.index+1),body=input.slice(token.startIndex+2,state2.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,open11=tokens[token.tokensIndex];open11.type="text",open11.value=literal,open11.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;state2.output=token.output+open11.output,state2.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=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state2.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?(state2.output=input,state2):(state2.output=utils.wrapOutput(output,state2,options),state2)}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,state2.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state2.brackets===0){push({type:"text",value});continue}}if(state2.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),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state2.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(state2.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state2.quotes=state2.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state2.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state2.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state2.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(state2.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(state2.output=state2.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state2.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state2.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open11={type:"brace",value,output:"(",outputIndex:state2.output.length,tokensIndex:state2.tokens.length};braces.push(open11),push(open11);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),state2.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state2.output.slice(0,brace.outputIndex),toks=state2.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state2.output=out;for(let t of toks)state2.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"&&state2.index===state2.start+1){state2.start=state2.index+1,state2.consumed="",state2.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state2.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(state2.braces+state2.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&&state2.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")||state2.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],state2.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,state2.backtrack=!0,state2.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=state2.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[state2.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state2.parens>0&&rest===")".repeat(state2.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state2.output=prev.output,state2.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state2.output=state2.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state2.globstar=!0,state2.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state2.output=state2.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,state2.output+=prior.output+prev.output,state2.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})`,state2.output=prev.output,state2.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state2.output=state2.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state2.output+=prev.output,state2.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}(state2.index===state2.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state2.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state2.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state2.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state2.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state2.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state2.output=utils.escapeLast(state2.output,"["),decrement("brackets")}for(;state2.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state2.output=utils.escapeLast(state2.output,"("),decrement("parens")}for(;state2.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state2.output=utils.escapeLast(state2.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state2.backtrack===!0){state2.output="";for(let token of state2.tokens)state2.output+=token.output!=null?token.output:token.value,token.suffix&&(state2.output+=token.suffix)}return state2};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state2={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,state2),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),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 state3=isMatch(str3);if(state3)return state3}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||{},posix5=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state2=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state:state2,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state2),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state2,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state2.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state2.output})${append}`;state2&&state2.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state2),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=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(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-JVLIKUBL.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-FC2YWHEC.js";import{AccountUsageLimitError,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,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,configureHttpDispatcher,createFallbackCircuitAccess,describeUsageLimitEntry,describeUsageLimitMessage,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,isBillingErrorMessage,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,takeOverStderr,takeOverStdout,trackTurnAdmission,usageLimitCause,usageLimitScope,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-2LQZJFKQ.js";import{TIP_DEFINITIONS}from"./chunk-25FRFTSP.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-EFJKVUID.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,SessionExtensionUiRequests,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,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,estimateCacheKey,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,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,isTransientMessage,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveReminderSystemPrompt,resolveThresholdContextTokens,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,serializeConversation,serializeForEstimate,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-2JGY3V4H.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_RESPONSE_TOO_LARGE,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-MF57DS3V.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-FRFGJC3I.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,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,loadEntriesFromFile,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-TK6RKAB4.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-ZMS6YEAO.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,createMcpLogger,delay,fingerprintSecret,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isRetriableMcpError,isTransientTokenError,loadMcpSdkAuth,loadMcpSdkStdioTransport,reapProcessTree,redactMcpLogText,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-RPAHOJ6F.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-SR7DBNWN.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-2MOGCBPT.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-HMK6F3RG.js";import{CredentialFailoverError,MAX_SLOT_BLOCK_MS,applyAccountOrder,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,withoutOrderedAccount}from"./chunk-6L3H4UVN.js";import{activeModelBlockUntil,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,redactSensitiveOutput,redactSensitiveTokenValues,usageLimitResetMs,withModelBlock}from"./chunk-QZBH7PDO.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-F4YDU66P.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,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-KXTWMPCP.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-6IWSMXBA.js";import{discoverEnvSlots}from"./chunk-FM7NDZR5.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-EPQK674G.js";import{source_default}from"./chunk-26UBFF6N.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-W557SQYL.js";import{ENDPOINT_REGISTRY_VERSION,MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,createHostDaemonPaths,daemonDirectoryName,serializeJsonLine,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-KUZPBZUK.js";import{createRgEngine,ensureTool}from"./chunk-IQWPR35S.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialSlotRepository,slotHealth}from"./chunk-QXJVKVA2.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{external_exports}from"./chunk-KUPQO7MC.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-SOWFP3I7.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-JKNUKBS3.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JXCHRJA7.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-2SM4TR4H.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-XSRM367N.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{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{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,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-LAWS3FYQ.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-RYQ2FFF5.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-RAIZG6HA.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-4J4ABCCL.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_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL}from"./chunk-WIAXG52U.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(win326){return win326===!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,state2={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state2.prefix="./"),output};exports.wrapOutput=(input,state2={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state2.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 state2={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state2.maxDepth=0,isPathSeparator(code)||tokens.push(token),state2.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]),state2.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]),state2.maxDepth+=tokens[tokens.length-1].depth),state2.slashes=slashes,state2.parts=parts}return state2};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}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=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 state2={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,state2),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state2.index===len-1,peek=state2.peek=(n=1)=>input[state2.index+n],advance=state2.advance=()=>input[++state2.index]||"",remaining=()=>input.slice(state2.index+1),consume=(value2="",num2=0)=>{state2.consumed+=value2,state2.index+=num2},append=token=>{state2.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state2.start++,count2++;return count2%2===0?!1:(state2.negated=!0,state2.start++,!0)},increment=type2=>{state2[type2]++,stack.push(type2)},decrement=type2=>{state2[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state2.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&&(state2.output=state2.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state2.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=state2.parens,token.output=state2.output,token.startIndex=state2.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state2.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state2.index+1),body=input.slice(token.startIndex+2,state2.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,open11=tokens[token.tokensIndex];open11.type="text",open11.value=literal,open11.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;state2.output=token.output+open11.output,state2.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=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state2.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?(state2.output=input,state2):(state2.output=utils.wrapOutput(output,state2,options),state2)}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,state2.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state2.brackets===0){push({type:"text",value});continue}}if(state2.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),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state2.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(state2.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state2.quotes=state2.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state2.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state2.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state2.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(state2.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(state2.output=state2.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state2.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state2.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open11={type:"brace",value,output:"(",outputIndex:state2.output.length,tokensIndex:state2.tokens.length};braces.push(open11),push(open11);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),state2.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state2.output.slice(0,brace.outputIndex),toks=state2.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state2.output=out;for(let t of toks)state2.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"&&state2.index===state2.start+1){state2.start=state2.index+1,state2.consumed="",state2.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state2.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(state2.braces+state2.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&&state2.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")||state2.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],state2.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,state2.backtrack=!0,state2.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=state2.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[state2.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state2.parens>0&&rest===")".repeat(state2.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state2.output=prev.output,state2.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state2.output=state2.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state2.globstar=!0,state2.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state2.output=state2.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,state2.output+=prior.output+prev.output,state2.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})`,state2.output=prev.output,state2.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state2.output=state2.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state2.output+=prev.output,state2.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}(state2.index===state2.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state2.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state2.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state2.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state2.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state2.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state2.output=utils.escapeLast(state2.output,"["),decrement("brackets")}for(;state2.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state2.output=utils.escapeLast(state2.output,"("),decrement("parens")}for(;state2.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state2.output=utils.escapeLast(state2.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state2.backtrack===!0){state2.output="";for(let token of state2.tokens)state2.output+=token.output!=null?token.output:token.value,token.suffix&&(state2.output+=token.suffix)}return state2};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state2={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,state2),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),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 state3=isMatch(str3);if(state3)return state3}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||{},posix5=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state2=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state:state2,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state2),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state2,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state2.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state2.output})${append}`;state2&&state2.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state2),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=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(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 basename34,dirname as dirname64,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 state2=credential.slotState??{};for(let slot2 of envSlots(env)){let persisted=state2[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=[],read=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)read(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 state3=await repository.listSlots(provider,"stored"),storedAccounts3=normalizeProviderId(provider)==="anthropic-subscription"?Array.isArray(credential.accounts)?listSlots(credential):[]:listSlots(credential);for(let slot2 of storedAccounts3){let displayName=accountDisplayName(slot2.displayName),persisted=state3[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))})}if(normalizeProviderId(provider)!=="anthropic-subscription")return summaries}let state2=await repository.listSlots(provider,"env");for(let slot2 of discoverEnvSlots(provider,name=>env[name])){let persisted=state2[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),!(await getCredentialAccounts(storage,provider,env,repo)).some(account=>account.name===name)))throw new Error(`Provider account not found: ${name}`);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.some(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;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.#publish(key,{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<previous.reportedAt)){if("error"in report){if(previous?.error===report.error)return;this.#publish(key,{...previous??{provider,account,windows:[],reportedAt},error:report.error});return}report.windows.length===0&&previous===void 0||this.#publish(key,{provider,account,windows:[...report.windows],reportedAt,...report.plan===void 0?{}:{plan:report.plan}})}}#publish(key,limits){this.#accounts.set(key,limits);for(let listener of this.#listeners)try{listener(limits)}catch(error2){process.stderr.write(`senpi subscription limits: a listener failed: ${String(error2)}
|
|
5
5
|
`)}}snapshot(){return[...this.#accounts.values()]}subscribe(listener){return this.#listeners.add(listener),()=>this.#listeners.delete(listener)}},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(entry=>entry.provider===PROVIDER&&entry.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 read=stored,slot2=read.accounts?.find(account=>account.name===name)??read.slotState?.[name];clearable(slot2)&&await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current,state2=credential.slotState?.[name],slotState=state2===void 0||!clearable(state2)?credential.slotState:{...credential.slotState,[name]:{...state2.modelBlocks?{modelBlocks:state2.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((resolve53,reject)=>{if(signal?.aborted){reject(signal.reason);return}let timer=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve53()},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)}
|
|
@@ -127,11 +127,11 @@ File: ${path14}`)}return _ModelConfig.parseAndMigrate(content,path14)}static loa
|
|
|
127
127
|
|
|
128
128
|
File: ${path14}`)}}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}isProviderDisabled(providerId){return this.disabledProviders.has(providerId)||this.providers.get(providerId)?.disabled===!0}getError(){return this.error}getWarnings(){return this.warnings}};import{join as join16}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path14=join16(getAgentDir(),"models-store.json")){this.path=normalizePath(path14),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState2,data,revision){readState2.data=data,readState2.revision=revision}reloadFromStorage(readState2,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState2,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState2,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState2.revision)return readState2.data;if(!readState2.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState2,{signal:controller.signal}),readers:0};readState2.reload=reload2,reload2.promise.then(()=>{readState2.reload===reload2&&(readState2.reload=void 0)},()=>{readState2.reload===reload2&&(readState2.reload=void 0)})}let reload=readState2.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState2.reload===reload&&(readState2.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};function configuredHeaderAuthStatus(configHeaders,extensionHeaders){let sawCredentialHeader=!1;for(let header2 of effectiveHeaders(configHeaders,extensionHeaders).values()){if(!isCredentialHeaderName(header2.name))continue;if(sawCredentialHeader=!0,isCommandConfigValue(header2.value))return{configured:!0,source:"models_json_command"};let envNames=getConfigValueEnvVarNames(header2.value);if(envNames.length>0){if(isConfigValueConfigured(header2.value))return{configured:!0,source:"environment",label:envNames.join(", ")};continue}if(hasCredentialHeaders({[header2.name]:header2.value}))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders),values=Object.fromEntries([...headers.values()].map(header2=>[header2.name,header2.value]));if(hasCredentialHeaders(values)){for(let header2 of headers.values())if(hasCredentialHeaders({[header2.name]:header2.value}))return header2.source==="extension_headers"?"provider extension headers":"models.json headers"}}async function checkConfiguredHeaderAuth(headers,ctx,source2){if(headers)for(let header2 of effectiveHeaders(headers,void 0).values()){if(!isCredentialHeaderName(header2.name))continue;if(isCommandConfigValue(header2.value))return{type:"api_key",source:source2};let envNames=getConfigValueEnvVarNames(header2.value),configured=!0;for(let envName of envNames)if(await ctx.env(envName)===void 0){configured=!1;break}if(configured&&hasCredentialHeaders({[header2.name]:header2.value}))return{type:"api_key",source:source2}}}function effectiveHeaders(configHeaders,extensionHeaders){let effective=new Map;return addHeaders(effective,configHeaders,"models_json_headers"),addHeaders(effective,extensionHeaders,"extension_headers"),effective}function addHeaders(target,headers,source2){for(let[name,value]of Object.entries(headers??{}))typeof value=="string"&&target.set(name.toLowerCase(),{name,value,source:source2})}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth,rawHeaders=configuredHeaders(config,extension),headerSource=headerAuthResolutionSource(config?.headers,extension?.headers),authHeader=extension?.authHeader??config?.authHeader??!1,ambient=extension?.ambientAuth;return!inherited&&rawKey===void 0&&!headerSource&&ambient?ambientApiKeyAuth(providerId,ambient,rawHeaders,headerSource,authHeader):!inherited&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited?.name??"API key",login:inherited?.login??(headerSource&&rawKey===void 0?void 0:async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential?.key){let inheritedCheck2=await inherited?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};for(let name of getConfigValueEnvVarNames(rawKey))if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}let inheritedCheck=await inherited?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited,rawKey,input),explicitEnv={...input.credential?.env??{},...result3?.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);if(!(!result3&&!hasCredentialHeaders(headers)))return{...result3,auth:withConfiguredAuth(result3?.auth??{},headers,authHeader),source:result3?.source??headerSource}}}}function ambientResolverOf(oauth){let candidate=oauth?.resolveAmbient;return typeof candidate=="function"?candidate:void 0}function ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader){let resolveAmbient=ambientResolverOf(oauth);if(!resolveAmbient)return;let resolve53=async input=>{let result3=await resolveAmbient({ctx:input.ctx,env:input.credential?.env,signal:input.signal});if(!result3||input.credential?.key&&input.credential.key!==result3.auth.apiKey)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:oauth.name??"Ambient credentials",ambientOnly:!0,check:async input=>{let resolved=await resolve53(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve53}}function ambientApiKeyAuth(providerId,ambient,rawHeaders,headerSource,authHeader){let resolve53=async input=>{let result3=await ambient.resolve({ctx:input.ctx,signal:input.signal});if(!result3)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:ambient.name??"Ambient credentials",ambientOnly:!0,resolve:resolve53}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}async function resolveBaseAuth(providerId,inherited,rawKey,input){if(input.credential?.key)return inherited?inherited.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited?inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}async function configContextEnv(values,ctx,explicit){let env={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env[name]!==void 0)continue;let value=await ctx.env(name);value!==void 0&&(env[name]=value)}return Object.keys(env).length>0?env:void 0}function getAllProviderModels(provider){return provider?provider.getAllModels?.()??provider.getModels():[]}function isChatModelConfig(definition){return(definition.type??"chat")==="chat"}function findExtensionChatModel(extension,modelId){return extension?.models?.filter(isChatModelConfig).find(entry=>entry.id===modelId)}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function mergeInputLimits(base,override){return override?{...base,...override,images:override.images?{...base?.images,...override.images,resize:override.images.resize?{...base?.images?.resize,...override.images.resize}:base?.images?.resize}:base?.images}:base}function applyModelOverride(model,override){return{...model,name:override.name??model.name,promptPreset:override.promptPreset??model.promptPreset,recoverTextToolCalls:override.recoverTextToolCalls??model.recoverTextToolCalls,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?override.thinkingLevelMapMode==="replace"?override.thinkingLevelMap:{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,inputLimits:mergeInputLimits(model.inputLimits,override.inputLimits),cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,promptCache:override.promptCache?{...model.promptCache,...override.promptCache}:model.promptCache,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,cacheRetention:override.cacheRetention??model.cacheRetention,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults){let api=definition.api??providerConfig.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,promptPreset:definition.promptPreset,recoverTextToolCalls:definition.recoverTextToolCalls,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],inputLimits:definition.inputLimits,cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},promptCache:definition.promptCache,contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){let chatModels2=models.filter(model=>isModelType(model,"chat"));return chatModels2.find(model=>model.id===modelId)??(api?chatModels2.find(model=>model.api===api):void 0)??chatModels2.find(model=>model.api==="openai-completions")??chatModels2[0]}function findExtensionModelDefaults(models,definition){let type2=definition.type??"chat",candidates=models.filter(model=>isModelType(model,type2));return candidates.find(model=>model.id===definition.id)??(definition.api?candidates.find(model=>model.api===definition.api):void 0)??(type2==="chat"?candidates.find(model=>model.api==="openai-completions"):void 0)??candidates[0]}function extensionModelFromDefinition(providerId,models,config,definition){let type2=definition.type??"chat",defaults=findExtensionModelDefaults(models,definition),api=definition.api??(type2==="chat"?config.api:void 0)??defaults?.api;if(!api)throw new Error(type2==="chat"?`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`:`Provider ${providerId}, model ${definition.id}: no "api" specified. Set it at model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return definition.type==="image"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:definition.type==="classifier"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:{...definition,api,provider:providerId,baseUrl,headers:void 0}}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&config.hideFreeModels===void 0&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>{let baseUrl=config.baseUrl??model.baseUrl;return isModelType(model,"chat")?{...model,baseUrl,compat:mergeCompat(model.compat,config.compat)}:{...model,baseUrl}});for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>isModelType(model2,"chat")&&model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0,hideFree=config.hideFreeModels===!0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id))&&!(hideFree&&model.cost.input===0&&model.cost.output===0))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>extensionModelFromDefinition(providerId,models,config,definition)),...models.filter(model=>isModelType(model,"chat")&&customModelIds.has(model.id)&&!declaredModels.some(definition=>isChatModelConfig(definition)&&definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let chatDefinition=isModelType(model,"chat")?config?.models?.find(entry=>entry.id===model.id):void 0,extensionModel=extension?.models?.find(entry=>(entry.type??"chat")===(model.type??"chat")&&entry.id===model.id),headers={...isModelType(model,"chat")?config?.modelOverrides?.[model.id]?.headers:void 0,...chatDefinition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getAllModels=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=[...extension.oauth.modifyModels(models.filter(model=>isModelType(model,"chat")),extensionOAuthCredential),...models.filter(model=>!isModelType(model,"chat"))]),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override&&isModelType(model,"chat")?applyModelOverride(model,override):model})};getAllModels();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model),tools=format2?getCurrentTools(context.messages):[];if(format2&&tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:()=>getAllModels().filter(model=>isModelType(model,"chat")),getAllModels,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,filterAllModels:base?.filterAllModels?(models,credential)=>base.filterAllModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options));let extensionImages=extension?.images,generateImages2=base?.generateImages;(generateImages2||Object.keys(extensionImages??{}).length>0)&&(provider.generateImages=(model,context,options)=>{let implementation=extensionImages?.[model.api];return implementation?implementation.generateImages(model,context,options):generateImages2?generateImages2(model,context,options):Promise.resolve(imageErrorResult(model,new Error(`Provider ${providerId} has no image implementation for "${model.api}"`)))});let extensionClassifiers=extension?.classifiers,classify=base?.classify;return(classify||Object.keys(extensionClassifiers??{}).length>0)&&(provider.classify=(model,context,options)=>{let implementation=extensionClassifiers?.[model.api];return implementation?implementation.classify(model,context,options):classify?classify(model,context,options):Promise.resolve(classifierErrorResult(model,new Error(`Provider ${providerId} has no classifier implementation for "${model.api}"`)))}),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value=configuredApiKey(config,extension);if(value===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value);return names.length>0?isConfigValueConfigured(value)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((resolve53,reject)=>{let abort=()=>{let index=semaphore.waiters.indexOf(waiter);index!==-1&&semaphore.waiters.splice(index,1),reject(signal?.reason)},waiter={grant(){signal?.removeEventListener("abort",abort),semaphore.active++;let released=!1;resolve53(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run2){let release4=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run2();return stream2.result().then(release4,release4),stream2}catch(error2){throw release4(),error2}}return{resize,bracket(providerId,signal,run2){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run2();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run2)}}}import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var MODEL_CAPABILITY_FIELDS=["contextWindow","maxTokens","input","reasoning","thinkingLevelMap","upstreamModelId","serviceTier","recoverTextToolCalls","compat"];function mergeRemoteCatalogModels(providerId,baseline,dynamic){let merged=[...baseline],conflicts=[];for(let model of dynamic){let index=merged.findIndex(entry=>entry.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field2=>!isDeepStrictEqual2(staticModel[field2],model[field2]));fields.length>0&&conflicts.push({providerId,modelId:model.id,fields}),merged[index]={...staticModel,name:model.name,cost:model.cost}}return{models:merged,conflicts}}function parseRemoteCatalog(providerId,value){let entries=Array.isArray(value)?value:typeof value=="object"&&value!==null&&"models"in value&&Array.isArray(value.models)?value.models:typeof value=="object"&&value!==null?Object.values(value):void 0;if(!entries?.every(isModelCatalogEntry))throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.map(model=>({...model,provider:providerId}))}function isModelCatalogEntry(value){return isRecord6(value)?typeof value.id=="string"&&typeof value.name=="string"&&typeof value.api=="string"&&typeof value.provider=="string"&&typeof value.baseUrl=="string"&&typeof value.reasoning=="boolean"&&isInputArray(value.input)&&isModelCost(value.cost)&&isFiniteNumber(value.contextWindow)&&isFiniteNumber(value.maxTokens):!1}function isInputArray(value){return Array.isArray(value)&&value.every(modality=>modality==="text"||modality==="image"||modality==="video")}function isModelCost(value){return isRecord6(value)?isFiniteNumber(value.input)&&isFiniteNumber(value.output)&&isFiniteNumber(value.cacheRead)&&isFiniteNumber(value.cacheWrite):!1}function isFiniteNumber(value){return typeof value=="number"&&Number.isFinite(value)}function isRecord6(value){return typeof value=="object"&&value!==null}var DEFAULT_CATALOG_BASE_URL="https://pi.dev",REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3,REMOTE_CATALOG_MODEL_TYPES=["chat","image","classifier"],NON_CHAT_MODEL_TYPES=REMOTE_CATALOG_MODEL_TYPES.filter(type2=>type2!=="chat"),FORK_ONLY_BUILTIN_PROVIDERS=new Set(["alibaba-token-plan","opengateway"]);function remoteCatalogServesProvider(providerId,catalogBaseUrl){return catalogBaseUrl!==void 0||!FORK_ONLY_BUILTIN_PROVIDERS.has(providerId)}function isSupportedModelType(model){return model.type===void 0||typeof model.type=="string"&&REMOTE_CATALOG_MODEL_TYPES.includes(model.type)}function mergeModels(baseline,dynamic){let merged=new Map;for(let model of[...baseline,...dynamic])merged.set(`${getModelType(model)}\0${model.id}`,model);return[...merged.values()]}var remoteCatalogConflicts=new WeakMap;function chatModels(models){return models.filter(model=>isModelType(model,"chat"))}function nonChatModels(models){return models.filter(model=>!isModelType(model,"chat"))}function parseCatalog(providerId,value){let entries=Array.isArray(value)?value:typeof value=="object"&&value!==null&&"models"in value&&Array.isArray(value.models)?value.models:typeof value=="object"&&value!==null?Object.values(value):void 0;if(!entries)throw new Error(`Invalid model catalog for provider "${providerId}"`);let supported=entries.filter(entry=>typeof entry=="object"&&entry!==null).filter(isSupportedModelType),isNonChat=entry=>NON_CHAT_MODEL_TYPES.includes(entry.type),chat=supported.filter(entry=>!isNonChat(entry)),other=supported.filter(entry=>isNonChat(entry)&&"id"in entry).map(model=>({...model,provider:providerId}));return[...parseRemoteCatalog(providerId,chat),...other]}function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl=DEFAULT_CATALOG_BASE_URL,localGeneratedAt){let dynamicModels=[],currentChatModels=()=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(dynamicModels)).models,conflictsFor=models=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(models)).conflicts,wrappedProvider={...provider,getModels:currentChatModels,getAllModels:()=>[...currentChatModels(),...mergeModels(nonChatModels(provider.getAllModels?.()??[]),nonChatModels(dynamicModels))],refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(restored))}})||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored&&stored.models.length>0?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl);url.searchParams.set("types",REMOTE_CATALOG_MODEL_TYPES.join(","));let response=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getPiUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response.status===404||response.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);let refreshed=parseCatalog(provider.id,await response.json()),lastModified=Date.parse(response.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(published))}})}};return remoteCatalogConflicts.set(wrappedProvider,[]),wrappedProvider}function asExtensionOAuthRegistry(store){let candidate=store;return typeof candidate.registerOAuthProvider=="function"&&typeof candidate.unregisterOAuthProvider=="function"?candidate:void 0}var RuntimeCredentials=class{constructor(store){this.overrides=new Map,this.store=store}get backingStore(){return this.store}registerOAuthProvider(providerId,oauth){asExtensionOAuthRegistry(this.store)?.registerOAuthProvider(providerId,oauth)}unregisterOAuthProvider(providerId){asExtensionOAuthRegistry(this.store)?.unregisterOAuthProvider(providerId)}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}busyReadCount(){let store=this.store;return typeof store.getBusyReadCount=="function"?store.getBusyReadCount():0}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};setWireIdentity(BRAND?.userAgent??APP_NAME);function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join17(dirname13(modelsPath),"claude-code-version.json"),offline:envValue("OFFLINE")!==void 0})}function mightHoldCredentialPool(providerId,credential,env,policySlots){if(credential){let accounts=Object.entries(credential).find(([key])=>key==="accounts")?.[1];return Array.isArray(accounts)&&accounts.length>1||Object.keys(policySlots??{}).length>0}return discoverEnvSlots(providerId,env).length+Object.keys(policySlots??{}).length>1}var CredentialSynchronizationError=class extends Error{constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}function withPayloadRequestMetadata(options,model){if(!options.onPayload)return options;let onPayload=options.onPayload;return{...options,onPayload:async(payload,providerModel)=>await onPayload(payload,providerModel,{model,headers:options.headers??{}})}}var ModelRuntime=class _ModelRuntime{setSettingsManager(settingsManager){if(this.settingsManager===settingsManager)return;this.unsubscribeProviderSettings?.(),this.settingsManager=settingsManager;let resize=()=>{for(let provider of this.getProviders())this.providerSemaphores.resize(provider.id,settingsManager.getProviderConcurrencyLimit(provider.id))};this.unsubscribeProviderSettings=settingsManager.subscribeToProviderSettings(resize),resize()}constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled,modelRefreshTimeoutMs,poolStatePath){this.providerSemaphores=createProviderSemaphores(providerId=>this.settingsManager?.getProviderConcurrencyLimit(providerId)??1/0),this.builtins=new Map,this.nativeExtensionProviders=new Map,this.extensionProviders=new Map,this.virtualModels=new Map,this.compositionErrors=new Map,this.snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map},this.availabilityInitialized=!1,this.availabilityRefreshSeq=0,this.availabilityErrorSeq=0,this.providerAvailabilitySeq=new Map,this.credentialOperations=new Map,this.credentials=credentials,this.poolStatePath=poolStatePath,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.modelRefreshTimeoutMs=modelRefreshTimeoutMs,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}get authStorage(){let store=this.credentials.backingStore;return store instanceof AuthStorage?store:void 0}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join17(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join17(dirname13(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,envValue("OFFLINE")===void 0&&options.allowModelNetwork===!0,options.modelRefreshTimeoutMs??15e3,options.agentDir?join17(options.agentDir,"credential-pool-state.json"):options.authPath?join17(dirname13(options.authPath),"credential-pool-state.json"):void 0);runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager);let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}static createSync(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join17(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join17(dirname13(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,options.allowModelNetwork??!1,options.modelRefreshTimeoutMs??15e3,options.agentDir?join17(options.agentDir,"credential-pool-state.json"):options.authPath?join17(dirname13(options.authPath),"credential-pool-state.json"):void 0);return runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager),runtime}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys(),...this.virtualModels.keys()])}recomposeProvider(rawProviderId){let providerId=normalizeProviderId(rawProviderId);if(this.config.isProviderDisabled(providerId)){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}let provider=this.composeProvider(providerId),virtualModels=[...this.virtualModels.get(providerId)?.values()??[]].map(entry=>entry.model);return virtualModels.length>0?this.models.setProvider(withVirtualModels(providerId,provider,virtualModels)):provider?this.models.setProvider(provider):this.models.deleteProvider(providerId),provider}composeProvider(providerId){let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!this.config.getProvider(providerId)&&!extension)return this.compositionErrors.delete(providerId),base;try{let provider=composeModelProvider(providerId,base,this.config,extension);return this.compositionErrors.delete(providerId),provider}catch(error2){return this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all2=[...this.models.getModels()];this.snapshot={...this.snapshot,all:all2,available:all2.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let busyReadsBefore=this.credentials.busyReadCount(),providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},this.availabilityInitialized=!0,errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq,busyReadsBefore=this.credentials.busyReadCount();try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all2=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all:all2,available:all2.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}answeredFromBusyStore(busyReadsBefore,errorSeq){return this.credentials.busyReadCount()===busyReadsBefore?!1:(errorSeq===this.availabilityErrorSeq&&(this.availabilityError="Credential store was busy; availability will be re-read on the next refresh"),!0)}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}getModelsOfType(type2,providerId){return this.models.getModelsOfType(type2,providerId)}getModelOfType(type2,providerId,modelId){return this.models.getModelOfType(type2,providerId,modelId)}getAllModels(providerId){return this.models.getAllModels(providerId)}getAvailableOfType(type2,providerId,options){return this.models.getAvailableOfType(type2,providerId,options)}getAllAvailable(providerId,options){return this.models.getAllAvailable(providerId,options)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}hasFreshAvailabilitySnapshot(){return this.availabilityInitialized&&this.availabilityError===void 0}hasAvailabilitySnapshot(){return this.availabilityInitialized}getWarnings(){return this.config.getWarnings()}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
|
|
129
129
|
|
|
130
|
-
`):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve53=>{markStarted=resolve53}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){return this.resolveProviderAuth(providerId).status}resolveProviderAuth(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{status:{configured:!0,source:"runtime"},signIn:!1};if(this.snapshot.storedProviders.has(providerId))return{status:{configured:!0,source:"stored"},signIn:!1};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return{status:configured,signIn:!1};let check=this.snapshot.auth.get(providerId);return check?{status:{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}},signIn:check.type==="oauth"}:{status:{configured:!1},signIn:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-XX2NXYL3.js"),import("./state-store-S7BFK5LR.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot2=>this.attemptWithTokenRecovery(model,streamOptions,slot2.lane==="env"?{...slot2.envKey===void 0?{}:{apiKey:slot2.envKey}}:{slotName:slot2.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),capturing={...prepared,options:withLimitCapture(prepared.options,prepared.model.provider,limitAccountOf(slotAuth))},inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(capturing));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot2=>this.attemptWithTokenRecovery(model,streamOptions,slot2.lane==="env"?{apiKey:slot2.envKey}:{slotName:slot2.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value]of Object.entries(config))value!==void 0&&(effective[key]=value);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing2=this.models.getModel(providerId,id);if(existing2&&!isVirtualModel(existing2))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join18(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.resolveProviderAuth(provider).status}resolveProviderAuth(provider){this.retryBusyCredentialRead();let resolved=this.runtime.resolveProviderAuth(provider);if(resolved.status.configured||this.runtime.hasAvailabilitySnapshot())return resolved;let live=this.authStorage.getAuthStatus(provider);return live.configured?{status:live,signIn:!1}:resolved}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-5-5","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-5-5",anthropic:"claude-opus-5-5",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.6-pro","xiaomi-token-plan-cn":"mimo-v2.6-pro","xiaomi-token-plan-ams":"mimo-v2.6-pro","xiaomi-token-plan-sgp":"mimo-v2.6-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference2){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference2.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function resolveStoredModelWithAuth(provider,modelId,modelRuntime){let resolved=resolveStoredModelReference(provider,modelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return resolved;if(provider==="anthropic"){let lane=resolveStoredModelReference(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,modelId,modelRuntime);if(lane&&modelRuntime.hasConfiguredAuth(lane.model.provider))return lane}return resolved}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches2=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches2.length===0)return;let aliases=matches2.filter(m=>isAlias(m.id)),datedVersions=matches2.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value){return SERVICE_TIER_VALUES.includes(value)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches2=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches2(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches2(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower2=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower2||`${m.provider}/${m.id}`.toLowerCase()===lower2);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches2=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches2}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower2=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower2||`${m.provider}/${m.id}`.toLowerCase()===lower2);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelWithAuth(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}var NESTED_CALL_LIMITS={maxCalls:256,maxArgumentBytesPerCall:8*1024,maxArgumentBytesTotal:32*1024,maxErrorChars:500},encoder=new TextEncoder,NestedCallRecorder=class{constructor(){this.calls=[],this.startedAt=new Map,this.complete=!0,this.argumentBytes=0}start(toolCall){if(this.calls.length>=NESTED_CALL_LIMITS.maxCalls){this.complete=!1;return}let record8={id:toolCall.id,name:toolCall.name,status:"unfinished"},json=JSON.stringify(toolCall.arguments??{}),bytes=encoder.encode(json).length;return bytes>NESTED_CALL_LIMITS.maxArgumentBytesPerCall||this.argumentBytes+bytes>NESTED_CALL_LIMITS.maxArgumentBytesTotal?(record8.argumentsBytes=bytes,this.complete=!1):(record8.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record8),this.startedAt.set(record8,performance.now()),record8}finish(record8,isError,errorText6){record8&&(record8.status=isError?"error":"ok",record8.durationMs=Math.round(performance.now()-(this.startedAt.get(record8)??performance.now())),this.startedAt.delete(record8),isError&&errorText6&&(record8.error=errorText6.slice(0,NESTED_CALL_LIMITS.maxErrorChars)))}addUsage(usage3){this.usage=this.usage?combineUsage(this.usage,usage3):usage3}get totalUsage(){return this.usage}snapshot(){if(this.calls.length===0&&this.complete)return;let calls=this.calls.map(call=>({...call}));return{calls,complete:this.complete&&calls.every(call=>call.status!=="unfinished")}}};function textOf(result3){return(result3.content??[]).filter(block=>block.type==="text").map(block=>block.text).join(`
|
|
130
|
+
`):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve53=>{markStarted=resolve53}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){return this.resolveProviderAuth(providerId).status}resolveProviderAuth(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{status:{configured:!0,source:"runtime"},signIn:!1};if(this.snapshot.storedProviders.has(providerId))return{status:{configured:!0,source:"stored"},signIn:!1};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return{status:configured,signIn:!1};let check=this.snapshot.auth.get(providerId);return check?{status:{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}},signIn:check.type==="oauth"}:{status:{configured:!1},signIn:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-QRRJ7G5Y.js"),import("./state-store-S7BFK5LR.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot2=>this.attemptWithTokenRecovery(model,streamOptions,slot2.lane==="env"?{...slot2.envKey===void 0?{}:{apiKey:slot2.envKey}}:{slotName:slot2.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),capturing={...prepared,options:withLimitCapture(prepared.options,prepared.model.provider,limitAccountOf(slotAuth))},inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(capturing));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot2=>this.attemptWithTokenRecovery(model,streamOptions,slot2.lane==="env"?{apiKey:slot2.envKey}:{slotName:slot2.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value]of Object.entries(config))value!==void 0&&(effective[key]=value);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing2=this.models.getModel(providerId,id);if(existing2&&!isVirtualModel(existing2))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join18(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.resolveProviderAuth(provider).status}resolveProviderAuth(provider){this.retryBusyCredentialRead();let resolved=this.runtime.resolveProviderAuth(provider);if(resolved.status.configured||this.runtime.hasAvailabilitySnapshot())return resolved;let live=this.authStorage.getAuthStatus(provider);return live.configured?{status:live,signIn:!1}:resolved}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-5-5","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-5-5",anthropic:"claude-opus-5-5",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.6-pro","xiaomi-token-plan-cn":"mimo-v2.6-pro","xiaomi-token-plan-ams":"mimo-v2.6-pro","xiaomi-token-plan-sgp":"mimo-v2.6-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference2){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference2.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function resolveStoredModelWithAuth(provider,modelId,modelRuntime){let resolved=resolveStoredModelReference(provider,modelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return resolved;if(provider==="anthropic"){let lane=resolveStoredModelReference(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,modelId,modelRuntime);if(lane&&modelRuntime.hasConfiguredAuth(lane.model.provider))return lane}return resolved}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches2=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches2.length===0)return;let aliases=matches2.filter(m=>isAlias(m.id)),datedVersions=matches2.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value){return SERVICE_TIER_VALUES.includes(value)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches2=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches2(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches2(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower2=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower2||`${m.provider}/${m.id}`.toLowerCase()===lower2);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches2=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches2}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower2=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower2||`${m.provider}/${m.id}`.toLowerCase()===lower2);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelWithAuth(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}var NESTED_CALL_LIMITS={maxCalls:256,maxArgumentBytesPerCall:8*1024,maxArgumentBytesTotal:32*1024,maxErrorChars:500},encoder=new TextEncoder,NestedCallRecorder=class{constructor(){this.calls=[],this.startedAt=new Map,this.complete=!0,this.argumentBytes=0}start(toolCall){if(this.calls.length>=NESTED_CALL_LIMITS.maxCalls){this.complete=!1;return}let record8={id:toolCall.id,name:toolCall.name,status:"unfinished"},json=JSON.stringify(toolCall.arguments??{}),bytes=encoder.encode(json).length;return bytes>NESTED_CALL_LIMITS.maxArgumentBytesPerCall||this.argumentBytes+bytes>NESTED_CALL_LIMITS.maxArgumentBytesTotal?(record8.argumentsBytes=bytes,this.complete=!1):(record8.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record8),this.startedAt.set(record8,performance.now()),record8}finish(record8,isError,errorText6){record8&&(record8.status=isError?"error":"ok",record8.durationMs=Math.round(performance.now()-(this.startedAt.get(record8)??performance.now())),this.startedAt.delete(record8),isError&&errorText6&&(record8.error=errorText6.slice(0,NESTED_CALL_LIMITS.maxErrorChars)))}addUsage(usage3){this.usage=this.usage?combineUsage(this.usage,usage3):usage3}get totalUsage(){return this.usage}snapshot(){if(this.calls.length===0&&this.complete)return;let calls=this.calls.map(call=>({...call}));return{calls,complete:this.complete&&calls.every(call=>call.status!=="unfinished")}}};function textOf(result3){return(result3.content??[]).filter(block=>block.type==="text").map(block=>block.text).join(`
|
|
131
131
|
`)}var NestedToolCallRunner=class{constructor(host){this.scopes=new Map,this.queueTail=Promise.resolve(),this.host=host}async execute(callerId,name,args,options={}){let scope=this.scopes.get(callerId);scope||(scope={recorder:new NestedCallRecorder,nextId:1,holdsQueue:!1},this.scopes.set(callerId,scope));let toolCall={type:"toolCall",id:`${callerId}/${scope.nextId++}`,name,arguments:args??{}},record8=scope.recorder.start(toolCall);await this.host.emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,parentToolCallId:callerId});let exclusive=!scope.holdsQueue&&(this.host.isSequential()||this.host.getTools().find(tool=>tool.name===name)?.executionMode==="sequential"),release4;if(exclusive){let previous=this.queueTail;this.queueTail=new Promise(resolve53=>{release4=resolve53}),await previous}this.scopes.set(toolCall.id,{recorder:scope.recorder,nextId:1,holdsQueue:scope.holdsQueue||exclusive});let outcome;try{outcome=await this.host.runToolCall(toolCall,callerId,options.signal,async partialResult=>{options.onUpdate?.(partialResult),await this.host.emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,partialResult,parentToolCallId:callerId})})}finally{this.scopes.delete(toolCall.id),release4?.()}return scope.recorder.finish(record8,outcome.isError,textOf(outcome.result)),outcome.result.usage&&scope.recorder.addUsage(outcome.result.usage),await this.host.emit({type:"tool_execution_end",toolCallId:toolCall.id,toolName:name,result:outcome.result,isError:outcome.isError,parentToolCallId:callerId}),outcome}takeRecord(toolCallId){let scope=this.scopes.get(toolCallId);if(this.scopes.delete(toolCallId),!!scope)return{calls:scope.recorder.snapshot(),usage:scope.recorder.totalUsage}}clear(){this.scopes.clear()}};import{createHash as createHash5,randomUUID as randomUUID3}from"node:crypto";import{open}from"node:fs/promises";import{dirname as dirname14}from"node:path";import{StringDecoder}from"node:string_decoder";function reduceMutation(current,event){if(current===void 0)return refuse(void 0,{outcome:"not_found",clientMessageId:""});let fingerprint=mutationFingerprint(event),recorded=current.operations[event.effectId];if(recorded!==void 0)return recorded.fingerprint!==fingerprint?refuse(current,answer(current,"effect_id_conflict")):refuse(current,{...recorded.result,replayed:!0});let refusal=mutationRefusal(current,event);if(refusal!==void 0)return{next:{...current,operations:{...current.operations,[event.effectId]:{fingerprint,result:refusal}}},result:refusal,effects:[{type:"persist"}]};let applied=applyMutation(current,event);return{next:{...applied.next,operations:{...current.operations,[event.effectId]:{fingerprint,result:applied.result}}},result:applied.result,effects:[{type:"persist"}]}}function mutationRefusal(current,event){if(current.phase==="delivered")return answer(current,"already_delivered");if(current.phase==="removed")return answer(current,"not_found");if(!sameHandle(current.handle,event.handle))return answer(current,"stale_handle");if(current.phase==="sending")return answer(current,event.type==="retry"?"not_retryable":"sending");if(event.type==="retry")return current.phase==="failed"&¤t.failure?.delivery==="not_delivered"?void 0:answer(current,"not_retryable");if(current.phase==="failed"){if(current.failure?.delivery==="uncertain")return answer(current,"unresolved");if(event.type==="edit")return answer(current,"not_editable")}if(event.expectedRevision!==current.revision)return{...answer(current,"conflict"),currentRevision:current.revision}}function applyMutation(current,event){switch(event.type){case"edit":{let revision=current.revision+1,next={...current,revision,hasEdits:!0,text:event.text,attachments:event.attachments,superseded:[...current.superseded,{lifetimeId:current.handle.lifetimeId,revision:current.revision,text:current.text}]};return{next,result:{...answer(next,"edited"),revision,text:event.text}}}case"remove":{let next=withoutFailure({...current,phase:"removed",removedBy:"remove"});return{next,result:answer(next,"removed")}}case"retry":{let next=withoutFailure({...current,phase:"queued"});return{next,result:{...answer(next,"requeued"),revision:next.revision}}}}}function withoutFailure(input){let{failure:_failure,...rest}=input;return rest}function mutationFingerprint(event){let target=`${event.handle.lifetimeId}/${event.handle.queuedId}`;switch(event.type){case"edit":return JSON.stringify(["edit",target,event.expectedRevision,event.text,event.attachments]);case"remove":return JSON.stringify(["remove",target,event.expectedRevision]);case"retry":return JSON.stringify(["retry",target])}}function sameHandle(a,b){return a.lifetimeId===b.lifetimeId&&a.queuedId===b.queuedId}function answer(input,outcome){return{outcome,clientMessageId:input.clientMessageId,revision:input.revision,lifetimeId:input.handle.lifetimeId}}function refuse(current,result3){return{next:current,result:result3,effects:[]}}function reducePendingInput(current,event){switch(event.type){case"submit":return submit(current,event);case"edit":case"remove":case"retry":return reduceMutation(current,event);default:return current===void 0?unchanged(void 0):reduceLifecycle(current,event)}}function submit(current,event){if(current!==void 0)return current.fingerprint!==event.fingerprint?{next:current,result:answer(current,"client_message_id_conflict"),effects:[]}:{next:current,result:{...answer(current,"replayed"),replayed:!0,text:current.text},effects:[]};let next={clientMessageId:event.clientMessageId,fingerprint:event.fingerprint,handle:event.handle,revision:1,hasEdits:!1,text:event.text,attachments:event.attachments,requestedMode:event.requestedMode,phase:"queued",attemptCount:0,superseded:[],operations:{}};return{next,result:answer(next,"admitted"),effects:[{type:"persist"}]}}function reduceLifecycle(current,event){switch(event.type){case"reject_before_dispatch":return current.phase==="queued"?persist(fail(current,"not_delivered",event.reason)):unchanged(current);case"reserve":return current.phase!=="queued"||!tokenFitsInput(current,event.token)?unchanged(current):{next:{...current,phase:"sending",attempt:event.token,attemptCount:current.attemptCount+1},effects:[{type:"persist"},{type:"dispatch",token:event.token}]};case"release":{if(!holdsAttempt(current,event.token))return unchanged(current);let{attempt:_attempt,...rest}=current;return persist({...rest,phase:"queued"})}case"consumed":return holdsAttempt(current,event.token)?persist(deliver(current,"consumed")):unchanged(current);case"handled":return"token"in event?holdsAttempt(current,event.token)?persist(deliver(current,"handled")):unchanged(current):current.phase==="queued"&&event.lifetimeId===current.handle.lifetimeId?persist(deliver(current,"handled")):unchanged(current);case"refused":return holdsAttempt(current,event.token)?persist(fail(current,"not_delivered",event.reason)):unchanged(current);case"ambiguous":return holdsAttempt(current,event.token)?persist(fail(current,"uncertain",event.reason)):unchanged(current);case"owner_lost":return holdsAttempt(current,event.token)?persist(fail(current,"uncertain","the delivering owner was lost")):unchanged(current);case"witnessed":return uncertainAbout(current,event.attemptId)?persist(deliver(current,"consumed")):unchanged(current);case"non_delivery_proven":return uncertainAbout(current,event.attemptId)?persist(fail(current,"not_delivered",current.failure?.reason??"")):unchanged(current);case"teardown":return current.phase==="sending"?persist(fail(current,"uncertain","torn down during handoff")):unchanged(current);case"cancel":return cancel(current,event.cause,event.consumerFenced);case"rebind":return rebind(current,event.handle,event.attemptsUnsent===!0)}}function cancel(current,cause,consumerFenced){if(!(current.phase==="queued"||current.phase==="sending"&&consumerFenced))return current.phase==="sending"?persist(fail(current,"uncertain","stopped before the handoff was confirmed")):unchanged(current);let next=settled({...current,phase:"removed",removedBy:cause});return{next,effects:cause==="stop"?[{type:"persist"},{type:"restore_to_draft",text:next.text}]:[{type:"persist"}]}}function rebind(current,handle,attemptsUnsent){if(current.phase==="delivered"||current.phase==="removed")return unchanged(current);let rebound={...current,handle,revision:1};if(current.phase!=="sending")return persist(rebound);if(!attemptsUnsent)return persist(fail(rebound,"uncertain","the session reopened during handoff"));let{attempt:_attempt,...unsent}=rebound;return persist({...unsent,phase:"queued"})}function tokenFitsInput(input,token){return token.lifetimeId===input.handle.lifetimeId&&token.clientMessageId===input.clientMessageId}function holdsAttempt(input,token){let attempt2=input.attempt;return input.phase==="sending"&&attempt2!==void 0&&attempt2.attemptId===token.attemptId&&attempt2.ownerId===token.ownerId&&attempt2.writerGeneration===token.writerGeneration&&tokenFitsInput(input,token)}function deliver(input,deliveredBy){return settled({...input,phase:"delivered",...deliveredBy===void 0?{}:{deliveredBy}})}function fail(input,delivery,reason){let{attempt:attempt2,...rest}=input,failedAttempt=attempt2??input.failure?.attempt;return{...rest,phase:"failed",failure:{delivery,reason,...failedAttempt===void 0?{}:{attempt:failedAttempt}}}}function uncertainAbout(input,attemptId){return input.phase==="failed"&&input.failure?.delivery==="uncertain"&&input.failure.attempt?.attemptId===attemptId}function settled(input){let{attempt:_attempt,failure:_failure,...rest}=input;return rest}function persist(next){return{next,effects:[{type:"persist"}]}}function unchanged(current){return{next:current,effects:[]}}function projectPendingInput(input){let base={clientMessageId:input.clientMessageId,text:input.text,requestedMode:input.requestedMode,revision:input.revision,supersededVersions:input.superseded};switch(input.phase){case"queued":{let queued=queuedStatus(input.requestedMode);return input.hasEdits?{...base,state:"edited",statusCode:"edited",statusText:`Edited - ${queued.text}`,actions:["edit","remove","copy"],pendingDecoration:!0}:{...base,state:"queued",statusCode:queued.code,statusText:queued.text,actions:["edit","remove","copy"],pendingDecoration:!0}}case"sending":return{...base,state:"sending",statusCode:"sending",statusText:"Sending",actions:["copy"],pendingDecoration:!0};case"delivered":return input.deliveredBy==="handled"?{...base,state:"delivered",statusCode:"applied",statusText:"Applied",actions:[],pendingDecoration:!1}:{...base,state:"delivered",statusCode:"delivered",statusText:"",actions:[],pendingDecoration:!1};case"removed":return{...base,state:"removed",statusCode:"removed",statusText:"Removed",actions:["copy"],pendingDecoration:!1};case"failed":return failedProjection(base,input.failure)}}function queuedStatus(mode){return mode==="steer"?{code:"queued_steer",text:"Steering - reaches the agent at its next step"}:{code:"queued_follow_up",text:"Queued - sent after this turn"}}function failedProjection(base,failure2){return failure2===void 0||failure2.delivery==="uncertain"?{...base,state:"failed",statusCode:"delivery_unconfirmed",statusText:"Delivery could not be confirmed",actions:["check_delivery","copy"],pendingDecoration:!0,...failure2===void 0?{}:{failure:failure2}}:{...base,state:"failed",statusCode:"failed",statusText:`Failed: ${failure2.reason}`,actions:["retry","remove","copy"],pendingDecoration:!0,failure:failure2}}var PENDING_INPUT_TRANSITION="pending_input_transition",PendingInputStore=class _PendingInputStore{constructor(options){this.inputs=new Map,this.listeners=new Set,this.gate=Promise.resolve(),this.cursor=0,this.options=options}static async open(options){let store=new _PendingInputStore(options);for(let record8 of await options.journal.read()){for(let input of[record8.input,...record8.batch??[]])store.inputs.set(input.clientMessageId,input);store.cursor=Math.max(store.cursor,record8.cursor)}for(let input of[...store.inputs.values()]){if(input.phase==="delivered"||input.phase==="removed")continue;let handle={lifetimeId:options.lifetimeId,queuedId:options.nextQueuedId()};await store.commit(input.clientMessageId,{type:"rebind",handle,attemptsUnsent:options.uncommittedAttemptsAreUnsent===!0})}return store}submit(event){return this.serialize(()=>this.admit(event))}apply(clientMessageId,event){return this.serialize(()=>this.commit(clientMessageId,event))}stop(items,consumerFenced){return this.serialize(async()=>{let removed=[],retained=[],conflicts=[],stale=[];for(let item of items){let current=this.inputs.get(item.clientMessageId);if(current===void 0)continue;if(!sameHandle2(current.handle,item.handle)){stale.push(item.clientMessageId);continue}if(current.phase==="queued"&¤t.revision!==item.expectedRevision){conflicts.push({clientMessageId:item.clientMessageId,currentRevision:current.revision});continue}await this.commit(item.clientMessageId,{type:"cancel",cause:"stop",consumerFenced}),this.inputs.get(item.clientMessageId)?.phase==="removed"&¤t.phase!=="removed"?removed.push(item.clientMessageId):retained.push(item.clientMessageId)}return{removed,conflicts,retained,stale}})}transaction(work){return this.serialize(()=>work({submit:event=>this.admit(event),apply:(clientMessageId,event)=>this.commit(clientMessageId,event),applyAll:changes=>this.commitMany(changes),current:clientMessageId=>this.inputs.get(clientMessageId)}))}current(clientMessageId){return this.inputs.get(clientMessageId)}read(clientMessageId){let input=this.inputs.get(clientMessageId);return input===void 0?{status:"not_admitted",clientMessageId}:{status:"admitted",projection:projectPendingInput(input)}}get throughCursor(){return this.cursor}snapshot(){return[...this.inputs.values()].map(projectPendingInput)}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}serialize(operation){let guarded=()=>this.unavailable!==void 0?Promise.reject(new PendingInputStoreUnavailableError(this.unavailable)):operation(),run2=this.gate.then(guarded,guarded);return this.gate=run2.catch(()=>{}),run2}admit(event){let handle=this.inputs.get(event.clientMessageId)?.handle??{lifetimeId:this.options.lifetimeId,queuedId:this.options.nextQueuedId()};return this.commit(event.clientMessageId,{...event,type:"submit",handle})}async commit(clientMessageId,event){return(await this.commitMany([{clientMessageId,event}]))[0]}async commitMany(changes){let results=[],committed=[],staged=new Map;for(let{clientMessageId,event}of changes){let current=staged.get(clientMessageId)??this.inputs.get(clientMessageId),decision=reducePendingInput(current,event),result3=decision.result?.clientMessageId===""?{...decision.result,clientMessageId}:decision.result;results.push(result3),!(decision.next===void 0||decision.effects.length===0)&&(staged.set(clientMessageId,decision.next),committed.push({next:decision.next,decision:{...decision,result:result3}}))}let[first,...rest]=committed;if(first===void 0)return results;let record8={type:PENDING_INPUT_TRANSITION,cursor:this.cursor+1,input:first.next,...first.decision.result===void 0?{}:{result:first.decision.result},...rest.length===0?{}:{batch:rest.map(entry=>entry.next)}};try{await this.options.journal.append(record8)}catch(error2){throw isUncertainAppend(error2)&&(this.unavailable=error2),error2}this.cursor=record8.cursor;for(let{next}of committed)this.inputs.set(next.clientMessageId,next);let projections=committed.map(({next})=>projectPendingInput(next));for(let listener of this.listeners)try{listener(projections,record8.cursor)}catch(error2){this.reportListenerError(error2)}for(let{next,decision}of committed)for(let effect of decision.effects)effect.type==="dispatch"&&this.options.dispatch?.(effect.token,next),effect.type==="restore_to_draft"&&this.options.restoreToDraft?.(effect.text);return results}reportListenerError(error2){let report=this.options.onListenerError;report!==void 0?report(error2):queueMicrotask(()=>{throw error2})}};function isUncertainAppend(error2){return error2 instanceof Error&&"code"in error2&&error2.code==="pending_input_append_uncertain"}var PendingInputStoreUnavailableError=class extends Error{constructor(cause){super("Pending inputs are unavailable after a failed save; reopen the session to recover them.",{cause}),this.code="pending_input_store_unavailable",this.name="PendingInputStoreUnavailableError"}};function sameHandle2(left,right){return left.lifetimeId===right.lifetimeId&&left.queuedId===right.queuedId}function fsJournalDurability(platform5=process.platform){return{syncFile:path14=>syncPath(path14),syncDirectory:path14=>platform5==="win32"?Promise.resolve():syncPath(path14)}}var SessionPendingInputJournal=class{constructor(session,durability=fsJournalDurability()){this.directorySynced=!1,this.session=session,this.durability=durability}async append(record8){if(!this.session.isPersisted()){this.session.appendCustomEntry(PENDING_INPUT_TRANSITION,record8);return}await this.session.persistHeaderNow();let file=this.session.getSessionFile();if(file===void 0||!this.session.isTranscriptFlushed())throw new PendingInputNotDurableError;this.session.appendCustomEntry(PENDING_INPUT_TRANSITION,record8);try{await this.durability.syncFile(file),this.directorySynced||(await this.durability.syncDirectory(dirname14(file)),this.directorySynced=!0)}catch(error2){throw new PendingInputAppendUncertainError(record8.cursor,error2)}}async read(){let records=(await this.transitionEntries()).map(entry=>parseRecord(entry.data,entry.id));return records.sort((a,b)=>a.cursor-b.cursor),records.forEach((record8,index)=>{if(record8.cursor!==index+1)throw new PendingInputJournalGapError(index+1)}),records}async transitionEntries(){let file=this.session.isPersisted()&&this.session.isTranscriptFlushed()?this.session.getSessionFile():void 0;return file===void 0?this.session.getEntries().flatMap(entry=>entry.type==="custom"&&entry.customType===PENDING_INPUT_TRANSITION?[{data:entry.data,id:entry.id}]:[]):scanTransitions(file).catch(error2=>{if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return[];throw error2})}};async function scanTransitions(file){let handle=await open(file,"r");try{let decoder=new StringDecoder("utf8"),buffer=Buffer.allocUnsafe(1024*1024),entries=[],pending="",lineNumber=0;for(;;){let{bytesRead}=await handle.read(buffer,0,buffer.length,null);if(bytesRead===0)break;pending+=decoder.write(buffer.subarray(0,bytesRead));let start=0,newline=pending.indexOf(`
|
|
132
132
|
`,start);for(;newline!==-1;){lineNumber+=1;let entry=transitionOf(pending.slice(start,newline),lineNumber);entry!==void 0&&entries.push(entry),start=newline+1,newline=pending.indexOf(`
|
|
133
133
|
`,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,cause){super(`Pending input transition ${cursor} was written but could not be synced; 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(path14){let handle=await open(path14,"r");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,entry)=>held||entry.type==="custom"&&entry.customType===PENDING_INPUT_TRANSITION},SessionPendingInputs=class{constructor(options){this.lifetimeId=randomUUID3(),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??randomUUID3(),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 read=store?.read(clientMessageId);return read?.status==="admitted"?{clientMessageId,status:"admitted",projection:read.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 createHash5("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}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await 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 systemPrompt=await untilAborted(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state2=agent.state,model=state2.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state2.reasoningBaseline,state2.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state2.thinkingSelection!==void 0&&(options.thinkingSelection=state2.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt,messages:[],tools:state2.tools.slice(),...state2.declaredTools!==void 0?{declaredTools:state2.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve53=>{onAbort=()=>resolve53(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 statSync6}from"fs";import{basename as basename7,dirname as dirname15,join as join19,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=basename7(filePath).replace(/\.md$/,""),description=typeof frontmatter.description=="string"?frontmatter.description:"";if(!description){let firstLine2=body.split(`
|
|
134
|
-
`).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 entry of entries){let fullPath=join19(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync6(fullPath).isFile()}catch{continue}if(isFile&&entry.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=join19(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:statSync6(resolvedPath).isDirectory()?resolvedPath:dirname15(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=statSync6(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];return{category,provider,...diagnostic2?.httpStatus===void 0?{}:{httpStatus:diagnostic2.httpStatus},...diagnostic2?.code===void 0?{}:{code:diagnostic2.code},...detail}}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?.()}}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 pickVariant(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=pickVariant(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),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){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(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries.findIndex(entry=>normalizedBase(entry)===base&&explicitThinkingLevel(entry)===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(errorMessage7){return stripProviderRequestIds(errorMessage7).toLowerCase()}function isTransportFailureText(normalizedMessage){return TRANSPORT_FAILURE.test(normalizedMessage)}function isPureNetworkTransient(errorMessage7){if(errorMessage7===void 0)return!1;let message=normalize(errorMessage7);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 canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy,boundary="turn"){let heldForNetworkBlip=this.heldForNetworkBlip&&boundary==="continuation";boundary==="turn"&&(this.heldForNetworkBlip=!1);let state2=this.state,current=this.deps.getCurrentSelector();if(!state2||state2.pinned||!current)return!1;let selector=parseFallbackSelector(state2.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(state2,revertPolicy)))return!1;let thinking=current.thinkingLevel===state2.lastAppliedThinkingLevel?state2.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:state2.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state2.originalSelector,...cause}),!0}originalRecovered(state2,revertPolicy){if(revertPolicy!=="cooldown-expiry")return!1;let originalSelector=state2.originalSelector,original=parseFallbackSelector(originalSelector,this.deps.registry);return original&&state2.originalThinkingLevel!==void 0&&this.deps.cooldowns.isSuppressed(rungSelector({...original,thinkingLevel:state2.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 state2=this.state;if(!state2)return!1;state2.pinnedByRefusal=!1;let wasPinned=state2.pinned;return state2.pinned=state2.pinnedByBilling,!wasPinned||state2.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state2.chainKey,originalSelector:state2.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,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random,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:errorMessage7}){let resetMs=errorMessage7===void 0?void 0:usageLimitResetMs(errorMessage7,this.wallNow()),message=stripProviderRequestIds(errorMessage7??"").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(state2,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state2.attempt-1);if(state2.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state2.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state2.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state2.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state2.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state2.hintDeadlineMs,cumulativeHintedWaitMs:state2.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,fchmodSync,mkdirSync as mkdirSync4,openSync,writeSync}from"node:fs";import{dirname as dirname16,join as join20}from"node:path";var DEFAULT_MAX_BYTES3=5*1024*1024,MAX_STRING_LENGTH=200,BLOCKED_KEY=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join20(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine(level,event,data);writeLine(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 validMaxBytes(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?Math.floor(value):DEFAULT_MAX_BYTES3}function formatLine(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText(event)};if(data!==void 0){for(let[key,value]of safeEntries(data))if(ALLOWED_DATA_KEY.test(key)&&!BLOCKED_KEY.test(key)){let safeValue=serializeValue(value,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine(filePath,line,maxBytes){mkdirSync4(dirname16(filePath),{recursive:!0,mode:448});let text3=`${line}
|
|
134
|
+
`).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 entry of entries){let fullPath=join19(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync6(fullPath).isFile()}catch{continue}if(isFile&&entry.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=join19(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:statSync6(resolvedPath).isDirectory()?resolvedPath:dirname15(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=statSync6(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?.()}}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 pickVariant(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=pickVariant(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),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){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(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries.findIndex(entry=>normalizedBase(entry)===base&&explicitThinkingLevel(entry)===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(errorMessage7){return stripProviderRequestIds(errorMessage7).toLowerCase()}function isTransportFailureText(normalizedMessage){return TRANSPORT_FAILURE.test(normalizedMessage)}function isPureNetworkTransient(errorMessage7){if(errorMessage7===void 0)return!1;let message=normalize(errorMessage7);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 canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy,boundary="turn"){let heldForNetworkBlip=this.heldForNetworkBlip&&boundary==="continuation";boundary==="turn"&&(this.heldForNetworkBlip=!1);let state2=this.state,current=this.deps.getCurrentSelector();if(!state2||state2.pinned||!current)return!1;let selector=parseFallbackSelector(state2.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(state2,revertPolicy)))return!1;let thinking=current.thinkingLevel===state2.lastAppliedThinkingLevel?state2.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:state2.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state2.originalSelector,...cause}),!0}originalRecovered(state2,revertPolicy){if(revertPolicy!=="cooldown-expiry")return!1;let originalSelector=state2.originalSelector,original=parseFallbackSelector(originalSelector,this.deps.registry);return original&&state2.originalThinkingLevel!==void 0&&this.deps.cooldowns.isSuppressed(rungSelector({...original,thinkingLevel:state2.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 state2=this.state;if(!state2)return!1;state2.pinnedByRefusal=!1;let wasPinned=state2.pinned;return state2.pinned=state2.pinnedByBilling,!wasPinned||state2.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state2.chainKey,originalSelector:state2.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,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random,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:errorMessage7}){let resetMs=errorMessage7===void 0?void 0:usageLimitResetMs(errorMessage7,this.wallNow()),message=stripProviderRequestIds(errorMessage7??"").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(state2,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state2.attempt-1);if(state2.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state2.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state2.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state2.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state2.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state2.hintDeadlineMs,cumulativeHintedWaitMs:state2.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,fchmodSync,mkdirSync as mkdirSync4,openSync,writeSync}from"node:fs";import{dirname as dirname16,join as join20}from"node:path";var DEFAULT_MAX_BYTES3=5*1024*1024,MAX_STRING_LENGTH=200,BLOCKED_KEY=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join20(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine(level,event,data);writeLine(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 validMaxBytes(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?Math.floor(value):DEFAULT_MAX_BYTES3}function formatLine(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText(event)};if(data!==void 0){for(let[key,value]of safeEntries(data))if(ALLOWED_DATA_KEY.test(key)&&!BLOCKED_KEY.test(key)){let safeValue=serializeValue(value,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine(filePath,line,maxBytes){mkdirSync4(dirname16(filePath),{recursive:!0,mode:448});let text3=`${line}
|
|
135
135
|
`;rotateLogIfNeeded(filePath,Buffer.byteLength(text3),maxBytes);let descriptor=openSync(filePath,"a",384);try{writeSync(descriptor,text3),fchmodSync(descriptor,384)}finally{closeSync(descriptor)}}function serializeValue(value,seen){if(typeof value=="string")return safeText(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=>serializeValue(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value))if(!BLOCKED_KEY.test(key)){let safeValue=serializeValue(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 safeText(value){let redacted=value.replace(SENSITIVE_TEXT,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH?redacted:`${redacted.slice(0,MAX_STRING_LENGTH-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(entry,key){return baseSelector(entry)!==baseSelector(key)?!1:(entry.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(entry=>typeof entry!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry of entries){let bareEntry=parseBareSelector(entry);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry,key));continue}let parsedEntry=parseFallbackSelector(entry,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry,key));continue}parsedKey&&isRungDuplicate(parsedEntry,parsedKey)&&warnings.push(`Fallback chain entry "${entry}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry}"`,warnings)}}return warnings}function createSessionControlActions(deps){return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();return host===void 0?{status:"unsupported",reason:"unsupported_mode"}:host.register(options)},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow()}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized"))}}function isAssistantEntry(entry){return entry.type==="message"&&entry.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry))continue;let{message}=entry;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}import{closeSync as closeSync2,fchmodSync as fchmodSync2,mkdirSync as mkdirSync5,openSync as openSync2,writeSync as writeSync2}from"node:fs";import{dirname as dirname17,join as join21}from"node:path";var DEFAULT_MAX_BYTES4=5*1024*1024,MAX_STRING_LENGTH2=200,DEBUG_PREFIX=`[${APP_NAME}-session]`,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:action|attemptId|disposition|stage|error|mode|count|willRetry|deferAdmission|delivered|restored|cause|accepted|skipped|rejectionCause|reason|durationMs|kind|retryable|phase|op|bytes|generation|requestId|tokens|tokensBefore|tokensAfter|contextWindow|attempt|aborted|sessionId|role|provider|model|source|actor|from|to|duringTurn|persistDefault|extension|handlerEvent)$/,SENSITIVE_TEXT2=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createSessionLogger(agentDir,options={}){if(typeof agentDir!="string"||agentDir.length===0)return{debug:()=>{},info:()=>{},warn:()=>{}};let filePath=join21(agentDir,"logs","session.log"),maxBytes=validMaxBytes2(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine2(level,event,options.context?{...options.context(),...data}:data);options.sink?.(line),writeLine2(filePath,line,maxBytes),(options.mirrorToStderr??envValue("SESSION_DEBUG")==="1")&&console.error(DEBUG_PREFIX,line)}catch(error2){reportedWriteFailure2||(reportedWriteFailure2=!0,console.error("Unable to write session 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 entry={ts:new Date().toISOString(),level,event:safeText2(event)};if(data!==void 0){for(let[key,value]of Object.entries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine2(filePath,line,maxBytes){mkdirSync5(dirname17(filePath),{recursive:!0,mode:448});let text3=`${line}
|
|
136
136
|
`;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){if(typeof value=="string")return safeText2(value);if(typeof value=="number"||typeof value=="boolean"||value===null)return value;if(typeof value=="bigint")return value.toString()}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 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,errorMessage7){if(!(sentReasoning!==void 0||errorMessage7===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage7))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.
|
|
137
137
|
|
|
@@ -247,8 +247,8 @@ ${renderToolDiff(generateAddedContentDiff(normalizedContent,maxLines),{filePath:
|
|
|
247
247
|
|
|
248
248
|
${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",line)).join(`
|
|
249
249
|
`)}`}remaining>0&&(text3+=`${theme2.fg("muted",`
|
|
250
|
-
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text3}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str(renderArgs?.file_path??renderArgs?.path),fileContent=str(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text3=context.lastComponent??new Text("",0,0);return text3.setText(output),text3}};var writeSchema=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path14,content)=>fsWriteFile2(path14,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{...options?.operations!==void 0||filesystemPolicy!==void 0?{serverPinned:!0}:{},name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path14,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path14,ctx?.cwd||cwd),dir=dirname23(absolutePath);return withFileMutationQueue(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path14}`}],details:createWriteDetails(path14,content,baseline)}})},...writeRenderers}}function createWriteTool(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),glob:createGlobToolDefinition(cwd,options?.glob),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool(cwd,options?.bash),createEditTool(cwd,options?.edit),createWriteTool(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var TURN_DEADLINE_ENTRY_TYPE="deadline-stop";function isDeadlineStopData(data){if(data===null||typeof data!="object")return!1;let candidate=data;return(candidate.kind==="inactivity"||candidate.kind==="max_runtime")&&typeof candidate.limitMs=="number"&&typeof candidate.elapsedMs=="number"}function deadlineStopPendingSinceLastTurn(entries){for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(entry.type==="message"&&entry.message?.role==="user")return;if(entry.type==="custom"&&entry.customType===TURN_DEADLINE_ENTRY_TYPE&&isDeadlineStopData(entry.data))return entry.data}}function resolveTurnDeadlineSettings(configured){let milliseconds=(value,fallback,minimum)=>typeof value!="number"||!Number.isFinite(value)||value<0?fallback:value===0?0:Math.max(minimum,Math.floor(value));return{inactivityMs:milliseconds(configured.turn_inactivity_ms,36e5,6e4),maxRuntimeMs:milliseconds(configured.turn_max_runtime_ms,216e5,1)}}async function within(work,ms){let timer,expired=new Promise(resolve53=>{timer=setTimeout(()=>resolve53(!1),ms)});try{return await Promise.race([work.then(()=>!0,()=>!1),expired])}finally{clearTimeout(timer)}}var AgentDeadlineTracker=class{get current(){return this.deadlineValue}constructor(session,settings,now2=Date.now){this.startedAtMs=0,this.session=session,this.settings=settings,this.now=now2}arm(){this.clearTimers(),this.deadlineValue=void 0,this.startedAtMs=this.now();let{inactivityMs,maxRuntimeMs}=this.settings();inactivityMs>0&&(this.inactivityTimer=setTimeout(()=>this.fire("inactivity"),inactivityMs)),maxRuntimeMs>0&&(this.maxRuntimeTimer=setTimeout(()=>this.fire("max_runtime"),maxRuntimeMs))}renew(){if(this.deadlineValue!==void 0||this.startedAtMs===0)return;let{inactivityMs}=this.settings();inactivityMs<=0||(this.inactivityTimer!==void 0&&clearTimeout(this.inactivityTimer),this.inactivityTimer=setTimeout(()=>this.fire("inactivity"),inactivityMs))}disarm(){this.clearTimers(),this.startedAtMs=0}clearHold(){if(this.deadlineValue===void 0){this.renew();return}this.session.isIdle&&(this.deadlineValue=void 0)}clearTimers(){this.inactivityTimer!==void 0&&clearTimeout(this.inactivityTimer),this.maxRuntimeTimer!==void 0&&clearTimeout(this.maxRuntimeTimer),this.inactivityTimer=void 0,this.maxRuntimeTimer=void 0}fire(kind){this.expire(kind).catch(error2=>this.session._warnDeadline("turn_deadline_failed",error2 instanceof Error?error2.message:String(error2)))}async expire(kind){if(this.deadlineValue!==void 0||this.startedAtMs===0)return;let{inactivityMs,maxRuntimeMs}=this.settings(),limitMs=kind==="inactivity"?inactivityMs:maxRuntimeMs;if(limitMs<=0)return;if(kind==="inactivity"&&this.session.isRetryInFlight){this.inactivityTimer=void 0,this.renew();return}this.clearTimers();let deadline={kind,limitMs,elapsedMs:this.now()-this.startedAtMs};this.deadlineValue=deadline;try{this.session._recordDeadlineStop(deadline)}catch(error2){this.session._warnDeadline("turn_deadline_record_failed",error2 instanceof Error?error2.message:String(error2))}let abortError,abortStartedAt=this.now(),aborting=this.session.abortTurnForDeadline().catch(error2=>{abortError=error2 instanceof Error?error2.message:String(error2)}),settled2=await within(aborting,1e4);settled2||(this.session.releaseHeldExtensionHandlers(),settled2=await within(aborting,1e4)),abortError!==void 0&&this.session._warnDeadline("turn_deadline_abort_failed",abortError),!(settled2&&abortError===void 0)&&(this.session.isIdle||this.session._warnDeadline("turn_deadline_unsettled",`turn still running ${this.now()-abortStartedAt} ms after the ${kind} deadline abort`))}};function buildDeadlineStopNotice(deadline){let limit=deadline.limitMs<6e4?`${Math.max(1,Math.round(deadline.limitMs/1e3))} s`:`${Math.round(deadline.limitMs/6e4)} min`;return`turn stopped: ${deadline.kind==="inactivity"?`no tool progress for ${limit} (turn_inactivity_ms)`:`turn hit its maximum runtime of ${limit} (turn_max_runtime_ms)`}. Action: send a message to continue, or raise the limit in settings`}function
|
|
251
|
-
`)===text3?textBlocks.map(block=>({type:"text",text:block})):[{type:"text",text:text3}]}function keepsTextBlocksVerbatim(textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&parseAskUserAnswerFrame(textBlocks[0]??"")!==void 0}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"||name==="glob"?`tool.${name}({ pattern: "...", path: "..." })`:name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet,TURN_END_SKIPPED_AFTER_SHUTDOWN="turn_end skipped: the session shut down during this turn, so its last response was not saved";function withProviderFailure(event){let failure2=providerFailureOf(event.messages);return failure2===void 0?event:{...event,failure:failure2}}function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},REQUIRED_COMPACTION_ERROR_MESSAGE="Context remains above the compaction threshold because compaction did not complete",RequiredCompactionError=class extends Error{constructor(){super(REQUIRED_COMPACTION_ERROR_MESSAGE),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`The retried request never started streaming${retryTimeoutMs===void 0?"":` after ${Math.round(retryTimeoutMs/1e3)}s`}.`+(streamStartTimeoutMs===void 0?" (Its stream-start guard is off; to bound or extend this wait, set retry.provider.streamStartTimeoutMs, 0 disables.)":` (Stream-start guard: ${Math.round(streamStartTimeoutMs/1e3)}s; to allow longer, raise retry.provider.streamStartTimeoutMs, 0 disables.)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._runContinuations=new AgentRunContinuations,this._handlerTurnScope=0,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._continueWithQueuedInput=!1,this._sessionStartDispatching=!1,this._admissionIdleWaiters=[],this._engineTurnStarts=[],this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._nextQueuedId=0,this._queueClearRecorded=Promise.resolve(),this._queuedMessages=new Map,this._deliveredQueuedIds=new Set,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._requestShapeRecovery=new RequestShapeRecovery,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._disposed=!1,this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._toolChildHostTargets=new Map,this._toolChildClosed=Promise.resolve(),this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._userActivity=createUserActivitySource(),this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._shownThinkingClampWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._runContinuations.observe(event),this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled2=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled2)},this._promptSurface=config.promptSurface,this._browserEngine=config.browserEngine,this.agent=config.agent,this.sessionManager=config.sessionManager,this._pendingInputs=new SessionPendingInputs({sessionManager:this.sessionManager,nextQueuedId:()=>this._mintQueuedId(),onChange:update=>this._emit({type:"pending_input_update",...update})}),this.agent.queuedInputPort=this._pendingInputs.queuedInputPort(),this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})});let toolRuntime=config.toolRuntime??"in-process",hostRefusal=toolRuntimeHostRefusal(toolRuntime);if(hostRefusal!==void 0)throw new ToolRuntimeUnsupportedHostError(hostRefusal);let hostCalls=createSessionHostCallHandler({cwd:this._cwd,executeNested:(parentToolCallId,name,args,signal)=>this._executeNestedToolCall(parentToolCallId,name,args,{signal}),callableToolNames:()=>this._callableToolNames(),target:kind=>this._toolChildHostTargets.get(kind),filesystemPolicy:()=>this._filesystemPolicy});this._toolChild=toolRuntime==="child"?new SessionToolChild({dir:join24(this._agentDir,"tool-children",this.sessionManager.getSessionId()),cwd:this._cwd,moduleRoots:()=>[...toolChildModuleRoots(this._extensionRunner.getAllRegisteredTools()),...childModuleRoots(this._extensionRunner.getAllChildModules())],onRecord:record8=>{if(this._emit({type:"session_tool_child",...record8}),record8.state==="exited")for(let job of this._childJobs())job.childExited?.(record8.generation)},onHostCall:hostCalls,onWake:wake=>{for(let job of this._childJobs())job.kind===wake.source&&job.wake?.(wake.value,wake.generation)}}):void 0,this._toolDispatcher=createToolDispatcher({runtime:toolRuntime,notify:(event,data)=>this._sessionLogger.info(event,data),hostCalls,onModuleStuck:notice2=>{this._sessionLogger.warn("offload_module_stuck",{modulePath:notice2.modulePath,export:notice2.export,deadlineMs:notice2.deadlineMs,files:notice2.files}),this._emit({type:"offload_module_stuck",...notice2})},...this._toolChild===void 0?{}:{childRunner:this._toolChild.runner,childKindRunner:this._toolChild.kindRunner}}),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow,void 0,config.fallbackWallNow??config.fallbackNow??Date.now);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,wallNow:config.fallbackWallNow??config.fallbackNow??Date.now,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,origin:{source:reason},emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},isCandidateRefusal:error2=>error2 instanceof ModelUsabilityBudgetError,emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._deadlineTracker=new AgentDeadlineTracker(this,()=>resolveTurnDeadlineSettings({turn_inactivity_ms:this.settingsManager.getTurnInactivityMs(),turn_max_runtime_ms:this.settingsManager.getTurnMaxRuntimeMs()})),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal,callbacks){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};return retryTransientCall(()=>this._resolveSummarizationRequestAuth(model,thinkingLevel,signal),isOAuthRefreshUnavailableError,this.settingsManager.getRetrySettings(),signal,callbacks??this._summarizationRetryCallbacks({source:"branchSummary"}))}async _resolveSummarizationRequestAuth(model,thinkingLevel,signal){if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted||isOAuthRefreshUnavailableError(error2))throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model,slash=override?.indexOf("/")??-1,configured=override&&slash>0?this._modelRuntime.getModel(override.slice(0,slash),override.slice(slash+1)):void 0,usable2=model=>!this._retryFallback.isProviderSpent(model.provider);if(usable2(sessionModel))return configured&&usable2(configured)?configured:sessionModel;let pending=this._pendingModelSwitch?.model;if(pending&&usable2(pending))return pending;if(configured&&usable2(configured))return configured;let requiredContextWindow=estimateMessagesTokens(this._runtimeMessages())+this._getCompactionSettings().reserveTokens,available=this._modelRuntime.getModels().find(model=>usable2(model)&&model.contextWindow>=requiredContextWindow&&this._modelRuntime.hasConfiguredAuth(model.provider));if(available)return available;throw new AccountUsageLimitError(sessionModel.provider,this._retryFallback.accountError(sessionModel.provider))}async _getCompactionRequestAuth(model,signal,callbacks){return{...await this._getSummarizationRequestAuth(model,signal,callbacks),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id,void 0,void 0,void 0,{origin:{source:"restore"},duringTurn:!1})}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err){throw this._toolExecutionDepth--,err}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err){throw err instanceof Error?err:new Error(`Extension failed, blocking execution: ${String(err)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state2=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state:state2});if(route.state!==void 0&&route.state!==state2){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:this._disposed?TURN_END_SKIPPED_AFTER_SHUTDOWN:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=this._requestShapeRecovery.apply(previousTransformContext?await previousTransformContext(messages,signal):messages),model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){if(this._logSessionEvent(event),event.type==="entry_appended"&&(event={...event,entry:describeUsageLimitEntry(event.entry)}),event.type==="retry_fallback_exhausted"&&usageLimitScope(event.lastError)==="account"&&(event={...event,lastError:new AccountUsageLimitError(this.model?.provider??"",event.lastError).message}),event.type==="agent_end"&&(event={...event,messages:event.messages.map(message=>message.role==="assistant"?describeUsageLimitMessage(message):message)}),(event.type==="message_end"||event.type==="message_start"||event.type==="message_update")&&event.message.role==="assistant"){let message=describeUsageLimitMessage(event.message);event=event.type==="message_update"?{...event,message,assistantMessageEvent:{...event.assistantMessageEvent,..."error"in event.assistantMessageEvent?{error:message}:{},..."partial"in event.assistantMessageEvent?{partial:message}:{}}}:{...event,message}}for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID5(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}whenToolChildClosed(){return this._toolChildClosed}toolChildRow(){return this._toolChild?.row()??{state:"none"}}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve53=>{this._resolveIdleWait=resolve53})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve53=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve53()}async _emitAgentSettled(agentEnd){if(this.agent.state.isStreaming&&await this._runContinuations.idleOrContinued(agentEnd,()=>this.agent.waitForIdle())){this._abortProvenance.closeAgentEndBoundary();return}if(!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseFullHistoryView(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches()}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim2=>claim2.disposition));if(!dispositions.includes("started")&&((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&!(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork))){if(settledRepetitiveTurnPause(this.sessionManager.getBranch()))try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_PAUSED_ENTRY_TYPE,{reason:"repetition",rule:"repetitive-turns",customType:"ttsr-injection",at:Date.now()}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_PAUSED_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}this.releaseSettledSessionMemory(),this._deadlineTracker.disarm(),this._emit({type:"agent_idle"})}}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._deadlineTracker.arm(),this._handlerTurnScope+=1,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared,userMessage2),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve53=>{this._retryResolve=resolve53}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens(messages);return shouldCompact(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens(this._runtimeMessages());return shouldCompact(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage7=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage7);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);event.type==="agent_start"&&(this._abortCause=void 0);let abortCause=event.type==="agent_end"&&this.currentAbortSource!==void 0?this._abortCause:void 0;abortCause!==void 0&&(this._abortCause=void 0),this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?withProviderFailure({...event,willRetry:agentEndWillRetry,...this._deadlineTracker.current!==void 0?{aborted:!0,abortSource:"system",deadline:this._deadlineTracker.current}:{},...abortCause===void 0?{}:{abortCause}}):event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){this._observeEngineTurnMessage(event.message);let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendOwnedMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage7=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage7),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage7}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage7}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.noteServed(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&(isHealthExhaustionFailure(msg.errorMessage)||usageLimitScope(msg.errorMessage)==="account")&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),requestShape=this._requestShapeRecovery.decide(msg,this.model?.contextWindow??0);if(requestShape==="not-request-shape"&&this._requestShapeRecovery.endStreak(),requestShape!=="not-request-shape"&&!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled){let requestShapeOutcome=await this._handleRequestShapeRejection(msg,requestShape);if(requestShapeOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}retryContinuationBlocked||=requestShapeOutcome==="blocked"}let retryableError=requestShape==="not-request-shape"&&this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled(event))}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){this._disposed=!0,this._deadlineTracker.disarm();for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed");let inProcessClosed=this._toolDispatcher.dispose().catch(error2=>this._sessionLogger.warn("tool_dispatcher_close_failed",{error:String(error2)})),childClosed=this._toolChild?.close().catch(error2=>this._sessionLogger.warn("tool_child_close_failed",{error:String(error2)}))??Promise.resolve();this._toolChildClosed=Promise.all([inProcessClosed,childClosed]).then(()=>{}),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unregisterMemoryReport(),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activeWakeSources(){return this._wakeSources.activeSources}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get startupThinkingClamp(){return this._startupThinkingClamp}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isRetryInFlight(){return this._retryPromise!==void 0}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}get currentDeadline(){return this._deadlineTracker.current}_warnDeadline(event,detail){this._sessionLogger.warn(event,{detail})}async abortTurnForDeadline(){await this._abortActiveAgentAndRetry("system"),this.isIdle||await this._waitForIdleAfterAbort()}async _waitForIdleAfterAbort(){let idle=this.waitForIdle(),graceTimer,graceOver=new Promise(resolve53=>{graceTimer=setTimeout(()=>resolve53(!0),1e4)}),stillHeld=await Promise.race([idle.then(()=>!1),graceOver]);clearTimeout(graceTimer),stillHeld&&this._extensionRunner.releaseHeldHandlers(this._handlerTurnScope),await idle}releaseHeldExtensionHandlers(){return this._extensionRunner.releaseHeldHandlers(this._handlerTurnScope)}_recordDeadlineStop(deadline){this._emitEntryAppended(this.sessionManager.appendCustomEntry(TURN_DEADLINE_ENTRY_TYPE,{kind:deadline.kind,limitMs:deadline.limitMs,elapsedMs:deadline.elapsedMs,at:Date.now()}))}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}registerToolChildHostTarget(kind,target){return this._toolChildHostTargets.set(kind,target),()=>{this._toolChildHostTargets.get(kind)===target&&this._toolChildHostTargets.delete(kind)}}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID5()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err){throw new ExecuteToolError("invalid_params",toolName,err instanceof Error?err.message:String(err),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err){result3={content:[{type:"text",text:err instanceof Error?err.message:String(err)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_childJobs(){return this._extensionRunner.getAllRegisteredTools().flatMap(tool=>tool.definition.childJob===void 0?[]:[tool.definition.childJob])}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}recordUserActivity(kind){this._userActivity.emit(kind)}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text3){if(!text3)return;let oneLine3=text3.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
250
|
+
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text3}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str(renderArgs?.file_path??renderArgs?.path),fileContent=str(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text3=context.lastComponent??new Text("",0,0);return text3.setText(output),text3}};var writeSchema=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path14,content)=>fsWriteFile2(path14,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{...options?.operations!==void 0||filesystemPolicy!==void 0?{serverPinned:!0}:{},name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path14,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path14,ctx?.cwd||cwd),dir=dirname23(absolutePath);return withFileMutationQueue(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path14}`}],details:createWriteDetails(path14,content,baseline)}})},...writeRenderers}}function createWriteTool(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),glob:createGlobToolDefinition(cwd,options?.glob),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool(cwd,options?.bash),createEditTool(cwd,options?.edit),createWriteTool(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var TURN_DEADLINE_ENTRY_TYPE="deadline-stop";function isDeadlineStopData(data){if(data===null||typeof data!="object")return!1;let candidate=data;return(candidate.kind==="inactivity"||candidate.kind==="max_runtime")&&typeof candidate.limitMs=="number"&&typeof candidate.elapsedMs=="number"}function deadlineStopPendingSinceLastTurn(entries){for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(entry.type==="message"&&entry.message?.role==="user")return;if(entry.type==="custom"&&entry.customType===TURN_DEADLINE_ENTRY_TYPE&&isDeadlineStopData(entry.data))return entry.data}}function resolveTurnDeadlineSettings(configured){let milliseconds=(value,fallback,minimum)=>typeof value!="number"||!Number.isFinite(value)||value<0?fallback:value===0?0:Math.max(minimum,Math.floor(value));return{inactivityMs:milliseconds(configured.turn_inactivity_ms,36e5,6e4),maxRuntimeMs:milliseconds(configured.turn_max_runtime_ms,216e5,1)}}async function within(work,ms){let timer,expired=new Promise(resolve53=>{timer=setTimeout(()=>resolve53(!1),ms)});try{return await Promise.race([work.then(()=>!0,()=>!1),expired])}finally{clearTimeout(timer)}}var AgentDeadlineTracker=class{get current(){return this.deadlineValue}constructor(session,settings,now2=Date.now){this.startedAtMs=0,this.session=session,this.settings=settings,this.now=now2}arm(){this.clearTimers(),this.deadlineValue=void 0,this.startedAtMs=this.now();let{inactivityMs,maxRuntimeMs}=this.settings();inactivityMs>0&&(this.inactivityTimer=setTimeout(()=>this.fire("inactivity"),inactivityMs)),maxRuntimeMs>0&&(this.maxRuntimeTimer=setTimeout(()=>this.fire("max_runtime"),maxRuntimeMs))}renew(){if(this.deadlineValue!==void 0||this.startedAtMs===0)return;let{inactivityMs}=this.settings();inactivityMs<=0||(this.inactivityTimer!==void 0&&clearTimeout(this.inactivityTimer),this.inactivityTimer=setTimeout(()=>this.fire("inactivity"),inactivityMs))}disarm(){this.clearTimers(),this.startedAtMs=0}clearHold(){if(this.deadlineValue===void 0){this.renew();return}this.session.isIdle&&(this.deadlineValue=void 0)}clearTimers(){this.inactivityTimer!==void 0&&clearTimeout(this.inactivityTimer),this.maxRuntimeTimer!==void 0&&clearTimeout(this.maxRuntimeTimer),this.inactivityTimer=void 0,this.maxRuntimeTimer=void 0}fire(kind){this.expire(kind).catch(error2=>this.session._warnDeadline("turn_deadline_failed",error2 instanceof Error?error2.message:String(error2)))}async expire(kind){if(this.deadlineValue!==void 0||this.startedAtMs===0)return;let{inactivityMs,maxRuntimeMs}=this.settings(),limitMs=kind==="inactivity"?inactivityMs:maxRuntimeMs;if(limitMs<=0)return;if(kind==="inactivity"&&this.session.isRetryInFlight){this.inactivityTimer=void 0,this.renew();return}this.clearTimers();let deadline={kind,limitMs,elapsedMs:this.now()-this.startedAtMs};this.deadlineValue=deadline;try{this.session._recordDeadlineStop(deadline)}catch(error2){this.session._warnDeadline("turn_deadline_record_failed",error2 instanceof Error?error2.message:String(error2))}let abortError,abortStartedAt=this.now(),aborting=this.session.abortTurnForDeadline().catch(error2=>{abortError=error2 instanceof Error?error2.message:String(error2)}),settled2=await within(aborting,1e4);settled2||(this.session.releaseHeldExtensionHandlers(),settled2=await within(aborting,1e4)),abortError!==void 0&&this.session._warnDeadline("turn_deadline_abort_failed",abortError),!(settled2&&abortError===void 0)&&(this.session.isIdle||this.session._warnDeadline("turn_deadline_unsettled",`turn still running ${this.now()-abortStartedAt} ms after the ${kind} deadline abort`))}};function buildDeadlineStopNotice(deadline){let limit=deadline.limitMs<6e4?`${Math.max(1,Math.round(deadline.limitMs/1e3))} s`:`${Math.round(deadline.limitMs/6e4)} min`;return`turn stopped: ${deadline.kind==="inactivity"?`no tool progress for ${limit} (turn_inactivity_ms)`:`turn hit its maximum runtime of ${limit} (turn_max_runtime_ms)`}. Action: send a message to continue, or raise the limit in settings`}function joinUserTextBlocks(blocks){return blocks.join(`
|
|
251
|
+
`)}function userMessageText(content){if(typeof content=="string")return content;let blocks=[];for(let part of content)part.type==="text"&&part.text!==void 0&&blocks.push(part.text);return joinUserTextBlocks(blocks)}function userTextContent(text3,textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&joinUserTextBlocks(textBlocks)===text3?textBlocks.map(block=>({type:"text",text:block})):[{type:"text",text:text3}]}function keepsTextBlocksVerbatim(textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&parseAskUserAnswerFrame(textBlocks[0]??"")!==void 0}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"||name==="glob"?`tool.${name}({ pattern: "...", path: "..." })`:name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet,TURN_END_SKIPPED_AFTER_SHUTDOWN="turn_end skipped: the session shut down during this turn, so its last response was not saved";function withProviderFailure(event){let failure2=providerFailureOf(event.messages);return failure2===void 0?event:{...event,failure:failure2}}function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},REQUIRED_COMPACTION_ERROR_MESSAGE="Context remains above the compaction threshold because compaction did not complete",RequiredCompactionError=class extends Error{constructor(){super(REQUIRED_COMPACTION_ERROR_MESSAGE),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`The retried request never started streaming${retryTimeoutMs===void 0?"":` after ${Math.round(retryTimeoutMs/1e3)}s`}.`+(streamStartTimeoutMs===void 0?" (Its stream-start guard is off; to bound or extend this wait, set retry.provider.streamStartTimeoutMs, 0 disables.)":` (Stream-start guard: ${Math.round(streamStartTimeoutMs/1e3)}s; to allow longer, raise retry.provider.streamStartTimeoutMs, 0 disables.)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._runContinuations=new AgentRunContinuations,this._handlerTurnScope=0,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._continueWithQueuedInput=!1,this._sessionStartDispatching=!1,this._admissionIdleWaiters=[],this._engineTurnStarts=[],this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._nextQueuedId=0,this._queueClearRecorded=Promise.resolve(),this._queuedMessages=new Map,this._deliveredQueuedIds=new Set,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._requestShapeRecovery=new RequestShapeRecovery,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._disposed=!1,this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._toolChildHostTargets=new Map,this._toolChildClosed=Promise.resolve(),this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._userActivity=createUserActivitySource(),this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._shownThinkingClampWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._runContinuations.observe(event),this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled2=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled2)},this._promptSurface=config.promptSurface,this._browserEngine=config.browserEngine,this.agent=config.agent,this.sessionManager=config.sessionManager,this._pendingInputs=new SessionPendingInputs({sessionManager:this.sessionManager,nextQueuedId:()=>this._mintQueuedId(),onChange:update=>this._emit({type:"pending_input_update",...update})}),this.agent.queuedInputPort=this._pendingInputs.queuedInputPort(),this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})});let toolRuntime=config.toolRuntime??"in-process",hostRefusal=toolRuntimeHostRefusal(toolRuntime);if(hostRefusal!==void 0)throw new ToolRuntimeUnsupportedHostError(hostRefusal);let hostCalls=createSessionHostCallHandler({cwd:this._cwd,executeNested:(parentToolCallId,name,args,signal)=>this._executeNestedToolCall(parentToolCallId,name,args,{signal}),callableToolNames:()=>this._callableToolNames(),target:kind=>this._toolChildHostTargets.get(kind),filesystemPolicy:()=>this._filesystemPolicy});this._toolChild=toolRuntime==="child"?new SessionToolChild({dir:join24(this._agentDir,"tool-children",this.sessionManager.getSessionId()),cwd:this._cwd,moduleRoots:()=>[...toolChildModuleRoots(this._extensionRunner.getAllRegisteredTools()),...childModuleRoots(this._extensionRunner.getAllChildModules())],onRecord:record8=>{if(this._emit({type:"session_tool_child",...record8}),record8.state==="exited")for(let job of this._childJobs())job.childExited?.(record8.generation)},onHostCall:hostCalls,onWake:wake=>{for(let job of this._childJobs())job.kind===wake.source&&job.wake?.(wake.value,wake.generation)}}):void 0,this._toolDispatcher=createToolDispatcher({runtime:toolRuntime,notify:(event,data)=>this._sessionLogger.info(event,data),hostCalls,onModuleStuck:notice2=>{this._sessionLogger.warn("offload_module_stuck",{modulePath:notice2.modulePath,export:notice2.export,deadlineMs:notice2.deadlineMs,files:notice2.files}),this._emit({type:"offload_module_stuck",...notice2})},...this._toolChild===void 0?{}:{childRunner:this._toolChild.runner,childKindRunner:this._toolChild.kindRunner}}),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow,void 0,config.fallbackWallNow??config.fallbackNow??Date.now);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,wallNow:config.fallbackWallNow??config.fallbackNow??Date.now,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,origin:{source:reason},emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},isCandidateRefusal:error2=>error2 instanceof ModelUsabilityBudgetError,emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._deadlineTracker=new AgentDeadlineTracker(this,()=>resolveTurnDeadlineSettings({turn_inactivity_ms:this.settingsManager.getTurnInactivityMs(),turn_max_runtime_ms:this.settingsManager.getTurnMaxRuntimeMs()})),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal,callbacks){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};return retryTransientCall(()=>this._resolveSummarizationRequestAuth(model,thinkingLevel,signal),isOAuthRefreshUnavailableError,this.settingsManager.getRetrySettings(),signal,callbacks??this._summarizationRetryCallbacks({source:"branchSummary"}))}async _resolveSummarizationRequestAuth(model,thinkingLevel,signal){if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted||isOAuthRefreshUnavailableError(error2))throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model,slash=override?.indexOf("/")??-1,configured=override&&slash>0?this._modelRuntime.getModel(override.slice(0,slash),override.slice(slash+1)):void 0,usable2=model=>!this._retryFallback.isProviderSpent(model.provider);if(usable2(sessionModel))return configured&&usable2(configured)?configured:sessionModel;let pending=this._pendingModelSwitch?.model;if(pending&&usable2(pending))return pending;if(configured&&usable2(configured))return configured;let requiredContextWindow=estimateMessagesTokens(this._runtimeMessages())+this._getCompactionSettings().reserveTokens,available=this._modelRuntime.getModels().find(model=>usable2(model)&&model.contextWindow>=requiredContextWindow&&this._modelRuntime.hasConfiguredAuth(model.provider));if(available)return available;throw new AccountUsageLimitError(sessionModel.provider,this._retryFallback.accountError(sessionModel.provider))}async _getCompactionRequestAuth(model,signal,callbacks){return{...await this._getSummarizationRequestAuth(model,signal,callbacks),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id,void 0,void 0,void 0,{origin:{source:"restore"},duringTurn:!1})}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err){throw this._toolExecutionDepth--,err}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err){throw err instanceof Error?err:new Error(`Extension failed, blocking execution: ${String(err)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state2=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state:state2});if(route.state!==void 0&&route.state!==state2){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:this._disposed?TURN_END_SKIPPED_AFTER_SHUTDOWN:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=this._requestShapeRecovery.apply(previousTransformContext?await previousTransformContext(messages,signal):messages),model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){if(this._logSessionEvent(event),event.type==="entry_appended"&&(event={...event,entry:describeUsageLimitEntry(event.entry)}),event.type==="retry_fallback_exhausted"&&usageLimitScope(event.lastError)==="account"&&(event={...event,lastError:new AccountUsageLimitError(this.model?.provider??"",event.lastError).message}),event.type==="agent_end"&&(event={...event,messages:event.messages.map(message=>message.role==="assistant"?describeUsageLimitMessage(message):message)}),(event.type==="message_end"||event.type==="message_start"||event.type==="message_update")&&event.message.role==="assistant"){let message=describeUsageLimitMessage(event.message);event=event.type==="message_update"?{...event,message,assistantMessageEvent:{...event.assistantMessageEvent,..."error"in event.assistantMessageEvent?{error:message}:{},..."partial"in event.assistantMessageEvent?{partial:message}:{}}}:{...event,message}}for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID5(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}whenToolChildClosed(){return this._toolChildClosed}toolChildRow(){return this._toolChild?.row()??{state:"none"}}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve53=>{this._resolveIdleWait=resolve53})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve53=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve53()}async _emitAgentSettled(agentEnd){if(this.agent.state.isStreaming&&await this._runContinuations.idleOrContinued(agentEnd,()=>this.agent.waitForIdle())){this._abortProvenance.closeAgentEndBoundary();return}if(!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseFullHistoryView(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches()}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim2=>claim2.disposition));if(!dispositions.includes("started")&&((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&!(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork))){if(settledRepetitiveTurnPause(this.sessionManager.getBranch()))try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_PAUSED_ENTRY_TYPE,{reason:"repetition",rule:"repetitive-turns",customType:"ttsr-injection",at:Date.now()}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_PAUSED_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}this.releaseSettledSessionMemory(),this._deadlineTracker.disarm(),this._emit({type:"agent_idle"})}}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._deadlineTracker.arm(),this._handlerTurnScope+=1,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:userMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared,userMessage2),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve53=>{this._retryResolve=resolve53}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens(messages);return shouldCompact(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens(this._runtimeMessages());return shouldCompact(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage7=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage7);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=userMessageText(event.message.content);if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);event.type==="agent_start"&&(this._abortCause=void 0);let abortCause=event.type==="agent_end"&&this.currentAbortSource!==void 0?this._abortCause:void 0;abortCause!==void 0&&(this._abortCause=void 0),this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?withProviderFailure({...event,willRetry:agentEndWillRetry,...this._deadlineTracker.current!==void 0?{aborted:!0,abortSource:"system",deadline:this._deadlineTracker.current}:{},...abortCause===void 0?{}:{abortCause}}):event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){this._observeEngineTurnMessage(event.message);let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendOwnedMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage7=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage7),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage7}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage7}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.noteServed(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&(isHealthExhaustionFailure(msg.errorMessage)||usageLimitScope(msg.errorMessage)==="account")&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),requestShape=this._requestShapeRecovery.decide(msg,this.model?.contextWindow??0);if(requestShape==="not-request-shape"&&this._requestShapeRecovery.endStreak(),requestShape!=="not-request-shape"&&!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled){let requestShapeOutcome=await this._handleRequestShapeRejection(msg,requestShape);if(requestShapeOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}retryContinuationBlocked||=requestShapeOutcome==="blocked"}let retryableError=requestShape==="not-request-shape"&&this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled(event))}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){this._deadlineTracker.renew();let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){this._disposed=!0,this._deadlineTracker.disarm();for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed");let inProcessClosed=this._toolDispatcher.dispose().catch(error2=>this._sessionLogger.warn("tool_dispatcher_close_failed",{error:String(error2)})),childClosed=this._toolChild?.close().catch(error2=>this._sessionLogger.warn("tool_child_close_failed",{error:String(error2)}))??Promise.resolve();this._toolChildClosed=Promise.all([inProcessClosed,childClosed]).then(()=>{}),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unregisterMemoryReport(),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activeWakeSources(){return this._wakeSources.activeSources}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get startupThinkingClamp(){return this._startupThinkingClamp}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isRetryInFlight(){return this._retryPromise!==void 0}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}get currentDeadline(){return this._deadlineTracker.current}_warnDeadline(event,detail){this._sessionLogger.warn(event,{detail})}async abortTurnForDeadline(){await this._abortActiveAgentAndRetry("system"),this.isIdle||await this._waitForIdleAfterAbort()}async _waitForIdleAfterAbort(){let idle=this.waitForIdle(),graceTimer,graceOver=new Promise(resolve53=>{graceTimer=setTimeout(()=>resolve53(!0),1e4)}),stillHeld=await Promise.race([idle.then(()=>!1),graceOver]);clearTimeout(graceTimer),stillHeld&&this._extensionRunner.releaseHeldHandlers(this._handlerTurnScope),await idle}releaseHeldExtensionHandlers(){return this._extensionRunner.releaseHeldHandlers(this._handlerTurnScope)}_recordDeadlineStop(deadline){this._emitEntryAppended(this.sessionManager.appendCustomEntry(TURN_DEADLINE_ENTRY_TYPE,{kind:deadline.kind,limitMs:deadline.limitMs,elapsedMs:deadline.elapsedMs,at:Date.now()}))}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}registerToolChildHostTarget(kind,target){return this._toolChildHostTargets.set(kind,target),()=>{this._toolChildHostTargets.get(kind)===target&&this._toolChildHostTargets.delete(kind)}}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID5()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err){throw new ExecuteToolError("invalid_params",toolName,err instanceof Error?err.message:String(err),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err){result3={content:[{type:"text",text:err instanceof Error?err.message:String(err)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_childJobs(){return this._extensionRunner.getAllRegisteredTools().flatMap(tool=>tool.definition.childJob===void 0?[]:[tool.definition.childJob])}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}recordUserActivity(kind){this._userActivity.emit(kind)}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text3){if(!text3)return;let oneLine3=text3.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
252
252
|
|
|
253
253
|
`):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
|
|
254
254
|
|
|
@@ -258,8 +258,7 @@ ${loaderAppendSystemPrompt.join(`
|
|
|
258
258
|
|
|
259
259
|
${sentences.join(`
|
|
260
260
|
|
|
261
|
-
`)}`: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 hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text3,options),submittedByCommand:options?.source==="extension"});try{options?.source!=="extension"&&(emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold()),await this._prompt(text3,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_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._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 errorMessage7=this._retryFallback.accountError(model.provider);if(!await this._retryFallback.tryFallback("transient",{errorMessage:errorMessage7},!1))throw new AccountUsageLimitError(model.provider,errorMessage7)}}catch(error2){throw releaseStart(!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text: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){expandedText=this._expandSkillCommand(expandedText);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(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{releaseStart(messages!==void 0)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,void 0,options?.onQueuedInput),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(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))});if(invocationTokens.length===0)return text3;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=readFileSync10(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err){return 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)}async _queueUserInput(text3,images,behavior,options){options?.source!=="extension"&&(emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold()),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 expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}}),"queued"}async steer(text3,images,options){return this._queueUserInput(text3,images,"steer",options)}async followUp(text3,images,options){return 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;if(clientMessageId===void 0){this._enqueuePreparedInput(input);return}await this._pendingInputs.admit({clientMessageId,text:input.text,...input.images?{images:input.images}:{},mode:input.mode},queuedId=>this._enqueuePreparedInput({...input,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.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);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)};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(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(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.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn&&this._stopEngineTurn(message.customType))this._recordRefusedEngineTurnMessage(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}isUserDirectedTurn(message.customType)||this._recordEngineTurnStart(message.customType),await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_recordEngineTurnStart(customType){this._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))}}_observeEngineTurnMessage(message){if(message.role==="user"||message.role==="custom"&&isUserDirectedTurn(message.customType)){this._engineTurnStarts=[],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(),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==="per-user-input"?"cap-per-message":"cap-per-minute",customType,count:stop.reason==="per-user-input"?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),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve53=>{resolveBindingPromptReadiness=resolve53});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=textParts.join(`
|
|
262
|
-
`),textParts.length>1&&(textBlocks=textParts),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text3,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,textBlocks,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text3,images,{textBlocks}):await this._queueFollowUp(text3,images,{textBlocks})),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),queuedId}_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 record8=this._queuedInputOrder[index],message=this._queuedMessages.get(queuedId);if(nextText!==void 0&&message?.role!=="user")return"not_found";let deferred=record8.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&&record8.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=record8.mode==="steer"?this._steeringMessages:this._followUpMessages,occurrence=this._queuedInputOrder.slice(0,index).filter(input=>input.mode===record8.mode&&input.text===record8.text).length,seen=-1,textIndex=texts.findIndex(text3=>text3===record8.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]={...record8,text:nextText,revision:record8.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=[],this.agent.clearAllQueues(),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}whenQueueClearRecorded(){return this._queueClearRecorded}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 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._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),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,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),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection,opts.origin),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault,opts.origin);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id,{origin:opts.origin,duringTurn}),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:opts.origin,from:previousModel,to:model,duringTurn,persistDefault:opts.persistDefault})),this._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.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward",options={}){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2,{persistDefault:options.persistDefault??!0,origin:options.origin??{source:"cycle"}})}async _cycleFavoriteModel(direction,favoriteModels2,cycle){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,cycle.persistDefault,cycle.origin):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection,cycle.origin);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens);let duringTurn=this.isStreaming;this.sessionManager.appendModelChange(next.model.provider,next.model.id,void 0,currentModel?.provider,currentModel?.id,{origin:cycle.origin,duringTurn}),cycle.persistDefault&&this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:cycle.origin,from:currentModel,to:next.model,duringTurn,persistDefault:cycle.persistDefault})),this._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)}setSessionThinkingLevel(level,origin){this._setThinkingLevel(level,!1,{level,source:"explicit"},origin,!0)}_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);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)}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this._lastManualThinkingLevel??this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this._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=randomUUID5(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage7=`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:errorMessage7}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage7,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID5(),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),errorMessage7=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage7}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage7,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID5();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=randomUUID5();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??randomUUID5(),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 lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=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 lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){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),errorMessage7=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:errorMessage7}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _assertModelReadyForTurn(){if(!this.model)throw new ModelNotReadyError(formatNoModelSelectedMessage());if(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0){this._providerRequiredNoticed=!1;return}throw this._modelRuntime.isUsingOAuth(this.model.provider)?new ModelNotReadyError(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new ModelNotReadyError(formatNoApiKeyFoundMessage(this.model.provider))}_noticeProviderRequired(notice2){this._providerRequiredNoticed||(this._providerRequiredNoticed=!0,this._emit({type:"provider_required",notice:notice2}))}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings)){if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings))throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}this._resumeCompactionRequirement=void 0}let 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 entry=branch[i];if(usageEntryId!==void 0&&entry.id===usageEntryId)break;if(entry.type==="compaction"||entry.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 errorMessage7=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage7}),inlineReason==="pre_prompt")throw new Error(errorMessage7);return!1}this._overflowRecoveryRungs+=1;let keepRecentTokensOverride=this._overflowRecoveryRungs>=2?0:void 0,messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry,!1,keepRecentTokensOverride):keepRecentTokensOverride===void 0?await this._runAutoCompaction("overflow",willRetry):await this._runAutoCompaction("overflow",willRetry,{keepRecentTokensOverride});if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted&&willRetry&&(this._failedResponse=assistantMessage),compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason)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 state2=this._compactionLifecycle.state;return state2.status==="failed"&&state2.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=randomUUID5();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 errorMessage7=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage7);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: ${errorMessage7}`}),!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=randomUUID5();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 errorMessage7=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage7}`:`Auto-compaction failed: ${errorMessage7}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle2;return this._sessionStartSettled=new Promise(resolve53=>{settle2=resolve53}),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),(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.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._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=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()},sendUserMessage:(content,options)=>{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).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data,options)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data,options),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(activator)},getCommands,setModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model,origin??{source:"extension"}),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model,origin??{source:"extension"}),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{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,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source2="user")=>{if(source2==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getCompactionModel:()=>this.model&&this._retryFallback.isProviderSpent(this.model.provider)?this._resolveCompactionModel(this.model):this.model,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=randomUUID5();(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},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 entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${name}`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext,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)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[]));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(resolve53=>this._admissionIdleWaiters.push(resolve53));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 resolve53 of waiters)resolve53()}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]),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");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:this._extensionRunner.getFlagValues(),includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart(),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)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&this._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(errorMessage7){let markerMs=parseRetryAfterMsMarker(errorMessage7);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage7})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage7)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage7})},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,errorMessage7){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:errorMessage7}),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(resolve53=>{this._retryResolve=resolve53}));let errorMessage7=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(errorMessage7)==="account"){if(switchedFallback=await tryFallback(isBillingErrorMessage(errorMessage7)?"billing":"transient",{errorMessage:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),!switchedFallback){let chainKey=this._retryFallback.exhaustedChainKey;return chainKey&&this._emit({type:"retry_fallback_exhausted",chainKey,lastError:errorMessage7}),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(errorMessage7)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage7}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7}),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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),!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(errorMessage7);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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(errorMessage7),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage7}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage7);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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7,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,errorMessage7);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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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(errorMessage7),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:errorMessage7,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(errorMessage7)==="account"?new AccountUsageLimitError(message.provider,errorMessage7).message:errorMessage7});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);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
261
|
+
`)}`: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 hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text3,options),submittedByCommand:options?.source==="extension"});try{options?.source!=="extension"&&(emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold()),await this._prompt(text3,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_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._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 errorMessage7=this._retryFallback.accountError(model.provider);if(!await this._retryFallback.tryFallback("transient",{errorMessage:errorMessage7},!1))throw new AccountUsageLimitError(model.provider,errorMessage7)}}catch(error2){throw releaseStart(!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text: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){expandedText=this._expandSkillCommand(expandedText);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(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{releaseStart(messages!==void 0)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,void 0,options?.onQueuedInput),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(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))});if(invocationTokens.length===0)return text3;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=readFileSync10(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err){return 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)}async _queueUserInput(text3,images,behavior,options){options?.source!=="extension"&&(emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold()),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 expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}}),"queued"}async steer(text3,images,options){return this._queueUserInput(text3,images,"steer",options)}async followUp(text3,images,options){return 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;if(clientMessageId===void 0){this._enqueuePreparedInput(input);return}await this._pendingInputs.admit({clientMessageId,text:input.text,...input.images?{images:input.images}:{},mode:input.mode},queuedId=>this._enqueuePreparedInput({...input,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.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);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)};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(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(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.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn&&this._stopEngineTurn(message.customType))this._recordRefusedEngineTurnMessage(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}isUserDirectedTurn(message.customType)||this._recordEngineTurnStart(message.customType),await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_recordEngineTurnStart(customType){this._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))}}_observeEngineTurnMessage(message){if(message.role==="user"||message.role==="custom"&&isUserDirectedTurn(message.customType)){this._engineTurnStarts=[],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(),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==="per-user-input"?"cap-per-message":"cap-per-minute",customType,count:stop.reason==="per-user-input"?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),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve53=>{resolveBindingPromptReadiness=resolve53});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}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text3,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,textBlocks,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text3,images,{textBlocks}):await this._queueFollowUp(text3,images,{textBlocks})),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),queuedId}_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 record8=this._queuedInputOrder[index],message=this._queuedMessages.get(queuedId);if(nextText!==void 0&&message?.role!=="user")return"not_found";let deferred=record8.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&&record8.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=record8.mode==="steer"?this._steeringMessages:this._followUpMessages,occurrence=this._queuedInputOrder.slice(0,index).filter(input=>input.mode===record8.mode&&input.text===record8.text).length,seen=-1,textIndex=texts.findIndex(text3=>text3===record8.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]={...record8,text:nextText,revision:record8.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=[],this.agent.clearAllQueues(),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}whenQueueClearRecorded(){return this._queueClearRecorded}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 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._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),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,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),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection,opts.origin),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault,opts.origin);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id,{origin:opts.origin,duringTurn}),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:opts.origin,from:previousModel,to:model,duringTurn,persistDefault:opts.persistDefault})),this._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.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward",options={}){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2,{persistDefault:options.persistDefault??!0,origin:options.origin??{source:"cycle"}})}async _cycleFavoriteModel(direction,favoriteModels2,cycle){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,cycle.persistDefault,cycle.origin):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection,cycle.origin);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens);let duringTurn=this.isStreaming;this.sessionManager.appendModelChange(next.model.provider,next.model.id,void 0,currentModel?.provider,currentModel?.id,{origin:cycle.origin,duringTurn}),cycle.persistDefault&&this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:cycle.origin,from:currentModel,to:next.model,duringTurn,persistDefault:cycle.persistDefault})),this._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)}setSessionThinkingLevel(level,origin){this._setThinkingLevel(level,!1,{level,source:"explicit"},origin,!0)}_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);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)}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this._lastManualThinkingLevel??this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this._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=randomUUID5(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage7=`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:errorMessage7}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage7,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID5(),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),errorMessage7=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage7}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage7,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID5();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=randomUUID5();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??randomUUID5(),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 lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=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 lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){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),errorMessage7=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:errorMessage7}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _assertModelReadyForTurn(){if(!this.model)throw new ModelNotReadyError(formatNoModelSelectedMessage());if(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0){this._providerRequiredNoticed=!1;return}throw this._modelRuntime.isUsingOAuth(this.model.provider)?new ModelNotReadyError(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new ModelNotReadyError(formatNoApiKeyFoundMessage(this.model.provider))}_noticeProviderRequired(notice2){this._providerRequiredNoticed||(this._providerRequiredNoticed=!0,this._emit({type:"provider_required",notice:notice2}))}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings)){if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings))throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}this._resumeCompactionRequirement=void 0}let 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 entry=branch[i];if(usageEntryId!==void 0&&entry.id===usageEntryId)break;if(entry.type==="compaction"||entry.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 errorMessage7=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage7}),inlineReason==="pre_prompt")throw new Error(errorMessage7);return!1}this._overflowRecoveryRungs+=1;let keepRecentTokensOverride=this._overflowRecoveryRungs>=2?0:void 0,messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry,!1,keepRecentTokensOverride):keepRecentTokensOverride===void 0?await this._runAutoCompaction("overflow",willRetry):await this._runAutoCompaction("overflow",willRetry,{keepRecentTokensOverride});if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted&&willRetry&&(this._failedResponse=assistantMessage),compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason)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 state2=this._compactionLifecycle.state;return state2.status==="failed"&&state2.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=randomUUID5();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 errorMessage7=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage7);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: ${errorMessage7}`}),!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=randomUUID5();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 errorMessage7=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage7}`:`Auto-compaction failed: ${errorMessage7}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle2;return this._sessionStartSettled=new Promise(resolve53=>{settle2=resolve53}),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),(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.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._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=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()},sendUserMessage:(content,options)=>{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).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data,options)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data,options),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(activator)},getCommands,setModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model,origin??{source:"extension"}),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model,origin??{source:"extension"}),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{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,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source2="user")=>{if(source2==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getCompactionModel:()=>this.model&&this._retryFallback.isProviderSpent(this.model.provider)?this._resolveCompactionModel(this.model):this.model,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=randomUUID5();(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},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 entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${name}`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext,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)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[]));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(resolve53=>this._admissionIdleWaiters.push(resolve53));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 resolve53 of waiters)resolve53()}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]),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");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:this._extensionRunner.getFlagValues(),includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart(),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)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&this._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(errorMessage7){let markerMs=parseRetryAfterMsMarker(errorMessage7);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage7})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage7)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage7})},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,errorMessage7){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:errorMessage7}),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(resolve53=>{this._retryResolve=resolve53}));let errorMessage7=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(errorMessage7)==="account"){if(switchedFallback=await tryFallback(isBillingErrorMessage(errorMessage7)?"billing":"transient",{errorMessage:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),!switchedFallback){let chainKey=this._retryFallback.exhaustedChainKey;return chainKey&&this._emit({type:"retry_fallback_exhausted",chainKey,lastError:errorMessage7}),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(errorMessage7)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage7}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7}),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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),!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(errorMessage7);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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(errorMessage7),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage7}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage7);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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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:errorMessage7,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,errorMessage7);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:errorMessage7,retryAfterMs:this._getProviderRetryDelayMs(errorMessage7)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage7}),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(errorMessage7),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:errorMessage7,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(errorMessage7)==="account"?new AccountUsageLimitError(message.provider,errorMessage7).message:errorMessage7});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);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
263
262
|
${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)}}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 rm4(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,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,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,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,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,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=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;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._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text3=askUserAnswerDisplayText(entry.message.content)??contentText(entry.message.content,"");text3&&result3.push({entryId:entry.id,text:text3})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){entry.type==="usage"?addUsageToTotals(usageTotals,entry.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,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 entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.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(entry=>entry.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=dirname24(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 entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync6(filePath,`${lines.join(`
|
|
264
263
|
`)}
|
|
265
264
|
`),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;return`${size}:${usage3?.input??""}:${usage3?.output??""}:${usage3?.totalTokens??""}`}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 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(entry,options,theme2)=>{let spec2=map(entry);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}import{existsSync as existsSync34,mkdirSync as mkdirSync18,readdirSync as readdirSync8,readFileSync as readFileSync40,realpathSync as realpathSync12,statSync as statSync19,unlinkSync as unlinkSync4,writeFileSync as writeFileSync19}from"node:fs";import{dirname as dirname54,join as join76,resolve as resolve45,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.
|
|
@@ -284,21 +283,9 @@ no effect (no persistent shell session). Standard senpi safety
|
|
|
284
283
|
guardrails still apply.
|
|
285
284
|
`;function anthropicBashExtension(pi){pi.on("before_provider_request",(event,ctx)=>addAnthropicBashToPayload(ctx.model?.api,event.payload)),pi.on("before_agent_start",async(event,ctx)=>{if(ctx.model?.api==="anthropic-messages"&&isAnthropicBashEnabled())return{systemPrompt:`${event.systemPrompt}
|
|
286
285
|
${ANTHROPIC_BASH_SECTION}`}},{previewSafe:!0})}import{existsSync as existsSync15,readFileSync as readFileSync19}from"node:fs";import{join as join33}from"node:path";function toBuiltinProviderContext(context){let transcript=collapseSystemMessages(context),head=getInitialSystemMessage(transcript.messages),messages=transcript.messages.filter(message=>message.role!=="system"),systemPrompt=head?getCurrentSystemPrompt(transcript.messages):"";return{...systemPrompt.length>0?{systemPrompt}:{},messages,...head?{tools:getCurrentTools(transcript.messages)}:{},...context.activeToolNames?{activeToolNames:context.activeToolNames}:{}}}function resolveCompactionOwner(settings){return settings.compactionOwner??"senpi"}var systemPromptModeSources=new WeakMap,resumeModeSources=new WeakMap;function resumeModeSource(settings){return resumeModeSources.get(settings)??"global"}function isRecord8(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function parseSettingSources(value){if(Array.isArray(value)&&value.every(source2=>source2==="user"||source2==="project"||source2==="local"))return[...value]}function parseEnvironmentSettingSources(value){if(value!==void 0)return value===""?[]:parseSettingSources(value.split(",").map(source2=>source2.trim()))}function parseSystemPromptMode(value){return value==="preset-append"||value==="full"||value==="override"?value:void 0}function parseResumeMode(value){return value==="auto"||value==="off"?value:void 0}function parseTokenInjection(value){return value==="oauth-slots"||value==="config-dir"||value==="ambient"?value:void 0}function parseCompactionOwner(value){return value==="senpi"||value==="sdk"?value:void 0}function parseEnvironmentBoolean(value){if(value!==void 0)switch(value.toLowerCase()){case"1":case"true":return!0;case"0":case"false":return!1;default:return}}function parseNonEmptyString(value){return typeof value=="string"&&value.length>0?value:void 0}function parseProviderSettings(value){if(!isRecord8(value))return{};let enabled=typeof value.enabled=="boolean"?value.enabled:void 0,appendSystemPrompt=typeof value.appendSystemPrompt=="boolean"?value.appendSystemPrompt:void 0,systemPromptMode=parseSystemPromptMode(value.systemPromptMode),systemPromptFile=parseNonEmptyString(value.systemPromptFile),resumeMode=parseResumeMode(value.resumeMode),settingSources=parseSettingSources(value.settingSources),strictMcpConfig=typeof value.strictMcpConfig=="boolean"?value.strictMcpConfig:void 0,pinnedAccount=parseNonEmptyString(value.pinnedAccount),accountFallback=typeof value.accountFallback=="boolean"?value.accountFallback:void 0,tokenInjection=parseTokenInjection(value.tokenInjection),compactionOwner=parseCompactionOwner(value.compactionOwner);return{...enabled!==void 0?{enabled}:{},...appendSystemPrompt!==void 0?{appendSystemPrompt}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...settingSources!==void 0?{settingSources}:{},...strictMcpConfig!==void 0?{strictMcpConfig}:{},...pinnedAccount!==void 0?{pinnedAccount}:{},...accountFallback!==void 0?{accountFallback}:{},...tokenInjection!==void 0?{tokenInjection}:{},...compactionOwner!==void 0?{compactionOwner}:{}}}function parseEnvironmentSettings(environment){let enabled=parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ENABLED),systemPromptMode=parseSystemPromptMode(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_MODE),systemPromptFile=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_FILE),resumeMode=parseResumeMode(environment.SENPI_CLAUDE_SDK_OAUTH_RESUME),tokenInjection=parseTokenInjection(environment.SENPI_CLAUDE_SDK_OAUTH_TOKEN_INJECTION),settingSources=parseEnvironmentSettingSources(environment.SENPI_CLAUDE_SDK_OAUTH_SETTING_SOURCES),pinnedAccount=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT),accountFallback=parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ACCOUNT_FALLBACK),compactionOwner=parseCompactionOwner(environment.SENPI_CLAUDE_SDK_OAUTH_COMPACTION_OWNER);return{...enabled!==void 0?{enabled}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...tokenInjection!==void 0?{tokenInjection}:{},...settingSources!==void 0?{settingSources}:{},...pinnedAccount!==void 0?{pinnedAccount}:{},...accountFallback!==void 0?{accountFallback}:{},...compactionOwner!==void 0?{compactionOwner}:{}}}function resolveSystemPromptMode(settings){return settings.systemPromptMode!==void 0?{mode:settings.systemPromptMode,source:systemPromptModeSources.get(settings)??"setting",conflict:settings.appendSystemPrompt!==void 0}:settings.appendSystemPrompt!==void 0?{mode:settings.appendSystemPrompt?"full":"preset-append",source:"legacy",conflict:!1}:{mode:"full",source:"default",conflict:!1}}function loadAnthropicSubscriptionProviderSettings(settingsManager,environment=process.env){let global=settingsManager.getGlobalSettings(),project2=settingsManager.getProjectSettings(),environmentSettings=parseEnvironmentSettings(environment),projectSettings=parseProviderSettings(project2.anthropicSubscriptionProvider??project2.claudeSdkOauthProvider),settings={...parseProviderSettings(global.anthropicSubscriptionProvider??global.claudeSdkOauthProvider),...projectSettings,...environmentSettings};return environmentSettings.systemPromptMode!==void 0&&systemPromptModeSources.set(settings,"env"),settings.resumeMode!==void 0&&resumeModeSources.set(settings,environmentSettings.resumeMode!==void 0?"env":projectSettings.resumeMode!==void 0?"project":"global"),settings}function settingsFingerprint(path14){return getFileContentRevision(path14)??"missing"}var cachedAnthropicSubscriptionManager;function loadAnthropicSubscriptionProviderSettingsFromDisk(cwd){let agentDir=getAgentDir(),key=`${cwd}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"global"))}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"project"))}`,settingsManager=cachedAnthropicSubscriptionManager?.cwd===cwd&&cachedAnthropicSubscriptionManager.key===key?cachedAnthropicSubscriptionManager.manager:void 0;return settingsManager||(settingsManager=SettingsManager.create(cwd,agentDir),cachedAnthropicSubscriptionManager={cwd,key,manager:settingsManager}),loadAnthropicSubscriptionProviderSettings(settingsManager)}var cliPinsBySession=new Map,ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL="Anthropic Subscription";function asCredential(value){return value?.type==="oauth"?value:void 0}function accountStatus(slot2,now2){if(slot2.blockedUntil!==void 0&&slot2.blockedUntil>now2){let until=new Date(slot2.blockedUntil).toISOString();return slot2.blockReason==="auth_error"?`login rejected; re-checked at ${until}`:`blocked until ${until}`}}function slotStatus(slot2){let now2=Date.now(),blocked=[accountStatus(slot2,now2),...describeModelBlocks(slot2.modelBlocks,now2)].filter(state2=>state2!==void 0);return blocked.length===0?"available":blocked.join(", ")}function readAccounts(ctx,environment){let credential=asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID));return{credential,accounts:listAccounts(credential??emptyCredential(),environment)}}function accountError(ctx,name){ctx.ui.notify(`Anthropic Subscription account '${name}' does not exist.`,"error")}function parseArgs3(rawArgs){return rawArgs.trim().split(/\s+/).filter(Boolean)}function getSessionClaudeAccountPin(sessionId){return sessionId===void 0?void 0:cliPinsBySession.get(sessionId)}function resolveClaudeAccountPin(cliPinnedAccount,settingsPinnedAccount,storedPinnedAccount){return cliPinnedAccount??settingsPinnedAccount??storedPinnedAccount}function registerClaudeAccountCommand(pi,deps={}){let loadSettings=deps.loadSettings??loadAnthropicSubscriptionProviderSettingsFromDisk,environment=deps.environment??(name=>process.env[name]);pi.registerFlag("claude-account",{type:"string",description:"Pin Anthropic Subscription account for this session."}),pi.on("session_start",(_event,ctx)=>{let flag=pi.getFlag("claude-account"),sessionId=ctx.sessionManager.getSessionId();typeof flag=="string"&&flag.length>0?cliPinsBySession.set(sessionId,flag):cliPinsBySession.delete(sessionId)}),pi.on("session_shutdown",(_event,ctx)=>{cliPinsBySession.delete(ctx.sessionManager.getSessionId())}),pi.registerCommand("claude-account",{description:"List and manage Anthropic Subscription accounts.",argumentHint:"[add | remove <id> | pin <id> | unpin | unblock <id> | rename <id> <display name...> | clear-name <id>]",requiresArguments:!1,handler:async(rawArgs,ctx)=>{if(await accountDisplayNameCommand(ctx,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,rawArgs))return;let args=parseArgs3(rawArgs),action=args[0]??"list";if(action==="list"){showAccounts2(ctx,loadSettings(ctx.cwd),environment);return}if(action==="add"){await addAccount2(ctx,deps);return}if(action==="remove"){await removeNamedAccount(ctx,args[1],environment);return}if(action==="pin"&&args[1]!=="unpin"){await pinNamedAccount(ctx,args[1],environment);return}if(action==="unpin"||action==="pin"&&args[1]==="unpin"){await unpinAccount(ctx);return}if(action==="unblock"){await unblockNamedAccount(ctx,args[1],environment);return}ctx.ui.notify("Usage: /claude-account [add | remove <id> | pin <id> | unpin | unblock <id> | rename <id> <display name...> | clear-name <id>]","error")}})}function showAccounts2(ctx,settings,environment){let{credential,accounts}=readAccounts(ctx,environment),cliPin=getSessionClaudeAccountPin(ctx.sessionManager.getSessionId()),pinned=resolveClaudeAccountPin(cliPin,settings.pinnedAccount,credential?.pinned),pinSource=cliPin!==void 0?"CLI":settings.pinnedAccount!==void 0?"settings":"stored",affinityPick,affinityError;if(accounts.length>0)try{affinityPick=selectAccount(accounts,{sessionId:ctx.sessionManager.getSessionId(),pinnedAccount:pinned,...pinned===void 0?{}:{pinSource:pinSource==="CLI"?"cli":pinSource},accountFallback:settings.accountFallback,...credential?.order===void 0?{}:{accountOrder:credential.order}}).name}catch(error2){affinityError=error2 instanceof Error?error2.message:String(error2)}let lines=["Anthropic Subscription accounts:"];accounts.length===0&&lines.push(" (none)");for(let account of accounts){let states=[accountLabel(account),account.source,slotStatus(account)];account.name===pinned&&states.push("pinned"),account.name===affinityPick&&states.push("affinity pick"),lines.push(` ${states.join(" | ")}`)}let labelFor=name=>accountLabel(accounts.find(account=>account.name===name)??{name});lines.push(`Pinned account: ${pinned===void 0?"none":`${labelFor(pinned)} (${pinSource.toLowerCase()})`}`),lines.push(`Affinity pick: ${affinityPick===void 0?affinityError?`unavailable - ${affinityError}`:"none":labelFor(affinityPick)}`),ctx.ui.notify(lines.join(`
|
|
287
|
-
`),"info")}async function addAccount2(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/claude-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("Anthropic Subscription account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!==LOGIN_CANCELLED_MESSAGE&&ctx.ui.notify(`Failed to add Anthropic Subscription account: ${message}`,"error")}}async function removeNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account remove <name>","error");return}let{accounts}=readAccounts(ctx,environment),target=accounts.find(account=>account.name===name);if(!target)return accountError(ctx,name);if(target.source==="env"){ctx.ui.notify(`Anthropic Subscription account '${name}' comes from the environment and cannot be removed.`,"error");return}try{await removeProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function pinNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account pin <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unblockNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account unblock <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{let env=new Proxy({},{get:(_target,key)=>environment(String(key))}),lifted=await unblockProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name,env);ctx.ui.notify(lifted?`Unblocked Anthropic Subscription account: ${name}. The next turn may use it.`:`Anthropic Subscription account '${name}' has no usage block to lift.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unpinAccount(ctx){if(!asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID))?.pinned){ctx.ui.notify("No stored Anthropic Subscription account pin is set.","info");return}await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned Anthropic Subscription account.","info")}var CLAUDE_SDK_OAUTH_API_ID="claude-sdk-oauth";import{mkdirSync as mkdirSync7,readFileSync as readFileSync13,renameSync as renameSync5,writeFileSync as writeFileSync7}from"node:fs";import{dirname as dirname27,join as join27}from"node:path";var LONG_CONTEXT_REFUSAL_TTL_MS=360*60*1e3,STATE_FILE="anthropic-subscription-long-context.json",listeners2=new Set,refusedUntil,loaded=!1,statePath=()=>join27(getAgentDir(),STATE_FILE);function load(){if(!loaded){loaded=!0;try{let parsed=JSON.parse(readFileSync13(statePath(),"utf8")),
|
|
288
|
-
`),renameSync5(temporary,statePath())}catch{}scheduleExpiry(now2),wasAvailable&¬ify(!1)}function onLongContextAvailabilityChange(listener){return listeners2.add(listener),()=>listeners2.delete(listener)}import{spawn as spawn5}from"node:child_process";import{readFileSync as readFileSync16,statSync as statSync9}from"node:fs";import{createRequire as createRequire2}from"node:module";import{dirname as dirname29,posix as posix2,win32 as win323}from"node:path";import{createHash as createHash6}from"crypto";import{chmodSync as chmodSync3,existsSync as existsSync12,lstatSync,mkdirSync as mkdirSync8,readFileSync as readFileSync14,renameSync as renameSync6,unlinkSync,writeFileSync as writeFileSync8}from"fs";import{tmpdir as osTmpdir}from"os";import{basename as basename12,join as join28}from"path";function tmpdir3(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join28(tmpdir3(),process.platform==="win32"?"claude":`claude-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync8(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync3(dir,448)}else try{mkdirSync8(dir,{recursive:!0,mode:448})}catch{}return dir}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync14(embeddedPath),hash=createHash6("sha256").update(content).digest("hex").slice(0,16),tmpDir=join28(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename12(embeddedPath),tmpPath=join28(tmpDir,fileName);if(mkdirSync8(tmpDir,{recursive:!0,mode:448}),existsSync12(tmpPath))return tmpPath;let tmpFile=join28(tmpDir,`${fileName}.tmp.${process.pid}`);writeFileSync8(tmpFile,content),chmodSync3(tmpFile,493);try{renameSync6(tmpFile,tmpPath)}catch(e){if((e.code==="EPERM"||e.code==="EBUSY")&&existsSync12(tmpPath)){try{unlinkSync(tmpFile)}catch{}return tmpPath}throw e}return tmpPath}catch(err){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32 as win322}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text3=deps.readText?.(batchPath),match=text3===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text3);if(!match?.[1])return;let target=win322.join(win322.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform5,pathext){return platform5!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform5,path14){if(path14===void 0)return[];let delimiter2=platform5==="win32"?";":":";return path14.split(delimiter2).map(entry=>platform5==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join102=deps.platform==="win32"?win322.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path14=join102(directory,candidate);if(!deps.isFile(path14))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win322.extname(path14).toLowerCase()))return path14;let target=nativeTargetOfBatchFile(path14,deps);if(target!==void 0)return target;deps.onSkip?.(path14)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync15}from"node:fs";import{dirname as dirname28,join as join29}from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text3){let match=text3===void 0?null:VERSION_PATTERN.exec(text3);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath4(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync15(join29(dirname28(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform5,arch4,preferMusl=!1){let ext=platform5==="win32"?".exe":"";if(platform5==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch4}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch4}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform5}-${arch4}/claude${ext}`]}function spawnableSpelling(platform5,candidate){return platform5==="win32"?win323.toNamespacedPath(win323.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source2)=>({executable,source:source2,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}let executableDir=deps.isCompiledBun?.()?deps.executableDir?.():void 0;if(executableDir!==void 0){let path14=deps.platform==="win32"?win323:posix2;for(let candidate of candidates){let accepted=accept(path14.join(executableDir,"node_modules",...candidate.split("/")));if(accepted!==void 0)return accepted}}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
|
|
289
|
-
`))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path14){try{return readFileSync16(path14,"utf8")}catch{return}}function isRegularFile(path14){try{return statSync9(path14).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,executableDir:()=>dirname29(process.execPath),resolve:spec2=>(defaultRequire||(defaultRequire=createRequire2(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec2))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var AMBIENT_STATUS_TTL_MS=3e4,AMBIENT_PROBE_TIMEOUT_MS=1e4;function createAmbientAuthStatusReader(probe,now2=Date.now,ttlMs=AMBIENT_STATUS_TTL_MS){let cached,inFlight,startProbe=()=>{let status=probe().then(value=>(cached={at:now2(),value},value));inFlight=status;let clear=()=>{inFlight===status&&(inFlight=void 0)};return status.then(clear,clear),status};return signal=>signal?.aborted?Promise.reject(signal.reason):cached&&now2()-cached.at<ttlMs?Promise.resolve(cached.value):untilAborted2(inFlight??startProbe(),signal)}function untilAborted2(status,signal){if(signal===void 0)return status;if(signal.aborted)return Promise.reject(signal.reason);let abortController=new AbortController,aborted=new Promise((_resolve,reject)=>{signal.addEventListener("abort",()=>reject(signal.reason),{once:!0,signal:abortController.signal})});return Promise.race([status,aborted]).finally(()=>abortController.abort())}async function probeAmbientClaudeAuthStatus(options={}){let timeoutMs=options.timeoutMs??AMBIENT_PROBE_TIMEOUT_MS,spawnProbe=options.spawnProbe??((command,args)=>spawn5(command,[...args],{stdio:"ignore",windowsHide:!0})),executable;try{executable=resolveClaudeCodeExecutable(defaultExecutableDeps())}catch{return!1}return new Promise(resolve53=>{let settled2=!1,finish=available=>{settled2||(settled2=!0,clearTimeout(deadline),resolve53(available))},child=spawnProbe(executable,["auth","status"]),deadline=setTimeout(()=>{signalSpawnedChild(child,"SIGKILL"),finish(!1)},timeoutMs);deadline.unref?.(),child.once("error",()=>finish(!1)),child.once("close",code=>finish(code===0))})}var readAmbientClaudeAuthStatus=createAmbientAuthStatusReader(probeAmbientClaudeAuthStatus);var ANTHROPIC_SUBSCRIPTION_NAME="Anthropic Subscription (Claude Pro/Max)",ENV_TOKEN_NAMES=["CLAUDE_CODE_OAUTH_TOKEN",...Array.from({length:15},(_,index)=>`CLAUDE_CODE_OAUTH_TOKEN_${index+2}`)],ENV_TOKEN_NAME_SET=new Set(ENV_TOKEN_NAMES),AUTH_CHECK={source:"Anthropic Subscription",type:"oauth"};function requestClaudeEnvironment(value){if(typeof value!="object"||value===null||Array.isArray(value))return{};let environment={};for(let[name,entry]of Object.entries(value))ENV_TOKEN_NAME_SET.has(name)&&typeof entry=="string"&&(environment[name]=entry);return environment}function toSlot(credential,name,source2){return{name,access:credential.access,refresh:credential.refresh,expires:credential.expires,source:source2}}function recoveryTargetName(existing2){if(existing2.length===1)return existing2[0]?.name;let authBlocked=existing2.filter(slot2=>slot2.blockReason==="auth_error");if(authBlocked.length===1)return authBlocked[0]?.name}async function promptAccountName(callbacks,existing2){if(existing2.length===0)return"default";let recovery=recoveryTargetName(existing2),fallback=`account-${existing2.length+1}`;if(!callbacks.onPrompt)return recovery??fallback;let names=existing2.map(slot2=>slot2.name).join(", "),message=recovery===void 0?`Name for this account (existing: ${names}; press Enter to add ${fallback}, or type an existing name to refresh it)`:`Name for this account (existing: ${names}; press Enter to refresh '${recovery}' with this login)`;return(await callbacks.onPrompt({message,placeholder:recovery??fallback})).trim()||recovery||fallback}function createOAuthConfig(deps){let claudeEnvironment=async ctx=>{let entries=await Promise.all(ENV_TOKEN_NAMES.map(async name=>[name,await ctx.env(name)]));return Object.fromEntries(entries.filter(entry=>entry[1]!==void 0))},configuredFor=async(ctx,stored,signal,environment)=>{let storedAccounts3=stored?.type==="oauth"&&Array.isArray(stored.accounts)?stored.accounts:[],selectedStoredAccount=stored?.type==="oauth"&&stored.access!==SENTINEL_OAUTH_FIELDS.access&&stored.refresh!==SENTINEL_OAUTH_FIELDS.refresh,effectiveEnvironment=environment??await claudeEnvironment(ctx),environmentTokenCount=Object.values(effectiveEnvironment).filter(Boolean).length,accountCount=storedAccounts3.length+(selectedStoredAccount?1:0)+environmentTokenCount,settings=deps.readSettings?.();return(settings?.tokenInjection??(accountCount>0?"oauth-slots":"ambient"))==="ambient"?environmentTokenCount>0?!0:settings?.enabled!==!0?!1:(deps.readAmbientAuthStatus??readAmbientClaudeAuthStatus)(signal):accountCount>0};return{name:ANTHROPIC_SUBSCRIPTION_NAME,async check({ctx,credential,signal}){let requestEnvironment=requestClaudeEnvironment(credential?.env);return await configuredFor(ctx,credential,signal,Object.keys(requestEnvironment).length>0?requestEnvironment:void 0)?AUTH_CHECK:void 0},async resolveAmbient({ctx,env,signal}){let requestEnvironment=requestClaudeEnvironment(env),environment=Object.keys(requestEnvironment).length>0?requestEnvironment:await claudeEnvironment(ctx);if(await configuredFor(ctx,void 0,signal,environment))return{auth:{apiKey:SENTINEL_OAUTH_FIELDS.access},...Object.keys(environment).length>0?{env:environment}:{},source:AUTH_CHECK.source}},async login(callbacks){let current=await deps.readCurrent()??emptyCredential();if(listAccounts(current).length===0&&deps.readAnthropicCredential&&callbacks.onPrompt){let imported=await deps.readAnthropicCredential();if(imported){let answer3=(await callbacks.onPrompt({message:"An Anthropic OAuth login already exists. Move it here (the anthropic provider is logged out) instead of a new login? [y/N]"})).trim().toLowerCase();if(answer3==="y"||answer3==="yes")return await deps.removeAnthropicCredential?.(),addAccount(current,toSlot(imported,"imported-anthropic","import"))}}let interaction={signal:callbacks.signal??new AbortController().signal,prompt:async prompt=>{if(prompt.type==="select"){let options=prompt.options??[],fallback=options.find(option=>/\(default\)/i.test(option.label))??options[0];return fallback?fallback.id:""}return callbacks.onPrompt?callbacks.onPrompt({message:prompt.message}):""},notify:event=>{event.type==="auth_url"&&callbacks.onAuth&&callbacks.onAuth({url:event.url}),event.type==="progress"&&callbacks.onProgress&&callbacks.onProgress(event.message)}},credential=await(deps.loginFlow??await loadAnthropicOAuth()).login(interaction),existingAfter=listAccounts(current),name=await promptAccountName(callbacks,existingAfter);return upsertAccount(current,toSlot(credential,name,"login"))},async refreshToken(credentials){return credentials},getApiKey(_credentials){return SENTINEL_OAUTH_FIELDS.access}}}import{existsSync as existsSync13,readFileSync as readFileSync18}from"node:fs";import{dirname as dirname30,join as join30,relative as relative5,resolve as resolve13}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"].join(`
|
|
290
|
-
`)}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`].join(`
|
|
291
|
-
`)}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].join(`
|
|
292
|
-
`);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].join(`
|
|
293
|
-
`):[`Claude account '${account.name}' for ${PROVIDER2} is blocked (rate limit)${until===void 0?"":` until ${until}`}, and account fallback is off, so no other account is tried.`,...until===void 0?[]:[` Wait until ${until}, when this account can serve again.`],switchAccountLine(account.pinnedBy),ENABLE_ACCOUNT_FALLBACK].join(`
|
|
294
|
-
`)}function versionFloorRemedy(target,ran){switch(ran?.source){case"override":return`The Claude Code binary set by CLAUDE_CODE_EXECUTABLE (${ran.executable}) is too old for this model. Replace it with ${target}, or unset CLAUDE_CODE_EXECUTABLE to use the Claude Code senpi/omo ships.`;case"bundled":return`The Claude Code bundled with senpi/omo (${ran.executable}) is too old for this model; \`claude update\` does not change it. Update senpi/omo (it ships a newer @anthropic-ai/claude-agent-sdk), install ${target} as \`claude\` on PATH (a newer one is used automatically), or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;case"path":return`The Claude Code on PATH (${ran.executable}) is too old for this model. Run \`claude update\` to get ${target}, or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;case void 0:return`The Claude Code binary is too old for this model. Update senpi/omo, update the \`claude\` on PATH, or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`}}function claudeCodeVersionFloorGuidance(text3,ran){let floor=/does not support this model; version (\S+?) or newer is required|claude_code_version_too_old/i.exec(text3);if(floor){let target=floor[1]===void 0?"a newer Claude Code":`Claude Code ${floor[1].replace(/[.,;:]+$/,"")} or newer`;return versionFloorRemedy(target,ran)}if(/\bmodel_not_found\b|unrecognized_model|not found for provider/i.test(text3))return"The bundled Claude Code binary does not know this model id; update senpi/omo or set CLAUDE_CODE_EXECUTABLE to a newer Claude Code binary."}function sdkErrorGuidance(kind){switch(kind){case"org_not_allowed":return"This organization's policy disallows subscription OAuth use here. Use an API key (ANTHROPIC_API_KEY) or an account from an allowed organization.";case"billing":return"The selected Claude account has a billing problem. Check the plan at claude.com or switch accounts with /claude-account pin <name>.";case"auth_error":return`The account's OAuth token was rejected. Re-run /login ${PROVIDER2} to refresh it, or remove the account with /claude-account remove <name>.`;case"entitlement":return"This model needs usage credits on the selected Claude account (it is not included in the subscription). Switch models with /model, enable usage credits at claude.com, or pick another account with /claude-account pin <name>.";default:return}}function overrideSystemPromptGuidance(path14,reason){return[`Anthropic Subscription override prompt could not load ${path14===void 0?"systemPromptFile":`systemPromptFile "${path14}"`}: ${reason}.`,'Set claudeSdkOauthProvider.systemPromptFile to a readable, non-empty UTF-8 prompt file, or select systemPromptMode "full".'].join(" ")}var armedSessions=new Set;function presetAppendDeprecationGuidance(options){if(armedSessions.has(options.sessionId))return;let isDeprecated=options.mode==="preset-append";if(!options.conflict&&!isDeprecated)return;armedSessions.add(options.sessionId);let parts=[];return isDeprecated&&parts.push("preset-append system-prompt mode is deprecated; `full` mode delivers the complete senpi system prompt; preset-append will be removed after one release."),options.conflict&&parts.push("systemPromptMode wins."),parts.join(" ")}import{readFileSync as readFileSync17}from"node:fs";function resolveCustomSystemPrompt(prompt){return prompt??""}function loadOverrideSystemPrompt(path14){if(path14===void 0)throw new Error(overrideSystemPromptGuidance(void 0,"the path is not configured"));let content;try{content=readFileSync17(path14,"utf-8")}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);throw new Error(overrideSystemPromptGuidance(path14,reason))}if(content.trim().length===0)throw new Error(overrideSystemPromptGuidance(path14,"the file is empty"));return resolveCustomSystemPrompt(content)}var SDK_TO_PI_TOOL_NAME={read:"read",write:"write",edit:"edit",bash:"bash",grep:"grep",glob:"find"},PI_TO_SDK_TOOL_NAME={read:"Read",bash:"Bash",grep:"Grep",find:"Glob",glob:"Glob"},HOST_TOOL_POLICY_FINGERPRINT="host-tool-denial-v4",BUILTIN_SDK_TOOLS=["Read","Bash","Grep","Glob"],TOOL_EXECUTION_DENIED_MESSAGE="Not an error: this is the normal host handoff, so ignore the 'hook error' label. Senpi runs this tool on the host and returns its result as the next user message. Wait for that result, and do not mention this message to the user.",HOST_TOOL_EXECUTION_DENIED_MESSAGE=TOOL_EXECUTION_DENIED_MESSAGE,CUSTOM_TOOLS_MCP_SERVER_NAME="custom-tools",CUSTOM_TOOLS_MCP_PREFIX=`mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`,HOST_CAPTURED_SDK_TOOL_MATCHER="Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*",HOST_TOOL_DENIAL_HOOKS={PreToolUse:[{matcher:HOST_CAPTURED_SDK_TOOL_MATCHER,hooks:[async()=>({continue:!1,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:HOST_TOOL_EXECUTION_DENIED_MESSAGE}})]}]};function pascalCase(value){return value.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(part=>`${part[0]?.toUpperCase()??""}${part.slice(1)}`).join("")}function mapPiToolNameToSdk(name,customToolNameToSdk){let normalized2=name.toLowerCase();return customToolNameToSdk?.get(name)??customToolNameToSdk?.get(normalized2)??PI_TO_SDK_TOOL_NAME[normalized2]??pascalCase(name)}function mapSdkToolNameToPi(name,customToolNameToPi){let normalized2=name.toLowerCase();return SDK_TO_PI_TOOL_NAME[normalized2]??customToolNameToPi?.get(name)??customToolNameToPi?.get(normalized2)??(normalized2.startsWith(CUSTOM_TOOLS_MCP_PREFIX)?name.slice(CUSTOM_TOOLS_MCP_PREFIX.length):name)}function mapToolArgs(toolName,args){let input=args??{};switch(toolName.toLowerCase()){case"read":return{path:input.file_path??input.path,offset:input.offset,limit:input.limit};case"write":return{path:input.file_path??input.path,content:input.content};case"edit":return{path:input.file_path??input.path,edits:Array.isArray(input.edits)?input.edits:[{oldText:input.old_string??input.oldText??input.old_text,newText:input.new_string??input.newText??input.new_text}]};case"bash":return{command:input.command,timeout:typeof input.timeout=="number"?input.timeout/1e3:input.timeout};case"grep":return{pattern:input.pattern,path:input.path,glob:input.glob,ignoreCase:input["-i"]??input.ignoreCase,context:input.context??input["-C"],limit:input.head_limit??input.limit};case"glob":case"find":return{pattern:input.pattern,path:input.path,limit:input.limit};default:return{...input}}}function resolveSdkTools(context){if(!context.tools)return{sdkTools:[...BUILTIN_SDK_TOOLS],customTools:[],customToolNameToSdk:new Map,customToolNameToPi:new Map};let sdkTools2=new Set,customTools=[],customToolNameToSdk=new Map,customToolNameToPi=new Map;for(let tool of context.tools){let normalized2=tool.name.toLowerCase(),sdkName=PI_TO_SDK_TOOL_NAME[normalized2];if(sdkName){sdkTools2.add(sdkName);continue}let customSdkName=`${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;customTools.push(tool),customToolNameToSdk.set(tool.name,customSdkName),customToolNameToSdk.set(normalized2,customSdkName),customToolNameToPi.set(customSdkName,tool.name),customToolNameToPi.set(customSdkName.toLowerCase(),tool.name)}return{sdkTools:[...sdkTools2],customTools,customToolNameToSdk,customToolNameToPi}}var canUseTool=async()=>({behavior:"deny",message:TOOL_EXECUTION_DENIED_MESSAGE});var CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW=2e5;function sdkModelId(model){return model.contextWindow>CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW&&longContextAvailable()?`${model.id}[1m]`:model.id}var ADAPTIVE_THINKING_MODEL_MARKERS=["opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-4-6","sonnet-4.6","sonnet-5","fable-5","mythos-5"],NATIVE_XHIGH_EFFORT_MODEL_MARKERS=["opus-4-7","opus-4-8","opus-5","sonnet-5","fable-5","mythos-5"],DEFAULT_THINKING_BUDGETS={minimal:2048,low:8192,medium:16384,high:31999,max:63999};function includesModelMarker(model,markers){let id=model.id.toLowerCase();return markers.some(marker=>id.includes(marker))}function forcedAdaptiveThinking(model){let compat=model.compat;if(!(!compat||!("forceAdaptiveThinking"in compat)))return typeof compat.forceAdaptiveThinking=="boolean"?compat.forceAdaptiveThinking:void 0}function supportsAdaptiveThinking(model){return forcedAdaptiveThinking(model)??includesModelMarker(model,ADAPTIVE_THINKING_MODEL_MARKERS)}function supportsNativeXhighEffort(model){return includesModelMarker(model,NATIVE_XHIGH_EFFORT_MODEL_MARKERS)}function isEffortLevel(value){return value==="low"||value==="medium"||value==="high"||value==="xhigh"||value==="max"}function mapThinkingLevelToEffort(model,level){let mapped=model.thinkingLevelMap?.[level];if(typeof mapped=="string"&&isEffortLevel(mapped))return mapped;switch(level){case"minimal":case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return supportsNativeXhighEffort(model)?"xhigh":"max";case"max":return"max"}}function mapThinkingTokens(reasoning,thinkingBudgets){let budgetLevel=reasoning==="xhigh"?"high":reasoning,customBudget=thinkingBudgets?.[budgetLevel];return typeof customBudget=="number"&&Number.isFinite(customBudget)&&customBudget>0?customBudget:DEFAULT_THINKING_BUDGETS[budgetLevel]}function findAgentsMdInParents(cwd){let current=resolve13(cwd);for(;;){let candidate=join30(current,"AGENTS.md");if(existsSync13(candidate))return candidate;let parent=dirname30(current);if(parent===current)return;current=parent}}function sanitizeAgentsContent(content){let escapedConfigDirectory=CONFIG_DIR_NAME.replace(/^\./,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return content.replace(new RegExp(`~/${escapedConfigDirectory}\\b`,"gi"),"~/.claude").replace(new RegExp(`(^|[\\s'"\`])\\.${escapedConfigDirectory}/`,"g"),"$1.claude/").replace(new RegExp(`\\b${escapedConfigDirectory}\\b`,"gi"),"environment")}function extractAgentsAppend(cwd){let agentsPath=findAgentsMdInParents(cwd)??join30(getAgentDir(),"AGENTS.md");if(existsSync13(agentsPath))try{let content=sanitizeAgentsContent(readFileSync18(agentsPath,"utf-8").trim());return content.length>0?`# CLAUDE.md
|
|
295
|
-
|
|
296
|
-
${content}`:void 0}catch{return}}function rewriteSkillsLocations(skillsBlock,cwd){let globalSkillsRoot=join30(getAgentDir(),"skills"),projectSkillsRoot=join30(cwd,CONFIG_DIR_NAME,"skills");return skillsBlock.replace(/<location>([^<]+)<\/location>/g,(_match,location)=>location.startsWith(globalSkillsRoot)?`<location>~/.claude/skills/${relative5(globalSkillsRoot,location).replace(/^\.+/,"")}</location>`:location.startsWith(projectSkillsRoot)?`<location>.claude/skills/${relative5(projectSkillsRoot,location).replace(/^\.+/,"")}</location>`:`<location>${location}</location>`)}function extractSkillsAppend(systemPrompt,cwd){if(!systemPrompt)return;let start=systemPrompt.indexOf("The following skills provide specialized instructions for specific tasks."),end=start===-1?-1:systemPrompt.indexOf("</available_skills>",start);if(end!==-1)return rewriteSkillsLocations(systemPrompt.slice(start,end+19).trim(),cwd)}function extractProjectRulesAppend(systemPrompt){if(!systemPrompt)return;let searchFrom=0;for(;searchFrom<=systemPrompt.length;){let sentinelStart=systemPrompt.indexOf(PROJECT_RULES_REGION_START_MARKER,searchFrom);if(sentinelStart===-1)return;let regionStart=sentinelStart+PROJECT_RULES_REGION_START_MARKER.length,regionEnd=systemPrompt.indexOf(PROJECT_RULES_REGION_END_MARKER,regionStart);if(regionEnd===-1)return;let region=systemPrompt.slice(regionStart,regionEnd).trim();if(isProjectRulesEnvelope(region))return region;searchFrom=regionStart}}function isProjectRulesEnvelope(region){return region.startsWith(`${PROJECT_RULES_START_MARKER}
|
|
297
|
-
${PROJECT_RULES_HEADING}
|
|
298
|
-
`)&®ion.endsWith(`
|
|
299
|
-
${PROJECT_RULES_END_MARKER}`)}function resolveSettingSources(providerSettings,mode,authLane){return providerSettings.settingSources!==void 0?[...providerSettings.settingSources]:mode!=="preset-append"||authLane!=="ambient"?[]:["user","project"]}function buildAnthropicSubscriptionQueryOptions(input){let cwd=input.cwd??process.cwd(),providerSettings=input.providerSettings??loadAnthropicSubscriptionProviderSettingsFromDisk(cwd),appendSystemPrompt=providerSettings.appendSystemPrompt!==!1,resolvedMode=resolveSystemPromptMode(providerSettings),mode=resolvedMode.mode;if(input.sessionId!==void 0&&input.onGuidance!==void 0){let deprecation=presetAppendDeprecationGuidance({mode,conflict:resolvedMode.conflict,sessionId:input.sessionId});deprecation!==void 0&&input.onGuidance(deprecation)}let authLane=input.authLane??providerSettings.tokenInjection??"ambient",append=mode==="preset-append"?[extractAgentsAppend(cwd),extractSkillsAppend(input.context.systemPrompt,cwd),extractProjectRulesAppend(input.context.systemPrompt)].filter(part=>part!==void 0):[],systemPrompt=mode==="preset-append"?{type:"preset",preset:"claude_code",append:append.join(`
|
|
300
|
-
|
|
301
|
-
`)||void 0}:mode==="override"?loadOverrideSystemPrompt(providerSettings.systemPromptFile):resolveCustomSystemPrompt(input.context.systemPrompt),toolLessRequest=input.streamOptions?.toolChoice==="none",emptyToolContext=(input.context.tools?.length??0)===0,strictMcpConfig=toolLessRequest||(providerSettings.strictMcpConfig??!appendSystemPrompt),senpiOwnsCompaction=resolveCompactionOwner(providerSettings)==="senpi",queryOptions={cwd,model:sdkModelId(input.model),tools:toolLessRequest||emptyToolContext?[]:input.tools?[...input.tools]:[...BUILTIN_SDK_TOOLS],permissionMode:"dontAsk",includePartialMessages:!0,canUseTool,hooks:HOST_TOOL_DENIAL_HOOKS,systemPrompt,settings:{autoCompactEnabled:!senpiOwnsCompaction},settingSources:resolveSettingSources(providerSettings,mode,authLane)};senpiOwnsCompaction&&(queryOptions.env={CLAUDE_CODE_TOTAL_TOKENS_REMINDER:"off"}),input.pathToClaudeCodeExecutable&&(queryOptions.pathToClaudeCodeExecutable=input.pathToClaudeCodeExecutable),toolLessRequest&&(queryOptions.maxTurns=1),strictMcpConfig&&(queryOptions.extraArgs={"strict-mcp-config":null});let reasoning=input.streamOptions?.reasoning;return reasoning&&supportsAdaptiveThinking(input.model)?(queryOptions.thinking={type:"adaptive",display:"summarized"},queryOptions.effort=mapThinkingLevelToEffort(input.model,reasoning)):reasoning&&(queryOptions.maxThinkingTokens=mapThinkingTokens(reasoning,input.streamOptions?.thinkingBudgets)),queryOptions}import{createHash as createHash7}from"node:crypto";var IMAGE_MEDIA_TYPES=["image/jpeg","image/png","image/gif","image/webp"];function appendSdkContentBlocks(blocks,content){if(typeof content=="string")return content.length>0&&blocks.push({type:"text",text:content}),content.trim().length>0;let hasText=!1;for(let entry of content)hasText=appendEntry(blocks,entry)||hasText;return hasText}function isRecord9(value){return typeof value=="object"&&value!==null}function isSdkImageMediaType(value){return parseImageMediaType(value)!==void 0}function parseImageMediaType(value){for(let mediaType of IMAGE_MEDIA_TYPES)if(mediaType===value)return mediaType}function omittedPlaceholder(entry){return isRecord9(entry)&&typeof entry.type=="string"?entry.type==="image"?typeof entry.mimeType=="string"&&typeof entry.data=="string"?`[image block omitted: unsupported media type ${entry.mimeType}]`:"[image block omitted: missing data]":`[unsupported content block omitted: ${entry.type}]`:"[unsupported content block omitted]"}function imageFromEntry(entry){if(typeof entry.mimeType!="string"||typeof entry.data!="string")return;let mediaType=parseImageMediaType(entry.mimeType);if(mediaType!==void 0)return{type:"image",source:{type:"base64",media_type:mediaType,data:entry.data}}}function appendEntry(blocks,entry){if(typeof entry=="string")return blocks.push({type:"text",text:entry}),entry.trim().length>0;if(!isRecord9(entry))return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0;if(entry.type==="text")return typeof entry.text=="string"?(blocks.push({type:"text",text:entry.text}),entry.text.trim().length>0):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0);if(entry.type==="image"){let image=imageFromEntry(entry);return image?(blocks.push(image),!1):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0)}return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0}var MAX_REPLAYED_HISTORY_IMAGES=8;function subject(origin){return origin.kind==="user"?"[image attached by the user":`[image returned by the ${origin.toolName} tool`}function source(origin){return origin.kind==="user"?"attached by the user":`returned by the ${origin.toolName} tool, id=${origin.toolCallId}`}var coldSeedImageText={toolOutput:toolName=>`[image returned by the ${toolName} tool to your own call (tool output, not a user attachment)]`,userHistory:"[image the user attached in this earlier turn (history, not part of the current message)]",duplicate:(origin,first)=>`${subject(origin)}: identical to an image already shown above (${source(first)}); not attached again]`,answered:origin=>`[image returned earlier by the ${origin.toolName} tool, id=${origin.toolCallId}: already seen earlier in this conversation; run the tool again if you need it]`,capped:origin=>`${subject(origin)}: omitted from this replay, which re-sends at most ${MAX_REPLAYED_HISTORY_IMAGES} earlier images; re-read the source if you need it]`,unreadable:origin=>`${subject(origin)}: omitted because its image data is missing or unreadable]`},BASE64=/^[A-Za-z0-9+/_-]+={0,2}$/;function decodeImageData(data){let compact2=data.replace(/\s+/g,"");if(!(compact2.length===0||compact2.replace(/=+$/,"").length%4===1||!BASE64.test(compact2)))return{sha256:createHash7("sha256").update(Buffer.from(compact2,"base64")).digest("hex"),compactBase64:compact2}}function isRecord10(value){return typeof value=="object"&&value!==null}function originOf(message,sdkToolName){return message.role==="user"?{kind:"user"}:{kind:"tool",toolName:sdkToolName(message.toolName),toolCallId:message.toolCallId}}function imageBearingContent(history,sdkToolName){let contents=new Map;return history.forEach((message,messageIndex)=>{message.role!=="user"&&message.role!=="toolResult"||typeof message.content!="string"&&contents.set(messageIndex,{origin:originOf(message,sdkToolName),content:message.content})}),contents}function collectOccurrences(contents,lastAssistantIndex){let occurrences=[];for(let[messageIndex,{origin,content}]of contents){let answered=messageIndex<lastAssistantIndex;content.forEach((entry,entryIndex)=>{!isRecord10(entry)||entry.type!=="image"||typeof entry.data!="string"||typeof entry.mimeType!="string"||isSdkImageMediaType(entry.mimeType)&&occurrences.push({messageIndex,answered,entryIndex,origin,entry,decoded:decodeImageData(entry.data)})})}return occurrences}function selectUserFirstThenMostRecent(occurrences){let ranked=new Map;occurrences.forEach((occurrence,order)=>{let hash=occurrence.decoded?.sha256;if(hash===void 0||isAnsweredToolImage(occurrence))return;let previous=ranked.get(hash);ranked.set(hash,{fromUser:(previous?.fromUser??!1)||occurrence.origin.kind==="user",lastSeen:order})});let ordered=[...ranked.entries()].sort(([,a],[,b])=>Number(b.fromUser)-Number(a.fromUser)||b.lastSeen-a.lastSeen);return new Set(ordered.slice(0,MAX_REPLAYED_HISTORY_IMAGES).map(([hash])=>hash))}function isAnsweredToolImage(occurrence){return occurrence.answered&&occurrence.origin.kind==="tool"}function replayHistoryImages(history,sdkToolName,options={}){let contents=imageBearingContent(history,sdkToolName),answeredBefore=options.inProgressTurn?Math.max(0,history.findLastIndex(message=>message.role==="user")):history.findLastIndex(message=>message.role==="assistant"),occurrences=collectOccurrences(contents,answeredBefore);if(occurrences.length===0)return new Map;let replayed=selectUserFirstThenMostRecent(occurrences),firstShown=new Map,replacements=new Map;for(let occurrence of occurrences){let{origin,entry,decoded}=occurrence,hash=decoded?.sha256,replacement,shownEarlier=hash===void 0?void 0:firstShown.get(hash);if(decoded===void 0||hash===void 0)replacement=[{type:"text",text:coldSeedImageText.unreadable(origin)}];else if(origin.kind==="tool"&&occurrence.answered&&shownEarlier===void 0)replacement=[{type:"text",text:coldSeedImageText.answered(origin)}];else if(!replayed.has(hash)&&shownEarlier===void 0)replacement=[{type:"text",text:coldSeedImageText.capped(origin)}];else{let first=firstShown.get(hash);if(first)replacement=[{type:"text",text:coldSeedImageText.duplicate(origin,first)}];else{firstShown.set(hash,origin);let canonical={...entry,data:Buffer.from(decoded.compactBase64,"base64").toString("base64")},label3=origin.kind==="tool"?coldSeedImageText.toolOutput(origin.toolName):occurrence.answered?coldSeedImageText.userHistory:void 0;replacement=label3===void 0?[canonical]:[{type:"text",text:label3},canonical]}}let perMessage=replacements.get(occurrence.messageIndex)??new Map;perMessage.set(occurrence.entryIndex,replacement),replacements.set(occurrence.messageIndex,perMessage)}let rewritten=new Map;for(let[messageIndex,perMessage]of replacements){let content=contents.get(messageIndex)?.content??[];rewritten.set(messageIndex,content.flatMap((entry,entryIndex)=>perMessage.get(entryIndex)??[entry]))}return rewritten}function contentToText(content,customToolNameToSdk){return content.map(block=>block.type==="text"?block.text:block.type==="thinking"?block.thinking:block.type==="toolCall"?`Historical tool call (non-executable): ${mapPiToolNameToSdk(block.name,customToolNameToSdk)} args=${JSON.stringify(block.arguments)}`:`[${block.type}]`).join(`
|
|
286
|
+
`),"info")}async function addAccount2(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/claude-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("Anthropic Subscription account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!==LOGIN_CANCELLED_MESSAGE&&ctx.ui.notify(`Failed to add Anthropic Subscription account: ${message}`,"error")}}async function removeNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account remove <name>","error");return}let{accounts}=readAccounts(ctx,environment),target=accounts.find(account=>account.name===name);if(!target)return accountError(ctx,name);if(target.source==="env"){ctx.ui.notify(`Anthropic Subscription account '${name}' comes from the environment and cannot be removed.`,"error");return}try{await removeProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function pinNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account pin <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unblockNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account unblock <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{let env=new Proxy({},{get:(_target,key)=>environment(String(key))}),lifted=await unblockProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name,env);ctx.ui.notify(lifted?`Unblocked Anthropic Subscription account: ${name}. The next turn may use it.`:`Anthropic Subscription account '${name}' has no usage block to lift.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unpinAccount(ctx){if(!asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID))?.pinned){ctx.ui.notify("No stored Anthropic Subscription account pin is set.","info");return}await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned Anthropic Subscription account.","info")}var CLAUDE_SDK_OAUTH_API_ID="claude-sdk-oauth";import{mkdirSync as mkdirSync7,readFileSync as readFileSync13,renameSync as renameSync5,rmSync as rmSync3,writeFileSync as writeFileSync7}from"node:fs";import{dirname as dirname27,join as join27}from"node:path";var LONG_CONTEXT_REFUSAL_TTL_MS=360*60*1e3,STATE_FILE="anthropic-subscription-long-context.json",STATE_VERSION=2,listeners2=new Set,refusedUntil,loaded=!1,statePath=()=>join27(getAgentDir(),STATE_FILE);function load(){if(!loaded){loaded=!0;try{let parsed=JSON.parse(readFileSync13(statePath(),"utf8")),state2=parsed!==null&&typeof parsed=="object"?parsed:{};if(state2.version!==STATE_VERSION){rmSync3(statePath(),{force:!0});return}let until=state2.refusedUntil;typeof until=="number"&&Number.isFinite(until)&&(refusedUntil=until,scheduleExpiry(Date.now()))}catch{}}}function longContextAvailable(now2=Date.now()){return load(),refusedUntil===void 0||now2>=refusedUntil}var expiryTimer;function scheduleExpiry(now2){expiryTimer!==void 0&&clearTimeout(expiryTimer),expiryTimer=void 0,!(refusedUntil===void 0||now2>=refusedUntil)&&(expiryTimer=setTimeout(()=>{expiryTimer=void 0,notify(!0)},refusedUntil-now2),expiryTimer.unref?.())}function notify(available){for(let listener of[...listeners2])try{listener(available)}catch{}}function markLongContextRefused(now2=Date.now()){load();let wasAvailable=longContextAvailable(now2);refusedUntil=now2+LONG_CONTEXT_REFUSAL_TTL_MS;try{mkdirSync7(dirname27(statePath()),{recursive:!0});let temporary=`${statePath()}.${process.pid}.tmp`;writeFileSync7(temporary,`${JSON.stringify({version:STATE_VERSION,refusedUntil})}
|
|
287
|
+
`),renameSync5(temporary,statePath())}catch{}scheduleExpiry(now2),wasAvailable&¬ify(!1)}function onLongContextAvailabilityChange(listener){return listeners2.add(listener),()=>listeners2.delete(listener)}var CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW=2e5,LEGACY_LONG_CONTEXT_MODEL_IDS=new Set(["claude-3-7-sonnet","claude-opus-4-6","claude-sonnet-4-0","claude-sonnet-4-5","claude-sonnet-4-6"]);function opensLegacyLongContext(model){return model.contextWindow>CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW&&LEGACY_LONG_CONTEXT_MODEL_IDS.has(model.id)}function plannedContextWindow(model,longContext=longContextAvailable()){return opensLegacyLongContext(model)&&!longContext?CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW:model.contextWindow}function sdkModelId(model){return opensLegacyLongContext(model)&&longContextAvailable()?`${model.id}[1m]`:model.id}function asksLegacyLongContext(sdkModel){return sdkModel?.endsWith("[1m]")===!0}import{spawn as spawn5}from"node:child_process";import{readFileSync as readFileSync16,statSync as statSync9}from"node:fs";import{createRequire as createRequire2}from"node:module";import{dirname as dirname29,posix as posix2,win32 as win323}from"node:path";import{createHash as createHash6}from"crypto";import{chmodSync as chmodSync3,existsSync as existsSync12,lstatSync,mkdirSync as mkdirSync8,readFileSync as readFileSync14,renameSync as renameSync6,unlinkSync,writeFileSync as writeFileSync8}from"fs";import{tmpdir as osTmpdir}from"os";import{basename as basename12,join as join28}from"path";function tmpdir3(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join28(tmpdir3(),process.platform==="win32"?"claude":`claude-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync8(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync3(dir,448)}else try{mkdirSync8(dir,{recursive:!0,mode:448})}catch{}return dir}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync14(embeddedPath),hash=createHash6("sha256").update(content).digest("hex").slice(0,16),tmpDir=join28(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename12(embeddedPath),tmpPath=join28(tmpDir,fileName);if(mkdirSync8(tmpDir,{recursive:!0,mode:448}),existsSync12(tmpPath))return tmpPath;let tmpFile=join28(tmpDir,`${fileName}.tmp.${process.pid}`);writeFileSync8(tmpFile,content),chmodSync3(tmpFile,493);try{renameSync6(tmpFile,tmpPath)}catch(e){if((e.code==="EPERM"||e.code==="EBUSY")&&existsSync12(tmpPath)){try{unlinkSync(tmpFile)}catch{}return tmpPath}throw e}return tmpPath}catch(err){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32 as win322}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text3=deps.readText?.(batchPath),match=text3===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text3);if(!match?.[1])return;let target=win322.join(win322.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform5,pathext){return platform5!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform5,path14){if(path14===void 0)return[];let delimiter2=platform5==="win32"?";":":";return path14.split(delimiter2).map(entry=>platform5==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join102=deps.platform==="win32"?win322.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path14=join102(directory,candidate);if(!deps.isFile(path14))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win322.extname(path14).toLowerCase()))return path14;let target=nativeTargetOfBatchFile(path14,deps);if(target!==void 0)return target;deps.onSkip?.(path14)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync15}from"node:fs";import{dirname as dirname28,join as join29}from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text3){let match=text3===void 0?null:VERSION_PATTERN.exec(text3);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath4(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync15(join29(dirname28(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform5,arch4,preferMusl=!1){let ext=platform5==="win32"?".exe":"";if(platform5==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch4}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch4}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform5}-${arch4}/claude${ext}`]}function spawnableSpelling(platform5,candidate){return platform5==="win32"?win323.toNamespacedPath(win323.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source2)=>({executable,source:source2,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}let executableDir=deps.isCompiledBun?.()?deps.executableDir?.():void 0;if(executableDir!==void 0){let path14=deps.platform==="win32"?win323:posix2;for(let candidate of candidates){let accepted=accept(path14.join(executableDir,"node_modules",...candidate.split("/")));if(accepted!==void 0)return accepted}}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
|
|
288
|
+
`))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path14){try{return readFileSync16(path14,"utf8")}catch{return}}function isRegularFile(path14){try{return statSync9(path14).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,executableDir:()=>dirname29(process.execPath),resolve:spec2=>(defaultRequire||(defaultRequire=createRequire2(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec2))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var AMBIENT_STATUS_TTL_MS=3e4,AMBIENT_PROBE_TIMEOUT_MS=1e4;function createAmbientAuthStatusReader(probe,now2=Date.now,ttlMs=AMBIENT_STATUS_TTL_MS){let cached,inFlight,startProbe=()=>{let status=probe().then(value=>(cached={at:now2(),value},value));inFlight=status;let clear=()=>{inFlight===status&&(inFlight=void 0)};return status.then(clear,clear),status};return signal=>signal?.aborted?Promise.reject(signal.reason):cached&&now2()-cached.at<ttlMs?Promise.resolve(cached.value):untilAborted2(inFlight??startProbe(),signal)}function untilAborted2(status,signal){if(signal===void 0)return status;if(signal.aborted)return Promise.reject(signal.reason);let abortController=new AbortController,aborted=new Promise((_resolve,reject)=>{signal.addEventListener("abort",()=>reject(signal.reason),{once:!0,signal:abortController.signal})});return Promise.race([status,aborted]).finally(()=>abortController.abort())}async function probeAmbientClaudeAuthStatus(options={}){let timeoutMs=options.timeoutMs??AMBIENT_PROBE_TIMEOUT_MS,spawnProbe=options.spawnProbe??((command,args)=>spawn5(command,[...args],{stdio:"ignore",windowsHide:!0})),executable;try{executable=resolveClaudeCodeExecutable(defaultExecutableDeps())}catch{return!1}return new Promise(resolve53=>{let settled2=!1,finish=available=>{settled2||(settled2=!0,clearTimeout(deadline),resolve53(available))},child=spawnProbe(executable,["auth","status"]),deadline=setTimeout(()=>{signalSpawnedChild(child,"SIGKILL"),finish(!1)},timeoutMs);deadline.unref?.(),child.once("error",()=>finish(!1)),child.once("close",code=>finish(code===0))})}var readAmbientClaudeAuthStatus=createAmbientAuthStatusReader(probeAmbientClaudeAuthStatus);var ANTHROPIC_SUBSCRIPTION_NAME="Anthropic Subscription (Claude Pro/Max)",ENV_TOKEN_NAMES=["CLAUDE_CODE_OAUTH_TOKEN",...Array.from({length:15},(_,index)=>`CLAUDE_CODE_OAUTH_TOKEN_${index+2}`)],ENV_TOKEN_NAME_SET=new Set(ENV_TOKEN_NAMES),AUTH_CHECK={source:"Anthropic Subscription",type:"oauth"};function requestClaudeEnvironment(value){if(typeof value!="object"||value===null||Array.isArray(value))return{};let environment={};for(let[name,entry]of Object.entries(value))ENV_TOKEN_NAME_SET.has(name)&&typeof entry=="string"&&(environment[name]=entry);return environment}function toSlot(credential,name,source2){return{name,access:credential.access,refresh:credential.refresh,expires:credential.expires,source:source2}}function recoveryTargetName(existing2){if(existing2.length===1)return existing2[0]?.name;let authBlocked=existing2.filter(slot2=>slot2.blockReason==="auth_error");if(authBlocked.length===1)return authBlocked[0]?.name}async function promptAccountName(callbacks,existing2){if(existing2.length===0)return"default";let recovery=recoveryTargetName(existing2),fallback=`account-${existing2.length+1}`;if(!callbacks.onPrompt)return recovery??fallback;let names=existing2.map(slot2=>slot2.name).join(", "),message=recovery===void 0?`Name for this account (existing: ${names}; press Enter to add ${fallback}, or type an existing name to refresh it)`:`Name for this account (existing: ${names}; press Enter to refresh '${recovery}' with this login)`;return(await callbacks.onPrompt({message,placeholder:recovery??fallback})).trim()||recovery||fallback}function createOAuthConfig(deps){let claudeEnvironment=async ctx=>{let entries=await Promise.all(ENV_TOKEN_NAMES.map(async name=>[name,await ctx.env(name)]));return Object.fromEntries(entries.filter(entry=>entry[1]!==void 0))},configuredFor=async(ctx,stored,signal,environment)=>{let storedAccounts3=stored?.type==="oauth"&&Array.isArray(stored.accounts)?stored.accounts:[],selectedStoredAccount=stored?.type==="oauth"&&stored.access!==SENTINEL_OAUTH_FIELDS.access&&stored.refresh!==SENTINEL_OAUTH_FIELDS.refresh,effectiveEnvironment=environment??await claudeEnvironment(ctx),environmentTokenCount=Object.values(effectiveEnvironment).filter(Boolean).length,accountCount=storedAccounts3.length+(selectedStoredAccount?1:0)+environmentTokenCount,settings=deps.readSettings?.();return(settings?.tokenInjection??(accountCount>0?"oauth-slots":"ambient"))==="ambient"?environmentTokenCount>0?!0:settings?.enabled!==!0?!1:(deps.readAmbientAuthStatus??readAmbientClaudeAuthStatus)(signal):accountCount>0};return{name:ANTHROPIC_SUBSCRIPTION_NAME,async check({ctx,credential,signal}){let requestEnvironment=requestClaudeEnvironment(credential?.env);return await configuredFor(ctx,credential,signal,Object.keys(requestEnvironment).length>0?requestEnvironment:void 0)?AUTH_CHECK:void 0},async resolveAmbient({ctx,env,signal}){let requestEnvironment=requestClaudeEnvironment(env),environment=Object.keys(requestEnvironment).length>0?requestEnvironment:await claudeEnvironment(ctx);if(await configuredFor(ctx,void 0,signal,environment))return{auth:{apiKey:SENTINEL_OAUTH_FIELDS.access},...Object.keys(environment).length>0?{env:environment}:{},source:AUTH_CHECK.source}},async login(callbacks){let current=await deps.readCurrent()??emptyCredential();if(listAccounts(current).length===0&&deps.readAnthropicCredential&&callbacks.onPrompt){let imported=await deps.readAnthropicCredential();if(imported){let answer3=(await callbacks.onPrompt({message:"An Anthropic OAuth login already exists. Move it here (the anthropic provider is logged out) instead of a new login? [y/N]"})).trim().toLowerCase();if(answer3==="y"||answer3==="yes")return await deps.removeAnthropicCredential?.(),addAccount(current,toSlot(imported,"imported-anthropic","import"))}}let interaction={signal:callbacks.signal??new AbortController().signal,prompt:async prompt=>{if(prompt.type==="select"){let options=prompt.options??[],fallback=options.find(option=>/\(default\)/i.test(option.label))??options[0];return fallback?fallback.id:""}return callbacks.onPrompt?callbacks.onPrompt({message:prompt.message}):""},notify:event=>{event.type==="auth_url"&&callbacks.onAuth&&callbacks.onAuth({url:event.url}),event.type==="progress"&&callbacks.onProgress&&callbacks.onProgress(event.message)}},credential=await(deps.loginFlow??await loadAnthropicOAuth()).login(interaction),existingAfter=listAccounts(current),name=await promptAccountName(callbacks,existingAfter);return upsertAccount(current,toSlot(credential,name,"login"))},async refreshToken(credentials){return credentials},getApiKey(_credentials){return SENTINEL_OAUTH_FIELDS.access}}}import{createHash as createHash7}from"node:crypto";var IMAGE_MEDIA_TYPES=["image/jpeg","image/png","image/gif","image/webp"];function appendSdkContentBlocks(blocks,content){if(typeof content=="string")return content.length>0&&blocks.push({type:"text",text:content}),content.trim().length>0;let hasText=!1;for(let entry of content)hasText=appendEntry(blocks,entry)||hasText;return hasText}function isRecord9(value){return typeof value=="object"&&value!==null}function isSdkImageMediaType(value){return parseImageMediaType(value)!==void 0}function parseImageMediaType(value){for(let mediaType of IMAGE_MEDIA_TYPES)if(mediaType===value)return mediaType}function omittedPlaceholder(entry){return isRecord9(entry)&&typeof entry.type=="string"?entry.type==="image"?typeof entry.mimeType=="string"&&typeof entry.data=="string"?`[image block omitted: unsupported media type ${entry.mimeType}]`:"[image block omitted: missing data]":`[unsupported content block omitted: ${entry.type}]`:"[unsupported content block omitted]"}function imageFromEntry(entry){if(typeof entry.mimeType!="string"||typeof entry.data!="string")return;let mediaType=parseImageMediaType(entry.mimeType);if(mediaType!==void 0)return{type:"image",source:{type:"base64",media_type:mediaType,data:entry.data}}}function appendEntry(blocks,entry){if(typeof entry=="string")return blocks.push({type:"text",text:entry}),entry.trim().length>0;if(!isRecord9(entry))return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0;if(entry.type==="text")return typeof entry.text=="string"?(blocks.push({type:"text",text:entry.text}),entry.text.trim().length>0):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0);if(entry.type==="image"){let image=imageFromEntry(entry);return image?(blocks.push(image),!1):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0)}return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0}var MAX_REPLAYED_HISTORY_IMAGES=8;function subject(origin){return origin.kind==="user"?"[image attached by the user":`[image returned by the ${origin.toolName} tool`}function source(origin){return origin.kind==="user"?"attached by the user":`returned by the ${origin.toolName} tool, id=${origin.toolCallId}`}var coldSeedImageText={toolOutput:toolName=>`[image returned by the ${toolName} tool to your own call (tool output, not a user attachment)]`,userHistory:"[image the user attached in this earlier turn (history, not part of the current message)]",duplicate:(origin,first)=>`${subject(origin)}: identical to an image already shown above (${source(first)}); not attached again]`,answered:origin=>`[image returned earlier by the ${origin.toolName} tool, id=${origin.toolCallId}: already seen earlier in this conversation; run the tool again if you need it]`,capped:origin=>`${subject(origin)}: omitted from this replay, which re-sends at most ${MAX_REPLAYED_HISTORY_IMAGES} earlier images; re-read the source if you need it]`,unreadable:origin=>`${subject(origin)}: omitted because its image data is missing or unreadable]`},BASE64=/^[A-Za-z0-9+/_-]+={0,2}$/;function decodeImageData(data){let compact2=data.replace(/\s+/g,"");if(!(compact2.length===0||compact2.replace(/=+$/,"").length%4===1||!BASE64.test(compact2)))return{sha256:createHash7("sha256").update(Buffer.from(compact2,"base64")).digest("hex"),compactBase64:compact2}}function isRecord10(value){return typeof value=="object"&&value!==null}function originOf(message,sdkToolName){return message.role==="user"?{kind:"user"}:{kind:"tool",toolName:sdkToolName(message.toolName),toolCallId:message.toolCallId}}function imageBearingContent(history,sdkToolName){let contents=new Map;return history.forEach((message,messageIndex)=>{message.role!=="user"&&message.role!=="toolResult"||typeof message.content!="string"&&contents.set(messageIndex,{origin:originOf(message,sdkToolName),content:message.content})}),contents}function collectOccurrences(contents,lastAssistantIndex){let occurrences=[];for(let[messageIndex,{origin,content}]of contents){let answered=messageIndex<lastAssistantIndex;content.forEach((entry,entryIndex)=>{!isRecord10(entry)||entry.type!=="image"||typeof entry.data!="string"||typeof entry.mimeType!="string"||isSdkImageMediaType(entry.mimeType)&&occurrences.push({messageIndex,answered,entryIndex,origin,entry,decoded:decodeImageData(entry.data)})})}return occurrences}function selectUserFirstThenMostRecent(occurrences){let ranked=new Map;occurrences.forEach((occurrence,order)=>{let hash=occurrence.decoded?.sha256;if(hash===void 0||isAnsweredToolImage(occurrence))return;let previous=ranked.get(hash);ranked.set(hash,{fromUser:(previous?.fromUser??!1)||occurrence.origin.kind==="user",lastSeen:order})});let ordered=[...ranked.entries()].sort(([,a],[,b])=>Number(b.fromUser)-Number(a.fromUser)||b.lastSeen-a.lastSeen);return new Set(ordered.slice(0,MAX_REPLAYED_HISTORY_IMAGES).map(([hash])=>hash))}function isAnsweredToolImage(occurrence){return occurrence.answered&&occurrence.origin.kind==="tool"}function replayHistoryImages(history,sdkToolName,options={}){let contents=imageBearingContent(history,sdkToolName),answeredBefore=options.inProgressTurn?Math.max(0,history.findLastIndex(message=>message.role==="user")):history.findLastIndex(message=>message.role==="assistant"),occurrences=collectOccurrences(contents,answeredBefore);if(occurrences.length===0)return new Map;let replayed=selectUserFirstThenMostRecent(occurrences),firstShown=new Map,replacements=new Map;for(let occurrence of occurrences){let{origin,entry,decoded}=occurrence,hash=decoded?.sha256,replacement,shownEarlier=hash===void 0?void 0:firstShown.get(hash);if(decoded===void 0||hash===void 0)replacement=[{type:"text",text:coldSeedImageText.unreadable(origin)}];else if(origin.kind==="tool"&&occurrence.answered&&shownEarlier===void 0)replacement=[{type:"text",text:coldSeedImageText.answered(origin)}];else if(!replayed.has(hash)&&shownEarlier===void 0)replacement=[{type:"text",text:coldSeedImageText.capped(origin)}];else{let first=firstShown.get(hash);if(first)replacement=[{type:"text",text:coldSeedImageText.duplicate(origin,first)}];else{firstShown.set(hash,origin);let canonical={...entry,data:Buffer.from(decoded.compactBase64,"base64").toString("base64")},label3=origin.kind==="tool"?coldSeedImageText.toolOutput(origin.toolName):occurrence.answered?coldSeedImageText.userHistory:void 0;replacement=label3===void 0?[canonical]:[{type:"text",text:label3},canonical]}}let perMessage=replacements.get(occurrence.messageIndex)??new Map;perMessage.set(occurrence.entryIndex,replacement),replacements.set(occurrence.messageIndex,perMessage)}let rewritten=new Map;for(let[messageIndex,perMessage]of replacements){let content=contents.get(messageIndex)?.content??[];rewritten.set(messageIndex,content.flatMap((entry,entryIndex)=>perMessage.get(entryIndex)??[entry]))}return rewritten}var SDK_TO_PI_TOOL_NAME={read:"read",write:"write",edit:"edit",bash:"bash",grep:"grep",glob:"find"},PI_TO_SDK_TOOL_NAME={read:"Read",bash:"Bash",grep:"Grep",find:"Glob",glob:"Glob"},HOST_TOOL_POLICY_FINGERPRINT="host-tool-denial-v4",BUILTIN_SDK_TOOLS=["Read","Bash","Grep","Glob"],TOOL_EXECUTION_DENIED_MESSAGE="Not an error: this is the normal host handoff, so ignore the 'hook error' label. Senpi runs this tool on the host and returns its result as the next user message. Wait for that result, and do not mention this message to the user.",HOST_TOOL_EXECUTION_DENIED_MESSAGE=TOOL_EXECUTION_DENIED_MESSAGE,CUSTOM_TOOLS_MCP_SERVER_NAME="custom-tools",CUSTOM_TOOLS_MCP_PREFIX=`mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`,HOST_CAPTURED_SDK_TOOL_MATCHER="Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*",HOST_TOOL_DENIAL_HOOKS={PreToolUse:[{matcher:HOST_CAPTURED_SDK_TOOL_MATCHER,hooks:[async()=>({continue:!1,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:HOST_TOOL_EXECUTION_DENIED_MESSAGE}})]}]};function pascalCase(value){return value.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(part=>`${part[0]?.toUpperCase()??""}${part.slice(1)}`).join("")}function mapPiToolNameToSdk(name,customToolNameToSdk){let normalized2=name.toLowerCase();return customToolNameToSdk?.get(name)??customToolNameToSdk?.get(normalized2)??PI_TO_SDK_TOOL_NAME[normalized2]??pascalCase(name)}function mapSdkToolNameToPi(name,customToolNameToPi){let normalized2=name.toLowerCase();return SDK_TO_PI_TOOL_NAME[normalized2]??customToolNameToPi?.get(name)??customToolNameToPi?.get(normalized2)??(normalized2.startsWith(CUSTOM_TOOLS_MCP_PREFIX)?name.slice(CUSTOM_TOOLS_MCP_PREFIX.length):name)}function mapToolArgs(toolName,args){let input=args??{};switch(toolName.toLowerCase()){case"read":return{path:input.file_path??input.path,offset:input.offset,limit:input.limit};case"write":return{path:input.file_path??input.path,content:input.content};case"edit":return{path:input.file_path??input.path,edits:Array.isArray(input.edits)?input.edits:[{oldText:input.old_string??input.oldText??input.old_text,newText:input.new_string??input.newText??input.new_text}]};case"bash":return{command:input.command,timeout:typeof input.timeout=="number"?input.timeout/1e3:input.timeout};case"grep":return{pattern:input.pattern,path:input.path,glob:input.glob,ignoreCase:input["-i"]??input.ignoreCase,context:input.context??input["-C"],limit:input.head_limit??input.limit};case"glob":case"find":return{pattern:input.pattern,path:input.path,limit:input.limit};default:return{...input}}}function resolveSdkTools(context){if(!context.tools)return{sdkTools:[...BUILTIN_SDK_TOOLS],customTools:[],customToolNameToSdk:new Map,customToolNameToPi:new Map};let sdkTools2=new Set,customTools=[],customToolNameToSdk=new Map,customToolNameToPi=new Map;for(let tool of context.tools){let normalized2=tool.name.toLowerCase(),sdkName=PI_TO_SDK_TOOL_NAME[normalized2];if(sdkName){sdkTools2.add(sdkName);continue}let customSdkName=`${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;customTools.push(tool),customToolNameToSdk.set(tool.name,customSdkName),customToolNameToSdk.set(normalized2,customSdkName),customToolNameToPi.set(customSdkName,tool.name),customToolNameToPi.set(customSdkName.toLowerCase(),tool.name)}return{sdkTools:[...sdkTools2],customTools,customToolNameToSdk,customToolNameToPi}}var canUseTool=async()=>({behavior:"deny",message:TOOL_EXECUTION_DENIED_MESSAGE});function contentToText(content,customToolNameToSdk){return content.map(block=>block.type==="text"?block.text:block.type==="thinking"?block.thinking:block.type==="toolCall"?`Historical tool call (non-executable): ${mapPiToolNameToSdk(block.name,customToolNameToSdk)} args=${JSON.stringify(block.arguments)}`:`[${block.type}]`).join(`
|
|
302
289
|
`)}function appendContentBlocks(blocks,content){return appendSdkContentBlocks(blocks,content)}var CONVERSATION_HISTORY_CLOSER=`
|
|
303
290
|
</conversation_history>`,RESPOND_TO_USER_INSTRUCTION='The above is the conversation history so far, provided as context. Respond as the assistant to the user message below only. Never emit "USER:" or "ASSISTANT:" labels or continue the transcript.',CONTINUE_TURN_INSTRUCTION='The above is the conversation history so far, provided as context. There is no new user message: the last entries are results of tool calls you made in your current turn, not anything the user sent. Continue that turn as the assistant. Never emit "USER:" or "ASSISTANT:" labels or continue the transcript.';function markCacheBreakpoint(blocks,historyStart,ttl){for(let index=blocks.length-1;index>=historyStart;index--){let block=blocks[index];if(block?.type==="text"){blocks[index]={...block,cache_control:{type:"ephemeral",ttl}};return}}}function buildPromptBlocks(context,customToolNameToSdk,toolWatchNote,options={}){let blocks=[],pushText=text3=>{blocks.push({type:"text",text:text3})},finalMessage=context.messages.at(-1),finalUserMessage=finalMessage?.role==="user"?finalMessage:void 0,history=finalUserMessage?context.messages.slice(0,-1):context.messages,continuesTurn=!finalUserMessage&&history.at(-1)?.role==="toolResult";if(history.length>0){let historyStart=blocks.length;pushText(`<conversation_history>
|
|
304
291
|
`);let hasPreviousTurn=!1,pushPrefix=label3=>{pushText(`${hasPreviousTurn?`
|
|
@@ -306,11 +293,23 @@ ${PROJECT_RULES_END_MARKER}`)}function resolveSettingSources(providerSettings,mo
|
|
|
306
293
|
`:""}${label3}
|
|
307
294
|
`),hasPreviousTurn=!0},replayedImages=replayHistoryImages(history,name=>mapPiToolNameToSdk(name,customToolNameToSdk),{inProgressTurn:continuesTurn});for(let[index,message]of history.entries()){if(message.role==="user"){pushPrefix("USER:"),appendContentBlocks(blocks,replayedImages.get(index)??message.content)||pushText("(see attached image)");continue}if(message.role==="assistant"){pushPrefix("ASSISTANT:");let text3=contentToText(message.content,customToolNameToSdk);text3.length>0&&pushText(text3);continue}message.role==="configurationUpdate"||message.role==="system"||(pushPrefix(`TOOL RESULT (historical ${mapPiToolNameToSdk(message.toolName,customToolNameToSdk)}, id=${message.toolCallId}):`),appendContentBlocks(blocks,replayedImages.get(index)??message.content)||pushText("(see attached image)"))}options.cacheBreakpoint!==void 0&&markCacheBreakpoint(blocks,historyStart,options.cacheBreakpoint),pushText(CONVERSATION_HISTORY_CLOSER)}return toolWatchNote?.trim()&&(pushText(`<recovered_tool_results>
|
|
308
295
|
`),pushText(toolWatchNote.trim()),pushText(`
|
|
309
|
-
</recovered_tool_results>`)),pushText(history.at(-1)?.role==="toolResult"&&!finalUserMessage?CONTINUE_TURN_INSTRUCTION:RESPOND_TO_USER_INSTRUCTION),finalUserMessage&&!appendContentBlocks(blocks,finalUserMessage.content)&&pushText("(see attached image)"),blocks}function buildDeferredPromptStream(build){return{[Symbol.asyncIterator]:()=>buildPromptStream(build())[Symbol.asyncIterator]()}}function buildPromptStream(promptBlocks){return(async function*(){yield{type:"user",message:{role:"user",content:promptBlocks},parent_tool_use_id:null,session_id:"prompt"}})()}var ULTRAWORK_MODE_OPEN_TAG="<ultrawork-mode>",ULTRAWORK_MODE_CLOSE_TAG="</ultrawork-mode>",REPEATED_PLACEHOLDER="[ultrawork directive repeated; identical to the ultrawork directive just above]";function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ULTRAWORK_SPAN_PATTERN=new RegExp(`${escapeRegExp(ULTRAWORK_MODE_OPEN_TAG)}[\\s\\S]*?${escapeRegExp(ULTRAWORK_MODE_CLOSE_TAG)}`,"g"),ULTRAWORK_TAG_PATTERN=new RegExp(`${escapeRegExp(ULTRAWORK_MODE_OPEN_TAG)}|${escapeRegExp(ULTRAWORK_MODE_CLOSE_TAG)}`,"g");function countSpans(text3){return(text3.match(ULTRAWORK_SPAN_PATTERN)??[]).length}function hasNestedDirective(blocks){let depth=0;for(let block of blocks)if(block.type==="text")for(let token of block.text.matchAll(ULTRAWORK_TAG_PATTERN))if(token[0]===ULTRAWORK_MODE_OPEN_TAG){if(depth+=1,depth>1)return!0}else depth>0&&(depth-=1);return!1}function serializedPayloadBytes(blocks){let total=0;for(let block of blocks)block.type==="text"&&(total+=Buffer.byteLength(block.text,"utf8"));return total}function dedupeUltraworkBlocks(blocks){if(hasNestedDirective(blocks))return{blocks:[...blocks],collapsedDirectives:0};let closerIndex=blocks.findIndex(block=>block.type==="text"&&block.text===CONVERSATION_HISTORY_CLOSER),previous,collapsedDirectives=0;return{blocks:blocks.map((block,index)=>{if(block.type!=="text"||index>=closerIndex||countSpans(block.text)===0)return block;let text3=block.text.replace(ULTRAWORK_SPAN_PATTERN,match=>match!==previous?(previous=match,match):(collapsedDirectives+=1,REPEATED_PLACEHOLDER));return{...block,text:text3}}),collapsedDirectives}}var COLD_SEED_OVERFLOW_DIAGNOSTIC="claude_sdk_oauth_cold_seed_overflow",UTF8_BYTES_PER_TOKEN_FLOOR=4,MAX_CALIBRATION_RATIO=8,OWN_REFUSAL_PREFIX="The conversation is too long to resend",ColdSeedOverflowError=class extends Error{constructor(estimatedTokens,contextWindow){super(`${OWN_REFUSAL_PREFIX} (about ${estimatedTokens} tokens, limit ${contextWindow}). Compacting it and retrying.`),this.name="ColdSeedOverflowError",this.estimatedTokens=estimatedTokens,this.contextWindow=contextWindow}};function estimateColdSeedTokens(context,blocks){let fixedBytes=Buffer.byteLength(context.systemPrompt??"","utf8")+Buffer.byteLength(JSON.stringify(context.tools??[]),"utf8");return Math.ceil((fixedBytes+serializedPayloadBytes(blocks))/UTF8_BYTES_PER_TOKEN_FLOOR)}var MAX_CALIBRATED_SESSIONS=256,calibrationBySession=new Map;function coldSeedCalibration(sessionId){return sessionId!==void 0&&calibrationBySession.get(sessionId)||1}function raiseCalibration(sessionId,estimatedTokens,reportedTokens){if(!(estimatedTokens>0)||!(reportedTokens>0))return;let ratio=Math.min(MAX_CALIBRATION_RATIO,reportedTokens/estimatedTokens);if(ratio<=coldSeedCalibration(sessionId))return;calibrationBySession.delete(sessionId),calibrationBySession.set(sessionId,ratio);let oldest=calibrationBySession.keys().next().value;calibrationBySession.size>MAX_CALIBRATED_SESSIONS&&oldest!==void 0&&calibrationBySession.delete(oldest)}function restoreColdSeedCalibration(sessionId,branch){for(let index=branch.length-1;index>=0;index-=1){let message=branch[index]?.type==="message"?branch[index]?.message:void 0;if(message?.role!=="assistant")continue;let details=message.diagnostics?.find(diagnostic2=>diagnostic2.type===COLD_SEED_OVERFLOW_DIAGNOSTIC)?.details;if(!(details?.estimatedTokens===void 0||details.reportedTokens===void 0)){raiseCalibration(sessionId,details.estimatedTokens,details.reportedTokens);return}}}function parseReportedOverflowTokens(errorMessage7){if(!errorMessage7)return;let match=/~?(\d[\d,]*)\s+tokens?\s*\(limit\s+(\d[\d,]*)\)/i.exec(errorMessage7)??/(\d[\d,]*)\s+tokens?\s*>\s*(\d[\d,]*)\s+maximum/i.exec(errorMessage7)??/about\s+(\d[\d,]*)\s+tokens?,\s*limit\s+(\d[\d,]*)/i.exec(errorMessage7);if(!match)return;let reportedTokens=Number(match[1].replaceAll(",","")),reportedLimit=Number(match[2].replaceAll(",",""));if(!(!(reportedTokens>0)||!(reportedLimit>0)))return{reportedTokens,reportedLimit}}function coldSeedOverflow(model,estimatedTokens,calibration=1){if(!(model.contextWindow>0))return;let calibratedTokens=Math.ceil(estimatedTokens*Math.max(1,calibration));return calibratedTokens>model.contextWindow?new ColdSeedOverflowError(calibratedTokens,model.contextWindow):void 0}function markColdSeedOverflow(output,model,coldSeedAttempt,estimatedTokens,sessionId){if(!coldSeedAttempt||output.stopReason!=="error"||!isContextOverflow(output,model.contextWindow))return;let reported=output.errorMessage?.startsWith(OWN_REFUSAL_PREFIX)===!0?void 0:parseReportedOverflowTokens(output.errorMessage),details={...estimatedTokens!==void 0?{estimatedTokens}:{},...reported??{}};sessionId!==void 0&&reported&&estimatedTokens!==void 0&&raiseCalibration(sessionId,estimatedTokens,reported.reportedTokens),output.diagnostics=[...output.diagnostics??[],{type:COLD_SEED_OVERFLOW_DIAGNOSTIC,timestamp:Date.now(),details}]}function isColdSeedOverflowMessage(message){return message.role==="assistant"&&(message.diagnostics??[]).some(diagnostic2=>diagnostic2.type===COLD_SEED_OVERFLOW_DIAGNOSTIC)}import{createHash as createHash8}from"node:crypto";function imageIdsOf(block){if(!(typeof block!="object"||block===null||!("type"in block))){if(block.type==="image"&&"data"in block&&typeof block.data=="string")return[imageContentId(block.data)];if(block.type==="text"&&"text"in block&&typeof block.text=="string")return elidedImageIds(block.text)}}function imageNeutralContent(content){if(typeof content=="string"||!content.some(block=>imageIdsOf(block)!==void 0))return content;let normalized2=[];for(let block of content){let ids=imageIdsOf(block);if(ids===void 0)normalized2.push(block);else for(let id of ids)normalized2.push({type:"image",id})}return normalized2}var sentHashesByEntry=new WeakMap;function stableValue(value,seen=new WeakSet){if(typeof value=="function")return`[function:${value.name}:${value.toString()}]`;if(typeof value=="bigint")return value.toString();if(value===null||typeof value!="object")return value;if(seen.has(value))return"[circular]";seen.add(value);let normalized2=Array.isArray(value)?value.map(item=>stableValue(item,seen)):Object.fromEntries(Object.entries(value).filter(([,item])=>item!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key,item])=>[key,stableValue(item,seen)]));return seen.delete(value),normalized2}function digest(value){return createHash8("sha256").update(JSON.stringify(stableValue(value))).digest("hex")}function sessionSyncDigest(value){return digest(value)}function isContentlessUserMessage(message){return message.role!=="user"?!1:Array.isArray(message.content)&&message.content.length===0}function sentMessages(context){return context.messages.filter(isTransmittedMessage)}function isTransmittedMessage(message){return message.role!=="user"&&message.role!=="toolResult"?!1:!isContentlessUserMessage(message)}function sentMessageHashes(messages){return messages.filter(isTransmittedMessage).map(message=>digest(message.role==="user"?{role:message.role,content:imageNeutralContent(message.content)}:{role:message.role,toolCallId:message.toolCallId,toolName:message.toolName,content:imageNeutralContent(message.content)}))}function sentHashPrefixDigest(hashes,count2=hashes.length){return digest(hashes.slice(0,count2))}function sentHashesForEntry(entry){return sentHashesByEntry.get(entry)}function recordSyncedStream(entry,hashes){let copy=[...hashes];sentHashesByEntry.set(entry,copy),entry.sentCount=copy.length,entry.syncedPrefixHash=sentHashPrefixDigest(copy),entry.branchInfo=null}function configFingerprint(options,context,authLane,accountName2){return{systemPromptHash:digest(options.systemPrompt??null),toolsetHash:digest({tools:options.tools??[],reasoning:{thinking:options.thinking,effort:options.effort,maxThinkingTokens:options.maxThinkingTokens},contextTools:(context.tools??[]).map(tool=>({name:tool.name,description:tool.description,parameters:tool.parameters})),cwd:options.cwd,authLane,accountName:accountName2,permissionMode:options.permissionMode,settings:options.settings,hostToolPolicy:HOST_TOOL_POLICY_FINGERPRINT,settingSources:options.settingSources,longContextRefused:!longContextAvailable(),extraArgs:options.extraArgs,pathToClaudeCodeExecutable:options.pathToClaudeCodeExecutable,includePartialMessages:options.includePartialMessages})}}function appendContent(blocks,content){if(content===""){blocks.push({type:"text",text:""});return}appendSdkContentBlocks(blocks,content)}function buildDeltaPromptBlocks(messages,customToolNameToSdk){let blocks=[];for(let[index,message]of messages.entries())index>0&&blocks.push({type:"text",text:`
|
|
296
|
+
</recovered_tool_results>`)),pushText(history.at(-1)?.role==="toolResult"&&!finalUserMessage?CONTINUE_TURN_INSTRUCTION:RESPOND_TO_USER_INSTRUCTION),finalUserMessage&&!appendContentBlocks(blocks,finalUserMessage.content)&&pushText("(see attached image)"),blocks}function buildDeferredPromptStream(build){return{[Symbol.asyncIterator]:()=>buildPromptStream(build())[Symbol.asyncIterator]()}}function buildPromptStream(promptBlocks){return(async function*(){yield{type:"user",message:{role:"user",content:promptBlocks},parent_tool_use_id:null,session_id:"prompt"}})()}var ULTRAWORK_MODE_OPEN_TAG="<ultrawork-mode>",ULTRAWORK_MODE_CLOSE_TAG="</ultrawork-mode>",REPEATED_PLACEHOLDER="[ultrawork directive repeated; identical to the ultrawork directive just above]";function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ULTRAWORK_SPAN_PATTERN=new RegExp(`${escapeRegExp(ULTRAWORK_MODE_OPEN_TAG)}[\\s\\S]*?${escapeRegExp(ULTRAWORK_MODE_CLOSE_TAG)}`,"g"),ULTRAWORK_TAG_PATTERN=new RegExp(`${escapeRegExp(ULTRAWORK_MODE_OPEN_TAG)}|${escapeRegExp(ULTRAWORK_MODE_CLOSE_TAG)}`,"g");function countSpans(text3){return(text3.match(ULTRAWORK_SPAN_PATTERN)??[]).length}function hasNestedDirective(blocks){let depth=0;for(let block of blocks)if(block.type==="text")for(let token of block.text.matchAll(ULTRAWORK_TAG_PATTERN))if(token[0]===ULTRAWORK_MODE_OPEN_TAG){if(depth+=1,depth>1)return!0}else depth>0&&(depth-=1);return!1}function serializedPayloadBytes(blocks){let total=0;for(let block of blocks)block.type==="text"&&(total+=Buffer.byteLength(block.text,"utf8"));return total}function dedupeUltraworkBlocks(blocks){if(hasNestedDirective(blocks))return{blocks:[...blocks],collapsedDirectives:0};let closerIndex=blocks.findIndex(block=>block.type==="text"&&block.text===CONVERSATION_HISTORY_CLOSER),previous,collapsedDirectives=0;return{blocks:blocks.map((block,index)=>{if(block.type!=="text"||index>=closerIndex||countSpans(block.text)===0)return block;let text3=block.text.replace(ULTRAWORK_SPAN_PATTERN,match=>match!==previous?(previous=match,match):(collapsedDirectives+=1,REPEATED_PLACEHOLDER));return{...block,text:text3}}),collapsedDirectives}}var COLD_SEED_OVERFLOW_DIAGNOSTIC="claude_sdk_oauth_cold_seed_overflow",UTF8_BYTES_PER_TOKEN_FLOOR=4,MAX_CALIBRATION_RATIO=8,OWN_REFUSAL_PREFIX="The conversation is too long to resend",ColdSeedOverflowError=class extends Error{constructor(estimatedTokens,contextWindow){super(`${OWN_REFUSAL_PREFIX} (about ${estimatedTokens} tokens, limit ${contextWindow}). Compacting it and retrying.`),this.name="ColdSeedOverflowError",this.estimatedTokens=estimatedTokens,this.contextWindow=contextWindow}};function estimateColdSeedTokens(context,blocks){let fixedBytes=Buffer.byteLength(context.systemPrompt??"","utf8")+Buffer.byteLength(JSON.stringify(context.tools??[]),"utf8");return Math.ceil((fixedBytes+serializedPayloadBytes(blocks))/UTF8_BYTES_PER_TOKEN_FLOOR)}var MAX_CALIBRATED_SESSIONS=256,calibrationBySession=new Map;function coldSeedCalibration(sessionId){return sessionId!==void 0&&calibrationBySession.get(sessionId)||1}function raiseCalibration(sessionId,estimatedTokens,reportedTokens){if(!(estimatedTokens>0)||!(reportedTokens>0))return;let ratio=Math.min(MAX_CALIBRATION_RATIO,reportedTokens/estimatedTokens);if(ratio<=coldSeedCalibration(sessionId))return;calibrationBySession.delete(sessionId),calibrationBySession.set(sessionId,ratio);let oldest=calibrationBySession.keys().next().value;calibrationBySession.size>MAX_CALIBRATED_SESSIONS&&oldest!==void 0&&calibrationBySession.delete(oldest)}function restoreColdSeedCalibration(sessionId,branch){for(let index=branch.length-1;index>=0;index-=1){let message=branch[index]?.type==="message"?branch[index]?.message:void 0;if(message?.role!=="assistant")continue;let details=message.diagnostics?.find(diagnostic2=>diagnostic2.type===COLD_SEED_OVERFLOW_DIAGNOSTIC)?.details;if(!(details?.estimatedTokens===void 0||details.reportedTokens===void 0)){raiseCalibration(sessionId,details.estimatedTokens,details.reportedTokens);return}}}function parseReportedOverflowTokens(errorMessage7){if(!errorMessage7)return;let match=/~?(\d[\d,]*)\s+tokens?\s*\(limit\s+(\d[\d,]*)\)/i.exec(errorMessage7)??/(\d[\d,]*)\s+tokens?\s*>\s*(\d[\d,]*)\s+maximum/i.exec(errorMessage7)??/about\s+(\d[\d,]*)\s+tokens?,\s*limit\s+(\d[\d,]*)/i.exec(errorMessage7);if(!match)return;let reportedTokens=Number(match[1].replaceAll(",","")),reportedLimit=Number(match[2].replaceAll(",",""));if(!(!(reportedTokens>0)||!(reportedLimit>0)))return{reportedTokens,reportedLimit}}function coldSeedOverflow(model,estimatedTokens,calibration=1){if(!(model.contextWindow>0))return;let calibratedTokens=Math.ceil(estimatedTokens*Math.max(1,calibration));return calibratedTokens>model.contextWindow?new ColdSeedOverflowError(calibratedTokens,model.contextWindow):void 0}function markColdSeedOverflow(output,model,coldSeedAttempt,estimatedTokens,sessionId){if(!coldSeedAttempt||output.stopReason!=="error"||!isContextOverflow(output,model.contextWindow))return;let reported=output.errorMessage?.startsWith(OWN_REFUSAL_PREFIX)===!0?void 0:parseReportedOverflowTokens(output.errorMessage),details={...estimatedTokens!==void 0?{estimatedTokens}:{},...reported??{}};sessionId!==void 0&&reported&&estimatedTokens!==void 0&&raiseCalibration(sessionId,estimatedTokens,reported.reportedTokens),output.diagnostics=[...output.diagnostics??[],{type:COLD_SEED_OVERFLOW_DIAGNOSTIC,timestamp:Date.now(),details}]}function isColdSeedOverflowMessage(message){return message.role==="assistant"&&(message.diagnostics??[]).some(diagnostic2=>diagnostic2.type===COLD_SEED_OVERFLOW_DIAGNOSTIC)}import{createHash as createHash8}from"node:crypto";function imageIdsOf(block){if(!(typeof block!="object"||block===null||!("type"in block))){if(block.type==="image"&&"data"in block&&typeof block.data=="string")return[imageContentId(block.data)];if(block.type==="text"&&"text"in block&&typeof block.text=="string")return elidedImageIds(block.text)}}function imageNeutralContent(content){if(typeof content=="string"||!content.some(block=>imageIdsOf(block)!==void 0))return content;let normalized2=[];for(let block of content){let ids=imageIdsOf(block);if(ids===void 0)normalized2.push(block);else for(let id of ids)normalized2.push({type:"image",id})}return normalized2}var sentHashesByEntry=new WeakMap;function stableValue(value,seen=new WeakSet){if(typeof value=="function")return`[function:${value.name}:${value.toString()}]`;if(typeof value=="bigint")return value.toString();if(value===null||typeof value!="object")return value;if(seen.has(value))return"[circular]";seen.add(value);let normalized2=Array.isArray(value)?value.map(item=>stableValue(item,seen)):Object.fromEntries(Object.entries(value).filter(([,item])=>item!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key,item])=>[key,stableValue(item,seen)]));return seen.delete(value),normalized2}function digest(value){return createHash8("sha256").update(JSON.stringify(stableValue(value))).digest("hex")}function sessionSyncDigest(value){return digest(value)}function isContentlessUserMessage(message){return message.role!=="user"?!1:Array.isArray(message.content)&&message.content.length===0}function sentMessages(context){return context.messages.filter(isTransmittedMessage)}function isTransmittedMessage(message){return message.role!=="user"&&message.role!=="toolResult"?!1:!isContentlessUserMessage(message)}function sentMessageHashes(messages){return messages.filter(isTransmittedMessage).map(message=>digest(message.role==="user"?{role:message.role,content:imageNeutralContent(message.content)}:{role:message.role,toolCallId:message.toolCallId,toolName:message.toolName,content:imageNeutralContent(message.content)}))}function sentHashPrefixDigest(hashes,count2=hashes.length){return digest(hashes.slice(0,count2))}function sentHashesForEntry(entry){return sentHashesByEntry.get(entry)}function recordSyncedStream(entry,hashes){let copy=[...hashes];sentHashesByEntry.set(entry,copy),entry.sentCount=copy.length,entry.syncedPrefixHash=sentHashPrefixDigest(copy),entry.branchInfo=null}function configFingerprint(options,context,authLane,accountName2){return{systemPromptHash:digest(options.systemPrompt??null),toolsetHash:digest({tools:options.tools??[],reasoning:{thinking:options.thinking,effort:options.effort,maxThinkingTokens:options.maxThinkingTokens},contextTools:(context.tools??[]).map(tool=>({name:tool.name,description:tool.description,parameters:tool.parameters})),cwd:options.cwd,authLane,accountName:accountName2,permissionMode:options.permissionMode,settings:options.settings,hostToolPolicy:HOST_TOOL_POLICY_FINGERPRINT,settingSources:options.settingSources,longContextRefused:!longContextAvailable(),contextWindow:options.env?.CLAUDE_CODE_MAX_CONTEXT_TOKENS,extraArgs:options.extraArgs,pathToClaudeCodeExecutable:options.pathToClaudeCodeExecutable,includePartialMessages:options.includePartialMessages})}}function appendContent(blocks,content){if(content===""){blocks.push({type:"text",text:""});return}appendSdkContentBlocks(blocks,content)}function buildDeltaPromptBlocks(messages,customToolNameToSdk){let blocks=[];for(let[index,message]of messages.entries())index>0&&blocks.push({type:"text",text:`
|
|
310
297
|
|
|
311
298
|
`}),message.role==="toolResult"&&blocks.push({type:"text",text:`Tool result (${mapPiToolNameToSdk(message.toolName,customToolNameToSdk)}, id=${message.toolCallId}):
|
|
312
|
-
`}),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 assistantContentHash(message){return sessionSyncDigest({role:message.role,api:message.api,provider:message.provider,model:message.model,content:message.content.map(semanticContentBlock)})}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){this.providerFinalByKey.set(key,assistantContentHash(message))}commit(key,message,modelId){let providerFinal=this.providerFinalByKey.get(key);return this.providerFinalByKey.delete(key),isResidentAssistant(message,modelId)?providerFinal===void 0||providerFinal===assistantContentHash(message)?"clean":"rewritten":"not-resident"}forget(key){this.providerFinalByKey.delete(key)}};var BINDING_ENTRY_TYPE="claude-sdk-oauth-binding",BINDING_MARKER={schemaVersion:2,marker:!0};function storedBindingFromEntry(entry,hashes,anchor){return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:entry.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:entry.assistantUuidByIndex.get(hashes.length)??null,accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.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 entry=branch[index];if(entry?.type==="message")return index;if(!entry||!isLedgerOnlyEntry(entry))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(entry){return entry.type==="custom_message"?entry.customType===GOAL_CONTINUATION_MESSAGE_TYPE:LEDGER_ONLY_ENTRY_TYPES.has(entry.type)}function isAppendOnlyTailEntry(entry){if(isLedgerOnlyEntry(entry)||entry.type==="custom_message")return!0;if(entry.type!=="message")return!1;let message=entry.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 entry=branch[index];if(entry?.type==="custom"&&entry.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 randomUUID6}from"node:crypto";import{realpathSync as realpathSync4}from"node:fs";import{readFile as readFile5,rename as rename2,rm as rm5,stat as stat2,writeFile as writeFile2}from"node:fs/promises";import{basename as basename13,dirname as
|
|
313
|
-
`;if(Buffer.byteLength(serialized)>MAX_RECORD_BYTES)throw new StoredBindingSizeError(Buffer.byteLength(serialized),MAX_RECORD_BYTES);let path14=bindingSidecarPath(sessionPath),temporaryPath=join31(dirname31(path14),`.${basename13(path14)}-${randomUUID6()}.tmp`);try{await writeFile2(temporaryPath,serialized,{encoding:"utf8",mode:384}),await rename2(temporaryPath,path14)}catch(error2){throw await rm5(temporaryPath,{force:!0}),error2}}async function deleteStoredBinding(sessionFile){await rm5(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-HZRUCUPH.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=>requireLoadedSdk("query").query(input),createSdkMcpServer:options=>requireLoadedSdk("createSdkMcpServer").createSdkMcpServer(options),getSessionMessages:async(sessionId,options)=>(await loadClaudeAgentSdk()).getSessionMessages(sessionId,options)},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){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};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}:{}}}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},...sessionId===void 0?{}:{sessionId}})}import{randomBytes as randomBytes3}from"node:crypto";import{createHash as createHash9}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 existsSync14,mkdirSync as mkdirSync9,renameSync as renameSync7,rmSync as rmSync3,writeFileSync as writeFileSync9}from"node:fs";import{join as join32}from"node:path";var LEGACY_ACCOUNTS_DIR="claude-sdk-oauth-accounts",ACCOUNTS_DIR="anthropic-subscription-accounts";function resolveAccountsDirectory(agentDir){let legacy=join32(agentDir,LEGACY_ACCOUNTS_DIR),target=join32(agentDir,ACCOUNTS_DIR);if(!existsSync14(legacy))return target;if(existsSync14(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}),rmSync3(legacy,{recursive:!0,force:!0}),target}catch{try{rmSync3(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=join32(resolveAccountsDirectory(agentDir),slot2.name);return mkdirSync9(directory,{recursive:!0,mode:448}),chmodSync4(directory,448),writeFileSync9(join32(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}:/\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 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 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}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=createHash9("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}}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)}async function*retryAtStandardWindowOnce(attempt2){let first=(await attempt2())[Symbol.asyncIterator](),refused=!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&&classifySdkError(failure2).kind==="long_context_unavailable"){refused=!0;break}visible||=visibleSdkMessage(next.value),yield next.value}}finally{if(!finished)try{await first.return?.()}catch{}}refused&&(markLongContextRefused(),yield*await attempt2())}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];yield*retryAtStandardWindowOnce(async()=>{let options=input.buildOptions("ambient");return options.env={...ambientEnvironment,...options.env},createAttemptMessages(input,{accountName:"ambient",accounts:[],authLane:"ambient",options})});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)}),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),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:classifySdkError,...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(entry,next){if(!allowedTransitions[entry.state].includes(next))throw new Error(`Illegal session state transition: ${entry.state} -> ${next}`);return entry.state=next,entry}var transitionToIdleSynced=entry=>transitionSessionState(entry,"IDLE_SYNCED"),transitionToTurnWaiting=entry=>transitionSessionState(entry,"TURN_WAITING"),transitionToTurnSent=entry=>transitionSessionState(entry,"TURN_SENT"),transitionToTurnClaimed=entry=>transitionSessionState(entry,"TURN_CLAIMED"),transitionToTurnStreaming=entry=>transitionSessionState(entry,"TURN_STREAMING"),transitionToTurnResultSeen=entry=>transitionSessionState(entry,"TURN_RESULT_SEEN");var transitionToClosing=entry=>transitionSessionState(entry,"CLOSING"),transitionToClosed=entry=>transitionSessionState(entry,"CLOSED");async function switchEntryModel(registry,senpiSessionId,modelId,sdkModel=modelId){let entry=registry.get(senpiSessionId);return entry?.query.setModel?(await entry.query.setModel(sdkModel),entry.modelId=modelId,registry.touch(entry),!0):!1}function annotatePendingFork(registry,senpiSessionId,reason){let entry=registry.get(senpiSessionId);entry&&(entry.pendingForkReason=reason,registry.touch(entry))}function annotateBranchInfo(registry,senpiSessionId,info){let entry=registry.get(senpiSessionId);entry&&(entry.branchInfo={...info},registry.touch(entry))}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(resolve53=>this.readers.push(resolve53))}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=randomBytes3(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(entry){return(entry.state==="IDLE_SYNCED"||entry.state==="TAINTED")&&entry.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 entry=this.entries.get(senpiSessionId);if(!(!entry||entry.generation!==generation2||!evictable(entry)))return{generation:entry.generation,lastUsedAt:entry.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,lastUsedAt:now2},entry;return entry=new Proxy(target,{set:(current,property,value)=>{if(this.entries.get(current.senpiSessionId)!==entry)return!0;let previousTurn=current.activeTurn;return Reflect.set(current,property,value),property==="activeTurn"&&previousTurn!==value&&this.recordUse(entry,value===null),!0}}),this.entries.set(input.senpiSessionId,entry),entry}touch(entry){this.recordUse(entry,entry.activeTurn===null&&evictable(entry))}closeSession(senpiSessionId,reason){let entry=this.entries.get(senpiSessionId);if(entry){recordPendingCloseCause(senpiSessionId,reason),this.reaper.cancel(senpiSessionId,entry.generation),transitionToClosing(entry),entry.inputController.close();try{entry.query.close()}finally{transitionToClosed(entry),this.reaper.cancel(senpiSessionId,entry.generation),this.entries.delete(senpiSessionId)}}}isCurrentGeneration(senpiSessionId,generation2){return this.entries.get(senpiSessionId)?.generation===generation2}evictExpired(){let now2=activeSessionRegistryBoundary.now();for(let entry of[...this.entries.values()])evictable(entry)&&now2-entry.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS&&this.closeSession(entry.senpiSessionId,"idle_ttl")}recordUse(entry,scheduleReap){this.entries.get(entry.senpiSessionId)===entry&&(entry.lastUsedAt=activeSessionRegistryBoundary.now(),this.reaper.cancel(entry.senpiSessionId,entry.generation),scheduleReap&&this.reaper.arm(entry.senpiSessionId,entry.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(entry){return activeSessionRegistryBoundary.now()-entry.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS}async function switchSessionModel(senpiSessionId,modelId,sdkModel){return switchEntryModel(sessionRegistry,senpiSessionId,modelId,sdkModel)}function recordPendingFork(senpiSessionId,reason){annotatePendingFork(sessionRegistry,senpiSessionId,reason)}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(entry,sentHashes){return{senpiSessionId:entry.senpiSessionId,sdkSessionId:entry.sdkSessionId,sdkSessionIdConfirmed:entry.sdkSessionIdConfirmed,sentCount:entry.sentCount,sentHashes:[...sentHashes],lastAssistantUuid:entry.assistantUuidByIndex.get(entry.sentCount)??null,assistantUuidByIndex:[...entry.assistantUuidByIndex.entries()],accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.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(entry,signal){let initialize=entry.query.initializationResult;if(!initialize)return;if(!signal){await initialize.call(entry.query);return}let rejectAborted=()=>{},aborted=new Promise((_,reject)=>{rejectAborted=reject}),onAbort=()=>{closeSession(entry.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(entry.query),aborted])}finally{signal.removeEventListener("abort",onAbort)}}async function reattachSession(input){await loadClaudeAgentSdk();let{binding,atUuid}=input;closeSession(binding.senpiSessionId,"reattach");let entry=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(entry,input.signal)}catch(error2){throw closeSession(binding.senpiSessionId,"resume_initialization_failed"),error2}recordSyncedStream(entry,binding.sentHashes);for(let[index,uuid]of binding.assistantUuidByIndex??[])entry.assistantUuidByIndex.set(index,uuid);return binding.lastAssistantUuid&&entry.assistantUuidByIndex.set(binding.sentCount,binding.lastAssistantUuid),rememberBinding({...binding,sdkSessionId:entry.sdkSessionId}),entry}var commitBoundary=new AssistantCommitBoundary;function persistBindingInvalidation(pi,sessionId,reason){pi.appendEntry?.(BINDING_ENTRY_TYPE,{schemaVersion:1,invalidated:!0,reason}),rememberBindingInvalidation(sessionId,reason)}async function invalidateBinding(pi,ctx,reason){let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId);let sessionFile=ctx.sessionManager.getSessionFile?.();sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,reason)}function keepBindingThenClose(sessionId,reason){let entry=getSession(sessionId);entry&&rememberBinding(bindingFromEntry(entry,sentHashesForEntry(entry)??[])),closeSession(sessionId,reason)}function residentEntryFor(sessionId,message){let entry=getSession(sessionId);if(!(!entry||!isResidentAssistant(message,entry.modelId)))return entry}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(),entry=getSession(sessionId),binding=getBinding(sessionId),modelId=entry?.modelId??binding?.modelId;if(!modelId)return;if(isTerminalFailure(event.message)){commitBoundary.forget(sessionId);return}let outcome=commitBoundary.commit(sessionId,event.message,modelId);if(outcome==="rewritten"){recordPendingFork(sessionId,"assistant_rewritten"),await invalidateBinding(pi,ctx,"assistant_rewritten");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 entry?storedBindingFromEntry(entry,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}}var PROMPT_CACHE_TTL_ENV="CLAUDE_CODE_PROMPT_CACHE_TTL",FORCE_PROMPT_CACHING_5M_ENV="FORCE_PROMPT_CACHING_5M";function isTruthy(value){return value!==void 0&&["1","true","yes","on"].includes(value.trim().toLowerCase())}function parsePromptCacheTtl(value){return value==="5m"||value==="1h"?value:void 0}function pinOneShotPromptCacheTtl(options,authLane,environment){let ttl=(isTruthy(options.env?.[FORCE_PROMPT_CACHING_5M_ENV])||isTruthy(environment[FORCE_PROMPT_CACHING_5M_ENV])?"5m":void 0)??parsePromptCacheTtl(options.env?.[PROMPT_CACHE_TTL_ENV])??parsePromptCacheTtl(environment[PROMPT_CACHE_TTL_ENV])??(authLane==="ambient"?void 0:"1h");if(ttl!==void 0)return options.env={...options.env,[PROMPT_CACHE_TTL_ENV]:ttl},ttl}var BoundedAsyncQueue=class{constructor(capacity){this.values=[],this.writers=[],this.closed=!1,this.failed=!1,this.capacity=capacity}[Symbol.asyncIterator](){return this}next(){if(this.values.length>0){let value=this.values.shift();return this.values.length<this.capacity&&this.releaseWriters(),Promise.resolve({value,done:!1})}return this.failed?Promise.reject(this.failure):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise((resolve53,reject)=>{this.reader={resolve:resolve53,reject}})}push(value){if(this.closed||this.failed)return;let reader=this.reader;if(reader){this.reader=void 0,reader.resolve({value,done:!1});return}this.values.push(value)}writable(){return this.closed||this.failed||this.values.length<this.capacity?Promise.resolve():new Promise(resolve53=>this.writers.push(resolve53))}releaseWriters(){for(let resolve53 of this.writers.splice(0))resolve53()}close(){if(this.closed||this.failed)return;this.closed=!0,this.releaseWriters();let reader=this.reader;this.reader=void 0,reader?.resolve({value:void 0,done:!0})}fail(error2){if(this.closed||this.failed)return;this.failed=!0,this.failure=error2,this.releaseWriters();let reader=this.reader;this.reader=void 0,reader?.reject(error2)}};import{Buffer as Buffer2}from"node:buffer";function deliver2(entry,turn,message){entry.state==="TURN_CLAIMED"&&transitionToTurnStreaming(entry),turn.messages.push(message),turn.onMessage?.(message)}function bufferBeforeReplay(registry,entry,turn,message){if(!(message.parent_tool_use_id!==null||turn.preReplayOverflowed)){if(turn.preReplay.push(message),turn.preReplayBytes+=Buffer2.byteLength(JSON.stringify(message)),turn.preReplay.length>turn.limits.maxMessages||turn.preReplayBytes>turn.limits.maxBytes){dropPreReplay(turn),turn.preReplayOverflowed=!0;return}registry.isCurrentGeneration(entry.senpiSessionId,turn.generation)||(turn.preReplay.length=0)}}function endForeignTurnBeforeReplay(turn){dropPreReplay(turn),turn.preReplayOverflowed=!1}function dropPreReplay(turn){turn.preReplay.length=0,turn.preReplayBytes=0}function claimTurn(entry,turn){turn.claimed=!0,transitionToTurnClaimed(entry);let buffered=turn.preReplay.splice(0);return turn.preReplayBytes=0,buffered}function isReplayFor(message,uuid){return message.type==="user"&&"isReplay"in message&&message.isReplay===!0&&message.uuid===uuid}function isAutonomousResult(message){if(message.origin&&message.origin.kind!=="human")return!0;let wire=message;return wire.parent_tool_use_id!=null||wire.subagent_type!=null||wire.isSynthetic===!0}function isForeignResult(message,turn){return"user_message_uuid"in message&&message.user_message_uuid!==void 0?message.user_message_uuid!==turn.uuid:isAutonomousResult(message)}function resultMatchesTurn(message,turn){return"user_message_uuid"in message&&message.user_message_uuid!==void 0?message.user_message_uuid===turn.uuid:turn.claimed&&!isAutonomousResult(message)}var SessionTurnAttributionError=class extends Error{constructor(message){super(message),this.code="claude_sdk_oauth_turn_attribution",this.name="SessionTurnAttributionError"}};var DEFAULT_PRE_REPLAY_MAX_MESSAGES=64,DEFAULT_PRE_REPLAY_MAX_BYTES=256*1024,SESSION_TURN_ABORT_GRACE_MS=1e3,ConcurrentSessionTurnAdmissionError=class extends Error{constructor(sessionId){super(`Concurrent Anthropic Subscription turn admission for session ${sessionId}`),this.code="claude_sdk_oauth_concurrent_turn_admission",this.name="ConcurrentSessionTurnAdmissionError"}};function currentTurn(entry){return entry.activeTurn}function scheduleAbort(callback,delayMs){let timer=setTimeout(callback,delayMs);return timer.unref(),()=>clearTimeout(timer)}function removeAbortListener(turn){turn.signal?.removeEventListener("abort",turn.onAbort),turn.cancelAbort?.(),turn.cancelAbort=void 0}function failTurn(registry,entry,error2){let turn=currentTurn(entry);turn&&(removeAbortListener(turn),entry.activeTurn=null,turn.reject(error2)),registry.isCurrentGeneration(entry.senpiSessionId,entry.generation)&®istry.closeSession(entry.senpiSessionId,error2.message)}function abortTurn(registry,entry,turn,_error){currentTurn(entry)!==turn||!registry.isCurrentGeneration(entry.senpiSessionId,turn.generation)||(removeAbortListener(turn),entry.activeTurn=null,registry.closeSession(entry.senpiSessionId,"abort_uncertain"),turn.resolve({uuid:turn.uuid,messages:turn.messages,aborted:!0}))}function finishTurn(registry,entry,turn,message){if(!resultMatchesTurn(message,turn))throw new SessionTurnAttributionError("Anthropic Subscription result user_message_uuid did not match the active turn");entry.state==="TURN_CLAIMED"&&transitionToTurnStreaming(entry),turn.aborted||deliver2(entry,turn,message),transitionToTurnResultSeen(entry),removeAbortListener(turn),entry.activeTurn=null,!turn.aborted||evaluateAbortOutcome(turn.interruptReceipt)==="keep"?transitionToIdleSynced(entry):registry.closeSession(entry.senpiSessionId,"abort_uncertain"),turn.resolve({uuid:turn.uuid,messages:turn.messages,aborted:turn.aborted})}function handleMessage(registry,entry,message){message.type==="system"&&message.subtype==="init"&&typeof message.session_id=="string"&&(message.session_id!==entry.sdkSessionId&&(entry.sdkSessionId=message.session_id),entry.sdkSessionIdConfirmed=!0);let turn=currentTurn(entry);if(!turn||!registry.isCurrentGeneration(entry.senpiSessionId,turn.generation))return!1;if(!turn.claimed){if(isReplayFor(message,turn.uuid)){entry.sdkSessionIdConfirmed=!0;for(let buffered of claimTurn(entry,turn))buffered.type==="result"?finishTurn(registry,entry,turn,buffered):deliver2(entry,turn,buffered)}else if(message.type==="stream_event")bufferBeforeReplay(registry,entry,turn,message);else if(message.type==="result"&&resultMatchesTurn(message,turn)){let failure2=sdkResultFailure(message);if(failure2)throw failure2;for(let buffered of claimTurn(entry,turn))deliver2(entry,turn,buffered);return finishTurn(registry,entry,turn,message),!1}else if(message.type==="result"&&isForeignResult(message,turn))endForeignTurnBeforeReplay(turn);else if(message.type==="result")throw sdkResultFailure(message)??new SessionTurnAttributionError("Anthropic Subscription result arrived before replay claim");return!1}if(message.type==="user"&&"isReplay"in message&&message.isReplay===!0)return!1;let refusal=refusalError(message);if(refusal)return failTurn(registry,entry,refusal),!0;if(message.type==="result"){let failure2=sdkResultFailure(message);if(failure2)return failTurn(registry,entry,failure2),!0;finishTurn(registry,entry,turn,message)}else deliver2(entry,turn,message);return!1}async function runPump(registry,entry){let iterator=entry.query[Symbol.asyncIterator]();try{for(;;){let{value,done}=await iterator.next();if(done){failTurn(registry,entry,new Error("Anthropic Subscription query ended before the active turn completed"));return}if(handleMessage(registry,entry,value))return;await currentTurn(entry)?.writable?.()}}catch(error2){failTurn(registry,entry,error2 instanceof Error?error2:new Error(String(error2)))}}function submitSessionTurn(registry,entry,request2,limits={maxMessages:DEFAULT_PRE_REPLAY_MAX_MESSAGES,maxBytes:DEFAULT_PRE_REPLAY_MAX_BYTES}){if(currentTurn(entry))throw new ConcurrentSessionTurnAdmissionError(entry.senpiSessionId);entry.state==="STARTING"&&transitionToIdleSynced(entry),transitionToTurnWaiting(entry);let uuid=createSessionUuid(),turn,promise=new Promise((resolve53,reject)=>{let onAbort=()=>{turn.aborted||(turn.aborted=!0,turn.cancelAbort=(request2.scheduleAbort??scheduleAbort)(()=>abortTurn(registry,entry,turn,new Error("Anthropic Subscription interrupted turn did not terminate")),SESSION_TURN_ABORT_GRACE_MS),entry.query.interrupt().then(receipt=>{turn.interruptReceipt=receipt}).catch(error2=>{let detail=error2 instanceof Error?error2.message:String(error2);abortTurn(registry,entry,turn,new Error(`Anthropic Subscription query interrupt failed: ${detail}`))}))};turn={uuid,generation:entry.generation,messages:[],preReplay:[],preReplayBytes:0,preReplayOverflowed:!1,claimed:!1,aborted:!1,onMessage:request2.onMessage,writable:request2.writable,signal:request2.signal,onAbort,resolve:resolve53,reject,limits}});return entry.activeTurn=turn,entry.pumpTask||(entry.pumpTask=runPump(registry,entry)),entry.inputController.push({type:"user",message:request2.message,parent_tool_use_id:null,uuid,session_id:entry.sdkSessionId}),transitionToTurnSent(entry),request2.signal?.aborted?turn.onAbort():request2.signal?.addEventListener("abort",turn.onAbort,{once:!0}),promise}function successfulTurn(messages){return messages.some(message=>message.type==="result"&&message.subtype==="success"&&sdkResultFailure(message)===void 0)}function recordAssistantUuid(entry,sentCount,message){message.type==="assistant"&&message.parent_tool_use_id===null&&entry.assistantUuidByIndex.set(sentCount,message.uuid)}var RESUME_TARGET_MISSING=/no conversation found with session id/i,RESUME_MESSAGE_MISSING=/no message found with message\.uuid(?:\s+of)?:\s*([0-9a-fA-F-]+)/i;function forgetMissingAssistantUuid(entry,message){let missing=RESUME_MESSAGE_MISSING.exec(message)?.[1];if(missing!==void 0)for(let[index,uuid]of entry.assistantUuidByIndex)uuid===missing&&entry.assistantUuidByIndex.delete(index)}function publishBinding(entry,binding){rememberBinding({...binding,sdkSessionIdConfirmed:entry.sdkSessionIdConfirmed})}function rememberRetryCheckpoint(entry,hashes){entry.sentCount<0||entry.sentCount>hashes.length||publishBinding(entry,{...bindingFromEntry(entry,hashes.slice(0,entry.sentCount)),unansweredTurnDigest:sentHashPrefixDigest(hashes,hashes.length)})}function createSessionTurnAttempt(entry,message,hashes,signal,staged){let generation2=entry.generation,resumeTargetMissing=!1;return{messages:(async function*(){let queue=new BoundedAsyncQueue(256),completion=submitSessionTurn(sessionRegistry,entry,{message,signal,onMessage:sdkMessage=>{recordAssistantUuid(entry,hashes.length,sdkMessage),queue.push(sdkMessage)},writable:()=>queue.writable()});completion.then(()=>queue.close(),error2=>queue.fail(error2));try{for await(let sdkMessage of queue)yield sdkMessage;let turn=await completion;!turn.aborted&&successfulTurn(turn.messages)?(recordSyncedStream(entry,hashes),publishBinding(entry,bindingFromEntry(entry,hashes))):rememberRetryCheckpoint(entry,hashes),staged.emit()}catch(error2){throw error2 instanceof Error&&RESUME_TARGET_MISSING.test(error2.message)?(resumeTargetMissing=!0,forgetBinding(entry.senpiSessionId)):(error2 instanceof Error&&forgetMissingAssistantUuid(entry,error2.message),rememberRetryCheckpoint(entry,hashes)),error2}finally{queue.close()}})(),discard:()=>{resumeTargetMissing?forgetBinding(entry.senpiSessionId):rememberRetryCheckpoint(entry,hashes),isCurrentGeneration(entry.senpiSessionId,generation2)&&closeSession(entry.senpiSessionId,"attempt_discarded")}}}var MAX_CHECKPOINT_RECOVERIES=3;async function earlierVerifiedCheckpoint(input){let{binding,currentHashes}=input;if(input.cwd===void 0||input.authLane==="config-dir")return;let candidates=(binding.assistantUuidByIndex??[]).filter(([index])=>index>=1&&index<binding.sentCount&&index<=binding.sentHashes.length&&index<=currentHashes.length&&binding.sentHashes.slice(0,index).every((hash,offset)=>hash===currentHashes[offset])).sort(([left],[right])=>right-left);if(candidates.length===0)return;let messages;try{messages=await getSdkBoundary().getSessionMessages(binding.sdkSessionId,{dir:input.cwd})}catch(error2){if(error2 instanceof Error)return;throw error2}if(messages.some(message=>message.session_id!==binding.sdkSessionId))return;let available=new Set(messages.filter(message=>message.type==="assistant"&&message.parent_tool_use_id===null).map(message=>message.uuid)),candidate=candidates.find(([,uuid])=>available.has(uuid));if(!candidate)return;let[sentCount,lastAssistantUuid]=candidate;return{...binding,sentCount,sentHashes:currentHashes.slice(0,sentCount),lastAssistantUuid,assistantUuidByIndex:(binding.assistantUuidByIndex??[]).filter(([index])=>index<=sentCount)}}async function reattachRecoveringCheckpoint(input){let binding=input.binding,atUuid=input.atUuid;for(let recovered2=0;;recovered2+=1)try{return{entry:await reattachSession({binding,options:input.options,...atUuid?{atUuid}:{},...input.signal?{signal:input.signal}:{}}),from:binding.sentCount}}catch(error2){if(input.signal?.aborted||recovered2>=MAX_CHECKPOINT_RECOVERIES||!(error2 instanceof Error)||!RESUME_MESSAGE_MISSING.test(error2.message))throw error2;let earlier=await earlierVerifiedCheckpoint({binding,currentHashes:input.currentHashes,cwd:input.options.cwd,authLane:input.authLane});if(!earlier?.lastAssistantUuid)throw error2;logContinuityEvent("claude_sdk_oauth_checkpoint_recovered",{rejectedIndex:binding.sentCount,recoveredIndex:earlier.sentCount}),binding=earlier,atUuid=earlier.lastAssistantUuid}}var PENDING_FORK_REASONS={assistant_rewritten:"assistant_rewritten",compaction:"tainted_compaction"},INVALIDATION_CAUSES={compaction:"tainted_compaction",tree_changed:"branch_diverged",fork:"tainted_fork"};function withRecordedInvalidation(decision,input){if(input.invalidationReason===void 0)return decision;let cause=INVALIDATION_CAUSES[input.invalidationReason]??sanitizeReason(input.invalidationReason);return decision.kind==="bootstrap"?{kind:"bootstrap",reason:cause}:decision.kind==="flatten"&&decision.reason==="registry_miss"?{kind:"flatten",reason:cause}:decision}function commonPrefixLength(left,right){let limit=Math.min(left.length,right.length),index=0;for(;index<limit&&left[index]===right[index];)index+=1;return index}function boundaryBefore(entry,count2){for(let candidate=count2-1;candidate>=1;candidate-=1){let uuid=entry.assistantUuidByIndex.get(candidate);if(uuid)return{index:candidate,uuid}}}function newestBoundaryWithin(entries,cap){let boundary;for(let[index,uuid]of entries??[])index>=1&&index<=cap&&(!boundary||index>boundary.index)&&(boundary={index,uuid});return boundary}function forkOrFlatten(entry,divergesAt,reason){let boundary=boundaryBefore(entry,divergesAt);return boundary?{kind:"fork",sdkSessionId:entry.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason}:{kind:"flatten",reason}}function identityDrift(input,entry){return entry.accountName!==input.accountName?"account_changed":entry.modelId!==input.modelId?"model_changed":entry.systemPromptHash!==input.fingerprint.systemPromptHash?"system_prompt_changed":entry.toolsetHash!==input.fingerprint.toolsetHash?"toolset_changed":null}function retryCheckpointDecision(input,binding){if(binding.unansweredTurnDigest===void 0||sentHashPrefixDigest(input.currentHashes,input.currentHashes.length)!==binding.unansweredTurnDigest||input.currentHashes.length<binding.sentCount||!(binding.sentPrefixHash!==void 0?sentHashPrefixDigest(input.currentHashes,binding.sentCount)===binding.sentPrefixHash:commonPrefixLength(binding.sentHashes,input.currentHashes)===binding.sentCount))return;let boundary=binding.lastAssistantUuid?{index:binding.sentCount,uuid:binding.lastAssistantUuid}:newestBoundaryWithin(binding.assistantUuidByIndex,binding.sentCount);return boundary?{kind:"fork",sdkSessionId:binding.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason:"timeout_retry"}:{kind:"flatten",reason:"timeout_retry"}}function withoutUnconfirmedResume(decision,binding){return binding.sdkSessionIdConfirmed!==!1?decision:decision.kind==="reattach"||decision.kind==="fork"?{kind:"flatten",reason:"session_unconfirmed"}:decision}function decideFromBinding(input,binding){if(!input.transcriptAvailable)return{kind:"flatten",reason:"transcript_missing"};let drift=identityDrift(input,binding);if(drift==="model_changed")return{kind:"flatten",reason:drift};if(drift==="account_changed"&&!input.crossAccountResumeSupported)return{kind:"flatten",reason:"cross_root_unsupported"};let retry=retryCheckpointDecision(input,binding);if(retry)return retry;if(binding.sentPrefixHash!==void 0)return input.currentHashes.length>=binding.sentCount&&sentHashPrefixDigest(input.currentHashes,binding.sentCount)===binding.sentPrefixHash?{kind:"reattach",sdkSessionId:binding.sdkSessionId,from:binding.sentCount,reason:drift??"registry_miss"}:{kind:"flatten",reason:input.currentHashes.length<binding.sentCount?"history_rolled_back":"sent_stream_diverged"};let shared=commonPrefixLength(binding.sentHashes,input.currentHashes);if(shared===binding.sentCount)return{kind:"reattach",sdkSessionId:binding.sdkSessionId,from:binding.sentCount,reason:drift??"registry_miss"};let reason=shared<binding.sentCount?"history_rolled_back":"sent_stream_diverged",boundary=newestBoundaryWithin(binding.assistantUuidByIndex,shared);return boundary?{kind:"fork",sdkSessionId:binding.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason}:{kind:"flatten",reason:binding.lastAssistantUuid?reason:"registry_miss"}}function decideNativeContinuity(input){return withRecordedInvalidation(decideFromState(input),input)}function decideFromState(input){let{entry,binding}=input;if(!entry)return binding?withoutUnconfirmedResume(decideFromBinding(input,binding),binding):{kind:"bootstrap"};if(!input.crossAccountResumeSupported&&entry.accountName!==input.accountName)return{kind:"flatten",reason:"cross_root_unsupported"};let divergence=entry.pendingForkReason??entry.taintedReason;if(divergence==="compaction")return{kind:"flatten",reason:"tainted_compaction"};if(divergence)return forkOrFlatten(entry,entry.sentCount,PENDING_FORK_REASONS[divergence]??"other");let shared=commonPrefixLength(entry.sentHashes,input.currentHashes);if(shared<entry.sentCount)return input.currentHashes.length<entry.sentCount&&shared===input.currentHashes.length?forkOrFlatten(entry,input.currentHashes.length,"history_rolled_back"):forkOrFlatten(entry,shared+1,"sent_stream_diverged");if(input.idleExpired)return{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:"idle_ttl"};let drift=identityDrift(input,entry);return drift?{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:drift}:input.credentialDigest!==void 0&&entry.credentialDigest!==void 0&&entry.credentialDigest!==input.credentialDigest?{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:"credential_refreshed"}:{kind:"delta",from:entry.sentCount}}async function admitRestoredBinding(sessionId,cwd,authLane){let binding=getBinding(sessionId);if(binding?.sentPrefixHash===void 0)return{binding,transcriptAvailable:!0};let transcriptAvailable=cwd!==void 0&&await verifyRestoredTranscript(binding,cwd,authLane);return transcriptAvailable||forgetBinding(sessionId),{binding,transcriptAvailable}}function userMessage(content){return{role:"user",content}}var OBSERVED_KIND={delta:"incremental",reattach:"resume",fork:"resume",flatten:"cold-seed",bootstrap:"cold-seed"};function contextHasPriorAssistantMessage(context){return context.messages.some(message=>message.role==="assistant")}function entrySnapshot(entry,hashes){return{sdkSessionId:entry.sdkSessionId,accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.toolsetHash,sentCount:entry.sentCount,sentHashes:hashes.slice(0,entry.sentCount),lastAssistantUuid:entry.assistantUuidByIndex.get(entry.sentCount)??null,assistantUuidByIndex:entry.assistantUuidByIndex,pendingForkReason:entry.pendingForkReason,taintedReason:entry.taintedReason,credentialDigest:entry.credentialDigest}}async function createResidentAttempt(input,auth){let sessionId=input.streamOptions.sessionId,messages=sentMessages(input.context),hashes=sentMessageHashes(messages),existing2=getSession(sessionId),fingerprint=configFingerprint(auth.options,input.context,auth.authLane,auth.accountName),residentHashes=existing2?sentHashesForEntry(existing2)??hashes:hashes,{binding,transcriptAvailable}=await admitRestoredBinding(sessionId,auth.options.cwd,auth.authLane),decision=decideNativeContinuity({entry:existing2?entrySnapshot(existing2,residentHashes):void 0,binding,currentHashes:hashes,accountName:auth.accountName,modelId:input.model.id,fingerprint,transcriptAvailable,crossAccountResumeSupported:auth.authLane!=="config-dir",idleExpired:existing2?isIdleExpired(existing2):!1,invalidationReason:bindingInvalidationReason(sessionId),credentialDigest:auth.credentialDigest}),firstTurn=existing2===void 0&&getBinding(sessionId)===void 0&&!contextHasPriorAssistantMessage(input.context),observedReason="reason"in decision?decision.reason:decision.kind==="bootstrap"?"registry_miss":void 0,observedKind=OBSERVED_KIND[decision.kind],entry,from=0,flatten=decision.kind==="flatten"||decision.kind==="bootstrap";if(decision.kind==="delta"&&existing2)entry=existing2,from=decision.from;else if(decision.kind==="reattach"||decision.kind==="fork"){let source2=getBinding(sessionId)??(existing2?bindingFromEntry(existing2,residentHashes):void 0),binding2=source2?(({sentPrefixHash:_persistedPrefix,...rest})=>({...rest,sentCount:decision.from,sentHashes:hashes.slice(0,decision.from),assistantUuidByIndex:(source2.assistantUuidByIndex??[]).filter(([index])=>index<=decision.from),accountName:auth.accountName,modelId:input.model.id,systemPromptHash:fingerprint.systemPromptHash,toolsetHash:fingerprint.toolsetHash,...decision.kind==="fork"?{lastAssistantUuid:decision.atUuid}:{}}))(source2):void 0;try{if(!binding2)throw new Error("Anthropic Subscription continuity binding is unavailable");({entry,from}=await reattachRecoveringCheckpoint({binding:binding2,options:auth.options,...decision.kind==="fork"?{atUuid:decision.atUuid}:{},...input.streamOptions.signal?{signal:input.streamOptions.signal}:{},currentHashes:hashes,authLane:auth.authLane}))}catch(error2){if(input.streamOptions.signal?.aborted)throw error2;input.onResumeFallback(error2),observedKind="cold-seed",observedReason="resume_initialization_failed",flatten=!0,entry=getOrCreateSession({senpiSessionId:sessionId,accountName:auth.accountName,modelId:input.model.id,...fingerprint,options:auth.options})}}else existing2&&closeSession(sessionId,observedReason??"registry_miss"),entry=getOrCreateSession({senpiSessionId:sessionId,accountName:auth.accountName,modelId:input.model.id,...fingerprint,options:auth.options});entry.credentialDigest=auth.credentialDigest;let flattenResult=flatten?dedupeUltraworkBlocks(buildPromptBlocks(input.context,input.customToolNameToSdk,input.toolWatchNote)):void 0,estimatedTokens=flattenResult?estimateColdSeedTokens(input.context,flattenResult.blocks):void 0;input.onDispatchShape?.(flattenResult!==void 0,estimatedTokens);let overBudget=estimatedTokens!==void 0?coldSeedOverflow(input.model,estimatedTokens,coldSeedCalibration(sessionId)):void 0;if(overBudget)throw closeSession(sessionId,"cold_seed_over_budget"),overBudget;let blocks=flattenResult?flattenResult.blocks:buildDeltaPromptBlocks(messages.slice(from),input.customToolNameToSdk),payloadBytes=flattenResult?serializedPayloadBytes(flattenResult.blocks):void 0,staged=stageContinuityDecision(observeSessionSyncDecision({kind:observedKind,reason:observedReason,deltaMessages:flatten?hashes.length:hashes.length-from,firstTurn,senpiSessionId:sessionId,...payloadBytes!==void 0?{payloadBytes}:{},...flattenResult?.collapsedDirectives!==void 0?{collapsedDirectives:flattenResult.collapsedDirectives}:{}}),sessionId,input.onContinuityDecision,()=>consumePendingCloseCause(sessionId));return createSessionTurnAttempt(entry,userMessage(blocks),hashes,input.streamOptions.signal,staged)}async function*residentSessionMessages(input){try{yield*residentAuthLaneMessages(input)}catch(error2){throw emitContinuityObservation({kind:"failed",reason:sanitizeTerminalFailure(error2)},input.streamOptions.sessionId,input.onContinuityDecision),error2}}function residentAuthLaneMessages(input){let sessionId=input.streamOptions.sessionId,preferredAccount=sessionId===void 0?void 0:getSession(sessionId)?.accountName??getBinding(sessionId)?.accountName;return queryWithAuthLane({prompt:"",query:getSdkBoundary().query,providerSettings:input.providerSettings,env:input.streamOptions.env,signal:input.streamOptions.signal,sessionId:input.streamOptions.affinitySessionId??input.streamOptions.sessionId,model:input.model.id,pinnedAccount:input.pinnedAccount,...preferredAccount===void 0?{}:{preferredAccount},buildOptions:input.buildOptions,createAttempt:auth=>createResidentAttempt(input,auth)})}var sdkTools=[...BUILTIN_SDK_TOOLS];function mapStopReason(reason){return reason==="tool_use"?"toolUse":reason==="max_tokens"?"length":"stop"}function asRecord2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function mapToolArguments(name,argumentsValue){return mapToolArgs(name,argumentsValue)}function updateUsage(model,output,usage3){usage3.input_tokens!=null&&(output.usage.input=usage3.input_tokens),usage3.output_tokens!=null&&(output.usage.output=usage3.output_tokens),usage3.cache_read_input_tokens!=null&&(output.usage.cacheRead=usage3.cache_read_input_tokens),usage3.cache_creation_input_tokens!=null&&(output.usage.cacheWrite=usage3.cache_creation_input_tokens),output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite,calculateCost(model,output.usage)}function emptyOutput(model){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()}}function errorMessage(error2){return error2 instanceof Error?error2.message:String(error2)}function openBlock(context,block,kind){context.blocks.push(block),context.output.content.push(block),context.stream.push({type:`${kind}_start`,contentIndex:context.output.content.length-1,partial:context.output})}function startContentBlock(context,event){if(event.content_block.type==="text"){openBlock(context,{type:"text",text:"",index:event.index},"text");return}if(event.content_block.type==="thinking"){let block={type:"thinking",thinking:"",thinkingSignature:"",index:event.index};openBlock(context,block,"thinking");return}if(event.content_block.type==="tool_use"){let block={type:"toolCall",id:event.content_block.id,name:mapSdkToolNameToPi(event.content_block.name,context.customToolNameToPi),arguments:asRecord2(event.content_block.input),partialJson:"",index:event.index};openBlock(context,block,"toolcall")}}function applyDelta(context,event){let{blocks,stream:stream2,output}=context,contentIndex=blocks.findIndex(candidate=>candidate.index===event.index),block=blocks[contentIndex];event.delta.type==="text_delta"&&block?.type==="text"?(block.text+=event.delta.text,stream2.push({type:"text_delta",contentIndex,delta:event.delta.text,partial:output})):event.delta.type==="thinking_delta"&&block?.type==="thinking"?(block.thinking+=event.delta.thinking,stream2.push({type:"thinking_delta",contentIndex,delta:event.delta.thinking,partial:output})):event.delta.type==="signature_delta"&&block?.type==="thinking"?block.thinkingSignature+=event.delta.signature:event.delta.type==="input_json_delta"&&block?.type==="toolCall"&&(block.partialJson=`${block.partialJson??""}${event.delta.partial_json}`,block.arguments=parseStreamingJson(block.partialJson),stream2.push({type:"toolcall_delta",contentIndex,delta:event.delta.partial_json,partial:output}))}function closeContentBlock(context,event){let{blocks,stream:stream2,output}=context,contentIndex=blocks.findIndex(candidate=>candidate.index===event.index),block=blocks[contentIndex];block?.type==="text"?stream2.push({type:"text_end",contentIndex,content:block.text,partial:output}):block?.type==="thinking"?stream2.push({type:"thinking_end",contentIndex,content:block.thinking,partial:output}):block?.type==="toolCall"&&(block.arguments=mapToolArguments(block.name,parseStreamingJson(block.partialJson)),delete block.partialJson,stream2.push({type:"toolcall_end",contentIndex,toolCall:block,partial:output})),block&&delete block.index}function applyStreamEvent(context,event){event.type==="message_start"?(context.output.responseId??=event.message.id||void 0,updateUsage(context.model,context.output,event.message.usage)):event.type==="content_block_start"?startContentBlock(context,event):event.type==="content_block_delta"?applyDelta(context,event):event.type==="content_block_stop"?closeContentBlock(context,event):event.type==="message_delta"&&(context.output.stopReason=mapStopReason(event.delta.stop_reason),updateUsage(context.model,context.output,event.usage))}function withAuthGuidance(error2,message,ran){if(error2 instanceof AllAccountsBlockedError)return error2.unavailableAccount===void 0?allAccountsBlockedGuidance(error2.soonestUnblockAt,error2.blockReason):singleAccountUnavailableGuidance(error2.unavailableAccount,error2.soonestUnblockAt,error2.blockReason);let guidance=sdkErrorGuidance(classifySdkError(error2).kind),versionGuidance=claudeCodeVersionFloorGuidance(message,ran),hints=[guidance,versionGuidance].filter(hint=>hint!==void 0);return hints.length>0?`${message}
|
|
299
|
+
`}),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 assistantContentHash(message){return sessionSyncDigest({role:message.role,api:message.api,provider:message.provider,model:message.model,content:message.content.map(semanticContentBlock)})}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){this.providerFinalByKey.set(key,assistantContentHash(message))}commit(key,message,modelId){let providerFinal=this.providerFinalByKey.get(key);return this.providerFinalByKey.delete(key),isResidentAssistant(message,modelId)?providerFinal===void 0||providerFinal===assistantContentHash(message)?"clean":"rewritten":"not-resident"}forget(key){this.providerFinalByKey.delete(key)}};var BINDING_ENTRY_TYPE="claude-sdk-oauth-binding",BINDING_MARKER={schemaVersion:2,marker:!0};function storedBindingFromEntry(entry,hashes,anchor){return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:entry.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:entry.assistantUuidByIndex.get(hashes.length)??null,accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.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 entry=branch[index];if(entry?.type==="message")return index;if(!entry||!isLedgerOnlyEntry(entry))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(entry){return entry.type==="custom_message"?entry.customType===GOAL_CONTINUATION_MESSAGE_TYPE:LEDGER_ONLY_ENTRY_TYPES.has(entry.type)}function isAppendOnlyTailEntry(entry){if(isLedgerOnlyEntry(entry)||entry.type==="custom_message")return!0;if(entry.type!=="message")return!1;let message=entry.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 entry=branch[index];if(entry?.type==="custom"&&entry.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 randomUUID6}from"node:crypto";import{realpathSync as realpathSync4}from"node:fs";import{readFile as readFile5,rename as rename2,rm as rm5,stat as stat2,writeFile as writeFile2}from"node:fs/promises";import{basename as basename13,dirname as dirname30,join as join30,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 realpathSync4(resolved)}catch{try{return join30(realpathSync4(dirname30(resolved)),basename13(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 readFile5(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,record8){let sessionPath=canonicalSessionPath(sessionFile),parsed=storedBindingSchema.parse(record8);if(canonicalSessionPath(parsed.sessionPath)!==sessionPath)throw new StoredBindingPathError(sessionPath,parsed.sessionPath);let canonical={...parsed,sessionPath},serialized=`${JSON.stringify(canonical)}
|
|
300
|
+
`;if(Buffer.byteLength(serialized)>MAX_RECORD_BYTES)throw new StoredBindingSizeError(Buffer.byteLength(serialized),MAX_RECORD_BYTES);let path14=bindingSidecarPath(sessionPath),temporaryPath=join30(dirname30(path14),`.${basename13(path14)}-${randomUUID6()}.tmp`);try{await writeFile2(temporaryPath,serialized,{encoding:"utf8",mode:384}),await rename2(temporaryPath,path14)}catch(error2){throw await rm5(temporaryPath,{force:!0}),error2}}async function deleteStoredBinding(sessionFile){await rm5(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-HZRUCUPH.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=>requireLoadedSdk("query").query(input),createSdkMcpServer:options=>requireLoadedSdk("createSdkMcpServer").createSdkMcpServer(options),getSessionMessages:async(sessionId,options)=>(await loadClaudeAgentSdk()).getSessionMessages(sessionId,options)},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){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};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}:{}}}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},...sessionId===void 0?{}:{sessionId}})}import{randomBytes as randomBytes3}from"node:crypto";import{createHash as createHash9}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 join31}from"node:path";var LEGACY_ACCOUNTS_DIR="claude-sdk-oauth-accounts",ACCOUNTS_DIR="anthropic-subscription-accounts";function resolveAccountsDirectory(agentDir){let legacy=join31(agentDir,LEGACY_ACCOUNTS_DIR),target=join31(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=join31(resolveAccountsDirectory(agentDir),slot2.name);return mkdirSync9(directory,{recursive:!0,mode:448}),chmodSync4(directory,448),writeFileSync9(join31(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}:/\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](),refused=!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"){refused=!0;break}visible||=visibleSdkMessage(next.value),yield next.value}}finally{if(!finished)try{await first.return?.()}catch{}}refused&&(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=createHash9("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(entry,next){if(!allowedTransitions[entry.state].includes(next))throw new Error(`Illegal session state transition: ${entry.state} -> ${next}`);return entry.state=next,entry}var transitionToIdleSynced=entry=>transitionSessionState(entry,"IDLE_SYNCED"),transitionToTurnWaiting=entry=>transitionSessionState(entry,"TURN_WAITING"),transitionToTurnSent=entry=>transitionSessionState(entry,"TURN_SENT"),transitionToTurnClaimed=entry=>transitionSessionState(entry,"TURN_CLAIMED"),transitionToTurnStreaming=entry=>transitionSessionState(entry,"TURN_STREAMING"),transitionToTurnResultSeen=entry=>transitionSessionState(entry,"TURN_RESULT_SEEN");var transitionToClosing=entry=>transitionSessionState(entry,"CLOSING"),transitionToClosed=entry=>transitionSessionState(entry,"CLOSED");async function switchEntryModel(registry,senpiSessionId,modelId,sdkModel=modelId){let entry=registry.get(senpiSessionId);return entry?.query.setModel?(await entry.query.setModel(sdkModel),entry.modelId=modelId,registry.touch(entry),!0):!1}function annotatePendingFork(registry,senpiSessionId,reason){let entry=registry.get(senpiSessionId);entry&&(entry.pendingForkReason=reason,registry.touch(entry))}function annotateBranchInfo(registry,senpiSessionId,info){let entry=registry.get(senpiSessionId);entry&&(entry.branchInfo={...info},registry.touch(entry))}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(resolve53=>this.readers.push(resolve53))}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=randomBytes3(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(entry){return(entry.state==="IDLE_SYNCED"||entry.state==="TAINTED")&&entry.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 entry=this.entries.get(senpiSessionId);if(!(!entry||entry.generation!==generation2||!evictable(entry)))return{generation:entry.generation,lastUsedAt:entry.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,lastUsedAt:now2},entry;return entry=new Proxy(target,{set:(current,property,value)=>{if(this.entries.get(current.senpiSessionId)!==entry)return!0;let previousTurn=current.activeTurn;return Reflect.set(current,property,value),property==="activeTurn"&&previousTurn!==value&&this.recordUse(entry,value===null),!0}}),this.entries.set(input.senpiSessionId,entry),entry}touch(entry){this.recordUse(entry,entry.activeTurn===null&&evictable(entry))}closeSession(senpiSessionId,reason){let entry=this.entries.get(senpiSessionId);if(entry){recordPendingCloseCause(senpiSessionId,reason),this.reaper.cancel(senpiSessionId,entry.generation),transitionToClosing(entry),entry.inputController.close();try{entry.query.close()}finally{transitionToClosed(entry),this.reaper.cancel(senpiSessionId,entry.generation),this.entries.delete(senpiSessionId)}}}isCurrentGeneration(senpiSessionId,generation2){return this.entries.get(senpiSessionId)?.generation===generation2}evictExpired(){let now2=activeSessionRegistryBoundary.now();for(let entry of[...this.entries.values()])evictable(entry)&&now2-entry.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS&&this.closeSession(entry.senpiSessionId,"idle_ttl")}recordUse(entry,scheduleReap){this.entries.get(entry.senpiSessionId)===entry&&(entry.lastUsedAt=activeSessionRegistryBoundary.now(),this.reaper.cancel(entry.senpiSessionId,entry.generation),scheduleReap&&this.reaper.arm(entry.senpiSessionId,entry.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(entry){return activeSessionRegistryBoundary.now()-entry.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS}async function switchSessionModel(senpiSessionId,modelId,sdkModel){return switchEntryModel(sessionRegistry,senpiSessionId,modelId,sdkModel)}function recordPendingFork(senpiSessionId,reason){annotatePendingFork(sessionRegistry,senpiSessionId,reason)}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(entry,sentHashes){return{senpiSessionId:entry.senpiSessionId,sdkSessionId:entry.sdkSessionId,sdkSessionIdConfirmed:entry.sdkSessionIdConfirmed,sentCount:entry.sentCount,sentHashes:[...sentHashes],lastAssistantUuid:entry.assistantUuidByIndex.get(entry.sentCount)??null,assistantUuidByIndex:[...entry.assistantUuidByIndex.entries()],accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.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(entry,signal){let initialize=entry.query.initializationResult;if(!initialize)return;if(!signal){await initialize.call(entry.query);return}let rejectAborted=()=>{},aborted=new Promise((_,reject)=>{rejectAborted=reject}),onAbort=()=>{closeSession(entry.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(entry.query),aborted])}finally{signal.removeEventListener("abort",onAbort)}}async function reattachSession(input){await loadClaudeAgentSdk();let{binding,atUuid}=input;closeSession(binding.senpiSessionId,"reattach");let entry=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(entry,input.signal)}catch(error2){throw closeSession(binding.senpiSessionId,"resume_initialization_failed"),error2}recordSyncedStream(entry,binding.sentHashes);for(let[index,uuid]of binding.assistantUuidByIndex??[])entry.assistantUuidByIndex.set(index,uuid);return binding.lastAssistantUuid&&entry.assistantUuidByIndex.set(binding.sentCount,binding.lastAssistantUuid),rememberBinding({...binding,sdkSessionId:entry.sdkSessionId}),entry}var commitBoundary=new AssistantCommitBoundary;function persistBindingInvalidation(pi,sessionId,reason){pi.appendEntry?.(BINDING_ENTRY_TYPE,{schemaVersion:1,invalidated:!0,reason}),rememberBindingInvalidation(sessionId,reason)}async function invalidateBinding(pi,ctx,reason){let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId);let sessionFile=ctx.sessionManager.getSessionFile?.();sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,reason)}function keepBindingThenClose(sessionId,reason){let entry=getSession(sessionId);entry&&rememberBinding(bindingFromEntry(entry,sentHashesForEntry(entry)??[])),closeSession(sessionId,reason)}function residentEntryFor(sessionId,message){let entry=getSession(sessionId);if(!(!entry||!isResidentAssistant(message,entry.modelId)))return entry}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(),entry=getSession(sessionId),binding=getBinding(sessionId),modelId=entry?.modelId??binding?.modelId;if(!modelId)return;if(isTerminalFailure(event.message)){commitBoundary.forget(sessionId);return}let outcome=commitBoundary.commit(sessionId,event.message,modelId);if(outcome==="rewritten"){recordPendingFork(sessionId,"assistant_rewritten"),await invalidateBinding(pi,ctx,"assistant_rewritten");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 entry?storedBindingFromEntry(entry,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 readFileSync18}from"node:fs";import{dirname as dirname31,join as join32,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"].join(`
|
|
301
|
+
`)}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`].join(`
|
|
302
|
+
`)}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].join(`
|
|
303
|
+
`);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].join(`
|
|
304
|
+
`):[`Claude account '${account.name}' for ${PROVIDER2} is blocked (rate limit)${until===void 0?"":` until ${until}`}, and account fallback is off, so no other account is tried.`,...until===void 0?[]:[` Wait until ${until}, when this account can serve again.`],switchAccountLine(account.pinnedBy),ENABLE_ACCOUNT_FALLBACK].join(`
|
|
305
|
+
`)}function versionFloorRemedy(target,ran){switch(ran?.source){case"override":return`The Claude Code binary set by CLAUDE_CODE_EXECUTABLE (${ran.executable}) is too old for this model. Replace it with ${target}, or unset CLAUDE_CODE_EXECUTABLE to use the Claude Code senpi/omo ships.`;case"bundled":return`The Claude Code bundled with senpi/omo (${ran.executable}) is too old for this model; \`claude update\` does not change it. Update senpi/omo (it ships a newer @anthropic-ai/claude-agent-sdk), install ${target} as \`claude\` on PATH (a newer one is used automatically), or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;case"path":return`The Claude Code on PATH (${ran.executable}) is too old for this model. Run \`claude update\` to get ${target}, or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`;case void 0:return`The Claude Code binary is too old for this model. Update senpi/omo, update the \`claude\` on PATH, or set CLAUDE_CODE_EXECUTABLE to ${target} binary.`}}function claudeCodeVersionFloorGuidance(text3,ran){let floor=/does not support this model; version (\S+?) or newer is required|claude_code_version_too_old/i.exec(text3);if(floor){let target=floor[1]===void 0?"a newer Claude Code":`Claude Code ${floor[1].replace(/[.,;:]+$/,"")} or newer`;return versionFloorRemedy(target,ran)}if(/\bmodel_not_found\b|unrecognized_model|not found for provider/i.test(text3))return"The bundled Claude Code binary does not know this model id; update senpi/omo or set CLAUDE_CODE_EXECUTABLE to a newer Claude Code binary."}function sdkErrorGuidance(kind){switch(kind){case"org_not_allowed":return"This organization's policy disallows subscription OAuth use here. Use an API key (ANTHROPIC_API_KEY) or an account from an allowed organization.";case"billing":return"The selected Claude account has a billing problem. Check the plan at claude.com or switch accounts with /claude-account pin <name>.";case"auth_error":return`The account's OAuth token was rejected. Re-run /login ${PROVIDER2} to refresh it, or remove the account with /claude-account remove <name>.`;case"entitlement":return"This model needs usage credits on the selected Claude account (it is not included in the subscription). Switch models with /model, enable usage credits at claude.com, or pick another account with /claude-account pin <name>.";default:return}}function overrideSystemPromptGuidance(path14,reason){return[`Anthropic Subscription override prompt could not load ${path14===void 0?"systemPromptFile":`systemPromptFile "${path14}"`}: ${reason}.`,'Set claudeSdkOauthProvider.systemPromptFile to a readable, non-empty UTF-8 prompt file, or select systemPromptMode "full".'].join(" ")}var armedSessions=new Set;function presetAppendDeprecationGuidance(options){if(armedSessions.has(options.sessionId))return;let isDeprecated=options.mode==="preset-append";if(!options.conflict&&!isDeprecated)return;armedSessions.add(options.sessionId);let parts=[];return isDeprecated&&parts.push("preset-append system-prompt mode is deprecated; `full` mode delivers the complete senpi system prompt; preset-append will be removed after one release."),options.conflict&&parts.push("systemPromptMode wins."),parts.join(" ")}import{readFileSync as readFileSync17}from"node:fs";function resolveCustomSystemPrompt(prompt){return prompt??""}function loadOverrideSystemPrompt(path14){if(path14===void 0)throw new Error(overrideSystemPromptGuidance(void 0,"the path is not configured"));let content;try{content=readFileSync17(path14,"utf-8")}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);throw new Error(overrideSystemPromptGuidance(path14,reason))}if(content.trim().length===0)throw new Error(overrideSystemPromptGuidance(path14,"the file is empty"));return resolveCustomSystemPrompt(content)}var ADAPTIVE_THINKING_MODEL_MARKERS=["opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-4-6","sonnet-4.6","sonnet-5","fable-5","mythos-5"],NATIVE_XHIGH_EFFORT_MODEL_MARKERS=["opus-4-7","opus-4-8","opus-5","sonnet-5","fable-5","mythos-5"],DEFAULT_THINKING_BUDGETS={minimal:2048,low:8192,medium:16384,high:31999,max:63999};function includesModelMarker(model,markers){let id=model.id.toLowerCase();return markers.some(marker=>id.includes(marker))}function forcedAdaptiveThinking(model){let compat=model.compat;if(!(!compat||!("forceAdaptiveThinking"in compat)))return typeof compat.forceAdaptiveThinking=="boolean"?compat.forceAdaptiveThinking:void 0}function supportsAdaptiveThinking(model){return forcedAdaptiveThinking(model)??includesModelMarker(model,ADAPTIVE_THINKING_MODEL_MARKERS)}function supportsNativeXhighEffort(model){return includesModelMarker(model,NATIVE_XHIGH_EFFORT_MODEL_MARKERS)}function isEffortLevel(value){return value==="low"||value==="medium"||value==="high"||value==="xhigh"||value==="max"}function mapThinkingLevelToEffort(model,level){let mapped=model.thinkingLevelMap?.[level];if(typeof mapped=="string"&&isEffortLevel(mapped))return mapped;switch(level){case"minimal":case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return supportsNativeXhighEffort(model)?"xhigh":"max";case"max":return"max"}}function mapThinkingTokens(reasoning,thinkingBudgets){let budgetLevel=reasoning==="xhigh"?"high":reasoning,customBudget=thinkingBudgets?.[budgetLevel];return typeof customBudget=="number"&&Number.isFinite(customBudget)&&customBudget>0?customBudget:DEFAULT_THINKING_BUDGETS[budgetLevel]}function findAgentsMdInParents(cwd){let current=resolve14(cwd);for(;;){let candidate=join32(current,"AGENTS.md");if(existsSync14(candidate))return candidate;let parent=dirname31(current);if(parent===current)return;current=parent}}function sanitizeAgentsContent(content){let escapedConfigDirectory=CONFIG_DIR_NAME.replace(/^\./,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return content.replace(new RegExp(`~/${escapedConfigDirectory}\\b`,"gi"),"~/.claude").replace(new RegExp(`(^|[\\s'"\`])\\.${escapedConfigDirectory}/`,"g"),"$1.claude/").replace(new RegExp(`\\b${escapedConfigDirectory}\\b`,"gi"),"environment")}function extractAgentsAppend(cwd){let agentsPath=findAgentsMdInParents(cwd)??join32(getAgentDir(),"AGENTS.md");if(existsSync14(agentsPath))try{let content=sanitizeAgentsContent(readFileSync18(agentsPath,"utf-8").trim());return content.length>0?`# CLAUDE.md
|
|
306
|
+
|
|
307
|
+
${content}`:void 0}catch{return}}function rewriteSkillsLocations(skillsBlock,cwd){let globalSkillsRoot=join32(getAgentDir(),"skills"),projectSkillsRoot=join32(cwd,CONFIG_DIR_NAME,"skills");return skillsBlock.replace(/<location>([^<]+)<\/location>/g,(_match,location)=>location.startsWith(globalSkillsRoot)?`<location>~/.claude/skills/${relative5(globalSkillsRoot,location).replace(/^\.+/,"")}</location>`:location.startsWith(projectSkillsRoot)?`<location>.claude/skills/${relative5(projectSkillsRoot,location).replace(/^\.+/,"")}</location>`:`<location>${location}</location>`)}function extractSkillsAppend(systemPrompt,cwd){if(!systemPrompt)return;let start=systemPrompt.indexOf("The following skills provide specialized instructions for specific tasks."),end=start===-1?-1:systemPrompt.indexOf("</available_skills>",start);if(end!==-1)return rewriteSkillsLocations(systemPrompt.slice(start,end+19).trim(),cwd)}function extractProjectRulesAppend(systemPrompt){if(!systemPrompt)return;let searchFrom=0;for(;searchFrom<=systemPrompt.length;){let sentinelStart=systemPrompt.indexOf(PROJECT_RULES_REGION_START_MARKER,searchFrom);if(sentinelStart===-1)return;let regionStart=sentinelStart+PROJECT_RULES_REGION_START_MARKER.length,regionEnd=systemPrompt.indexOf(PROJECT_RULES_REGION_END_MARKER,regionStart);if(regionEnd===-1)return;let region=systemPrompt.slice(regionStart,regionEnd).trim();if(isProjectRulesEnvelope(region))return region;searchFrom=regionStart}}function isProjectRulesEnvelope(region){return region.startsWith(`${PROJECT_RULES_START_MARKER}
|
|
308
|
+
${PROJECT_RULES_HEADING}
|
|
309
|
+
`)&®ion.endsWith(`
|
|
310
|
+
${PROJECT_RULES_END_MARKER}`)}function resolveSettingSources(providerSettings,mode,authLane){return providerSettings.settingSources!==void 0?[...providerSettings.settingSources]:mode!=="preset-append"||authLane!=="ambient"?[]:["user","project"]}function buildAnthropicSubscriptionQueryOptions(input){let cwd=input.cwd??process.cwd(),providerSettings=input.providerSettings??loadAnthropicSubscriptionProviderSettingsFromDisk(cwd),appendSystemPrompt=providerSettings.appendSystemPrompt!==!1,resolvedMode=resolveSystemPromptMode(providerSettings),mode=resolvedMode.mode;if(input.sessionId!==void 0&&input.onGuidance!==void 0){let deprecation=presetAppendDeprecationGuidance({mode,conflict:resolvedMode.conflict,sessionId:input.sessionId});deprecation!==void 0&&input.onGuidance(deprecation)}let authLane=input.authLane??providerSettings.tokenInjection??"ambient",append=mode==="preset-append"?[extractAgentsAppend(cwd),extractSkillsAppend(input.context.systemPrompt,cwd),extractProjectRulesAppend(input.context.systemPrompt)].filter(part=>part!==void 0):[],systemPrompt=mode==="preset-append"?{type:"preset",preset:"claude_code",append:append.join(`
|
|
311
|
+
|
|
312
|
+
`)||void 0}:mode==="override"?loadOverrideSystemPrompt(providerSettings.systemPromptFile):resolveCustomSystemPrompt(input.context.systemPrompt),toolLessRequest=input.streamOptions?.toolChoice==="none",emptyToolContext=(input.context.tools?.length??0)===0,strictMcpConfig=toolLessRequest||(providerSettings.strictMcpConfig??!appendSystemPrompt),senpiOwnsCompaction=resolveCompactionOwner(providerSettings)==="senpi",queryOptions={cwd,model:sdkModelId(input.model),tools:toolLessRequest||emptyToolContext?[]:input.tools?[...input.tools]:[...BUILTIN_SDK_TOOLS],permissionMode:"dontAsk",includePartialMessages:!0,canUseTool,hooks:HOST_TOOL_DENIAL_HOOKS,systemPrompt,settings:{autoCompactEnabled:!senpiOwnsCompaction},settingSources:resolveSettingSources(providerSettings,mode,authLane)};senpiOwnsCompaction&&(queryOptions.env={CLAUDE_CODE_TOTAL_TOKENS_REMINDER:"off",CLAUDE_CODE_MAX_CONTEXT_TOKENS:String(plannedContextWindow(input.model)),DISABLE_COMPACT:"1"}),input.pathToClaudeCodeExecutable&&(queryOptions.pathToClaudeCodeExecutable=input.pathToClaudeCodeExecutable),toolLessRequest&&(queryOptions.maxTurns=1),strictMcpConfig&&(queryOptions.extraArgs={"strict-mcp-config":null});let reasoning=input.streamOptions?.reasoning;return reasoning&&supportsAdaptiveThinking(input.model)?(queryOptions.thinking={type:"adaptive",display:"summarized"},queryOptions.effort=mapThinkingLevelToEffort(input.model,reasoning)):reasoning&&(queryOptions.maxThinkingTokens=mapThinkingTokens(reasoning,input.streamOptions?.thinkingBudgets)),queryOptions}var PROMPT_CACHE_TTL_ENV="CLAUDE_CODE_PROMPT_CACHE_TTL",FORCE_PROMPT_CACHING_5M_ENV="FORCE_PROMPT_CACHING_5M";function isTruthy(value){return value!==void 0&&["1","true","yes","on"].includes(value.trim().toLowerCase())}function parsePromptCacheTtl(value){return value==="5m"||value==="1h"?value:void 0}function pinOneShotPromptCacheTtl(options,authLane,environment){let ttl=(isTruthy(options.env?.[FORCE_PROMPT_CACHING_5M_ENV])||isTruthy(environment[FORCE_PROMPT_CACHING_5M_ENV])?"5m":void 0)??parsePromptCacheTtl(options.env?.[PROMPT_CACHE_TTL_ENV])??parsePromptCacheTtl(environment[PROMPT_CACHE_TTL_ENV])??(authLane==="ambient"?void 0:"1h");if(ttl!==void 0)return options.env={...options.env,[PROMPT_CACHE_TTL_ENV]:ttl},ttl}var BoundedAsyncQueue=class{constructor(capacity){this.values=[],this.writers=[],this.closed=!1,this.failed=!1,this.capacity=capacity}[Symbol.asyncIterator](){return this}next(){if(this.values.length>0){let value=this.values.shift();return this.values.length<this.capacity&&this.releaseWriters(),Promise.resolve({value,done:!1})}return this.failed?Promise.reject(this.failure):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise((resolve53,reject)=>{this.reader={resolve:resolve53,reject}})}push(value){if(this.closed||this.failed)return;let reader=this.reader;if(reader){this.reader=void 0,reader.resolve({value,done:!1});return}this.values.push(value)}writable(){return this.closed||this.failed||this.values.length<this.capacity?Promise.resolve():new Promise(resolve53=>this.writers.push(resolve53))}releaseWriters(){for(let resolve53 of this.writers.splice(0))resolve53()}close(){if(this.closed||this.failed)return;this.closed=!0,this.releaseWriters();let reader=this.reader;this.reader=void 0,reader?.resolve({value:void 0,done:!0})}fail(error2){if(this.closed||this.failed)return;this.failed=!0,this.failure=error2,this.releaseWriters();let reader=this.reader;this.reader=void 0,reader?.reject(error2)}};import{Buffer as Buffer2}from"node:buffer";function deliver2(entry,turn,message){entry.state==="TURN_CLAIMED"&&transitionToTurnStreaming(entry),turn.messages.push(message),turn.onMessage?.(message)}function bufferBeforeReplay(registry,entry,turn,message){if(!(message.parent_tool_use_id!==null||turn.preReplayOverflowed)){if(turn.preReplay.push(message),turn.preReplayBytes+=Buffer2.byteLength(JSON.stringify(message)),turn.preReplay.length>turn.limits.maxMessages||turn.preReplayBytes>turn.limits.maxBytes){dropPreReplay(turn),turn.preReplayOverflowed=!0;return}registry.isCurrentGeneration(entry.senpiSessionId,turn.generation)||(turn.preReplay.length=0)}}function endForeignTurnBeforeReplay(turn){dropPreReplay(turn),turn.preReplayOverflowed=!1}function dropPreReplay(turn){turn.preReplay.length=0,turn.preReplayBytes=0}function claimTurn(entry,turn){turn.claimed=!0,transitionToTurnClaimed(entry);let buffered=turn.preReplay.splice(0);return turn.preReplayBytes=0,buffered}function isReplayFor(message,uuid){return message.type==="user"&&"isReplay"in message&&message.isReplay===!0&&message.uuid===uuid}function isAutonomousResult(message){if(message.origin&&message.origin.kind!=="human")return!0;let wire=message;return wire.parent_tool_use_id!=null||wire.subagent_type!=null||wire.isSynthetic===!0}function isForeignResult(message,turn){return"user_message_uuid"in message&&message.user_message_uuid!==void 0?message.user_message_uuid!==turn.uuid:isAutonomousResult(message)}function resultMatchesTurn(message,turn){return"user_message_uuid"in message&&message.user_message_uuid!==void 0?message.user_message_uuid===turn.uuid:turn.claimed&&!isAutonomousResult(message)}var SessionTurnAttributionError=class extends Error{constructor(message){super(message),this.code="claude_sdk_oauth_turn_attribution",this.name="SessionTurnAttributionError"}};var DEFAULT_PRE_REPLAY_MAX_MESSAGES=64,DEFAULT_PRE_REPLAY_MAX_BYTES=256*1024,SESSION_TURN_ABORT_GRACE_MS=1e3,ConcurrentSessionTurnAdmissionError=class extends Error{constructor(sessionId){super(`Concurrent Anthropic Subscription turn admission for session ${sessionId}`),this.code="claude_sdk_oauth_concurrent_turn_admission",this.name="ConcurrentSessionTurnAdmissionError"}};function currentTurn(entry){return entry.activeTurn}function scheduleAbort(callback,delayMs){let timer=setTimeout(callback,delayMs);return timer.unref(),()=>clearTimeout(timer)}function removeAbortListener(turn){turn.signal?.removeEventListener("abort",turn.onAbort),turn.cancelAbort?.(),turn.cancelAbort=void 0}function failTurn(registry,entry,error2){let turn=currentTurn(entry);turn&&(removeAbortListener(turn),entry.activeTurn=null,turn.reject(error2)),registry.isCurrentGeneration(entry.senpiSessionId,entry.generation)&®istry.closeSession(entry.senpiSessionId,error2.message)}function abortTurn(registry,entry,turn,_error){currentTurn(entry)!==turn||!registry.isCurrentGeneration(entry.senpiSessionId,turn.generation)||(removeAbortListener(turn),entry.activeTurn=null,registry.closeSession(entry.senpiSessionId,"abort_uncertain"),turn.resolve({uuid:turn.uuid,messages:turn.messages,aborted:!0}))}function finishTurn(registry,entry,turn,message){if(!resultMatchesTurn(message,turn))throw new SessionTurnAttributionError("Anthropic Subscription result user_message_uuid did not match the active turn");entry.state==="TURN_CLAIMED"&&transitionToTurnStreaming(entry),turn.aborted||deliver2(entry,turn,message),transitionToTurnResultSeen(entry),removeAbortListener(turn),entry.activeTurn=null,!turn.aborted||evaluateAbortOutcome(turn.interruptReceipt)==="keep"?transitionToIdleSynced(entry):registry.closeSession(entry.senpiSessionId,"abort_uncertain"),turn.resolve({uuid:turn.uuid,messages:turn.messages,aborted:turn.aborted})}function handleMessage(registry,entry,message){message.type==="system"&&message.subtype==="init"&&typeof message.session_id=="string"&&(message.session_id!==entry.sdkSessionId&&(entry.sdkSessionId=message.session_id),entry.sdkSessionIdConfirmed=!0);let turn=currentTurn(entry);if(!turn||!registry.isCurrentGeneration(entry.senpiSessionId,turn.generation))return!1;if(!turn.claimed){if(isReplayFor(message,turn.uuid)){entry.sdkSessionIdConfirmed=!0;for(let buffered of claimTurn(entry,turn))buffered.type==="result"?finishTurn(registry,entry,turn,buffered):deliver2(entry,turn,buffered)}else if(message.type==="stream_event")bufferBeforeReplay(registry,entry,turn,message);else if(message.type==="result"&&resultMatchesTurn(message,turn)){let failure2=sdkResultFailure(message);if(failure2)throw failure2;for(let buffered of claimTurn(entry,turn))deliver2(entry,turn,buffered);return finishTurn(registry,entry,turn,message),!1}else if(message.type==="result"&&isForeignResult(message,turn))endForeignTurnBeforeReplay(turn);else if(message.type==="result")throw sdkResultFailure(message)??new SessionTurnAttributionError("Anthropic Subscription result arrived before replay claim");return!1}if(message.type==="user"&&"isReplay"in message&&message.isReplay===!0)return!1;let refusal=refusalError(message);if(refusal)return failTurn(registry,entry,refusal),!0;if(message.type==="result"){let failure2=sdkResultFailure(message);if(failure2)return failTurn(registry,entry,failure2),!0;finishTurn(registry,entry,turn,message)}else deliver2(entry,turn,message);return!1}async function runPump(registry,entry){let iterator=entry.query[Symbol.asyncIterator]();try{for(;;){let{value,done}=await iterator.next();if(done){failTurn(registry,entry,new Error("Anthropic Subscription query ended before the active turn completed"));return}if(handleMessage(registry,entry,value))return;await currentTurn(entry)?.writable?.()}}catch(error2){failTurn(registry,entry,error2 instanceof Error?error2:new Error(String(error2)))}}function submitSessionTurn(registry,entry,request2,limits={maxMessages:DEFAULT_PRE_REPLAY_MAX_MESSAGES,maxBytes:DEFAULT_PRE_REPLAY_MAX_BYTES}){if(currentTurn(entry))throw new ConcurrentSessionTurnAdmissionError(entry.senpiSessionId);entry.state==="STARTING"&&transitionToIdleSynced(entry),transitionToTurnWaiting(entry);let uuid=createSessionUuid(),turn,promise=new Promise((resolve53,reject)=>{let onAbort=()=>{turn.aborted||(turn.aborted=!0,turn.cancelAbort=(request2.scheduleAbort??scheduleAbort)(()=>abortTurn(registry,entry,turn,new Error("Anthropic Subscription interrupted turn did not terminate")),SESSION_TURN_ABORT_GRACE_MS),entry.query.interrupt().then(receipt=>{turn.interruptReceipt=receipt}).catch(error2=>{let detail=error2 instanceof Error?error2.message:String(error2);abortTurn(registry,entry,turn,new Error(`Anthropic Subscription query interrupt failed: ${detail}`))}))};turn={uuid,generation:entry.generation,messages:[],preReplay:[],preReplayBytes:0,preReplayOverflowed:!1,claimed:!1,aborted:!1,onMessage:request2.onMessage,writable:request2.writable,signal:request2.signal,onAbort,resolve:resolve53,reject,limits}});return entry.activeTurn=turn,entry.pumpTask||(entry.pumpTask=runPump(registry,entry)),entry.inputController.push({type:"user",message:request2.message,parent_tool_use_id:null,uuid,session_id:entry.sdkSessionId}),transitionToTurnSent(entry),request2.signal?.aborted?turn.onAbort():request2.signal?.addEventListener("abort",turn.onAbort,{once:!0}),promise}function successfulTurn(messages){return messages.some(message=>message.type==="result"&&message.subtype==="success"&&sdkResultFailure(message)===void 0)}function recordAssistantUuid(entry,sentCount,message){message.type==="assistant"&&message.parent_tool_use_id===null&&entry.assistantUuidByIndex.set(sentCount,message.uuid)}var RESUME_TARGET_MISSING=/no conversation found with session id/i,RESUME_MESSAGE_MISSING=/no message found with message\.uuid(?:\s+of)?:\s*([0-9a-fA-F-]+)/i;function forgetMissingAssistantUuid(entry,message){let missing=RESUME_MESSAGE_MISSING.exec(message)?.[1];if(missing!==void 0)for(let[index,uuid]of entry.assistantUuidByIndex)uuid===missing&&entry.assistantUuidByIndex.delete(index)}function publishBinding(entry,binding){rememberBinding({...binding,sdkSessionIdConfirmed:entry.sdkSessionIdConfirmed})}function rememberRetryCheckpoint(entry,hashes){entry.sentCount<0||entry.sentCount>hashes.length||publishBinding(entry,{...bindingFromEntry(entry,hashes.slice(0,entry.sentCount)),unansweredTurnDigest:sentHashPrefixDigest(hashes,hashes.length)})}function createSessionTurnAttempt(entry,message,hashes,signal,staged){let generation2=entry.generation,resumeTargetMissing=!1;return{messages:(async function*(){let queue=new BoundedAsyncQueue(256),completion=submitSessionTurn(sessionRegistry,entry,{message,signal,onMessage:sdkMessage=>{recordAssistantUuid(entry,hashes.length,sdkMessage),queue.push(sdkMessage)},writable:()=>queue.writable()});completion.then(()=>queue.close(),error2=>queue.fail(error2));try{for await(let sdkMessage of queue)yield sdkMessage;let turn=await completion;!turn.aborted&&successfulTurn(turn.messages)?(recordSyncedStream(entry,hashes),publishBinding(entry,bindingFromEntry(entry,hashes))):rememberRetryCheckpoint(entry,hashes),staged.emit()}catch(error2){throw error2 instanceof Error&&RESUME_TARGET_MISSING.test(error2.message)?(resumeTargetMissing=!0,forgetBinding(entry.senpiSessionId)):(error2 instanceof Error&&forgetMissingAssistantUuid(entry,error2.message),rememberRetryCheckpoint(entry,hashes)),error2}finally{queue.close()}})(),discard:()=>{resumeTargetMissing?forgetBinding(entry.senpiSessionId):rememberRetryCheckpoint(entry,hashes),isCurrentGeneration(entry.senpiSessionId,generation2)&&closeSession(entry.senpiSessionId,"attempt_discarded")}}}var MAX_CHECKPOINT_RECOVERIES=3;async function earlierVerifiedCheckpoint(input){let{binding,currentHashes}=input;if(input.cwd===void 0||input.authLane==="config-dir")return;let candidates=(binding.assistantUuidByIndex??[]).filter(([index])=>index>=1&&index<binding.sentCount&&index<=binding.sentHashes.length&&index<=currentHashes.length&&binding.sentHashes.slice(0,index).every((hash,offset)=>hash===currentHashes[offset])).sort(([left],[right])=>right-left);if(candidates.length===0)return;let messages;try{messages=await getSdkBoundary().getSessionMessages(binding.sdkSessionId,{dir:input.cwd})}catch(error2){if(error2 instanceof Error)return;throw error2}if(messages.some(message=>message.session_id!==binding.sdkSessionId))return;let available=new Set(messages.filter(message=>message.type==="assistant"&&message.parent_tool_use_id===null).map(message=>message.uuid)),candidate=candidates.find(([,uuid])=>available.has(uuid));if(!candidate)return;let[sentCount,lastAssistantUuid]=candidate;return{...binding,sentCount,sentHashes:currentHashes.slice(0,sentCount),lastAssistantUuid,assistantUuidByIndex:(binding.assistantUuidByIndex??[]).filter(([index])=>index<=sentCount)}}async function reattachRecoveringCheckpoint(input){let binding=input.binding,atUuid=input.atUuid;for(let recovered2=0;;recovered2+=1)try{return{entry:await reattachSession({binding,options:input.options,...atUuid?{atUuid}:{},...input.signal?{signal:input.signal}:{}}),from:binding.sentCount}}catch(error2){if(input.signal?.aborted||recovered2>=MAX_CHECKPOINT_RECOVERIES||!(error2 instanceof Error)||!RESUME_MESSAGE_MISSING.test(error2.message))throw error2;let earlier=await earlierVerifiedCheckpoint({binding,currentHashes:input.currentHashes,cwd:input.options.cwd,authLane:input.authLane});if(!earlier?.lastAssistantUuid)throw error2;logContinuityEvent("claude_sdk_oauth_checkpoint_recovered",{rejectedIndex:binding.sentCount,recoveredIndex:earlier.sentCount}),binding=earlier,atUuid=earlier.lastAssistantUuid}}var PENDING_FORK_REASONS={assistant_rewritten:"assistant_rewritten",compaction:"tainted_compaction"},INVALIDATION_CAUSES={compaction:"tainted_compaction",tree_changed:"branch_diverged",fork:"tainted_fork"};function withRecordedInvalidation(decision,input){if(input.invalidationReason===void 0)return decision;let cause=INVALIDATION_CAUSES[input.invalidationReason]??sanitizeReason(input.invalidationReason);return decision.kind==="bootstrap"?{kind:"bootstrap",reason:cause}:decision.kind==="flatten"&&decision.reason==="registry_miss"?{kind:"flatten",reason:cause}:decision}function commonPrefixLength(left,right){let limit=Math.min(left.length,right.length),index=0;for(;index<limit&&left[index]===right[index];)index+=1;return index}function boundaryBefore(entry,count2){for(let candidate=count2-1;candidate>=1;candidate-=1){let uuid=entry.assistantUuidByIndex.get(candidate);if(uuid)return{index:candidate,uuid}}}function newestBoundaryWithin(entries,cap){let boundary;for(let[index,uuid]of entries??[])index>=1&&index<=cap&&(!boundary||index>boundary.index)&&(boundary={index,uuid});return boundary}function forkOrFlatten(entry,divergesAt,reason){let boundary=boundaryBefore(entry,divergesAt);return boundary?{kind:"fork",sdkSessionId:entry.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason}:{kind:"flatten",reason}}function identityDrift(input,entry){return entry.accountName!==input.accountName?"account_changed":entry.modelId!==input.modelId?"model_changed":entry.systemPromptHash!==input.fingerprint.systemPromptHash?"system_prompt_changed":entry.toolsetHash!==input.fingerprint.toolsetHash?"toolset_changed":null}function retryCheckpointDecision(input,binding){if(binding.unansweredTurnDigest===void 0||sentHashPrefixDigest(input.currentHashes,input.currentHashes.length)!==binding.unansweredTurnDigest||input.currentHashes.length<binding.sentCount||!(binding.sentPrefixHash!==void 0?sentHashPrefixDigest(input.currentHashes,binding.sentCount)===binding.sentPrefixHash:commonPrefixLength(binding.sentHashes,input.currentHashes)===binding.sentCount))return;let boundary=binding.lastAssistantUuid?{index:binding.sentCount,uuid:binding.lastAssistantUuid}:newestBoundaryWithin(binding.assistantUuidByIndex,binding.sentCount);return boundary?{kind:"fork",sdkSessionId:binding.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason:"timeout_retry"}:{kind:"flatten",reason:"timeout_retry"}}function withoutUnconfirmedResume(decision,binding){return binding.sdkSessionIdConfirmed!==!1?decision:decision.kind==="reattach"||decision.kind==="fork"?{kind:"flatten",reason:"session_unconfirmed"}:decision}function decideFromBinding(input,binding){if(!input.transcriptAvailable)return{kind:"flatten",reason:"transcript_missing"};let drift=identityDrift(input,binding);if(drift==="model_changed")return{kind:"flatten",reason:drift};if(drift==="account_changed"&&!input.crossAccountResumeSupported)return{kind:"flatten",reason:"cross_root_unsupported"};let retry=retryCheckpointDecision(input,binding);if(retry)return retry;if(binding.sentPrefixHash!==void 0)return input.currentHashes.length>=binding.sentCount&&sentHashPrefixDigest(input.currentHashes,binding.sentCount)===binding.sentPrefixHash?{kind:"reattach",sdkSessionId:binding.sdkSessionId,from:binding.sentCount,reason:drift??"registry_miss"}:{kind:"flatten",reason:input.currentHashes.length<binding.sentCount?"history_rolled_back":"sent_stream_diverged"};let shared=commonPrefixLength(binding.sentHashes,input.currentHashes);if(shared===binding.sentCount)return{kind:"reattach",sdkSessionId:binding.sdkSessionId,from:binding.sentCount,reason:drift??"registry_miss"};let reason=shared<binding.sentCount?"history_rolled_back":"sent_stream_diverged",boundary=newestBoundaryWithin(binding.assistantUuidByIndex,shared);return boundary?{kind:"fork",sdkSessionId:binding.sdkSessionId,atUuid:boundary.uuid,from:boundary.index,reason}:{kind:"flatten",reason:binding.lastAssistantUuid?reason:"registry_miss"}}function decideNativeContinuity(input){return withRecordedInvalidation(decideFromState(input),input)}function decideFromState(input){let{entry,binding}=input;if(!entry)return binding?withoutUnconfirmedResume(decideFromBinding(input,binding),binding):{kind:"bootstrap"};if(!input.crossAccountResumeSupported&&entry.accountName!==input.accountName)return{kind:"flatten",reason:"cross_root_unsupported"};let divergence=entry.pendingForkReason??entry.taintedReason;if(divergence==="compaction")return{kind:"flatten",reason:"tainted_compaction"};if(divergence)return forkOrFlatten(entry,entry.sentCount,PENDING_FORK_REASONS[divergence]??"other");let shared=commonPrefixLength(entry.sentHashes,input.currentHashes);if(shared<entry.sentCount)return input.currentHashes.length<entry.sentCount&&shared===input.currentHashes.length?forkOrFlatten(entry,input.currentHashes.length,"history_rolled_back"):forkOrFlatten(entry,shared+1,"sent_stream_diverged");if(input.idleExpired)return{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:"idle_ttl"};let drift=identityDrift(input,entry);return drift?{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:drift}:input.credentialDigest!==void 0&&entry.credentialDigest!==void 0&&entry.credentialDigest!==input.credentialDigest?{kind:"reattach",sdkSessionId:entry.sdkSessionId,from:entry.sentCount,reason:"credential_refreshed"}:{kind:"delta",from:entry.sentCount}}async function admitRestoredBinding(sessionId,cwd,authLane){let binding=getBinding(sessionId);if(binding?.sentPrefixHash===void 0)return{binding,transcriptAvailable:!0};let transcriptAvailable=cwd!==void 0&&await verifyRestoredTranscript(binding,cwd,authLane);return transcriptAvailable||forgetBinding(sessionId),{binding,transcriptAvailable}}function userMessage(content){return{role:"user",content}}var OBSERVED_KIND={delta:"incremental",reattach:"resume",fork:"resume",flatten:"cold-seed",bootstrap:"cold-seed"};function contextHasPriorAssistantMessage(context){return context.messages.some(message=>message.role==="assistant")}function entrySnapshot(entry,hashes){return{sdkSessionId:entry.sdkSessionId,accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.toolsetHash,sentCount:entry.sentCount,sentHashes:hashes.slice(0,entry.sentCount),lastAssistantUuid:entry.assistantUuidByIndex.get(entry.sentCount)??null,assistantUuidByIndex:entry.assistantUuidByIndex,pendingForkReason:entry.pendingForkReason,taintedReason:entry.taintedReason,credentialDigest:entry.credentialDigest}}async function createResidentAttempt(input,auth){let sessionId=input.streamOptions.sessionId,messages=sentMessages(input.context),hashes=sentMessageHashes(messages),existing2=getSession(sessionId),fingerprint=configFingerprint(auth.options,input.context,auth.authLane,auth.accountName),residentHashes=existing2?sentHashesForEntry(existing2)??hashes:hashes,{binding,transcriptAvailable}=await admitRestoredBinding(sessionId,auth.options.cwd,auth.authLane),decision=decideNativeContinuity({entry:existing2?entrySnapshot(existing2,residentHashes):void 0,binding,currentHashes:hashes,accountName:auth.accountName,modelId:input.model.id,fingerprint,transcriptAvailable,crossAccountResumeSupported:auth.authLane!=="config-dir",idleExpired:existing2?isIdleExpired(existing2):!1,invalidationReason:bindingInvalidationReason(sessionId),credentialDigest:auth.credentialDigest}),firstTurn=existing2===void 0&&getBinding(sessionId)===void 0&&!contextHasPriorAssistantMessage(input.context),observedReason="reason"in decision?decision.reason:decision.kind==="bootstrap"?"registry_miss":void 0,observedKind=OBSERVED_KIND[decision.kind],entry,from=0,flatten=decision.kind==="flatten"||decision.kind==="bootstrap";if(decision.kind==="delta"&&existing2)entry=existing2,from=decision.from;else if(decision.kind==="reattach"||decision.kind==="fork"){let source2=getBinding(sessionId)??(existing2?bindingFromEntry(existing2,residentHashes):void 0),binding2=source2?(({sentPrefixHash:_persistedPrefix,...rest})=>({...rest,sentCount:decision.from,sentHashes:hashes.slice(0,decision.from),assistantUuidByIndex:(source2.assistantUuidByIndex??[]).filter(([index])=>index<=decision.from),accountName:auth.accountName,modelId:input.model.id,systemPromptHash:fingerprint.systemPromptHash,toolsetHash:fingerprint.toolsetHash,...decision.kind==="fork"?{lastAssistantUuid:decision.atUuid}:{}}))(source2):void 0;try{if(!binding2)throw new Error("Anthropic Subscription continuity binding is unavailable");({entry,from}=await reattachRecoveringCheckpoint({binding:binding2,options:auth.options,...decision.kind==="fork"?{atUuid:decision.atUuid}:{},...input.streamOptions.signal?{signal:input.streamOptions.signal}:{},currentHashes:hashes,authLane:auth.authLane}))}catch(error2){if(input.streamOptions.signal?.aborted)throw error2;input.onResumeFallback(error2),observedKind="cold-seed",observedReason="resume_initialization_failed",flatten=!0,entry=getOrCreateSession({senpiSessionId:sessionId,accountName:auth.accountName,modelId:input.model.id,...fingerprint,options:auth.options})}}else existing2&&closeSession(sessionId,observedReason??"registry_miss"),entry=getOrCreateSession({senpiSessionId:sessionId,accountName:auth.accountName,modelId:input.model.id,...fingerprint,options:auth.options});entry.credentialDigest=auth.credentialDigest;let flattenResult=flatten?dedupeUltraworkBlocks(buildPromptBlocks(input.context,input.customToolNameToSdk,input.toolWatchNote)):void 0,estimatedTokens=flattenResult?estimateColdSeedTokens(input.context,flattenResult.blocks):void 0;input.onDispatchShape?.(flattenResult!==void 0,estimatedTokens);let overBudget=estimatedTokens!==void 0?coldSeedOverflow(input.model,estimatedTokens,coldSeedCalibration(sessionId)):void 0;if(overBudget)throw closeSession(sessionId,"cold_seed_over_budget"),overBudget;let blocks=flattenResult?flattenResult.blocks:buildDeltaPromptBlocks(messages.slice(from),input.customToolNameToSdk),payloadBytes=flattenResult?serializedPayloadBytes(flattenResult.blocks):void 0,staged=stageContinuityDecision(observeSessionSyncDecision({kind:observedKind,reason:observedReason,deltaMessages:flatten?hashes.length:hashes.length-from,firstTurn,senpiSessionId:sessionId,...payloadBytes!==void 0?{payloadBytes}:{},...flattenResult?.collapsedDirectives!==void 0?{collapsedDirectives:flattenResult.collapsedDirectives}:{}}),sessionId,input.onContinuityDecision,()=>consumePendingCloseCause(sessionId));return createSessionTurnAttempt(entry,userMessage(blocks),hashes,input.streamOptions.signal,staged)}async function*residentSessionMessages(input){try{yield*residentAuthLaneMessages(input)}catch(error2){throw emitContinuityObservation({kind:"failed",reason:sanitizeTerminalFailure(error2)},input.streamOptions.sessionId,input.onContinuityDecision),error2}}function residentAuthLaneMessages(input){let sessionId=input.streamOptions.sessionId,preferredAccount=sessionId===void 0?void 0:getSession(sessionId)?.accountName??getBinding(sessionId)?.accountName;return queryWithAuthLane({prompt:"",query:getSdkBoundary().query,providerSettings:input.providerSettings,env:input.streamOptions.env,signal:input.streamOptions.signal,sessionId:input.streamOptions.affinitySessionId??input.streamOptions.sessionId,model:input.model.id,pinnedAccount:input.pinnedAccount,...preferredAccount===void 0?{}:{preferredAccount},buildOptions:input.buildOptions,createAttempt:auth=>createResidentAttempt(input,auth)})}var sdkTools=[...BUILTIN_SDK_TOOLS];function mapStopReason(reason){return reason==="tool_use"?"toolUse":reason==="max_tokens"?"length":"stop"}function asRecord2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function mapToolArguments(name,argumentsValue){return mapToolArgs(name,argumentsValue)}function updateUsage(model,output,usage3){usage3.input_tokens!=null&&(output.usage.input=usage3.input_tokens),usage3.output_tokens!=null&&(output.usage.output=usage3.output_tokens),usage3.cache_read_input_tokens!=null&&(output.usage.cacheRead=usage3.cache_read_input_tokens),usage3.cache_creation_input_tokens!=null&&(output.usage.cacheWrite=usage3.cache_creation_input_tokens),output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite,calculateCost(model,output.usage)}function emptyOutput(model){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()}}function errorMessage(error2){return error2 instanceof Error?error2.message:String(error2)}function openBlock(context,block,kind){context.blocks.push(block),context.output.content.push(block),context.stream.push({type:`${kind}_start`,contentIndex:context.output.content.length-1,partial:context.output})}function startContentBlock(context,event){if(event.content_block.type==="text"){openBlock(context,{type:"text",text:"",index:event.index},"text");return}if(event.content_block.type==="thinking"){let block={type:"thinking",thinking:"",thinkingSignature:"",index:event.index};openBlock(context,block,"thinking");return}if(event.content_block.type==="tool_use"){let block={type:"toolCall",id:event.content_block.id,name:mapSdkToolNameToPi(event.content_block.name,context.customToolNameToPi),arguments:asRecord2(event.content_block.input),partialJson:"",index:event.index};openBlock(context,block,"toolcall")}}function applyDelta(context,event){let{blocks,stream:stream2,output}=context,contentIndex=blocks.findIndex(candidate=>candidate.index===event.index),block=blocks[contentIndex];event.delta.type==="text_delta"&&block?.type==="text"?(block.text+=event.delta.text,stream2.push({type:"text_delta",contentIndex,delta:event.delta.text,partial:output})):event.delta.type==="thinking_delta"&&block?.type==="thinking"?(block.thinking+=event.delta.thinking,stream2.push({type:"thinking_delta",contentIndex,delta:event.delta.thinking,partial:output})):event.delta.type==="signature_delta"&&block?.type==="thinking"?block.thinkingSignature+=event.delta.signature:event.delta.type==="input_json_delta"&&block?.type==="toolCall"&&(block.partialJson=`${block.partialJson??""}${event.delta.partial_json}`,block.arguments=parseStreamingJson(block.partialJson),stream2.push({type:"toolcall_delta",contentIndex,delta:event.delta.partial_json,partial:output}))}function closeContentBlock(context,event){let{blocks,stream:stream2,output}=context,contentIndex=blocks.findIndex(candidate=>candidate.index===event.index),block=blocks[contentIndex];block?.type==="text"?stream2.push({type:"text_end",contentIndex,content:block.text,partial:output}):block?.type==="thinking"?stream2.push({type:"thinking_end",contentIndex,content:block.thinking,partial:output}):block?.type==="toolCall"&&(block.arguments=mapToolArguments(block.name,parseStreamingJson(block.partialJson)),delete block.partialJson,stream2.push({type:"toolcall_end",contentIndex,toolCall:block,partial:output})),block&&delete block.index}function applyStreamEvent(context,event){event.type==="message_start"?(context.output.responseId??=event.message.id||void 0,updateUsage(context.model,context.output,event.message.usage)):event.type==="content_block_start"?startContentBlock(context,event):event.type==="content_block_delta"?applyDelta(context,event):event.type==="content_block_stop"?closeContentBlock(context,event):event.type==="message_delta"&&(context.output.stopReason=mapStopReason(event.delta.stop_reason),updateUsage(context.model,context.output,event.usage))}function withAuthGuidance(error2,message,ran){if(error2 instanceof AllAccountsBlockedError)return error2.unavailableAccount===void 0?allAccountsBlockedGuidance(error2.soonestUnblockAt,error2.blockReason):singleAccountUnavailableGuidance(error2.unavailableAccount,error2.soonestUnblockAt,error2.blockReason);let guidance=sdkErrorGuidance(classifySdkError(error2).kind),versionGuidance=claudeCodeVersionFloorGuidance(message,ran),hints=[guidance,versionGuidance].filter(hint=>hint!==void 0);return hints.length>0?`${message}
|
|
314
313
|
${hints.join(`
|
|
315
314
|
`)}`:message}var TOOL_WATCH_CUSTOM_TYPE="claude-sdk-oauth-tool-watch";var MAX_TRACKED_TOOL_EXECUTIONS=256,MAX_TRACKED_TOOL_CONTENT_CHARS=4e3,MAX_LEDGER_TOOL_RESULTS=4,MAX_LEDGER_TOOL_CONTENT_CHARS=1200;function asRecord3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:void 0}function truncate(text3,limit){return text3.length<=limit?text3:`${text3.slice(0,limit)}
|
|
316
315
|
...[truncated]`}function contentToText2(content){return typeof content=="string"?content:Array.isArray(content)?content.map(block=>{let value=asRecord3(block);return value?.type==="text"&&typeof value.text=="string"?value.text:value?.type==="image"?`[image:${typeof value.mimeType=="string"?value.mimeType:"unknown"}]`:typeof value?.type=="string"?`[${value.type}]`:""}).filter(Boolean).join(`
|
|
@@ -318,7 +317,7 @@ ${hints.join(`
|
|
|
318
317
|
Tool execution did not complete or its result was not observed. Do not guess. Call the tool again.`;let status=execution.isError?"error":"ok";return`TOOL RESULT (recovered ${mapPiToolNameToSdk(execution.toolName,customToolNameToSdk)}, id=${toolCallId}, status=${status}):
|
|
319
318
|
${truncate(execution.content||"(empty tool result)",MAX_LEDGER_TOOL_CONTENT_CHARS)}`});return notes.length>0?notes.join(`
|
|
320
319
|
|
|
321
|
-
`):void 0},deleteSession:sessionKey=>{states.delete(sessionKey)}}}var toolWatch=createToolWatch();var NATIVE_COMPACTION_WHILE_SENPI_OWNS='Claude Code compacted this session natively although senpi owns compaction on this lane (compactionOwner: "senpi"); the turn was stopped so only one side compacts. Run /compact, or set anthropicSubscriptionProvider.compactionOwner to "sdk" to let Claude Code compact.';function streamAnthropicSubscription(model,context,options){let stream2=createAssistantMessageEventStream();return(async()=>{let output=emptyOutput(model),blocks=[],sdkQuery,closed=!1,wasAborted=!1,started=!1,sawStreamEvent=!1,closeQuery=()=>{closed||!sdkQuery||(closed=!0,sdkQuery.close())},requestAbort=()=>{sdkQuery&&sdkQuery.interrupt().catch(()=>{}).finally(closeQuery)},onAbort=()=>{wasAborted=!0,requestAbort()};options?.signal?.aborted?onAbort():options?.signal?.addEventListener("abort",onAbort,{once:!0});let claudeCodeRun,coldSeedAttempt=!1,coldSeedEstimate,nativeCompactionStopped=!1;try{await loadClaudeAgentSdk();let resolvedTools=resolveSdkTools(context),affinityKey=options?.affinitySessionId??options?.sessionId,sessionKey=options?.sessionId?toolWatch.sessionKey(options.sessionId):void 0;sessionKey&&toolWatch.reconcileWithContext(sessionKey,context);let toolWatchNote=toolWatch.buildPromptNote(sessionKey,context,resolvedTools.customToolNameToSdk),providerSettings=loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd()),senpiOwnsCompaction=resolveCompactionOwner(providerSettings)==="senpi",mcpServers=options?.toolChoice==="none"?void 0:await buildCustomToolServers(resolvedTools.customTools);claudeCodeRun=resolveClaudeCodeRun(defaultExecutableDeps());let executable=claudeCodeRun.executable,oneShotCacheTtl,buildOptions=authLane=>{let queryOptions=buildAnthropicSubscriptionQueryOptions({model,context,streamOptions:options,providerSettings,authLane,tools:resolvedTools.sdkTools,pathToClaudeCodeExecutable:executable,sessionId:options?.sessionId,onGuidance:text3=>{output.diagnostics=[...output.diagnostics??[],createAssistantMessageDiagnostic("claude_sdk_oauth_deprecation",text3)]}});return mcpServers&&(queryOptions.mcpServers=mcpServers),useResidentSession||(oneShotCacheTtl=pinOneShotPromptCacheTtl(queryOptions,authLane??providerSettings.tokenInjection??"ambient",{...process.env,...options?.env})),queryOptions},recordContinuity=observation=>{output.diagnostics=[...output.diagnostics??[],{type:"claude_sdk_oauth_session_continuity",timestamp:Date.now(),details:{...observation}}]},useResidentSession=options?.streamKind==="main"&&providerSettings.resumeMode!=="off"&&options.sessionId!==void 0;options?.streamKind==="main"&&!useResidentSession&&emitContinuityObservation({kind:"disabled",reason:providerSettings.resumeMode==="off"?"resume_mode_off":"registry_miss",...providerSettings.resumeMode==="off"?{settingSource:resumeModeSource(providerSettings)}:{}},options.sessionId,recordContinuity);let messages=useResidentSession?residentSessionMessages({model,context,streamOptions:options,providerSettings,pinnedAccount:getSessionClaudeAccountPin(options.sessionId),buildOptions,customToolNameToSdk:resolvedTools.customToolNameToSdk,toolWatchNote,onContinuityDecision:recordContinuity,onDispatchShape:(coldSeed,estimatedTokens)=>{coldSeedAttempt=coldSeed,coldSeedEstimate=estimatedTokens},onResumeFallback:error2=>{output.diagnostics=[...output.diagnostics??[],createAssistantMessageDiagnostic("claude_sdk_oauth_resume_fallback",error2)]}}):queryWithAuthLane({prompt:buildDeferredPromptStream(()=>dedupeUltraworkBlocks(buildPromptBlocks(context,resolvedTools.customToolNameToSdk,toolWatchNote,oneShotCacheTtl===void 0?{}:{cacheBreakpoint:oneShotCacheTtl})).blocks),query:getSdkBoundary().query,providerSettings,env:options?.env,signal:options?.signal,sessionId:affinityKey,model:model.id,pinnedAccount:getSessionClaudeAccountPin(options?.sessionId),onQuery:query=>{sdkQuery=query,wasAborted&&requestAbort()},buildOptions});for await(let message of messages){let refusal=refusalError(message);if(refusal)throw refusal;let failure2=message.type==="assistant"?sdkAssistantFailure(message):message.type==="result"?sdkResultFailure(message):void 0;if(failure2)throw failure2;if(started||(stream2.push({type:"start",partial:output}),started=!0),message.type==="stream_event")sawStreamEvent=!0,applyStreamEvent({model,output,blocks,stream:stream2,customToolNameToPi:resolvedTools.customToolNameToPi},message.event);else if(message.type==="assistant")output.responseId??=message.message.id||void 0;else if(message.type==="system"&&message.subtype==="compact_boundary"){if(senpiOwnsCompaction)throw nativeCompactionStopped=!0,new Error(NATIVE_COMPACTION_WHILE_SENPI_OWNS);output.diagnostics=[...output.diagnostics??[],{type:"claude_sdk_oauth_compact_boundary",timestamp:Date.now(),details:{boundary:{trigger:message.compact_metadata?.trigger??"unknown",preTokens:message.compact_metadata?.pre_tokens??0,postTokens:message.compact_metadata?.post_tokens??0,lineageId:message.session_id??"",observedAt:Date.now()}}}]}else message.type==="result"&&message.subtype==="success"&&(message.usage&&updateUsage(model,output,message.usage),message.stop_reason!=null&&output.stopReason!=="toolUse"&&(output.stopReason=mapStopReason(message.stop_reason)),sawStreamEvent||output.content.push({type:"text",text:message.result}))}wasAborted||options?.signal?.aborted?(output.stopReason="aborted",output.errorMessage="Operation aborted",stream2.push({type:"error",reason:"aborted",error:output})):stream2.push({type:"done",reason:output.stopReason==="toolUse"?"toolUse":output.stopReason==="length"?"length":"stop",message:output})}catch(error2){nativeCompactionStopped&&options?.sessionId&&forgetBinding(options.sessionId),output.stopReason=options?.signal?.aborted?"aborted":"error";let billed=sdkResultFailureUsage(error2);billed&&updateUsage(model,output,billed),output.errorMessage=withAuthGuidance(error2,errorMessage(error2),claudeCodeRun),markColdSeedOverflow(output,model,coldSeedAttempt,coldSeedEstimate,options?.sessionId),stream2.push({type:"error",reason:output.stopReason,error:output})}finally{options?.signal?.removeEventListener("abort",onAbort),closeQuery(),stream2.end()}})(),stream2}var anthropicSubscriptionModels=(longContext=longContextAvailable())=>getModels("anthropic").map(model=>({id:model.id,name:model.name,reasoning:model.reasoning,input:model.input,cost:model.cost,contextWindow:longContext?model.contextWindow:Math.min(model.contextWindow,CLAUDE_CODE_DEFAULT_CONTEXT_WINDOW),maxTokens:model.maxTokens,thinkingLevelMap:{...model.thinkingLevelMap,minimal:null}}));function readStoredCredential2(providerId){let authPath=join33(getAgentDir(),"auth.json");if(existsSync15(authPath))try{let data=JSON.parse(readFileSync19(authPath,"utf8"));return readByProviderId(data,providerId)}catch{return}}function registerAnthropicSubscriptionExtension(pi,deps={}){registerClaudeAccountCommand(pi),registerSessionRegistry(pi);let providerConfig=longContext=>({baseUrl:CLAUDE_SDK_OAUTH_API_ID,api:CLAUDE_SDK_OAUTH_API_ID,models:anthropicSubscriptionModels(longContext),streamSimple:(model,context,options)=>streamAnthropicSubscription(model,toBuiltinProviderContext(context),options),fallbackEligible:()=>{try{return(deps.readSettings?deps.readSettings():loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd())).enabled!==!1}catch{return!0}},oauth:createOAuthConfig({readCurrent:async()=>readStoredCredential2(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),readAmbientAuthStatus:deps.readAmbientAuthStatus,readSettings:()=>{try{let settings=deps.readSettings?deps.readSettings():loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd());return{tokenInjection:settings.tokenInjection,enabled:settings.enabled}}catch{return}},readAnthropicCredential:async()=>{let credential=readStoredCredential2("anthropic");return credential&&typeof credential.access=="string"?{access:credential.access,refresh:credential.refresh,expires:credential.expires}:void 0},removeAnthropicCredential:async()=>{await new FileAuthStorageBackend().withLockAsync(async current=>{if(current===void 0)return{result:void 0};let data=JSON.parse(current);return"anthropic"in data?(delete data.anthropic,{result:void 0,next:JSON.stringify(data,null,2)}):{result:void 0}})}})});pi.registerProvider(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,providerConfig(longContextAvailable()));let stopFollowingLongContext=onLongContextAvailabilityChange(available=>{pi.registerProvider(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,providerConfig(available))});pi.on("session_shutdown",()=>stopFollowingLongContext())}function anthropicSubscriptionExtension(pi){registerAnthropicSubscriptionExtension(pi)}var WEB_SEARCH_MAX_USES=8,ENABLE_ENV="PI_ANTHROPIC_WEB_SEARCH",ALLOWED_DOMAINS_ENV="PI_ANTHROPIC_WEB_SEARCH_ALLOWED_DOMAINS",BLOCKED_DOMAINS_ENV="PI_ANTHROPIC_WEB_SEARCH_BLOCKED_DOMAINS",STATUS_KEY="anthropic-web-search",WIDGET_KEY="anthropic-web-search";function parseEnableEnv(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isRecord11(value){return typeof value=="object"&&value!==null}function isWebSearchType(value){return typeof value=="string"&&value.startsWith("web_search_")}function resolveTarget(target){if(target!==void 0)return typeof target=="string"?{api:target,baseUrl:target==="anthropic-messages"?"https://api.anthropic.com":"",provider:target==="anthropic-messages"?"anthropic":""}:target}function supportsNativeAnthropicWebSearch(target){let model=resolveTarget(target);if(model?.api!=="anthropic-messages")return!1;let compat=model.compat;if(compat?.supportsWebSearch!==void 0)return compat.supportsWebSearch;try{return new URL(model.baseUrl).hostname==="api.anthropic.com"}catch{return!1}}function parseDomainListEnv(envVar){let envValue2=process.env[envVar];if(!envValue2)return;let domains=envValue2.split(",").map(domain=>domain.trim()).filter(domain=>domain.length>0);if(domains.length!==0)return domains}function makeWebSearchTool(){let allowedDomains=parseDomainListEnv(ALLOWED_DOMAINS_ENV),blockedDomains=parseDomainListEnv(BLOCKED_DOMAINS_ENV);return{type:"web_search_20250305",name:"web_search",...allowedDomains?{allowed_domains:allowedDomains}:{},...blockedDomains?{blocked_domains:blockedDomains}:{},max_uses:WEB_SEARCH_MAX_USES}}function sanitizeTools2(tools){let sanitized=[];for(let tool of tools){if(!isRecord11(tool))continue;let name=tool.name,type2=tool.type;name==="web_search"&&!isWebSearchType(type2)||sanitized.push(tool)}return sanitized}function stripNativeAnthropicWebSearch(payload){let tools=payload.tools;if(!Array.isArray(tools))return payload;let sanitizedTools=tools.filter(tool=>!(isRecord11(tool)&&isWebSearchType(tool.type)));if(sanitizedTools.length===tools.length)return payload;let sanitizedPayload={...payload};if(sanitizedTools.length>0?sanitizedPayload.tools=sanitizedTools:delete sanitizedPayload.tools,isRecord11(sanitizedPayload.tool_choice)){let selectedName=sanitizedPayload.tool_choice.name,hasSelectedTool=typeof selectedName=="string"&&sanitizedTools.some(tool=>isRecord11(tool)&&tool.name===selectedName);(sanitizedTools.length===0||typeof selectedName=="string"&&!hasSelectedTool)&&delete sanitizedPayload.tool_choice}return sanitizedPayload}function addAnthropicWebSearchToPayload(target,payload){let model=resolveTarget(target);if(model?.api!=="anthropic-messages"||!isRecord11(payload))return payload;if(isServerSearchDisabled(payload)||isServerSearchFallback(payload)||!supportsNativeAnthropicWebSearch(model))return stripNativeAnthropicWebSearch(payload);if(!isAnthropicWebSearchEnabled())return payload;let tools=Array.isArray(payload.tools)?payload.tools:[],sanitizedTools=sanitizeTools2(tools);return sanitizedTools.some(tool=>isWebSearchType(tool.type))||sanitizedTools.push(makeWebSearchTool()),{...payload,tools:sanitizedTools}}function isAnthropicWebSearchEnabled(){return parseEnableEnv(ENABLE_ENV)}function clearUi(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY,void 0),ctx.ui.setWidget(WIDGET_KEY,void 0))}function syncUi(ctx){clearUi(ctx)}var ANTHROPIC_WEB_SEARCH_SECTION=`
|
|
320
|
+
`):void 0},deleteSession:sessionKey=>{states.delete(sessionKey)}}}var toolWatch=createToolWatch();var NATIVE_COMPACTION_WHILE_SENPI_OWNS='Claude Code compacted this session natively although senpi owns compaction on this lane (compactionOwner: "senpi"); the turn was stopped so only one side compacts. Run /compact, or set anthropicSubscriptionProvider.compactionOwner to "sdk" to let Claude Code compact.';function streamAnthropicSubscription(model,context,options){let stream2=createAssistantMessageEventStream();return(async()=>{let output=emptyOutput(model),blocks=[],sdkQuery,closed=!1,wasAborted=!1,started=!1,sawStreamEvent=!1,closeQuery=()=>{closed||!sdkQuery||(closed=!0,sdkQuery.close())},requestAbort=()=>{sdkQuery&&sdkQuery.interrupt().catch(()=>{}).finally(closeQuery)},onAbort=()=>{wasAborted=!0,requestAbort()};options?.signal?.aborted?onAbort():options?.signal?.addEventListener("abort",onAbort,{once:!0});let claudeCodeRun,coldSeedAttempt=!1,coldSeedEstimate,nativeCompactionStopped=!1;try{await loadClaudeAgentSdk();let resolvedTools=resolveSdkTools(context),affinityKey=options?.affinitySessionId??options?.sessionId,sessionKey=options?.sessionId?toolWatch.sessionKey(options.sessionId):void 0;sessionKey&&toolWatch.reconcileWithContext(sessionKey,context);let toolWatchNote=toolWatch.buildPromptNote(sessionKey,context,resolvedTools.customToolNameToSdk),providerSettings=loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd()),senpiOwnsCompaction=resolveCompactionOwner(providerSettings)==="senpi",mcpServers=options?.toolChoice==="none"?void 0:await buildCustomToolServers(resolvedTools.customTools);claudeCodeRun=resolveClaudeCodeRun(defaultExecutableDeps());let executable=claudeCodeRun.executable,oneShotCacheTtl,buildOptions=authLane=>{let queryOptions=buildAnthropicSubscriptionQueryOptions({model,context,streamOptions:options,providerSettings,authLane,tools:resolvedTools.sdkTools,pathToClaudeCodeExecutable:executable,sessionId:options?.sessionId,onGuidance:text3=>{output.diagnostics=[...output.diagnostics??[],createAssistantMessageDiagnostic("claude_sdk_oauth_deprecation",text3)]}});return mcpServers&&(queryOptions.mcpServers=mcpServers),useResidentSession||(oneShotCacheTtl=pinOneShotPromptCacheTtl(queryOptions,authLane??providerSettings.tokenInjection??"ambient",{...process.env,...options?.env})),queryOptions},recordContinuity=observation=>{output.diagnostics=[...output.diagnostics??[],{type:"claude_sdk_oauth_session_continuity",timestamp:Date.now(),details:{...observation}}]},useResidentSession=options?.streamKind==="main"&&providerSettings.resumeMode!=="off"&&options.sessionId!==void 0;options?.streamKind==="main"&&!useResidentSession&&emitContinuityObservation({kind:"disabled",reason:providerSettings.resumeMode==="off"?"resume_mode_off":"registry_miss",...providerSettings.resumeMode==="off"?{settingSource:resumeModeSource(providerSettings)}:{}},options.sessionId,recordContinuity);let messages=useResidentSession?residentSessionMessages({model,context,streamOptions:options,providerSettings,pinnedAccount:getSessionClaudeAccountPin(options.sessionId),buildOptions,customToolNameToSdk:resolvedTools.customToolNameToSdk,toolWatchNote,onContinuityDecision:recordContinuity,onDispatchShape:(coldSeed,estimatedTokens)=>{coldSeedAttempt=coldSeed,coldSeedEstimate=estimatedTokens},onResumeFallback:error2=>{output.diagnostics=[...output.diagnostics??[],createAssistantMessageDiagnostic("claude_sdk_oauth_resume_fallback",error2)]}}):queryWithAuthLane({prompt:buildDeferredPromptStream(()=>dedupeUltraworkBlocks(buildPromptBlocks(context,resolvedTools.customToolNameToSdk,toolWatchNote,oneShotCacheTtl===void 0?{}:{cacheBreakpoint:oneShotCacheTtl})).blocks),query:getSdkBoundary().query,providerSettings,env:options?.env,signal:options?.signal,sessionId:affinityKey,model:model.id,pinnedAccount:getSessionClaudeAccountPin(options?.sessionId),onQuery:query=>{sdkQuery=query,wasAborted&&requestAbort()},buildOptions});for await(let message of messages){let refusal=refusalError(message);if(refusal)throw refusal;let failure2=message.type==="assistant"?sdkAssistantFailure(message):message.type==="result"?sdkResultFailure(message):void 0;if(failure2)throw failure2;if(started||(stream2.push({type:"start",partial:output}),started=!0),message.type==="stream_event")sawStreamEvent=!0,applyStreamEvent({model,output,blocks,stream:stream2,customToolNameToPi:resolvedTools.customToolNameToPi},message.event);else if(message.type==="assistant")output.responseId??=message.message.id||void 0;else if(message.type==="system"&&message.subtype==="compact_boundary"){if(senpiOwnsCompaction)throw nativeCompactionStopped=!0,new Error(NATIVE_COMPACTION_WHILE_SENPI_OWNS);output.diagnostics=[...output.diagnostics??[],{type:"claude_sdk_oauth_compact_boundary",timestamp:Date.now(),details:{boundary:{trigger:message.compact_metadata?.trigger??"unknown",preTokens:message.compact_metadata?.pre_tokens??0,postTokens:message.compact_metadata?.post_tokens??0,lineageId:message.session_id??"",observedAt:Date.now()}}}]}else message.type==="result"&&message.subtype==="success"&&(message.usage&&updateUsage(model,output,message.usage),message.stop_reason!=null&&output.stopReason!=="toolUse"&&(output.stopReason=mapStopReason(message.stop_reason)),sawStreamEvent||output.content.push({type:"text",text:message.result}))}wasAborted||options?.signal?.aborted?(output.stopReason="aborted",output.errorMessage="Operation aborted",stream2.push({type:"error",reason:"aborted",error:output})):stream2.push({type:"done",reason:output.stopReason==="toolUse"?"toolUse":output.stopReason==="length"?"length":"stop",message:output})}catch(error2){nativeCompactionStopped&&options?.sessionId&&forgetBinding(options.sessionId),output.stopReason=options?.signal?.aborted?"aborted":"error";let billed=sdkResultFailureUsage(error2);billed&&updateUsage(model,output,billed),output.errorMessage=withAuthGuidance(error2,errorMessage(error2),claudeCodeRun),markColdSeedOverflow(output,model,coldSeedAttempt,coldSeedEstimate,options?.sessionId),stream2.push({type:"error",reason:output.stopReason,error:output})}finally{options?.signal?.removeEventListener("abort",onAbort),closeQuery(),stream2.end()}})(),stream2}var anthropicSubscriptionModels=(longContext=longContextAvailable())=>getModels("anthropic").map(model=>({id:model.id,name:model.name,reasoning:model.reasoning,input:model.input,cost:model.cost,contextWindow:plannedContextWindow(model,longContext),maxTokens:model.maxTokens,thinkingLevelMap:{...model.thinkingLevelMap,minimal:null}}));function readStoredCredential2(providerId){let authPath=join33(getAgentDir(),"auth.json");if(existsSync15(authPath))try{let data=JSON.parse(readFileSync19(authPath,"utf8"));return readByProviderId(data,providerId)}catch{return}}function registerAnthropicSubscriptionExtension(pi,deps={}){registerClaudeAccountCommand(pi),registerSessionRegistry(pi);let providerConfig=longContext=>({baseUrl:CLAUDE_SDK_OAUTH_API_ID,api:CLAUDE_SDK_OAUTH_API_ID,models:anthropicSubscriptionModels(longContext),streamSimple:(model,context,options)=>streamAnthropicSubscription(model,toBuiltinProviderContext(context),options),fallbackEligible:()=>{try{return(deps.readSettings?deps.readSettings():loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd())).enabled!==!1}catch{return!0}},oauth:createOAuthConfig({readCurrent:async()=>readStoredCredential2(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),readAmbientAuthStatus:deps.readAmbientAuthStatus,readSettings:()=>{try{let settings=deps.readSettings?deps.readSettings():loadAnthropicSubscriptionProviderSettingsFromDisk(process.cwd());return{tokenInjection:settings.tokenInjection,enabled:settings.enabled}}catch{return}},readAnthropicCredential:async()=>{let credential=readStoredCredential2("anthropic");return credential&&typeof credential.access=="string"?{access:credential.access,refresh:credential.refresh,expires:credential.expires}:void 0},removeAnthropicCredential:async()=>{await new FileAuthStorageBackend().withLockAsync(async current=>{if(current===void 0)return{result:void 0};let data=JSON.parse(current);return"anthropic"in data?(delete data.anthropic,{result:void 0,next:JSON.stringify(data,null,2)}):{result:void 0}})}})});pi.registerProvider(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,providerConfig(longContextAvailable()));let stopFollowingLongContext=onLongContextAvailabilityChange(available=>{pi.registerProvider(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,providerConfig(available))});pi.on("session_shutdown",()=>stopFollowingLongContext())}function anthropicSubscriptionExtension(pi){registerAnthropicSubscriptionExtension(pi)}var WEB_SEARCH_MAX_USES=8,ENABLE_ENV="PI_ANTHROPIC_WEB_SEARCH",ALLOWED_DOMAINS_ENV="PI_ANTHROPIC_WEB_SEARCH_ALLOWED_DOMAINS",BLOCKED_DOMAINS_ENV="PI_ANTHROPIC_WEB_SEARCH_BLOCKED_DOMAINS",STATUS_KEY="anthropic-web-search",WIDGET_KEY="anthropic-web-search";function parseEnableEnv(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isRecord11(value){return typeof value=="object"&&value!==null}function isWebSearchType(value){return typeof value=="string"&&value.startsWith("web_search_")}function resolveTarget(target){if(target!==void 0)return typeof target=="string"?{api:target,baseUrl:target==="anthropic-messages"?"https://api.anthropic.com":"",provider:target==="anthropic-messages"?"anthropic":""}:target}function supportsNativeAnthropicWebSearch(target){let model=resolveTarget(target);if(model?.api!=="anthropic-messages")return!1;let compat=model.compat;if(compat?.supportsWebSearch!==void 0)return compat.supportsWebSearch;try{return new URL(model.baseUrl).hostname==="api.anthropic.com"}catch{return!1}}function parseDomainListEnv(envVar){let envValue2=process.env[envVar];if(!envValue2)return;let domains=envValue2.split(",").map(domain=>domain.trim()).filter(domain=>domain.length>0);if(domains.length!==0)return domains}function makeWebSearchTool(){let allowedDomains=parseDomainListEnv(ALLOWED_DOMAINS_ENV),blockedDomains=parseDomainListEnv(BLOCKED_DOMAINS_ENV);return{type:"web_search_20250305",name:"web_search",...allowedDomains?{allowed_domains:allowedDomains}:{},...blockedDomains?{blocked_domains:blockedDomains}:{},max_uses:WEB_SEARCH_MAX_USES}}function sanitizeTools2(tools){let sanitized=[];for(let tool of tools){if(!isRecord11(tool))continue;let name=tool.name,type2=tool.type;name==="web_search"&&!isWebSearchType(type2)||sanitized.push(tool)}return sanitized}function stripNativeAnthropicWebSearch(payload){let tools=payload.tools;if(!Array.isArray(tools))return payload;let sanitizedTools=tools.filter(tool=>!(isRecord11(tool)&&isWebSearchType(tool.type)));if(sanitizedTools.length===tools.length)return payload;let sanitizedPayload={...payload};if(sanitizedTools.length>0?sanitizedPayload.tools=sanitizedTools:delete sanitizedPayload.tools,isRecord11(sanitizedPayload.tool_choice)){let selectedName=sanitizedPayload.tool_choice.name,hasSelectedTool=typeof selectedName=="string"&&sanitizedTools.some(tool=>isRecord11(tool)&&tool.name===selectedName);(sanitizedTools.length===0||typeof selectedName=="string"&&!hasSelectedTool)&&delete sanitizedPayload.tool_choice}return sanitizedPayload}function addAnthropicWebSearchToPayload(target,payload){let model=resolveTarget(target);if(model?.api!=="anthropic-messages"||!isRecord11(payload))return payload;if(isServerSearchDisabled(payload)||isServerSearchFallback(payload)||!supportsNativeAnthropicWebSearch(model))return stripNativeAnthropicWebSearch(payload);if(!isAnthropicWebSearchEnabled())return payload;let tools=Array.isArray(payload.tools)?payload.tools:[],sanitizedTools=sanitizeTools2(tools);return sanitizedTools.some(tool=>isWebSearchType(tool.type))||sanitizedTools.push(makeWebSearchTool()),{...payload,tools:sanitizedTools}}function isAnthropicWebSearchEnabled(){return parseEnableEnv(ENABLE_ENV)}function clearUi(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY,void 0),ctx.ui.setWidget(WIDGET_KEY,void 0))}function syncUi(ctx){clearUi(ctx)}var ANTHROPIC_WEB_SEARCH_SECTION=`
|
|
322
321
|
## Web Search
|
|
323
322
|
|
|
324
323
|
The native web_search tool is available in this session.
|
|
@@ -646,7 +645,7 @@ ${messages.join(`
|
|
|
646
645
|
|
|
647
646
|
`)}`}function safeDiagnosticDetails(diagnostic2){return{code:diagnostic2.code,...diagnostic2.event===void 0?{}:{event:diagnostic2.event},message:diagnostic2.message,path:diagnostic2.path,severity:diagnostic2.severity,sourcePath:diagnostic2.source.sourcePath}}function buildSessionStartHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"SessionStart",hook_event_name:"SessionStart",reason:event.reason,sessionId:ctx.sessionManager.getSessionId(),session_id:ctx.sessionManager.getSessionId(),...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function buildPreCompactHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"PreCompact",hook_event_name:"PreCompact",reason:event.reason,request_id:event.requestId,session_id:ctx.sessionManager.getSessionId(),will_retry:event.willRetry,...event.customInstructions===void 0?{}:{custom_instructions:event.customInstructions},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function buildNotificationHookInput(input,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"Notification",hook_event_name:"Notification",kind:input.kind,message:input.message,session_id:ctx.sessionManager.getSessionId(),...input.title===void 0?{}:{title:input.title},...input.source===void 0?{}:{notification_source:input.source},...input.requestId===void 0?{}:{request_id:input.requestId},...input.status===void 0?{}:{status:input.status},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}async function dispatchNotificationHookEvent(options){return dispatchLifecycleHookEvent({cwd:options.cwd,handlers:options.handlers,input:options.input,matcherInputs:["Notification"],...options.signal===void 0?{}:{signal:options.signal},trustState:options.trustState})}function notificationResultDetails(result3){return{cancel:!1,contexts:result3?.summaries.flatMap(summary=>summary.output.additionalContext===void 0?[]:[summary.output.additionalContext])??[],diagnostics:result3===void 0?[]:[...result3.diagnostics,...commandFailureDiagnostics("Notification",result3)]}}function buildPostCompactHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{accepted:event.accepted,cwd:ctx.cwd,event:"PostCompact",hook_event_name:"PostCompact",reason:event.reason,request_id:event.requestId,session_id:ctx.sessionManager.getSessionId(),will_retry:event.willRetry,...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}async function dispatchLifecycleHookEvent(options){let selection=selectLifecycleHandlers(options);if(selection.handlers.length===0&&selection.diagnostics.length===0)return;let trustedHandlers=selection.handlers.map(handler=>stripLifecycleMatcher(handler)),hooks={};for(let handler of trustedHandlers)hooks[hookTrustId(handler)]=createHookTrustEntry(handler,{platform:process.platform,updatedAt:"2026-06-29T00:00:00.000Z"});let result3=await dispatchHookEvent({cwd:options.cwd,handlers:trustedHandlers,input:options.input,...options.signal===void 0?{}:{signal:options.signal},trustOptions:{platform:process.platform},trustState:{hooks,version:1}});return{...result3,diagnostics:[...selection.diagnostics,...result3.diagnostics]}}function sessionStartResultDetails(result3){return lifecycleResultDetails("SessionStart",result3)}function preCompactResultDetails(result3){let details=lifecycleResultDetails("PreCompact",result3);if(details.cancel)return details;let blocker=result3?.summaries.find(summary=>{let output2=readLifecycleHookOutput("PreCompact",summary.run.stdout);return output2?.decision==="block"||output2?.decision==="deny"});if(blocker===void 0)return details;let output=readLifecycleHookOutput("PreCompact",blocker.run.stdout);return{...details,cancel:!0,...output?.reason===void 0?{}:{reason:output.reason}}}function postCompactResultDetails(result3){return lifecycleResultDetails("PostCompact",result3)}function sessionBeforeCompactResult(details){return details.cancel?{cancel:!0}:void 0}function recordLifecycleHookResult(pi,event,details,options){if(details.contexts.length===0&&details.diagnostics.length===0&&details.reason===void 0)return;let content=details.contexts.length>0?details.contexts.join(`
|
|
648
647
|
|
|
649
|
-
`):details.reason??`${event} hook diagnostics.`;pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content,display:!1,details:{event,diagnostics:details.diagnostics.map(safeDiagnosticDetails),...options?.compactionRequestId===void 0?{}:{compactionRequestId:options.compactionRequestId}}},{triggerTurn:!1})}function selectLifecycleHandlers(options){let matched=[],diagnostics=[];for(let handler of options.handlers){if(handler.event!==options.input.event)continue;if(isInitialRuntimeSessionStart(handler,options.input)){diagnostics.push(diagnostic({code:"unsupported_event",event:"SessionStart",message:"Runtime SessionStart hooks are loaded for reload or the next session only.",path:"hooks.SessionStart",severity:"warning"},handler.source));continue}let match=handler.event==="Notification"?{diagnostics:[],matched:!0}:matchesLifecycleMatcher(handler,options.matcherInputs);diagnostics.push(...match.diagnostics),match.matched&&matched.push(handler)}let trustRecords=listHookTrustRecords(matched,options.trustState,{platform:process.platform}),trusted=matched.filter((_handler,index)=>trustRecords[index]?.executable===!0);return{diagnostics,handlers:trusted}}function isInitialRuntimeSessionStart(handler,input){return input.event==="SessionStart"&&input.reason==="startup"&&handler.source.discoveredAt==="runtime"}function matchesLifecycleMatcher(handler,inputs){let matcher=handler.matcher?.trim();if(matcher===void 0||matcher.length===0||matcher==="*")return{diagnostics:[],matched:!0};let literalMatched=matcher.split(/[|,]/).map(part=>part.trim()).filter(part=>part.length>0).some(part=>inputs.includes(part));try{let regex2=new RegExp(matcher);return{diagnostics:[],matched:literalMatched||inputs.some(input=>regex2.test(input))}}catch(error2){if(error2 instanceof SyntaxError)return{diagnostics:[diagnostic({code:"invalid_matcher",event:handler.event,message:`Hook matcher is not a valid JavaScript regular expression: ${error2.message}`,path:`hooks.${handler.event}[${handler.groupIndex}].matcher`,severity:"warning"},handler.source)],matched:literalMatched};throw error2}}function stripLifecycleMatcher(handler){return{config:handler.config,event:handler.event,groupIndex:handler.groupIndex,handlerIndex:handler.handlerIndex,source:handler.source}}function lifecycleResultDetails(event,result3){if(result3===void 0)return{cancel:!1,contexts:[],diagnostics:[]};let diagnostics=[...result3.diagnostics,...commandFailureDiagnostics(event,result3)],contexts=[];for(let summary of result3.summaries){let output=readLifecycleHookOutput(event,summary.run.stdout);output?.additionalContext!==void 0&&event!=="PreCompact"&&contexts.push(output.additionalContext),event==="PreCompact"&&diagnostics.push(...preCompactUnsupportedDiagnostics(summary.handler,output))}let reason=event==="PreCompact"&&result3.decision.kind==="block"?result3.decision.reason:void 0;return{cancel:event==="PreCompact"&&result3.decision.kind==="block",contexts,diagnostics,...reason===void 0?{}:{reason}}}function commandFailureDiagnostics(event,result3){return result3.summaries.flatMap(summary=>{if(summary.run.exitCode===0||summary.run.exitCode===2&&event==="PreCompact")return[];let status=summary.run.exitCode===null?"without an exit code":`with exit code ${summary.run.exitCode}`;return[diagnostic({code:"invalid_root",event,message:`Hook command failed ${status}.`,path:"process.exitCode",severity:"warning"},summary.handler.source)]})}function preCompactUnsupportedDiagnostics(handler,output){if(output===void 0)return[];let diagnostics=[];return output.additionalContext!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact additionalContext is diagnostic-only in builtin hooks v1.",path:"stdout.hookSpecificOutput.additionalContext",severity:"warning"},handler.source)),output.customInstructions!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact customInstructions cannot mutate compaction in builtin hooks v1.",path:"stdout.hookSpecificOutput.customInstructions",severity:"warning"},handler.source)),diagnostics}function readLifecycleHookOutput(event,stdout){let trimmed=stdout.trim();if(trimmed.length===0)return;let parsed;try{parsed=JSON.parse(trimmed)}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}if(!isRecord28(parsed))return;let specific=isRecord28(parsed.hookSpecificOutput)?parsed.hookSpecificOutput:void 0;if(!(specific?.hookEventName!==void 0&&specific.hookEventName!==event))return{...textField(specific?.additionalContext??parsed.additionalContext,"additionalContext"),...textField(specific?.customInstructions??parsed.customInstructions,"customInstructions"),...textField(parsed.decision,"decision"),...textField(specific?.permissionDecisionReason??parsed.reason,"reason")}}function textField(value,key){if(typeof value!="string")return{};let trimmed=value.trim();return trimmed.length===0?{}:{[key]:trimmed}}function isRecord28(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var STOP_STATE_CUSTOM_TYPE="senpi.hooks.stop-state",STOP_DIAGNOSTICS_CUSTOM_TYPE="senpi.hooks.stop-diagnostics",STOP_OUTPUT_CUSTOM_TYPE="senpi.hooks.stop-output",STOP_REENTRY_LIMIT=8;function buildStopHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile(),stopReason=findLastAssistantStopReason(event.messages);return{cwd:ctx.cwd,event:"Stop",hook_event_name:"Stop",session_id:ctx.sessionManager.getSessionId(),...stopReason===void 0?{}:{stopReason},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function createStopTurnTracker(){let activeTurnKey,turnIndex=0;return{reset(){turnIndex+=1,activeTurnKey=void 0},turnKey(ctx){if(activeTurnKey!==void 0)return activeTurnKey;let leafId=ctx.sessionManager.getLeafId()??ctx.sessionManager.getSessionId();return activeTurnKey=`${turnIndex}:${leafId}`,activeTurnKey}}}function applyStopHookResult(pi,ctx,result3,turnKey){let sessionId=ctx.sessionManager.getSessionId(),previous=latestStopState(ctx,sessionId,turnKey);if(previous.count>=STOP_REENTRY_LIMIT)return appendStopState(pi,{count:previous.count,sessionId,turnKey}),appendStopDiagnostics(pi,[diagnostic({code:"unsupported_event",event:"Stop",message:"Stop hook reentry limit reached.",path:"hooks.Stop",severity:"warning"},limitDiagnosticSource(result3))]),Promise.resolve();let unsupportedDiagnostics=unsupportedStopOutputDiagnostics(result3);if((unsupportedDiagnostics.length>0||result3.diagnostics.length>0)&&appendStopDiagnostics(pi,[...result3.diagnostics,...unsupportedDiagnostics]),appendStopOutputs(pi,stopOutputRecords(result3)),result3.decision.kind!=="block")return appendStopState(pi,{count:previous.count,sessionId,turnKey}),Promise.resolve();let count2=previous.count+1;appendStopState(pi,{count:count2,sessionId,turnKey});let followUp=stopFollowUpText(result3);return followUp===void 0?(appendStopDiagnostics(pi,[diagnostic({code:"unsupported_field",event:"Stop",message:"Stop hook blocked without follow-up context.",path:"stdout.reason",severity:"warning"},result3.decision.source)]),Promise.resolve()):(pi.sendUserMessage(followUp,{deliverAs:"followUp"}),waitForFollowUpQueue(ctx))}async function waitForFollowUpQueue(ctx){for(let attempt2=0;attempt2<64;attempt2+=1)if(await Promise.resolve(),ctx.hasPendingMessages())return}var latestStopStates={initial:()=>new Map,add:(states,entry)=>(entry.type==="custom"&&entry.customType===STOP_STATE_CUSTOM_TYPE&&isStopState(entry.data)&&states.set(stopStateKey(entry.data.sessionId,entry.data.turnKey),entry.data),states)};function stopStateKey(sessionId,turnKey){return`${sessionId}\0${turnKey}`}function latestStopState(ctx,sessionId,turnKey){return ctx.sessionManager.reduceHistory(latestStopStates).get(stopStateKey(sessionId,turnKey))??{count:0,sessionId,turnKey}}function appendStopState(pi,state2){pi.appendEntry(STOP_STATE_CUSTOM_TYPE,state2)}function appendStopDiagnostics(pi,diagnostics){diagnostics.length!==0&&pi.appendEntry(STOP_DIAGNOSTICS_CUSTOM_TYPE,diagnostics.map(safeStopDiagnosticDetails))}function safeStopDiagnosticDetails(diagnostic2){return diagnostic2.code==="invalid_event_config"&&diagnostic2.event==="Stop"&&diagnostic2.path==="stdout.hookSpecificOutput.hookEventName"?{...safeDiagnosticDetails(diagnostic2),message:"Hook output event does not match Stop."}:safeDiagnosticDetails(diagnostic2)}function appendStopOutputs(pi,records){records.length!==0&&pi.appendEntry(STOP_OUTPUT_CUSTOM_TYPE,records)}function stopOutputRecords(result3){return result3.summaries.flatMap(summary=>{let fields=stopOutputFieldPaths(summary);return fields.length===0?[]:[{event:"Stop",exitCode:summary.run.exitCode,fields,sourcePath:summary.handler.source.sourcePath}]})}function unsupportedStopOutputDiagnostics(result3){let diagnostics=[];for(let summary of result3.summaries)diagnostics.push(...unsupportedSummaryDiagnostics(summary));return diagnostics}function unsupportedSummaryDiagnostics(summary){let diagnostics=[];summary.output.systemMessage!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.systemMessage","Stop does not support systemMessage.")),summary.output.suppressOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.suppressOutput","Stop does not support suppressOutput.")),summary.output.stopReason!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.stopReason","Stop output stopReason is diagnostic-only.")),summary.output.updatedInput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedInput","Stop does not support updatedInput.")),summary.output.updatedToolOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedToolOutput","Stop does not support updatedToolOutput."));for(let path14 of rawUnsupportedStopFieldPaths(summary))diagnostics.push(unsupportedField(summary,path14,`Stop does not support ${path14.replace("stdout.","")}.`));return diagnostics}function stopOutputFieldPaths(summary){let fields=[];if(summary.output.decision!==void 0&&fields.push("stdout.decision"),summary.output.reason!==void 0&&fields.push("stdout.reason"),summary.output.additionalContext!==void 0){let raw=rawStdoutObject(summary.run.stdout),specific=raw===void 0?void 0:rawHookSpecificOutput(raw);fields.push(specific!==void 0&&Object.hasOwn(specific,"additionalContext")?"stdout.hookSpecificOutput.additionalContext":"stdout.additionalContext")}return summary.output.continue!==void 0&&fields.push("stdout.continue"),summary.output.stopReason!==void 0&&fields.push("stdout.stopReason"),summary.output.suppressOutput!==void 0&&fields.push("stdout.suppressOutput"),summary.output.systemMessage!==void 0&&fields.push("stdout.systemMessage"),fields.push(...rawUnsupportedStopFieldPaths(summary)),fields}function rawUnsupportedStopFieldPaths(summary){let raw=rawStdoutObject(summary.run.stdout);if(raw===void 0)return[];let fields=[];pushFieldIfPresent(fields,raw,"updatedInput","stdout.updatedInput"),pushFieldIfPresent(fields,raw,"updatedToolOutput","stdout.updatedToolOutput");let specific=rawHookSpecificOutput(raw);return specific!==void 0&&(pushFieldIfPresent(fields,specific,"updatedInput","stdout.hookSpecificOutput.updatedInput"),pushFieldIfPresent(fields,specific,"updatedToolOutput","stdout.hookSpecificOutput.updatedToolOutput")),fields}function pushFieldIfPresent(fields,record8,key,path14){Object.hasOwn(record8,key)&&fields.push(path14)}function rawStdoutObject(stdout){let trimmed=stdout.trim();if(trimmed.length!==0)try{let parsed=JSON.parse(trimmed);return isRecord29(parsed)?parsed:void 0}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}}function rawHookSpecificOutput(raw){let value=raw.hookSpecificOutput;return isRecord29(value)?value:void 0}function unsupportedField(summary,path14,message){return diagnostic({code:"unsupported_field",event:"Stop",message,path:path14,severity:"warning"},summary.handler.source)}function stopFollowUpText(result3){if(result3.decision.kind!=="block")return;let blocker=blockingSummary(result3);if(!(blocker===void 0||blocker.run.exitCode===2))return blocker.output.additionalContext??result3.decision.reason}function blockingSummary(result3){if(result3.decision.kind!=="block")return;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny"))}function limitDiagnosticSource(result3){return result3.matchedHandlers[0]?.source??result3.executableHandlers[0]?.source??{discoveredAt:"runtime",displayOrder:0,scope:"managed",sourcePath:"<builtin:hooks>"}}function isStopState(value){return typeof value!="object"||value===null||Array.isArray(value)||!("sessionId"in value)||!("turnKey"in value)||!("count"in value)?!1:typeof value.sessionId=="string"&&typeof value.turnKey=="string"&&typeof value.count=="number"&&Number.isInteger(value.count)&&value.count>=0}function isRecord29(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function findLastAssistantStopReason(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message?.role==="assistant")return message.stopReason}}var STOP_DRAIN_GRACE_MS=2e3,USER_TURN_WAKE_SOURCE="ask-user";function registerStopLifecycle(pi,deps){let turnTracker=createStopTurnTracker(),backgroundWork=new Map,pending,drainTimer;async function dispatchStop({ctx,input}){let state2=deps.refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state2.trust});await applyStopHookResult(pi,ctx,result3,turnTracker.turnKey(ctx))}function clearDrainTimer(){drainTimer!==void 0&&(clearTimeout(drainTimer),drainTimer=void 0)}function dropPending(){clearDrainTimer(),pending=void 0}function dispatchPendingIfQuiet(){drainTimer=void 0;let stop=pending;stop===void 0||backgroundWork.size>0||!stop.ctx.isIdle()||stop.ctx.hasPendingMessages()||(pending=void 0,dispatchStop(stop).catch(error2=>{isStaleExtensionContextError(error2)||stop.ctx.ui.notify(`Stop hook dispatch failed: ${error2 instanceof Error?error2.message:String(error2)}`,"error")}))}return pi.events.on(WAKE_SOURCE_STATE_EVENT,data=>{!isWakeSourceStateEvent(data)||data.source===USER_TURN_WAKE_SOURCE||(data.activeCount>0?backgroundWork.set(data.source,data.activeCount):backgroundWork.delete(data.source),clearDrainTimer(),!(backgroundWork.size>0||pending===void 0)&&(drainTimer=setTimeout(dispatchPendingIfQuiet,STOP_DRAIN_GRACE_MS),drainTimer.unref()))}),pi.on("agent_end",async(event,ctx)=>{let stop={ctx,input:buildStopHookInput(event,ctx)};if(backgroundWork.size>0){pending=stop;return}dropPending(),await dispatchStop(stop)}),pi.on("agent_start",()=>dropPending()),pi.on("session_shutdown",()=>dropPending()),{resetTurn:()=>turnTracker.reset()}}var PRE_TOOL_BLOCK_REASON="PreToolUse hook blocked the tool call.",POST_TOOL_BLOCK_REASON="PostToolUse hook flagged the tool result.";function buildPreToolUseHookInput(event,ctx){return{event:"PreToolUse",toolName:event.toolName,toolInput:event.input,cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PreToolUse",tool_name:event.toolName,tool_input:event.input,tool_use_id:event.toolCallId}}function buildPostToolUseHookInput(event,ctx){return{event:"PostToolUse",toolName:event.toolName,toolInput:event.input,toolOutput:{content:event.content,details:event.details,is_error:event.isError},cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PostToolUse",tool_name:event.toolName,tool_input:event.input,tool_response:{content:event.content,details:event.details,is_error:event.isError},tool_use_id:event.toolCallId}}function applyPreToolUseResult(event,result3){if(result3.decision.kind==="block")return{block:!0,reason:preToolBlockReasonFromResult(result3)};if(result3.decision.kind==="ask")return{block:!0,reason:result3.decision.fallback.reason};result3.decision.kind==="allow"&&isRecord30(result3.decision.updatedInput)&&replaceToolInput(event.input,result3.decision.updatedInput)}function applyPostToolUseResult(event,result3,preToolContexts=[]){return result3.decision.kind==="block"?{content:[{type:"text",text:postToolBlockReasonFromResult(result3)},...preToolContexts.map(contextTextPart),...toolContextsFromResult(result3).map(contextTextPart)],details:event.details,isError:!0}:collectPostToolUseReplacement(event,result3,preToolContexts)}function toolContextsFromResult(result3){return result3.summaries.flatMap(summary=>summary.output.additionalContext===void 0?[]:[summary.output.additionalContext])}function preToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return PRE_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?PRE_TOOL_BLOCK_REASON:result3.decision.reason??PRE_TOOL_BLOCK_REASON}function postToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return POST_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?POST_TOOL_BLOCK_REASON:result3.decision.reason??POST_TOOL_BLOCK_REASON}function collectPostToolUseReplacement(event,result3,preToolContexts){let content=[...event.content],details=event.details,replaced=!1,postToolContexts=[];for(let summary of result3.summaries){let updated=normalizeUpdatedToolOutput(summary.output.updatedToolOutput);updated!==void 0&&(content=[...updated.content],details=updated.details,replaced=!0);let context=summary.output.additionalContext;context!==void 0&&postToolContexts.push(context)}for(let context of postToolContexts)content.push(contextTextPart(context));for(let context of preToolContexts)content.push(contextTextPart(context));if(!(!replaced&&postToolContexts.length===0&&preToolContexts.length===0))return{content,...details===void 0?{}:{details}}}function normalizeUpdatedToolOutput(value){if(typeof value=="string")return{content:[{type:"text",text:value}]};if(isContentArray(value))return{content:value};if(!isRecord30(value))return;let content=value.content;if(typeof content=="string")return{content:[{type:"text",text:content}],details:value.details};if(isContentArray(content))return{content,details:value.details}}function replaceToolInput(target,replacement){for(let key of Object.keys(target))delete target[key];Object.assign(target,replacement)}function contextTextPart(text3){return{type:"text",text:text3}}function isContentArray(value){return Array.isArray(value)&&value.every(isContentPart)}function isContentPart(value){return isRecord30(value)?value.type==="text"?typeof value.text=="string":value.type==="image"&&typeof value.mimeType=="string"&&typeof value.data=="string":!1}function isRecord30(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var import_proper_lockfile3=__toESM(require_proper_lockfile(),1);import{randomUUID as randomUUID9}from"node:crypto";import{chmodSync as chmodSync6,existsSync as existsSync20,mkdirSync as mkdirSync13,readFileSync as readFileSync28,renameSync as renameSync8,rmSync as rmSync4,statSync as statSync11,writeFileSync as writeFileSync13}from"node:fs";import{readFile as readFile9}from"node:fs/promises";import{dirname as dirname38,join as join47}from"node:path";var FileHookStateStorage=class{constructor(options){let agentDir=options.agentDir??getAgentDir();this.globalStatePath=join47(agentDir,"hooks-state.json"),this.projectStatePath=join47(options.cwd,CONFIG_DIR_NAME,"hooks-state.json")}async readAsync(scope){let path14=statePathForScope(scope,this.globalStatePath,this.projectStatePath);try{return readHookTrustStateJson(await readFile9(path14,"utf8"))}catch(error2){if(errorCode2(error2)==="ENOENT")return emptyHookTrustState();throw error2}}read(scope){let path14=statePathForScope(scope,this.globalStatePath,this.projectStatePath),snapshot=parseHookTrustStateJson(existsSync20(path14)?readFileSync28(path14,"utf-8"):void 0);if(snapshot!==void 0)return snapshot;if(!existsSync20(dirname38(path14)))return emptyHookTrustState();let release4;try{release4=acquireHookStateLockSync(path14)}catch(error2){let code=errorCode2(error2);if(code==="ELOCKED"||code==="EPERM"||code==="EACCES"||code==="EROFS")return emptyHookTrustState();throw error2}return runWithHookStateLockRelease(release4,()=>readHookTrustStateJson(existsSync20(path14)?readFileSync28(path14,"utf-8"):void 0))}update(scope,updater){return withHookStateFileLock(statePathForScope(scope,this.globalStatePath,this.projectStatePath),path14=>{let stateExists=existsSync20(path14),current=readHookTrustStateJson(stateExists?readFileSync28(path14,"utf-8"):void 0),mode=stateExists?statSync11(path14).mode&511:384,next=updater(current),tempPath=`${path14}.${process.pid}.${randomUUID9()}.tmp`;try{writeFileSync13(tempPath,serializeHookTrustState(next),{encoding:"utf-8",mode}),chmodSync6(tempPath,mode),renameSync8(tempPath,path14)}catch(publicationError){try{rmSync4(tempPath,{force:!0})}catch(cleanupError){throw new AggregateError([publicationError,cleanupError],"Failed to publish and clean up hook trust state snapshot")}throw publicationError}return next})}};function statePathForScope(scope,globalStatePath,projectStatePath){return scope==="global"?globalStatePath:projectStatePath}function serializeHookTrustState(state2){let sortedHooks={};for(let key of Object.keys(state2.hooks).sort()){let entry=state2.hooks[key];entry!==void 0&&(sortedHooks[key]=entry)}return`${JSON.stringify({version:1,hooks:sortedHooks},null,2)}
|
|
648
|
+
`):details.reason??`${event} hook diagnostics.`;pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content,display:!1,details:{event,diagnostics:details.diagnostics.map(safeDiagnosticDetails),...options?.compactionRequestId===void 0?{}:{compactionRequestId:options.compactionRequestId}}},{triggerTurn:!1})}function selectLifecycleHandlers(options){let matched=[],diagnostics=[];for(let handler of options.handlers){if(handler.event!==options.input.event)continue;if(isInitialRuntimeSessionStart(handler,options.input)){diagnostics.push(diagnostic({code:"unsupported_event",event:"SessionStart",message:"Runtime SessionStart hooks are loaded for reload or the next session only.",path:"hooks.SessionStart",severity:"warning"},handler.source));continue}let match=handler.event==="Notification"?{diagnostics:[],matched:!0}:matchesLifecycleMatcher(handler,options.matcherInputs);diagnostics.push(...match.diagnostics),match.matched&&matched.push(handler)}let trustRecords=listHookTrustRecords(matched,options.trustState,{platform:process.platform}),trusted=matched.filter((_handler,index)=>trustRecords[index]?.executable===!0);return{diagnostics,handlers:trusted}}function isInitialRuntimeSessionStart(handler,input){return input.event==="SessionStart"&&input.reason==="startup"&&handler.source.discoveredAt==="runtime"}function matchesLifecycleMatcher(handler,inputs){let matcher=handler.matcher?.trim();if(matcher===void 0||matcher.length===0||matcher==="*")return{diagnostics:[],matched:!0};let literalMatched=matcher.split(/[|,]/).map(part=>part.trim()).filter(part=>part.length>0).some(part=>inputs.includes(part));try{let regex2=new RegExp(matcher);return{diagnostics:[],matched:literalMatched||inputs.some(input=>regex2.test(input))}}catch(error2){if(error2 instanceof SyntaxError)return{diagnostics:[diagnostic({code:"invalid_matcher",event:handler.event,message:`Hook matcher is not a valid JavaScript regular expression: ${error2.message}`,path:`hooks.${handler.event}[${handler.groupIndex}].matcher`,severity:"warning"},handler.source)],matched:literalMatched};throw error2}}function stripLifecycleMatcher(handler){return{config:handler.config,event:handler.event,groupIndex:handler.groupIndex,handlerIndex:handler.handlerIndex,source:handler.source}}function lifecycleResultDetails(event,result3){if(result3===void 0)return{cancel:!1,contexts:[],diagnostics:[]};let diagnostics=[...result3.diagnostics,...commandFailureDiagnostics(event,result3)],contexts=[];for(let summary of result3.summaries){let output=readLifecycleHookOutput(event,summary.run.stdout);output?.additionalContext!==void 0&&event!=="PreCompact"&&contexts.push(output.additionalContext),event==="PreCompact"&&diagnostics.push(...preCompactUnsupportedDiagnostics(summary.handler,output))}let reason=event==="PreCompact"&&result3.decision.kind==="block"?result3.decision.reason:void 0;return{cancel:event==="PreCompact"&&result3.decision.kind==="block",contexts,diagnostics,...reason===void 0?{}:{reason}}}function commandFailureDiagnostics(event,result3){return result3.summaries.flatMap(summary=>{if(summary.run.exitCode===0||summary.run.exitCode===2&&event==="PreCompact")return[];let status=summary.run.exitCode===null?"without an exit code":`with exit code ${summary.run.exitCode}`;return[diagnostic({code:"invalid_root",event,message:`Hook command failed ${status}.`,path:"process.exitCode",severity:"warning"},summary.handler.source)]})}function preCompactUnsupportedDiagnostics(handler,output){if(output===void 0)return[];let diagnostics=[];return output.additionalContext!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact additionalContext is diagnostic-only in builtin hooks v1.",path:"stdout.hookSpecificOutput.additionalContext",severity:"warning"},handler.source)),output.customInstructions!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact customInstructions cannot mutate compaction in builtin hooks v1.",path:"stdout.hookSpecificOutput.customInstructions",severity:"warning"},handler.source)),diagnostics}function readLifecycleHookOutput(event,stdout){let trimmed=stdout.trim();if(trimmed.length===0)return;let parsed;try{parsed=JSON.parse(trimmed)}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}if(!isRecord28(parsed))return;let specific=isRecord28(parsed.hookSpecificOutput)?parsed.hookSpecificOutput:void 0;if(!(specific?.hookEventName!==void 0&&specific.hookEventName!==event))return{...textField(specific?.additionalContext??parsed.additionalContext,"additionalContext"),...textField(specific?.customInstructions??parsed.customInstructions,"customInstructions"),...textField(parsed.decision,"decision"),...textField(specific?.permissionDecisionReason??parsed.reason,"reason")}}function textField(value,key){if(typeof value!="string")return{};let trimmed=value.trim();return trimmed.length===0?{}:{[key]:trimmed}}function isRecord28(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var STOP_STATE_CUSTOM_TYPE="senpi.hooks.stop-state",STOP_DIAGNOSTICS_CUSTOM_TYPE="senpi.hooks.stop-diagnostics",STOP_OUTPUT_CUSTOM_TYPE="senpi.hooks.stop-output",STOP_REENTRY_LIMIT=8;function buildStopHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile(),stopReason=findLastAssistantStopReason(event.messages);return{cwd:ctx.cwd,event:"Stop",hook_event_name:"Stop",session_id:ctx.sessionManager.getSessionId(),...stopReason===void 0?{}:{stopReason},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function createStopTurnTracker(){let activeTurnKey,turnIndex=0;return{reset(){turnIndex+=1,activeTurnKey=void 0},turnKey(ctx){if(activeTurnKey!==void 0)return activeTurnKey;let leafId=ctx.sessionManager.getLeafId()??ctx.sessionManager.getSessionId();return activeTurnKey=`${turnIndex}:${leafId}`,activeTurnKey}}}function applyStopHookResult(pi,ctx,result3,turnKey){let sessionId=ctx.sessionManager.getSessionId(),previous=latestStopState(ctx,sessionId,turnKey);if(previous.count>=STOP_REENTRY_LIMIT)return appendStopState(pi,{count:previous.count,sessionId,turnKey}),appendStopDiagnostics(pi,[diagnostic({code:"unsupported_event",event:"Stop",message:"Stop hook reentry limit reached.",path:"hooks.Stop",severity:"warning"},limitDiagnosticSource(result3))]),Promise.resolve();let unsupportedDiagnostics=unsupportedStopOutputDiagnostics(result3);if((unsupportedDiagnostics.length>0||result3.diagnostics.length>0)&&appendStopDiagnostics(pi,[...result3.diagnostics,...unsupportedDiagnostics]),appendStopOutputs(pi,stopOutputRecords(result3)),result3.decision.kind!=="block")return appendStopState(pi,{count:previous.count,sessionId,turnKey}),Promise.resolve();let count2=previous.count+1;appendStopState(pi,{count:count2,sessionId,turnKey});let followUp=stopFollowUpText(result3);return followUp===void 0?(appendStopDiagnostics(pi,[diagnostic({code:"unsupported_field",event:"Stop",message:"Stop hook blocked without follow-up context.",path:"stdout.reason",severity:"warning"},result3.decision.source)]),Promise.resolve()):(pi.sendUserMessage(followUp,{deliverAs:"followUp"}),waitForFollowUpQueue(ctx))}async function waitForFollowUpQueue(ctx){for(let attempt2=0;attempt2<64;attempt2+=1)if(await Promise.resolve(),ctx.hasPendingMessages())return}var latestStopStates={initial:()=>new Map,add:(states,entry)=>(entry.type==="custom"&&entry.customType===STOP_STATE_CUSTOM_TYPE&&isStopState(entry.data)&&states.set(stopStateKey(entry.data.sessionId,entry.data.turnKey),entry.data),states)};function stopStateKey(sessionId,turnKey){return`${sessionId}\0${turnKey}`}function latestStopState(ctx,sessionId,turnKey){return ctx.sessionManager.reduceHistory(latestStopStates).get(stopStateKey(sessionId,turnKey))??{count:0,sessionId,turnKey}}function appendStopState(pi,state2){pi.appendEntry(STOP_STATE_CUSTOM_TYPE,state2)}function appendStopDiagnostics(pi,diagnostics){diagnostics.length!==0&&pi.appendEntry(STOP_DIAGNOSTICS_CUSTOM_TYPE,diagnostics.map(safeStopDiagnosticDetails))}function safeStopDiagnosticDetails(diagnostic2){return diagnostic2.code==="invalid_event_config"&&diagnostic2.event==="Stop"&&diagnostic2.path==="stdout.hookSpecificOutput.hookEventName"?{...safeDiagnosticDetails(diagnostic2),message:"Hook output event does not match Stop."}:safeDiagnosticDetails(diagnostic2)}function appendStopOutputs(pi,records){records.length!==0&&pi.appendEntry(STOP_OUTPUT_CUSTOM_TYPE,records)}function stopOutputRecords(result3){return result3.summaries.flatMap(summary=>{let fields=stopOutputFieldPaths(summary);return fields.length===0?[]:[{event:"Stop",exitCode:summary.run.exitCode,fields,sourcePath:summary.handler.source.sourcePath}]})}function unsupportedStopOutputDiagnostics(result3){let diagnostics=[];for(let summary of result3.summaries)diagnostics.push(...unsupportedSummaryDiagnostics(summary));return diagnostics}function unsupportedSummaryDiagnostics(summary){let diagnostics=[];summary.output.systemMessage!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.systemMessage","Stop does not support systemMessage.")),summary.output.suppressOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.suppressOutput","Stop does not support suppressOutput.")),summary.output.stopReason!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.stopReason","Stop output stopReason is diagnostic-only.")),summary.output.updatedInput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedInput","Stop does not support updatedInput.")),summary.output.updatedToolOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedToolOutput","Stop does not support updatedToolOutput."));for(let path14 of rawUnsupportedStopFieldPaths(summary))diagnostics.push(unsupportedField(summary,path14,`Stop does not support ${path14.replace("stdout.","")}.`));return diagnostics}function stopOutputFieldPaths(summary){let fields=[];if(summary.output.decision!==void 0&&fields.push("stdout.decision"),summary.output.reason!==void 0&&fields.push("stdout.reason"),summary.output.additionalContext!==void 0){let raw=rawStdoutObject(summary.run.stdout),specific=raw===void 0?void 0:rawHookSpecificOutput(raw);fields.push(specific!==void 0&&Object.hasOwn(specific,"additionalContext")?"stdout.hookSpecificOutput.additionalContext":"stdout.additionalContext")}return summary.output.continue!==void 0&&fields.push("stdout.continue"),summary.output.stopReason!==void 0&&fields.push("stdout.stopReason"),summary.output.suppressOutput!==void 0&&fields.push("stdout.suppressOutput"),summary.output.systemMessage!==void 0&&fields.push("stdout.systemMessage"),fields.push(...rawUnsupportedStopFieldPaths(summary)),fields}function rawUnsupportedStopFieldPaths(summary){let raw=rawStdoutObject(summary.run.stdout);if(raw===void 0)return[];let fields=[];pushFieldIfPresent(fields,raw,"updatedInput","stdout.updatedInput"),pushFieldIfPresent(fields,raw,"updatedToolOutput","stdout.updatedToolOutput");let specific=rawHookSpecificOutput(raw);return specific!==void 0&&(pushFieldIfPresent(fields,specific,"updatedInput","stdout.hookSpecificOutput.updatedInput"),pushFieldIfPresent(fields,specific,"updatedToolOutput","stdout.hookSpecificOutput.updatedToolOutput")),fields}function pushFieldIfPresent(fields,record8,key,path14){Object.hasOwn(record8,key)&&fields.push(path14)}function rawStdoutObject(stdout){let trimmed=stdout.trim();if(trimmed.length!==0)try{let parsed=JSON.parse(trimmed);return isRecord29(parsed)?parsed:void 0}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}}function rawHookSpecificOutput(raw){let value=raw.hookSpecificOutput;return isRecord29(value)?value:void 0}function unsupportedField(summary,path14,message){return diagnostic({code:"unsupported_field",event:"Stop",message,path:path14,severity:"warning"},summary.handler.source)}function stopFollowUpText(result3){if(result3.decision.kind!=="block")return;let blocker=blockingSummary(result3);if(!(blocker===void 0||blocker.run.exitCode===2))return blocker.output.additionalContext??result3.decision.reason}function blockingSummary(result3){if(result3.decision.kind!=="block")return;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny"))}function limitDiagnosticSource(result3){return result3.matchedHandlers[0]?.source??result3.executableHandlers[0]?.source??{discoveredAt:"runtime",displayOrder:0,scope:"managed",sourcePath:"<builtin:hooks>"}}function isStopState(value){return typeof value!="object"||value===null||Array.isArray(value)||!("sessionId"in value)||!("turnKey"in value)||!("count"in value)?!1:typeof value.sessionId=="string"&&typeof value.turnKey=="string"&&typeof value.count=="number"&&Number.isInteger(value.count)&&value.count>=0}function isRecord29(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function findLastAssistantStopReason(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message?.role==="assistant")return message.stopReason}}var STOP_DRAIN_GRACE_MS=2e3,USER_TURN_WAKE_SOURCE="ask-user";function registerStopLifecycle(pi,deps){let turnTracker=createStopTurnTracker(),backgroundWork=new Map,pending,drainTimer;async function dispatchStop({ctx,input}){let state2=deps.refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state2.trust});await applyStopHookResult(pi,ctx,result3,turnTracker.turnKey(ctx))}function clearDrainTimer(){drainTimer!==void 0&&(clearTimeout(drainTimer),drainTimer=void 0)}function dropPending(){clearDrainTimer(),pending=void 0}function dispatchPendingIfQuiet(){drainTimer=void 0;let stop=pending;stop===void 0||backgroundWork.size>0||!stop.ctx.isIdle()||stop.ctx.hasPendingMessages()||(pending=void 0,dispatchStop(stop).catch(error2=>{isStaleExtensionContextError(error2)||stop.ctx.ui.notify(`Stop hook dispatch failed: ${error2 instanceof Error?error2.message:String(error2)}`,"error")}))}return pi.events.on(WAKE_SOURCE_STATE_EVENT,data=>{!isWakeSourceStateEvent(data)||data.source===USER_TURN_WAKE_SOURCE||(data.activeCount>0?backgroundWork.set(data.source,data.activeCount):backgroundWork.delete(data.source),clearDrainTimer(),!(backgroundWork.size>0||pending===void 0)&&(drainTimer=setTimeout(dispatchPendingIfQuiet,STOP_DRAIN_GRACE_MS),drainTimer.unref()))}),pi.on("agent_end",async(event,ctx)=>{let stop={ctx,input:buildStopHookInput(event,ctx)};if(backgroundWork.size>0){pending=stop;return}dropPending(),await dispatchStop(stop)}),pi.on("agent_start",()=>dropPending()),pi.on("session_shutdown",()=>dropPending()),{resetTurn:()=>turnTracker.reset()}}var PRE_TOOL_BLOCK_REASON="PreToolUse hook blocked the tool call.",POST_TOOL_BLOCK_REASON="PostToolUse hook flagged the tool result.";function buildPreToolUseHookInput(event,ctx){return{event:"PreToolUse",toolName:event.toolName,toolInput:event.input,cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PreToolUse",tool_name:event.toolName,tool_input:event.input,tool_use_id:event.toolCallId}}function buildPostToolUseHookInput(event,ctx){return{event:"PostToolUse",toolName:event.toolName,toolInput:event.input,toolOutput:{content:event.content,details:event.details,is_error:event.isError},cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PostToolUse",tool_name:event.toolName,tool_input:event.input,tool_response:{content:event.content,details:event.details,is_error:event.isError},tool_use_id:event.toolCallId}}function applyPreToolUseResult(event,result3){if(result3.decision.kind==="block")return{block:!0,reason:preToolBlockReasonFromResult(result3)};if(result3.decision.kind==="ask")return{block:!0,reason:result3.decision.fallback.reason};result3.decision.kind==="allow"&&isRecord30(result3.decision.updatedInput)&&replaceToolInput(event.input,result3.decision.updatedInput)}function applyPostToolUseResult(event,result3,preToolContexts=[]){return result3.decision.kind==="block"?{content:[{type:"text",text:postToolBlockReasonFromResult(result3)},...preToolContexts.map(contextTextPart),...toolContextsFromResult(result3).map(contextTextPart)],details:event.details,isError:!0}:collectPostToolUseReplacement(event,result3,preToolContexts)}function toolContextsFromResult(result3){return result3.summaries.flatMap(summary=>summary.output.additionalContext===void 0?[]:[summary.output.additionalContext])}function preToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return PRE_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?PRE_TOOL_BLOCK_REASON:result3.decision.reason??PRE_TOOL_BLOCK_REASON}function postToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return POST_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?POST_TOOL_BLOCK_REASON:result3.decision.reason??POST_TOOL_BLOCK_REASON}function collectPostToolUseReplacement(event,result3,preToolContexts){let content=[...event.content],details=event.details,replaced=!1,postToolContexts=[];for(let summary of result3.summaries){let updated=normalizeUpdatedToolOutput(summary.output.updatedToolOutput);updated!==void 0&&(content=[...updated.content],details=updated.details,replaced=!0);let context=summary.output.additionalContext;context!==void 0&&postToolContexts.push(context)}for(let context of postToolContexts)content.push(contextTextPart(context));for(let context of preToolContexts)content.push(contextTextPart(context));if(!(!replaced&&postToolContexts.length===0&&preToolContexts.length===0))return{content,...details===void 0?{}:{details}}}function normalizeUpdatedToolOutput(value){if(typeof value=="string")return{content:[{type:"text",text:value}]};if(isContentArray(value))return{content:value};if(!isRecord30(value))return;let content=value.content;if(typeof content=="string")return{content:[{type:"text",text:content}],details:value.details};if(isContentArray(content))return{content,details:value.details}}function replaceToolInput(target,replacement){for(let key of Object.keys(target))delete target[key];Object.assign(target,replacement)}function contextTextPart(text3){return{type:"text",text:text3}}function isContentArray(value){return Array.isArray(value)&&value.every(isContentPart)}function isContentPart(value){return isRecord30(value)?value.type==="text"?typeof value.text=="string":value.type==="image"&&typeof value.mimeType=="string"&&typeof value.data=="string":!1}function isRecord30(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var import_proper_lockfile3=__toESM(require_proper_lockfile(),1);import{randomUUID as randomUUID9}from"node:crypto";import{chmodSync as chmodSync6,existsSync as existsSync20,mkdirSync as mkdirSync13,readFileSync as readFileSync28,renameSync as renameSync8,rmSync as rmSync5,statSync as statSync11,writeFileSync as writeFileSync13}from"node:fs";import{readFile as readFile9}from"node:fs/promises";import{dirname as dirname38,join as join47}from"node:path";var FileHookStateStorage=class{constructor(options){let agentDir=options.agentDir??getAgentDir();this.globalStatePath=join47(agentDir,"hooks-state.json"),this.projectStatePath=join47(options.cwd,CONFIG_DIR_NAME,"hooks-state.json")}async readAsync(scope){let path14=statePathForScope(scope,this.globalStatePath,this.projectStatePath);try{return readHookTrustStateJson(await readFile9(path14,"utf8"))}catch(error2){if(errorCode2(error2)==="ENOENT")return emptyHookTrustState();throw error2}}read(scope){let path14=statePathForScope(scope,this.globalStatePath,this.projectStatePath),snapshot=parseHookTrustStateJson(existsSync20(path14)?readFileSync28(path14,"utf-8"):void 0);if(snapshot!==void 0)return snapshot;if(!existsSync20(dirname38(path14)))return emptyHookTrustState();let release4;try{release4=acquireHookStateLockSync(path14)}catch(error2){let code=errorCode2(error2);if(code==="ELOCKED"||code==="EPERM"||code==="EACCES"||code==="EROFS")return emptyHookTrustState();throw error2}return runWithHookStateLockRelease(release4,()=>readHookTrustStateJson(existsSync20(path14)?readFileSync28(path14,"utf-8"):void 0))}update(scope,updater){return withHookStateFileLock(statePathForScope(scope,this.globalStatePath,this.projectStatePath),path14=>{let stateExists=existsSync20(path14),current=readHookTrustStateJson(stateExists?readFileSync28(path14,"utf-8"):void 0),mode=stateExists?statSync11(path14).mode&511:384,next=updater(current),tempPath=`${path14}.${process.pid}.${randomUUID9()}.tmp`;try{writeFileSync13(tempPath,serializeHookTrustState(next),{encoding:"utf-8",mode}),chmodSync6(tempPath,mode),renameSync8(tempPath,path14)}catch(publicationError){try{rmSync5(tempPath,{force:!0})}catch(cleanupError){throw new AggregateError([publicationError,cleanupError],"Failed to publish and clean up hook trust state snapshot")}throw publicationError}return next})}};function statePathForScope(scope,globalStatePath,projectStatePath){return scope==="global"?globalStatePath:projectStatePath}function serializeHookTrustState(state2){let sortedHooks={};for(let key of Object.keys(state2.hooks).sort()){let entry=state2.hooks[key];entry!==void 0&&(sortedHooks[key]=entry)}return`${JSON.stringify({version:1,hooks:sortedHooks},null,2)}
|
|
650
649
|
`}function acquireHookStateLockSync(path14){let stateDir=dirname38(path14);mkdirSync13(stateDir,{recursive:!0});let maxAttempts=10,delayMs=20,lastError;for(let attempt2=1;attempt2<=maxAttempts;attempt2++)try{return import_proper_lockfile3.default.lockSync(stateDir,{realpath:!1,lockfilePath:`${path14}.lock`})}catch(error2){if(errorCode2(error2)!=="ELOCKED"||attempt2===maxAttempts)throw error2;lastError=error2;let start=Date.now();for(;Date.now()-start<delayMs;)Date.now()}throw lastError instanceof Error?lastError:new Error("Failed to acquire hook state lock")}function errorCode2(error2){if(!isRecord31(error2))return;let code=error2.code;return typeof code=="string"?code:void 0}function isRecord31(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function withHookStateFileLock(path14,fn){let release4=acquireHookStateLockSync(path14);return runWithHookStateLockRelease(release4,()=>fn(path14))}function runWithHookStateLockRelease(release4,operation){let result3;try{result3=operation()}catch(operationError){try{release4()}catch(releaseError){throw new AggregateError(operationError instanceof AggregateError?[...operationError.errors,releaseError]:[operationError,releaseError],"Hook state operation and lock release both failed")}throw operationError}return release4(),result3}function hooksExtension(pi){let pendingPromptContexts=[],pendingPreToolContexts=new Map,refreshState=ctx=>{let sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=loadHookConfigSources({agentDir:sources.agentDir,cwd:sources.cwd,fileSystem:{readTextFile(path14){return existsSync21(path14)?readFileSync29(path14,"utf-8"):void 0}},globalHookSourcePaths:sources.globalHookSourcePaths,globalHooksPath:sources.globalHooksPath,globalSettingsHooks:sources.globalSettingsHooks,preSessionHookSourcePaths:sources.preSessionHookSourcePaths,projectHookSourcePaths:sources.projectHookSourcePaths,projectHooksPath:sources.projectHooksPath,projectSettingsHooks:sources.projectSettingsHooks,runtimeHookSourcePaths:sources.runtimeHookSourcePaths}),storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),trust=mergeTrustStates(storage.read("global"),ctx.isProjectTrusted()?storage.read("project"):emptyHookTrustState());return{parsed,trust,storage}},stopLifecycle=registerStopLifecycle(pi,{refreshState});for(let channel of[ASK_USER_ASKED_EVENT,ASK_USER_SETTLED_EVENT])pi.events.on(channel,async data=>{let event=data,{ctx,request:request2,variant}=event,response="response"in event?event.response:void 0,headers=request2.questions.map(question=>question.header).join(", "),input=buildNotificationHookInput({kind:response===void 0?"ask-user-asked":response.status==="timed_out"?"ask-user-timeout":"ask-user-settled",message:response===void 0?`Question asked (${headers})`:response.status==="timed_out"?`Question timed out (${headers}): ${formatResultText(variant,response,request2.questions,request2.required===!0)}`:`Question ${response.status} (${headers})`,requestId:request2.requestId,source:"ask-user",status:response?.status??"pending",title:headers},ctx),sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=await loadHookConfigSourcesAsync(sources),handlers=parsed.executableHandlers.filter(handler=>handler.event==="Notification");if(handlers.length===0)return;let storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),[globalTrust,projectTrust]=await Promise.all([storage.readAsync("global"),ctx.isProjectTrusted()?storage.readAsync("project"):emptyHookTrustState()]),result3=await dispatchNotificationHookEvent({cwd:ctx.cwd,handlers,input,...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:mergeTrustStates(globalTrust,projectTrust)}),details=notificationResultDetails(result3);recordLifecycleHookResult(pi,"Notification",{...details,diagnostics:[...parsed.diagnostics,...details.diagnostics]})});pi.on("session_start",async(event,ctx)=>{let state2=refreshState(ctx),input=buildSessionStartHookInput(event,ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input,matcherInputs:["SessionStart",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state2.trust});recordLifecycleHookResult(pi,"SessionStart",sessionStartResultDetails(result3))}),pi.on("input",async(event,ctx)=>{if(event.source==="extension")return;stopLifecycle.resetTurn(),pendingPromptContexts.splice(0);let state2=refreshState(ctx),input=buildUserPromptHookInput({cwd:ctx.cwd,permissionMode:"default",prompt:event.text,sessionId:ctx.sessionManager.getSessionId(),transcriptPath:ctx.sessionManager.getSessionFile()}),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state2.trust});if(result3.decision.kind==="block"){let reason=promptBlockReasonFromResult(result3);return ctx.ui.notify(reason,"warning"),pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content:reason,display:!1,details:{decision:"block",event:"UserPromptSubmit",sourcePath:result3.decision.source.sourcePath}},{triggerTurn:!1}),{action:"handled"}}if(ctx.isIdle()){let pending=promptContextFromResult(result3);pending!==void 0&&pendingPromptContexts.push(pending)}return{action:"continue"}});let onBeforeAgentStart=async event=>{if(event.preview===!0)return;let pending=pendingPromptContexts.shift();if(pending===void 0)return;let messageContent=formatPromptContextMessage(pending),systemPrompt=appendSystemMessages(event.systemPrompt,pending.systemMessages);if(messageContent===void 0&&systemPrompt===event.systemPrompt)return;let result3={};return messageContent!==void 0&&(result3.message={customType:HOOK_CUSTOM_MESSAGE_TYPE,content:messageContent,display:!1,details:{event:"UserPromptSubmit",diagnostics:pending.diagnostics.map(safeDiagnosticDetails)}}),systemPrompt!==event.systemPrompt&&(result3.systemPrompt=systemPrompt),result3};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("tool_call",async(event,ctx)=>{pendingPreToolContexts.delete(event.toolCallId);let state2=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input:buildPreToolUseHookInput(event,ctx),onRunningHandlersChange:running2=>{running2.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running2))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state2.trust}),toolResult=applyPreToolUseResult(event,result3);if(toolResult?.block)return pendingPreToolContexts.delete(event.toolCallId),toolResult;let contexts=toolContextsFromResult(result3);return contexts.length>0&&pendingPreToolContexts.set(event.toolCallId,contexts),toolResult}),pi.on("tool_result",async(event,ctx)=>{let preToolContexts=pendingPreToolContexts.get(event.toolCallId)??[];pendingPreToolContexts.delete(event.toolCallId);let state2=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input:buildPostToolUseHookInput(event,ctx),onRunningHandlersChange:running2=>{running2.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running2))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state2.trust});return applyPostToolUseResult(event,result3,preToolContexts)}),pi.on("session_before_compact",async(event,ctx)=>{let state2=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input:buildPreCompactHookInput(event,ctx),matcherInputs:["PreCompact",event.reason],signal:event.signal,trustState:state2.trust}),details=preCompactResultDetails(result3);return recordLifecycleHookResult(pi,"PreCompact",details,{compactionRequestId:event.requestId}),sessionBeforeCompactResult(details)}),pi.on("session_compact",async(event,ctx)=>{if(!event.accepted)return;let state2=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state2.parsed.executableHandlers,input:buildPostCompactHookInput(event,ctx),matcherInputs:["PostCompact",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state2.trust});recordLifecycleHookResult(pi,"PostCompact",postCompactResultDetails(result3))}),registerHooksCommand(pi,refreshState)}function mergeTrustStates(globalState,projectState){return{version:1,hooks:{...globalState.hooks,...projectState.hooks}}}function fallbackHookSources(cwd){return{agentDir:cwd,cwd,globalHookSourcePaths:[],globalHooksPath:`${cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]}}import{mkdir as mkdir6,writeFile as writeFile5}from"node:fs/promises";import{join as join48}from"node:path";var BASE_CSS="html{background:var(--background);color:var(--foreground);font-family:var(--font-sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;scrollbar-width:none}html::-webkit-scrollbar{display:none}body{margin:0}code,kbd,pre,samp{font-family:var(--font-mono)}",DARK_VARS={"--background":"#0a0a0a","--foreground":"#f5f5f5","--muted-foreground":"#818181","--chart-1":"#60a5fa","--font-sans":'-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',"--font-mono":'"SF Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace',"--radius":"0.625rem"},LIGHT_VARS={...DARK_VARS,"--background":"#ffffff","--foreground":"#0a0a0a","--muted-foreground":"#525252","--chart-1":"#1d4ed8"};function rootRule(appearance,variables){let declarations=Object.entries(variables).map(([name,value])=>`${name}:${value};`).join("");return`:root{color-scheme:${appearance};${declarations}}`}var BOOTSTRAP_SCRIPT=`(function(){var s=document.getElementById("t3-theme");if(!s)return;var b=${JSON.stringify(BASE_CSS)};try{var m=window.matchMedia("(prefers-color-scheme: light)");var a=function(){s.textContent=m.matches?${JSON.stringify(rootRule("light",LIGHT_VARS))}:${JSON.stringify(rootRule("dark",DARK_VARS))}+b;};a();if(m.addEventListener)m.addEventListener("change",a);}catch(e){}})();`;function bootstrapMarkup(markup){let defaultCss=`${rootRule("dark",DARK_VARS)}@media (prefers-color-scheme: light){${rootRule("light",LIGHT_VARS)}}${BASE_CSS}`;return[/<meta\s[^>]*charset/i.test(markup.slice(0,4096))?"":'<meta charset="utf-8">',/<meta\s[^>]*name\s*=\s*["']?viewport/i.test(markup)?"":'<meta name="viewport" content="width=device-width, initial-scale=1">',`<style id="t3-theme">${defaultCss}</style>`,`<script>${BOOTSTRAP_SCRIPT}</script>`].join("")}var blankNonMarkup=html=>{let scan2=html.replace(/<!--[\s\S]*?(?:-->|$)|<(script|style|textarea|title|xmp|iframe|noembed|noframes|noscript)\b[\s\S]*?(?:<\/\1\s*>|$)|<plaintext\b[\s\S]*$/gi,match=>" ".repeat(match.length)),parts=[],depth=0,start=0,at=0;for(let match of scan2.matchAll(/<(\/?)template(?:\s[^>]*)?\/?>/gi))if(!match[1])depth++===0&&(start=match.index);else if(depth>0&&--depth===0){let end=match.index+match[0].length;parts.push(scan2.slice(at,start)," ".repeat(end-start)),at=end}return depth>0&&(parts.push(scan2.slice(at,start)," ".repeat(scan2.length-start)),at=scan2.length),parts.push(scan2.slice(at)),parts.join("")},HTML_RENDER_CONTENT_SECURITY_POLICY=["default-src 'none'","script-src 'unsafe-inline' 'unsafe-eval' data: blob:","style-src 'unsafe-inline' data:","img-src data: blob:","font-src data:","media-src data: blob:","worker-src blob:","connect-src 'none'","frame-src 'none'","form-action 'none'","base-uri 'none'"].join("; "),POLICY_META=`<meta http-equiv="Content-Security-Policy" content="${HTML_RENDER_CONTENT_SECURITY_POLICY}">`,PREAMBLE=`\uFEFF<!doctype html>${POLICY_META}`,LEADING_ASCII_DOCTYPE=/^\uFEFF?[\t\n\f\r ]*<!doctype[ -=?-~]*>/i;function injectHtmlRenderBootstrap(html){return PREAMBLE+injectThemeBootstrap(html).replace(LEADING_ASCII_DOCTYPE,"")}function injectThemeBootstrap(html){let scan2=blankNonMarkup(html),markup=bootstrapMarkup(scan2),headOpen=/<head(?:\s[^>]*)?>/i.exec(scan2);if(headOpen){let at=headOpen.index+headOpen[0].length;return html.slice(0,at)+markup+html.slice(at)}let htmlOpen=/<html(?:\s[^>]*)?>/i.exec(scan2);if(htmlOpen){let at=htmlOpen.index+htmlOpen[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}let doctype=/^\s*<!doctype[^>]*>/i.exec(html);if(doctype){let at=doctype[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}return`<!doctype html><head>${markup}</head>${html}`}import{readFile as readFile10,stat as stat5}from"node:fs/promises";var MIB=1024*1024,MAX_IMAGE_BYTES=10*MIB,MAX_PAGE_BYTES=25*MIB;var HtmlRenderImageTooLargeError=class extends Error{constructor(path14,sizeBytes){super(`${path14} is ${(sizeBytes/MIB).toFixed(1)} MiB; each local image must be at most 10 MiB.`),this.name="HtmlRenderImageTooLargeError"}},HtmlRenderPageTooLargeError=class extends Error{constructor(sizeBytes){super(`With its images inlined the page is ${(sizeBytes/MIB).toFixed(1)} MiB; the limit is 25 MiB. Use smaller images.`),this.name="HtmlRenderPageTooLargeError"}},IMAGE_MIME_TYPES={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon"},IMAGE_EXTENSIONS=Object.keys(IMAGE_MIME_TYPES).join("|"),ABSOLUTE_PATH=String.raw`(?:/(?!/)|[a-z]:[\\/])`,LOCAL_IMAGE_PATTERN=new RegExp(String.raw`(["'\x60])(${ABSOLUTE_PATH}(?:(?!\1)[^\r\n]){0,2048}?\.(?:${IMAGE_EXTENSIONS}))\1`+String.raw`|url\(\s*(${ABSOLUTE_PATH}[^\s"'\x60()]{0,2048}?\.(?:${IMAGE_EXTENSIONS}))\s*\)`,"gid"),findLocalImages=html=>Array.from(html.matchAll(LOCAL_IMAGE_PATTERN)).flatMap(match=>{let span=match.indices?.[2]??match.indices?.[3];return span?[{start:span[0],end:span[1],path:html.slice(span[0],span[1])}]:[]}),filePathFor=reference2=>/^[a-z]:/i.test(reference2)?reference2.replaceAll("\\\\","\\"):reference2,dataUriPrefix=path14=>`data:${IMAGE_MIME_TYPES[path14.slice(path14.lastIndexOf(".")+1).toLowerCase()]??"application/octet-stream"};base64,`,latin1=(bytes,start,end)=>String.fromCharCode(...bytes.subarray(start,end)),after=(text3,token,from)=>{let at=text3.indexOf(token,from);return at===-1?-1:at+token.length},afterDoctype=(text3,from)=>{let inSubset=!1,at=from;for(;at!==-1&&at<text3.length;){let char=text3[at];if(char==='"'||char==="'")at=after(text3,char,at+1);else if(inSubset&&text3.startsWith("<!--",at))at=after(text3,"-->",at+4);else if(inSubset&&text3.startsWith("<?",at))at=after(text3,"?>",at+2);else{if(char===">"&&!inSubset)return at+1;char==="["?inSubset=!0:char==="]"&&(inSubset=!1),at+=1}}return-1},hasSvgRoot=text3=>{let at=0;for(;at!==-1;){for(;/\s/.test(text3.charAt(at));)at+=1;if(text3.startsWith("<?",at))at=after(text3,"?>",at+2);else if(text3.startsWith("<!--",at))at=after(text3,"-->",at+4);else if(text3.slice(at,at+9).toLowerCase()==="<!doctype")at=afterDoctype(text3,at+9);else return/^<svg[ \t\r\n/>]/.test(text3.slice(at,at+5))}return!1},isImageBytes=bytes=>{let head=latin1(bytes,0,12);return head.startsWith("\x89PNG")||head.startsWith("\xFF\xD8\xFF")||head.startsWith("GIF8")||head.startsWith("\0\0\0")||head.startsWith("BM")&&head.slice(6,10)==="\0\0\0\0"||head.startsWith("RIFF")&&head.slice(8,12)==="WEBP"||/^ftyp(?:avif|avis|mif1)$/.test(head.slice(4,12))?!0:hasSvgRoot(new TextDecoder().decode(bytes.subarray(0,4096)))};async function inlineLocalImages(html){let references=findLocalImages(html),uniquePaths2=[...new Set(references.map(reference2=>reference2.path))],files=await Promise.all(uniquePaths2.map(async path14=>{try{let info=await stat5(filePathFor(path14));return{path:path14,size:info.isFile()?Number(info.size):void 0}}catch{return{path:path14,size:void 0}}})),oversized=files.find(file=>file.size!==void 0&&file.size>MAX_IMAGE_BYTES);if(oversized?.size!==void 0)throw new HtmlRenderImageTooLargeError(oversized.path,oversized.size);let images=new Map,readBytes=0;for(let file of files.filter(entry=>entry.size!==void 0)){let bytes=new Uint8Array(await readFile10(filePathFor(file.path)));if(isImageBytes(bytes)){if(bytes.byteLength>MAX_IMAGE_BYTES)throw new HtmlRenderImageTooLargeError(file.path,bytes.byteLength);if(readBytes+=Math.ceil(bytes.byteLength/3)*4,readBytes>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(readBytes);images.set(file.path,bytes)}}let parts=[],cursor=0;for(let reference2 of references){let bytes=images.get(reference2.path);bytes!==void 0&&(parts.push(html.slice(cursor,reference2.start),dataUriPrefix(reference2.path)+Buffer.from(bytes).toString("base64")),cursor=reference2.end)}parts.push(html.slice(cursor));let inlined=parts.join("");if(Buffer.byteLength(inlined)>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(Buffer.byteLength(inlined));let missing=files.filter(file=>!images.has(file.path)).map(file=>file.path);return{html:inlined,missing}}var MAX_HTML_CHARACTERS=512e3,Params=typebox_exports.Object({html:typebox_exports.String({description:`A complete, self-contained HTML document, at most ${MAX_HTML_CHARACTERS} characters. Pass screenshots and other images as absolute file paths (<img src="/abs/path.png">), never as base64.`,minLength:1}),title:typebox_exports.String({description:"Short name for the page.",minLength:1,maxLength:200}),height:typebox_exports.Optional(typebox_exports.Integer({description:"Frame height hint in CSS pixels, 80-2000. Defaults to the page's natural height."}))}),OUTPUT_DIR=".senpi/html-pages",BASE64_IMAGE=/data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=\s]+/gi;function assertWithinInputLimit(html){if(html.length<=MAX_HTML_CHARACTERS)return;let images=html.match(BASE64_IMAGE)??[],imageCharacters=images.reduce((total,image)=>total+image.length,0),advice=images.length>0?` ${images.length} base64 images make up ${imageCharacters} of them. Save each image to a file and reference it by absolute file path (<img src="/abs/path/shot.png">); show_html_page inlines local images itself, and they do not count against this limit.`:" Shorten the document, or move large images out of it as absolute file paths, which show_html_page inlines itself.";throw new Error(`The page is ${html.length} characters; show_html_page accepts at most ${MAX_HTML_CHARACTERS} characters.${advice}`)}var clampHeight=height=>height===void 0?void 0:Math.min(2e3,Math.max(80,Math.round(height))),showHtmlPageTool={name:"show_html_page",label:"Show HTML Page",description:"Show a finished self-contained HTML page (chart, table, diagram, mockup) to the reader. No network: inline every script, style and image (data: URIs). A <script src>, stylesheet link, font, image or fetch that points at a URL (a CDN included) is refused, and the page comes out blank or broken. Local images written as absolute file paths are inlined automatically after a byte check. In the desktop thread this renders inline above your reply; elsewhere it is written to a file you can open in the desktop.",promptSnippet:"show_html_page: show a self-contained HTML page (chart/table/diagram) to the reader",promptGuidelines:["No network: inline every script, style and image (data: URIs); a CDN <script src> or remote font is refused and leaves the page blank.","Absolute-path local images are inlined after a magic-byte check; a renamed non-image is refused.","Pass screenshots and other images as absolute file paths, never as base64 data: URIs: the page is limited to 512000 characters before images are inlined."],parameters:Params,async execute(_toolCallId,params,_signal,_onUpdate,ctx){assertWithinInputLimit(params.html);let inlined=await inlineLocalImages(params.html),prepared=injectHtmlRenderBootstrap(inlined.html),height=clampHeight(params.height),dir=join48(ctx.cwd,OUTPUT_DIR);await mkdir6(dir,{recursive:!0});let safeName=params.title.replace(/[\\/:*?"<>|\p{Cc}]+/gu," ").replace(/\s+/g," ").trim().slice(0,60)||"page",path14=join48(dir,`${safeName}-${Date.now().toString(36)}.html`);await writeFile5(path14,prepared,"utf8");let missing=inlined.missing.length===0?void 0:inlined.missing;return{content:[{type:"text",text:`Wrote the page to ${path14}. Open it in the desktop to see it rendered with your theme. `+(missing===void 0?"Local images were inlined.":`Some local images could not be read and were left as written: ${missing.join(", ")}.`)}],details:{path:path14,title:params.title,height,prepared:!0,...missing?{missingImages:missing}:{},html:params.html}}}};function htmlRenderExtension(pi){pi.registerTool(showHtmlPageTool)}import{existsSync as existsSync23}from"node:fs";import{dirname as dirname40}from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";var OPENAI_BASE_URL="https://api.openai.com/v1";function nonEmpty(value){let trimmed=value?.trim();return trimmed||void 0}function sameBaseUrl(left,right){return left.replace(/\/+$/,"")===right.replace(/\/+$/,"")}function resolvedHeaders(headers){if(!headers)return;let resolved={};for(let[name,value]of Object.entries(headers))typeof value=="string"&&value.trim().length>0&&(resolved[name]=value);return Object.keys(resolved).length>0?resolved:void 0}function isPlaceholderKey(apiKey){return/^SK-SENTINEL-DO-NOT-LOG/i.test(apiKey)}function credentialParts(auth){let apiKey=nonEmpty(auth?.apiKey);if(!apiKey||isPlaceholderKey(apiKey))return;let headers=resolvedHeaders(auth?.headers);return{apiKey,...headers?{headers}:{}}}function isStoredApiKey(value){return typeof value=="object"&&value!==null&&"type"in value&&value.type==="api_key"}function openAiTier(stored,model,statusSource){if(stored||statusSource==="runtime")return"store";if(!sameBaseUrl(model.baseUrl,OPENAI_BASE_URL)||statusSource?.startsWith("models_json"))return"provider-config"}async function storedKeyWithoutCatalogModel(registry){let resolved;try{resolved=await registry.getProviderAuth("openai")}catch{return}let credentials=credentialParts(resolved?.auth);if(credentials)return{tier:"store",resolution:{kind:"native-openai",...credentials,baseUrl:OPENAI_BASE_URL,provenance:"store",providerId:"openai"}}}async function resolveConfiguredOpenAi(registry){let stored=isStoredApiKey(registry.authStorage.get("openai")),model=registry.getAll().find(candidate=>candidate.provider==="openai"&&nonEmpty(candidate.baseUrl));if(!model)return stored?storedKeyWithoutCatalogModel(registry):void 0;let tier=openAiTier(stored,model,registry.getProviderAuthStatus?.("openai").source);if(!tier)return;let resolved;try{resolved=await registry.getApiKeyAndHeaders(model)}catch{return}if(!resolved.ok)return;let credentials=credentialParts(resolved);if(!credentials)return;let baseUrl=nonEmpty(resolved.baseUrl)??model.baseUrl;return{tier,resolution:{kind:sameBaseUrl(baseUrl,OPENAI_BASE_URL)?"native-openai":"gateway",...credentials,baseUrl,provenance:tier,providerId:"openai"}}}var SETUP_REASON='Image generation is not configured. Store an OpenAI API key for provider "openai", configure an OpenAI-compatible gateway in models.json and optionally pin it with PI_IMAGE_GEN_PROVIDER, or set OPENAI_API_KEY.';function isGatewayApi(api){return api==="openai-completions"||api==="openai-responses"}function compareText(left,right){return left<right?-1:left>right?1:0}function compareProviderIds(left,right){let leftMatches=/openai/i.test(left),rightMatches=/openai/i.test(right);return leftMatches!==rightMatches?leftMatches?-1:1:compareText(left,right)}function groupGatewayModels(models){let groups=new Map,ordered=[...models].sort((left,right)=>compareText(left.provider,right.provider)||compareText(left.id,right.id));for(let model of ordered)model.provider==="openai"||!isGatewayApi(model.api)||!nonEmpty(model.baseUrl)||groups.has(model.provider)||groups.set(model.provider,model);return groups}async function resolveGateway(providerId,model,registry){let baseUrl=nonEmpty(model.baseUrl);if(!baseUrl)return;let resolved;try{resolved=await registry.getApiKeyAndHeaders(model)}catch{return}if(!resolved.ok)return;let credentials=credentialParts(resolved);if(credentials)return{kind:"gateway",...credentials,baseUrl,provenance:"provider-config",providerId}}async function*imageGenCandidates(deps){let registry=deps.modelRegistry,env=deps.env??process.env,openai=await resolveConfiguredOpenAi(registry);if(openai?.tier==="store"){yield{...openai.resolution,fallthrough:!1};return}let groups=groupGatewayModels(registry.getAll()),pinnedProvider=nonEmpty(env.PI_IMAGE_GEN_PROVIDER),pinnedModel=pinnedProvider===void 0?void 0:groups.get(pinnedProvider);if(pinnedProvider!==void 0&&pinnedModel!==void 0){let pinned=await resolveGateway(pinnedProvider,pinnedModel,registry);if(pinned){yield{...pinned,fallthrough:!1};return}}if(openai){yield{...openai.resolution,fallthrough:!1};return}let providerIds=[...groups.keys()].filter(providerId=>providerId!==pinnedProvider).sort(compareProviderIds);for(let providerId of providerIds){let model=groups.get(providerId);if(!model)continue;let gateway=await resolveGateway(providerId,model,registry);gateway&&(yield{...gateway,fallthrough:!0})}let envApiKey=nonEmpty(env.OPENAI_API_KEY);envApiKey&&!isPlaceholderKey(envApiKey)&&(yield{kind:"native-openai",apiKey:envApiKey,baseUrl:OPENAI_BASE_URL,provenance:"env",fallthrough:!1})}async function resolveImageGenAuth(deps){let first=await imageGenCandidates(deps).next();if(first.done)return{kind:"none",reason:SETUP_REASON};let{fallthrough:_fallthrough,...resolution}=first.value;return resolution}var NATIVE_BYPASS_MESSAGE="Image generation is handled by the provider's native server-side tool for the current model. Call the native image_generation tool instead of generate_image.",nativeBypass=!1,registryOverride;function setNativeBypass(enabled){nativeBypass=enabled}function isNativeBypass(){return nativeBypass}function imageGenRegistryOverride(){return registryOverride}import{existsSync as existsSync22}from"node:fs";import{mkdir as mkdir7,rm as rm7,writeFile as writeFile6}from"node:fs/promises";import{dirname as dirname39}from"node:path";var DEFAULT_IMAGE_MODEL="gpt-image-2.5-sunburst",IMAGE_MODEL_NAMES={"gpt-image-2.5-sunburst":"GPT Image 2.5 Sunburst","gpt-image-2.5-flare":"GPT Image 2.5 Flare","gpt-image-2":"GPT Image 2"},Params2=typebox_exports.Object({prompt:typebox_exports.String({minLength:1,maxLength:32e3,description:"Detailed description of the desired image, including the end state for edits."}),model:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("gpt-image-2.5-sunburst"),typebox_exports.Literal("gpt-image-2.5-flare"),typebox_exports.Literal("gpt-image-2")],{default:DEFAULT_IMAGE_MODEL,description:"Sunburst (default) is the most capable: highest quality, precise edits, reference fidelity, best for final assets; Flare is the small model optimized for speed, with quality comparable to gpt-image-2; gpt-image-2 is the previous generation."})),size:typebox_exports.Optional(typebox_exports.String({default:"auto",description:"auto, 1024x1024, 1536x1024, 1024x1536, or any WIDTHxHEIGHT with both divisible by 16, aspect between 1:3 and 3:1, max 3840x2160 (e.g. 2048x2048, 2048x1152, 3840x2160)"})),quality:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")],{default:"auto",description:"Rendering quality. Defaults to auto. xhigh/max are gpt-image-2.5 only, slower and costlier."})),reference_image_paths:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}),{minItems:1,maxItems:5,description:"Local PNG/JPEG/WEBP images to edit or use as references (1-5 files, each at most 50 MB). Paths may be absolute or relative to the working directory."})),mask_image_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Inpainting mask (PNG with an alpha channel, same size as the first reference image): transparent areas are repainted. Requires reference_image_paths."})),background:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("transparent"),typebox_exports.Literal("opaque")],{default:"auto",description:"Output background. transparent needs output_format png or webp and keeps the alpha channel; auto lets the model decide."})),output_format:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("png"),typebox_exports.Literal("jpeg"),typebox_exports.Literal("webp")],{default:"png",description:"File format. png (default) is lossless and supports transparency; jpeg is fastest; webp is small and supports transparency."})),output_compression:typebox_exports.Optional(typebox_exports.Integer({minimum:0,maximum:100,description:"Compression level 0-100 for jpeg or webp output only (100 = best quality)."})),moderation:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low")],{default:"auto",description:"Content filter strictness: auto (standard) or low (less restrictive)."})),n:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:10,default:1,description:"How many variants of this one prompt to generate; distinct assets need distinct calls."})),output_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Where to write the image, relative to the working directory. The extension must match output_format (.png, .jpg/.jpeg, .webp) or be omitted. Defaults to generated-images/."}))},{additionalProperties:!1});function failure(message,reason,base){let details={...base,paths:[],generated:0,revisedPrompts:[],error:message,reason};return{content:[{type:"text",text:message}],details}}import{isAbsolute as isAbsolute11,relative as relative12,resolve as resolve23}from"node:path";var GENERATED_IMAGE_DIRECTORY="generated-images",DEFAULT_DIRECTORY=GENERATED_IMAGE_DIRECTORY,MAX_TOOL_CALL_ID_CHARS=64,EXTENSIONS={png:[".png"],jpeg:[".jpg",".jpeg"],webp:[".webp"]};function sanitizeImageStem(identifier2){let sanitized=identifier2.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,MAX_TOOL_CALL_ID_CHARS);return sanitized.length>0?sanitized:"image"}function sanitizeToolCallId(toolCallId){return sanitizeImageStem(toolCallId)}function resolveTargets(cwd,toolCallId,count2,outputPath,outputFormat="png"){let allowed=EXTENSIONS[outputFormat],defaultExtension=allowed[0]??".png",requested=outputPath?.trim(),base,extension;if(requested===void 0||requested.length===0)base=resolve23(cwd,DEFAULT_DIRECTORY,`${sanitizeToolCallId(toolCallId)}${defaultExtension}`),extension=defaultExtension;else{let absolute=isAbsolute11(requested)?requested:resolve23(cwd,requested),extensionMatch=/\.[^./\\]+$/.exec(absolute);if(extensionMatch&&!allowed.includes(extensionMatch[0].toLowerCase()))return{ok:!1,error:`Error: output_path must end in ${allowed.join(" or ")} for output_format ${outputFormat} (got "${requested}").`};extension=extensionMatch?extensionMatch[0]:defaultExtension,base=extensionMatch?absolute:`${absolute}${defaultExtension}`}if(count2===1)return{ok:!0,paths:[base]};let stem=base.slice(0,-extension.length);return{ok:!0,paths:Array.from({length:count2},(_,index)=>`${stem}-${String(index+1).padStart(2,"0")}${extension}`)}}function outputFormatOf(mimeType){if(mimeType==="image/png")return"png";if(mimeType==="image/jpeg")return"jpeg";if(mimeType==="image/webp")return"webp"}function withFormatExtension(path14,outputFormat){let extension=EXTENSIONS[outputFormat][0]??".png",extensionMatch=/\.[^./\\]+$/.exec(path14),current=extensionMatch?.[0].toLowerCase();return current!==void 0&&EXTENSIONS[outputFormat].includes(current)?path14:extensionMatch?`${path14.slice(0,-extensionMatch[0].length)}${extension}`:`${path14}${extension}`}function displayPath2(cwd,absolute){let relativePath=relative12(cwd,absolute);return relativePath&&!relativePath.startsWith("..")&&!isAbsolute11(relativePath)?relativePath:absolute}import{constants as constants7}from"node:fs";import{open as open5}from"node:fs/promises";import{resolve as resolve24}from"node:path";var MAX_REFERENCE_BYTES=50*1024*1024,PNG_SIGNATURE2=Buffer.from([137,80,78,71,13,10,26,10]),JPEG_SIGNATURE=Buffer.from([255,216,255]),RIFF_SIGNATURE=Buffer.from("RIFF"),WEBP_SIGNATURE=Buffer.from("WEBP");function imageMimeType(bytes){if(bytes.subarray(0,8).equals(PNG_SIGNATURE2))return"image/png";if(bytes.subarray(0,3).equals(JPEG_SIGNATURE))return"image/jpeg";if(bytes.subarray(0,4).equals(RIFF_SIGNATURE)&&bytes.subarray(8,12).equals(WEBP_SIGNATURE))return"image/webp"}async function loadImageFile(cwd,path14,label3){try{let file=await open5(resolve24(cwd,path14),constants7.O_RDONLY|constants7.O_NONBLOCK);try{let stat17=await file.stat();if(!stat17.isFile())throw new Error("must be a regular file");if(stat17.size>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let bytes=await file.readFile();if(bytes.length>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let mimeType=imageMimeType(bytes);if(mimeType===void 0)throw new Error("must be a PNG, JPEG, or WEBP image (invalid magic bytes)");return{ok:!0,image:{type:"image",data:bytes.toString("base64"),mimeType}}}finally{await file.close()}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:`Error: ${label3} "${path14}": ${reason}`}}}async function loadReferenceImages(cwd,paths){if(paths===void 0)return{ok:!0,images:[]};if(paths.length<1||paths.length>5)return{ok:!1,error:`Error: reference_image_paths must contain 1 to 5 paths (got ${paths.length}).`};let images=[];for(let path14 of paths){let loaded3=await loadImageFile(cwd,path14,"reference image");if(!loaded3.ok)return loaded3;images.push(loaded3.image)}return{ok:!0,images}}async function loadMaskImage(cwd,path14,referenceCount){if(path14!==void 0)return referenceCount===0?{ok:!1,error:"Error: mask_image_path requires at least one reference_image_paths entry to edit."}:loadImageFile(cwd,path14,"mask image")}var NO_IMAGES_ENDPOINT_STATUSES=new Set([404,405]);function missingImagesEndpointStatus(images){if(images.stopReason!=="error")return;let status=images.providerDiagnostic?.httpStatus;return status!==void 0&&NO_IMAGES_ENDPOINT_STATUSES.has(status)?status:void 0}async function requestImagesAcrossCandidates(first,rest,request2){let skipped2=[],auth=first;for(;;){let images=await request2(auth),status=auth.fallthrough?missingImagesEndpointStatus(images):void 0;if(status===void 0)return{kind:"images",auth,images,skipped:skipped2};skipped2.push({providerId:auth.providerId??"openai",baseUrl:auth.baseUrl,httpStatus:status});let next=await rest.next();if(next.done)return{kind:"exhausted",skipped:skipped2};auth=next.value}}function describe(skipped2){return skipped2.map(entry=>`${entry.providerId} (${entry.baseUrl}, HTTP ${entry.httpStatus})`).join(", ")}function exhaustedProvidersMessage(skipped2){return[`Error: none of the configured OpenAI-compatible providers serves image generation. Tried: ${describe(skipped2)}.`,'Set PI_IMAGE_GEN_PROVIDER to a provider whose endpoint has /images, override the "openai" provider in models.json with such a baseUrl, or store an OpenAI API key for provider "openai".'].join(" ")}function skippedProvidersNote(skipped2){if(skipped2.length!==0)return`Note: skipped ${describe(skipped2)}: no image generation endpoint. Pin a provider with PI_IMAGE_GEN_PROVIDER to skip this check.`}function sourceLabel(auth){return auth.kind==="none"?"none":auth.provenance==="env"?"env:OPENAI_API_KEY":`${auth.provenance}:${auth.providerId??auth.kind}`}function synthesizeModel(auth,id){return{type:"image",id,name:IMAGE_MODEL_NAMES[id],api:"openai-images",provider:auth.providerId??"openai",baseUrl:auth.baseUrl,input:["text","image"],output:["image"],cost:getImageModel("openai",id).cost}}function collectImages(images){let collected=[],pendingText;for(let block of images.output){if(block.type==="text"){let text3=block.text.trim();pendingText=text3.length>0?text3:void 0;continue}collected.push({data:block.data,mimeType:block.mimeType,...pendingText===void 0?{}:{revisedPrompt:pendingText}}),pendingText=void 0}return collected}async function writeImages(paths,images){let written=[];for(let[index,image]of images.entries()){let target=paths[index];if(target===void 0)break;try{await mkdir7(dirname39(target),{recursive:!0}),await writeFile6(target,Buffer.from(image.data,"base64"),{flag:"wx"}),written.push(target)}catch(error2){for(let path14 of written)await rm7(path14,{force:!0}).catch(()=>{});let reason=error2 instanceof Error?error2.message:String(error2);return`Error: failed to write generated image to ${target}: ${reason}`}}}var GENERATE_IMAGE_TOOL_NAME="generate_image",generateImageTool={name:GENERATE_IMAGE_TOOL_NAME,label:"Generate Image",description:"Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default, the most capable; Flare when speed matters more than quality) and save it as a png, jpeg, or webp file, optionally with a transparent background. Pass reference_image_paths to edit or reference existing images. Generate directly when the request is clear instead of asking for confirmation. Returns the saved file paths.",promptSnippet:"Generate or edit images from prompts and optional reference images, saving them as png/jpeg/webp files.",exposure:"search",searchGroup:"imagegen",searchKeywords:["generate image","image generation","edit image","create a picture","illustration","mockup","gpt-image","transparent png"],parameters:Params2,async execute(toolCallId,params,signal,_onUpdate,ctx){let size=params.size??"auto",quality=params.quality??"auto",requested=params.n??1,modelId=params.model??DEFAULT_IMAGE_MODEL,background=params.background??"auto",outputFormat=params.output_format??"png",context={model:modelId,size,quality,background,outputFormat,requested,source:"none"},prompt=params.prompt.trim();if(prompt.length===0)return failure("Error: prompt must contain non-whitespace text.","invalid_params",context);if(isNativeBypass())return failure(NATIVE_BYPASS_MESSAGE,"provider_native_bypass",context);let candidates=imageGenCandidates({modelRegistry:imageGenRegistryOverride()??ctx.modelRegistry}),firstCandidate=await candidates.next();if(firstCandidate.done)return failure(SETUP_REASON,"missing_config",context);let source2=sourceLabel(firstCandidate.value),parsedSize=parseOpenAIImageSize(size);if(!parsedSize.ok)return failure(`Error: ${parsedSize.error}`,"invalid_params",{...context,source:source2});let references=await loadReferenceImages(ctx.cwd,params.reference_image_paths);if(!references.ok)return failure(references.error,"invalid_params",{...context,source:source2});let mask=await loadMaskImage(ctx.cwd,params.mask_image_path,references.images.length);if(mask!==void 0&&!mask.ok)return failure(mask.error,"invalid_params",{...context,source:source2});let outputOptions=parseOpenAIImageOutputOptions({background,outputFormat,outputCompression:params.output_compression,hasMask:mask!==void 0,imageCount:references.images.length});if(!outputOptions.ok)return failure(`Error: ${outputOptions.error}`,"invalid_params",{...context,source:source2});let targets2=resolveTargets(ctx.cwd,toolCallId,requested,params.output_path,outputFormat);if(!targets2.ok)return failure(targets2.error,"invalid_params",{...context,source:source2});for(let target of targets2.paths)if(existsSync22(target))return failure(`Error: ${displayPath2(ctx.cwd,target)} already exists. Choose another output_path.`,"invalid_params",{...context,source:source2});let outcome=await requestImagesAcrossCandidates(firstCandidate.value,candidates,auth=>generateImages(synthesizeModel(auth,modelId),{input:[{type:"text",text:prompt},...references.images]},{...auth.apiKey===void 0?{}:{apiKey:auth.apiKey},...auth.headers===void 0?{}:{headers:auth.headers},...signal===void 0?{}:{signal},size,quality,n:requested,...params.background===void 0?{}:{background},outputFormat,...params.output_compression===void 0?{}:{outputCompression:params.output_compression},...params.moderation===void 0?{}:{moderation:params.moderation},...mask===void 0?{}:{mask:mask.image}}));if(outcome.kind==="exhausted")return failure(exhaustedProvidersMessage(outcome.skipped),"provider_error",{...context,source:source2});let{images}=outcome;if(source2=sourceLabel(outcome.auth),images.stopReason!=="stop"){let message=images.errorMessage??`Image generation ${images.stopReason}.`;return failure(`Error: ${message}`,"provider_error",{...context,source:source2})}let generated=collectImages(images);if(generated.length===0)return failure("Error: the provider returned no images.","provider_error",{...context,source:source2});let delivered=generated.map(image=>outputFormatOf(image.mimeType)??outputFormat),savedFormat=delivered[0]??outputFormat,paths=targets2.paths.map((target,index)=>{let format2=delivered[index];return format2===void 0||format2===outputFormat?target:withFormatExtension(target,format2)}),renamedCollision=paths.find((target,index)=>target!==targets2.paths[index]&&existsSync22(target));if(renamedCollision!==void 0)return failure(`Error: the provider returned ${savedFormat} instead of ${outputFormat} and ${displayPath2(ctx.cwd,renamedCollision)} already exists. Choose another output_path.`,"write_failed",{...context,source:source2});let writeError=await writeImages(paths,generated);if(writeError!==void 0)return failure(writeError,"write_failed",{...context,source:source2});let savedPaths=paths.slice(0,generated.length).map(target=>displayPath2(ctx.cwd,target)),revisedPrompts=generated.flatMap(image=>image.revisedPrompt?[image.revisedPrompt]:[]),details={paths:savedPaths,model:modelId,source:source2,size,quality,background,outputFormat:savedFormat,requested,generated:generated.length,revisedPrompts,...images.background===void 0?{}:{transparentBackground:images.background==="transparent"}};return{content:[{type:"text",text:[`Generated ${generated.length} image${generated.length===1?"":"s"}:`,...savedPaths.map(path14=>`- ${path14}`),...savedFormat===outputFormat?[]:[`Note: the provider returned ${savedFormat} instead of the requested ${outputFormat}; saved with the matching extension.`],...images.background===void 0?[]:[`Background: ${images.background}`],...[skippedProvidersNote(outcome.skipped)].flatMap(note2=>note2===void 0?[]:[note2]),...revisedPrompts.map(revised=>`Revised prompt: ${revised}`),"The saved file is the deliverable; refer to it by path instead of re-embedding image data."].join(`
|
|
651
650
|
`)},...generated.map(image=>({type:"image",data:image.data,mimeType:image.mimeType}))],details,...images.usage===void 0?{}:{usage:images.usage}}}};var IMAGEGEN_BASE_DIR=dirname40(fileURLToPath5(import.meta.url)),loggedMissingSkill=!1,IMAGE_GEN_SECTION=`
|
|
652
651
|
## Image Generation
|
|
@@ -713,8 +712,8 @@ ${loopFile.content}
|
|
|
713
712
|
For normal dynamic re-entry, set \`prompt\` to the complete original command, for example \`/loop check the deploy\`, preserving the user's text verbatim. Set \`noop: true\` only when this iteration found no actionable change; consecutive noop iterations are folded in the terminal view. Omit \`noop\` when stopping. Notify the user only when state changes in a way worth acting on, not once per tick.`,scheduleWakeupSchema=typebox_exports.Object({delaySeconds:typebox_exports.Optional(typebox_exports.Integer({description:`Dynamic loop delay in seconds. Values are clamped to ${MIN_WAKEUP_DELAY_SECONDS}-${MAX_WAKEUP_DELAY_SECONDS}.`})),reason:typebox_exports.String({minLength:1,description:"Why this wakeup or stop is appropriate. Must not be blank."}),prompt:typebox_exports.Optional(typebox_exports.String({description:"Prompt to dispatch when the wakeup fires. Required unless stop is true; preserve the original /loop command verbatim for normal dynamic re-entry."})),stop:typebox_exports.Optional(typebox_exports.Boolean({description:"End the active dynamic loop immediately instead of scheduling another wakeup."})),noop:typebox_exports.Optional(typebox_exports.Boolean({description:"True when this iteration observed no actionable change. Consecutive noop iterations are folded in the terminal view. Omit when stopping."}))},{additionalProperties:!1}),NO_ACTIVE_DYNAMIC_LOOP_ERROR=`${SCHEDULE_WAKEUP_TOOL} can only be used while a dynamic /loop is active.`,FIXED_TICK_ERROR=`This is a fixed /loop tick; the recurring schedule re-arms automatically. Do not call ${SCHEDULE_WAKEUP_TOOL}.`,MISSING_PROMPT_ERROR="prompt is required and must be non-empty unless stop is true.",MISSING_DELAY_ERROR="delaySeconds is required unless stop is true.",NON_INTEGER_DELAY_ERROR="delaySeconds must be a finite integer number of seconds.",BLANK_REASON_ERROR="reason is required and must be non-empty.",NOOP_WITH_STOP_ERROR="noop must be omitted when stop is true.";function clampDelaySeconds(requested){return Math.min(MAX_WAKEUP_DELAY_SECONDS,Math.max(MIN_WAKEUP_DELAY_SECONDS,requested))}function resolveDynamicLoopId(scheduler){let target=scheduler.getWakeupTarget();if(target===null)throw new Error(NO_ACTIVE_DYNAMIC_LOOP_ERROR);if(target.kind==="fixed")throw new Error(FIXED_TICK_ERROR);return target.loopId}function requireReason(reason){let trimmed=typeof reason=="string"?reason.trim():"";if(trimmed.length===0)throw new Error(BLANK_REASON_ERROR);return trimmed}function collectIgnoredFields(params){let ignored=[];return params.delaySeconds!==void 0&&ignored.push("delaySeconds"),params.prompt!==void 0&&ignored.push("prompt"),ignored}async function executeStop(scheduler,params){if(params.noop!==void 0)throw new Error(NOOP_WITH_STOP_ERROR);let reason=requireReason(params.reason),loopId=resolveDynamicLoopId(scheduler),ignoredFields=collectIgnoredFields(params),{endedAt}=await scheduler.stopDynamicLoop({loopId,reason});return{content:[{type:"text",text:`Stopped dynamic loop ${loopId}.`}],details:{ok:!0,action:"stopped",loopId,terminalReason:"stopped",reason,endedAt,ignoredFields}}}async function executeSchedule(scheduler,params){let reason=requireReason(params.reason),requestedDelaySeconds=params.delaySeconds;if(requestedDelaySeconds===void 0)throw new Error(MISSING_DELAY_ERROR);if(!Number.isInteger(requestedDelaySeconds))throw new Error(NON_INTEGER_DELAY_ERROR);let prompt=params.prompt;if(prompt===void 0||prompt.trim().length===0)throw new Error(MISSING_PROMPT_ERROR);let loopId=resolveDynamicLoopId(scheduler),delaySeconds=clampDelaySeconds(requestedDelaySeconds),clamped=delaySeconds!==requestedDelaySeconds,noop=params.noop===!0,outcome=await scheduler.scheduleWakeup({loopId,requestedDelaySeconds,delaySeconds,reason,prompt,noop});return{content:[{type:"text",text:clamped?`Scheduled loop ${loopId} in ${delaySeconds}s; requested ${requestedDelaySeconds}s was clamped to the supported ${MIN_WAKEUP_DELAY_SECONDS}-${MAX_WAKEUP_DELAY_SECONDS}s range.`:`Scheduled loop ${loopId} in ${delaySeconds}s.`}],details:{ok:!0,action:"scheduled",loopId,wakeupId:outcome.wakeupId,...outcome.replacedWakeupId===void 0?{}:{replacedWakeupId:outcome.replacedWakeupId},requestedDelaySeconds,delaySeconds,clamped,dueAt:outcome.dueAt,reason,prompt,noop,noopStreak:outcome.noopStreak}}}function registerLoopTools(pi,deps){pi.registerTool({name:SCHEDULE_WAKEUP_TOOL,label:"Schedule Wakeup",description:SCHEDULE_WAKEUP_DESCRIPTION,parameters:scheduleWakeupSchema,exposure:"search",allowLazyActivation:!1,executionMode:"sequential",async execute(_toolCallId,params){return params.stop===!0?executeStop(deps.scheduler,params):executeSchedule(deps.scheduler,params)}})}var LOOP_TICK_ENTRY_TYPE="loop-tick",renderLoopTickEntry=noticeEntryRenderer(entry=>{let data=entry.data;if(data===void 0)return;let folded=data.folded?formatNoopFold(data.noopStreak):"";return folded.length>0?{title:folded,why:"Consecutive loop ticks reported no actionable change."}:{title:`\u21BB loop tick (${data.mode}) \xB7 ${data.delivery}`,why:"A /loop schedule dispatched this tick."}});function createNodeTimerPort(){let handles=new Map,generations=new Map;function cancel3(key){let handle=handles.get(key);handle!==void 0&&clearTimeout(handle),handles.delete(key),generations.set(key,(generations.get(key)??0)+1)}return{arm(key,dueAt,callback){cancel3(key);let generation2=generations.get(key)??0,delayMs=Math.max(0,dueAt-Date.now()),handle=setTimeout(()=>{handles.delete(key),generations.get(key)===generation2&&callback()},delayMs);handle.unref?.(),handles.set(key,handle)},cancel:cancel3,cancelAll(){for(let key of[...handles.keys()])cancel3(key)}}}function defaultIds(){let sequence2=0,mint=prefix=>(sequence2+=1,`${prefix}-${Date.now().toString(36)}-${sequence2.toString(36)}`);return{loopId:()=>mint("loop"),wakeupId:()=>mint("wakeup"),deliveryId:()=>mint("delivery")}}function defaultStoreRef(ctx){return{baseDir:ctx.sessionManager.getSessionFile()===void 0?join50(getAgentDir(),"extensions","loop","no-session"):join50(ctx.sessionManager.getSessionDir(),"extensions","loop"),sessionId:ctx.sessionManager.getSessionId()}}function emptyDeliveryState(){return{autonomousPreambleDelivered:!1,lastLoopFileDelivered:null,forceFullDelivery:!1}}function loopFileSnapshot(result3){return result3.found?{present:!0,path:result3.path,content:result3.content,mtimeMs:result3.fingerprint.mtimeMs,size:result3.fingerprint.size,contentHash:result3.fingerprint.contentHash}:{present:!1}}function sentinelFor(mode,loopFilePresent){return loopFilePresent?mode==="fixed"?"<<loop.md>>":"<<loop.md-dynamic>>":mode==="fixed"?"<<autonomous-loop>>":"<<autonomous-loop-dynamic>>"}function modeOf(entry){return entry.kind==="fixed"?"fixed":"dynamic"}function anchorPayloadOf(entry){if(entry.type==="custom")return entry.customType===LOOP_TICK_ENTRY_TYPE?entry.data:void 0;if(entry.type==="custom_message")return entry.customType===LOOP_TICK_ENTRY_TYPE?entry.details:void 0}function anchorPresent(ctx,loopId,deliveryId){return ctx.sessionManager.buildContextEntries().some(entry=>{let payload=anchorPayloadOf(entry);return payload===void 0||payload.loopId!==void 0&&payload.loopId!==loopId?!1:deliveryId===void 0?!0:payload.deliveryId===deliveryId})}function createLoopExtension(deps={}){let clock=deps.clock??{now:()=>Date.now()},makeTimers=deps.timers??createNodeTimerPort,ids=deps.ids??defaultIds(),storeRefOf=deps.storeRef??defaultStoreRef,resolveLoopFile2=deps.resolveLoopFile??(options=>resolveLoopFile({cwd:options.cwd,homeDir:options.homeDir,fs:nodeFs,path:{join:join50}})),readState2=deps.readState??readLoopState,writeState2=deps.writeState??writeLoopState;return pi=>{let ctx,scheduler,storeRef,timers=makeTimers(),storeFailure,sessionNamed=!1,attributedLoopId,attributedDeliveryId,attributionResolved=!1,deferredDispatches=[],deliveryStates=new Map,endedWithError=new Set,storeTouched=!1,persistTail=Promise.resolve(),ticker=new LoopStatusTicker({render:(key,text3)=>{try{ctx?.ui.setStatus(key,text3)}catch{}},now:()=>clock.now()});pi.registerEntryRenderer(LOOP_TICK_ENTRY_TYPE,renderLoopTickEntry),registerLoopTools(pi,{scheduler:{getWakeupTarget:()=>{if(scheduler===void 0||attributedLoopId===void 0)return null;let entry=scheduler.getState().entries[attributedLoopId];return entry===void 0||entry.phase==="ended"?null:{kind:entry.kind,loopId:entry.id}},scheduleWakeup:async request2=>{let result3=requireScheduler().onScheduleWakeup(request2);if(!result3.ok)throw new Error(`schedule_wakeup rejected: ${result3.reason}`);return attributionResolved=!0,await persist2(),refreshStatus(),{wakeupId:result3.wakeupId,...result3.replacedWakeupId===void 0?{}:{replacedWakeupId:result3.replacedWakeupId},dueAt:result3.dueAt,noopStreak:result3.noopStreak}},stopDynamicLoop:async request2=>(requireScheduler().stop(request2.loopId,"model-stop"),attributionResolved=!0,await persist2(),refreshStatus(),{endedAt:clock.now()})}});function requireScheduler(){if(scheduler===void 0)throw new Error("loop extension has no active session");return scheduler}function withDeliveryOverlay(state2){let entries={};for(let[id,entry]of Object.entries(state2.entries)){let delivery=deliveryStates.get(id);entries[id]=delivery===void 0?entry:{...entry,sentinelDelivery:delivery}}return{...state2,entries}}function persist2(){let ref=storeRef,active=scheduler;if(ref===void 0||active===void 0)return Promise.resolve();let snapshot=withDeliveryOverlay(active.getState());return!storeTouched&&Object.keys(snapshot.entries).length===0?Promise.resolve():(storeTouched=!0,persistTail=persistTail.then(async()=>{try{await writeState2(ref,snapshot)}catch(error2){failStore(error2,Object.keys(snapshot.entries))}}),persistTail)}function failStore(error2,loopIds){let message=error2 instanceof Error?error2.message:String(error2);timers.cancelAll();for(let loopId of loopIds)endedWithError.add(loopId);storeFailure={endReason:"error",message,loopIds},ticker.dispose(),ctx?.ui.notify(`/loop state could not be used and the affected loops were ended: ${message}`,"error")}function syncScheduleWakeupActivation(){if(scheduler===void 0)return;let wanted=Object.values(scheduler.getState().entries).some(entry=>entry.kind==="dynamic"&&entry.phase!=="ended"&&entry.phase!=="suspended"),active=pi.getActiveTools(),present=active.includes(SCHEDULE_WAKEUP_TOOL);wanted!==present&&pi.setActiveTools(wanted?[...active,SCHEDULE_WAKEUP_TOOL]:active.filter(name=>name!==SCHEDULE_WAKEUP_TOOL))}function refreshStatus(){if(syncScheduleWakeupActivation(),scheduler===void 0)return;let state2=scheduler.getState();if(Object.values(state2.entries).every(entry=>entry.phase==="ended")){ticker.running&&ticker.dispose();return}ticker.sync(state2)}function deliveryStateOf(loopId){return deliveryStates.get(loopId)??emptyDeliveryState()}function markForceFullDelivery(){for(let[id,state2]of deliveryStates)deliveryStates.set(id,{...state2,forceFullDelivery:!0});let active=scheduler;if(active!==void 0)for(let entry of Object.values(active.getState().entries))entry.phase!=="ended"&&(deliveryStates.has(entry.id)||deliveryStates.set(entry.id,{...entry.sentinelDelivery,forceFullDelivery:!0}))}function isExtensionCommandPayload(text3){if(!text3.startsWith("/"))return!1;let name=text3.slice(1).split(/\s+/)[0];return pi.getCommands().some(command=>command.name===name)}async function dispatchTick(tick){let entry=requireScheduler().getState().entries[tick.loopId];if(entry===void 0||entry.phase==="ended"||endedWithError.has(tick.loopId))return;let currentCtx=ctx;if(currentCtx===void 0)return;let mode=modeOf(entry),loopFile=entry.payload.type==="sentinel"?await resolveLoopFileSafely(currentCtx):{found:!1},built=buildTickMessage({loopId:entry.id,deliveryId:tick.deliveryId,mode,payload:entry.payload,reentryPrompt:entry.reentryPrompt,deliveryState:deliveryStateOf(entry.id),loopFile:loopFileSnapshot(loopFile)});deliveryStates.set(entry.id,built.deliveryState);let busy=!currentCtx.isIdle()||currentCtx.hasPendingMessages();if(busy&&isExtensionCommandPayload(built.text)){deferredDispatches.push(tick);return}let noopStreak=entry.noopStreak;pi.appendEntry(LOOP_TICK_ENTRY_TYPE,{loopId:entry.id,deliveryId:tick.deliveryId,scheduledForAt:tick.scheduledForAt,mode,delivery:built.delivery,...built.details.sentinel===void 0?{}:{sentinel:built.details.sentinel},noopStreak,folded:noopStreak>=2}),attributedLoopId=entry.id,attributedDeliveryId=tick.deliveryId,attributionResolved=!1,syncScheduleWakeupActivation(),pi.sendUserMessage(built.text,{expandPromptTemplates:!0,...busy?{deliverAs:"followUp"}:{}}),await persist2(),refreshStatus()}async function resolveLoopFileSafely(currentCtx){try{return await resolveLoopFile2({cwd:currentCtx.cwd,homeDir:homedir8()})}catch{return{found:!1}}}async function drainDeferred(){if(deferredDispatches.length===0)return;let pending=deferredDispatches.splice(0,deferredDispatches.length);for(let tick of pending)await dispatchTick(tick)}async function fireDue(loopId){let active=scheduler,currentCtx=ctx;if(active===void 0||currentCtx===void 0)return;let busy=!currentCtx.isIdle()||currentCtx.hasPendingMessages(),decision=active.onDue(loopId,clock.now(),busy);if(await persist2(),decision.action==="dispatch"){await dispatchTick(decision.tick);return}decision.action==="expire"&&ctx?.ui.notify("Loop expired after 7 days and is no longer armed.","info"),refreshStatus()}function handleTimerFire(loopId){fireDue(loopId).catch(error2=>{ctx?.ui.notify(`Loop tick failed: ${error2 instanceof Error?error2.message:String(error2)}`,"error")})}function payloadForPrompt(prompt){return{type:"prompt",prompt}}async function startFixed(request2){let active=requireScheduler(),effective=normalizeInterval(request2.requestedInterval),created=active.createFixed({originalArgs:request2.originalArgs,reentryPrompt:`/loop ${request2.originalArgs}`.trimEnd(),payload:payloadForPrompt(request2.prompt),requestedInterval:request2.requestedInterval,effectiveInterval:effective,cronExpression:describeCron(effective),intervalMs:effective.intervalMs});return created.ok?(deliveryStates.set(created.loopId,emptyDeliveryState()),await persist2(),nameSessionAfterLoop(request2.prompt),await fireDue(created.loopId),refreshStatus(),{ok:!0,loopId:created.loopId,...effective.roundingNotice===void 0?{}:{roundingNotice:effective.roundingNotice},cronExpression:describeCron(effective),effectiveCadence:effective.human,expiresAt:active.getState().entries[created.loopId]?.expiresAt}):{ok:!1,message:created.message}}async function startDynamic(request2){let active=requireScheduler(),created=active.createDynamic({originalArgs:request2.originalArgs,reentryPrompt:`/loop ${request2.originalArgs}`.trimEnd(),payload:payloadForPrompt(request2.prompt)});return created.ok?(deliveryStates.set(created.loopId,emptyDeliveryState()),await persist2(),nameSessionAfterLoop(request2.prompt),await fireDue(created.loopId),refreshStatus(),{ok:!0,loopId:created.loopId,...created.supersededLoopId===void 0?{}:{supersededLoopId:created.supersededLoopId},expiresAt:active.getState().entries[created.loopId]?.expiresAt}):{ok:!1,message:created.message}}async function startBare(request2){let active=requireScheduler(),currentCtx=ctx;if(currentCtx===void 0)return{ok:!1,message:"loop extension has no active session"};let loopFile=await resolveLoopFileSafely(currentCtx),mode=request2.interval===void 0?"dynamic":"fixed",payload={type:"sentinel",sentinel:sentinelFor(mode,loopFile.found)},reentryPrompt=request2.originalArgs.trim()===""?"/loop":`/loop ${request2.originalArgs.trim()}`,created=request2.interval===void 0?active.createDynamic({originalArgs:request2.originalArgs,reentryPrompt,payload}):(()=>{let effective=normalizeInterval(request2.interval);return active.createFixed({originalArgs:request2.originalArgs,reentryPrompt,payload,requestedInterval:request2.interval,effectiveInterval:effective,cronExpression:describeCron(effective),intervalMs:effective.intervalMs})})();return created.ok?(deliveryStates.set(created.loopId,emptyDeliveryState()),await persist2(),nameSessionAfterLoop(reentryPrompt),await fireDue(created.loopId),refreshStatus(),{ok:!0,loopId:created.loopId,expiresAt:active.getState().entries[created.loopId]?.expiresAt}):{ok:!1,message:created.message}}function nameSessionAfterLoop(prompt){sessionNamed||(sessionNamed=!0,pi.getSessionName()===void 0&&pi.setSessionName(`loop: ${prompt}`.trim()))}let controller={startFixed,startDynamic,startBare,fireDue,scheduleWakeup:async request2=>{requireScheduler().onScheduleWakeup(request2).ok&&(attributionResolved=!0),await persist2(),refreshStatus()},stop:async(target,detail)=>{let result3=requireScheduler().stop(target,detail);return await persist2(),refreshStatus(),result3.affectedLoopIds},pause:async target=>{let result3=requireScheduler().pause(target);return await persist2(),refreshStatus(),result3.affectedLoopIds},resume:async target=>{let result3=requireScheduler().resume(target);return await persist2(),refreshStatus(),result3.affectedLoopIds},getState:()=>requireScheduler().getState(),statusLine:()=>formatLoopStatus(requireScheduler().getState(),clock.now()),lastStoreFailure:()=>storeFailure,isEndedWithError:loopId=>endedWithError.has(loopId)};deps.onControllerReady?.(controller),registerLoopCommand(pi,{controller}),pi.on("session_start",async(_event,nextCtx)=>{ctx=nextCtx,timers.cancelAll(),timers=makeTimers(),storeFailure=void 0,endedWithError.clear(),storeTouched=!1,sessionNamed=!1,attributedLoopId=void 0,attributedDeliveryId=void 0,attributionResolved=!1,deferredDispatches.length=0,deliveryStates.clear(),storeRef=storeRefOf(nextCtx);let initialState;try{initialState=await readState2(storeRef)??void 0}catch(error2){failStore(error2,[]),scheduler=createLoopScheduler({sessionId:nextCtx.sessionManager.getSessionId(),clock,timers,ids,onFire:handleTimerFire});return}scheduler=createLoopScheduler({sessionId:nextCtx.sessionManager.getSessionId(),clock,timers,ids,onFire:handleTimerFire,...initialState===void 0?{}:{initialState}}),storeTouched=initialState!==void 0;for(let entry of Object.values(scheduler.getState().entries)){let anchorDeliveryId=entry.sentinelDelivery.lastLoopFileDelivered?.anchorDeliveryId,needsFull=!anchorPresent(nextCtx,entry.id,anchorDeliveryId)&&hasAnchoredDelivery(entry.sentinelDelivery);deliveryStates.set(entry.id,{...entry.sentinelDelivery,forceFullDelivery:entry.sentinelDelivery.forceFullDelivery||needsFull})}let restored=scheduler.restore(clock.now());await persist2(),refreshStatus();for(let tick of restored.recoveryTicks)await dispatchTick(tick);restored.expiredLoopIds.length>0&&nextCtx.ui.notify(`Loop expired after 7 days: ${restored.expiredLoopIds.join(", ")}`,"info")}),pi.on("session_compact",async event=>{event.accepted===!0&&(markForceFullDelivery(),await persist2())}),pi.on("input",async event=>{event.source!=="extension"&&(attributedLoopId=void 0,attributedDeliveryId=void 0,attributionResolved=!1)}),pi.on("agent_end",async event=>{if(event.willRetry!==!0){if(event.aborted===!0&&event.abortSource==="user"){await pauseAttributedLoop();return}await settleAttributedTick(event.aborted===!0?"error":"completed")}}),pi.on("agent_settled",async()=>{await settleAttributedTick("completed"),await drainDeferred(),refreshStatus()}),pi.on("session_abort",async()=>{await pauseAttributedLoop()}),pi.on("session_shutdown",async()=>{let active=scheduler;active!==void 0&&(active.onShutdown(),await persist2()),timers.cancelAll(),deferredDispatches.length=0,ticker.dispose(),attributedLoopId=void 0,attributedDeliveryId=void 0,attributionResolved=!1,ctx=void 0});async function pauseAttributedLoop(){let active=scheduler;if(active===void 0)return;let targets2=attributedLoopId===void 0?Object.values(active.getState().entries).filter(entry=>entry.phase!=="ended").map(entry=>entry.id):[attributedLoopId],paused=[];for(let loopId of targets2)active.onUserAbort(loopId).action==="paused"&&paused.push(loopId);attributedLoopId=void 0,attributedDeliveryId=void 0,attributionResolved=!1,paused.length!==0&&(await persist2(),refreshStatus(),ctx?.ui.notify("loop paused - /loop resume or /loop stop","info"))}async function settleAttributedTick(outcome){let active=scheduler,loopId=attributedLoopId,deliveryId=attributedDeliveryId;if(active===void 0||loopId===void 0)return;let entry=active.getState().entries[loopId];if(entry===void 0)return;let resolved=attributionResolved;attributedLoopId=void 0,attributedDeliveryId=void 0,attributionResolved=!1;let settled2=deliveryId===void 0?void 0:active.onTickSettled({loopId,deliveryId,outcome});if(await persist2(),!resolved&&entry.kind==="dynamic"){let keepalive=active.onTurnEndedWithoutSchedule(loopId);await persist2(),refreshStatus(),keepalive.action==="ended"&&ctx?.ui.notify(keepalive.endReason==="keepalive_exhausted"?"Loop ended: the model stopped scheduling wakeups.":"Loop expired after 7 days and is no longer armed.","info");return}settled2?.action==="dispatch"?await dispatchTick(settled2.tick):settled2?.action==="ended"&&ctx?.ui.notify(`Loop ended: ${settled2.endReason}.`,"info"),refreshStatus()}}}function hasAnchoredDelivery(state2){return state2.autonomousPreambleDelivered||state2.lastLoopFileDelivered!==null}var loop_default=createLoopExtension();function bigramCounts(text3){let counts=new Map;for(let i=0;i<text3.length-1;i++){let gram=text3.slice(i,i+2);counts.set(gram,(counts.get(gram)??0)+1)}return counts}function diceSimilarity(a,b){let totalA=0;for(let count2 of a.values())totalA+=count2;let totalB=0;for(let count2 of b.values())totalB+=count2;if(totalA===0&&totalB===0)return 1;if(totalA===0||totalB===0)return 0;let intersection=0,[small,large]=a.size<=b.size?[a,b]:[b,a];for(let[gram,count2]of small){let other=large.get(gram);other!==void 0&&(intersection+=Math.min(count2,other))}return 2*intersection/(totalA+totalB)}function meanAdjacentSimilarity(argStrings){if(argStrings.length<2)return 1;let grams=argStrings.map(bigramCounts),total=0;for(let i=0;i<grams.length-1;i++){let current=grams[i],next=grams[i+1];current===void 0||next===void 0||(total+=diceSimilarity(current,next))}return total/(grams.length-1)}var TARGET_FIELDS=new Map([["read",["path"]],["bash_output",["bash_id"]],["task_output",["task_id","name"]],["task_update",["task_id"]],["task_send",["to"]],["lsp_diagnostics",["filePath"]]]);function targetIdentity(record8){let fields=TARGET_FIELDS.get(record8.toolName);if(fields===void 0)return;let args;try{args=JSON.parse(record8.argsJson)}catch{return}if(!(typeof args!="object"||args===null||Array.isArray(args)))for(let field2 of fields){let value=Reflect.get(args,field2);if(typeof value=="string"&&value.length>0)return value}}function hasAllDistinctTargets(records){let identities2=[];for(let record8 of records){let identity=targetIdentity(record8);if(identity===void 0)return!1;identities2.push(identity)}return new Set(identities2).size===identities2.length}function detectIdenticalRun(records){let last=records[records.length-1];if(last===void 0)return;let run2=1;for(let i=records.length-2;i>=0&&records[i]?.signature===last.signature;i--)run2++;if(!(run2<3))return{kind:"identical",toolName:last.toolName,count:run2,fingerprint:last.signature}}function detectSimilarRun(records){let last=records[records.length-1];if(last===void 0)return;let run2=1;for(let i=records.length-2;i>=0&&records[i]?.toolName===last.toolName;i--)run2++;if(run2<5)return;let runRecords=records.slice(records.length-run2),argStrings=runRecords.map(record8=>record8.argsJson);if(new Set(argStrings).size===1||hasAllDistinctTargets(runRecords))return;let similarity=meanAdjacentSimilarity(argStrings);if(!(similarity<.85))return{kind:"similar",toolName:last.toolName,count:run2,similarity,fingerprint:last.toolName}}function detectCycle(records){let total=records.length;for(let period=2;period<=6;period++){if(total<period*3)continue;let cycle=records.slice(total-period);if(new Set(cycle.map(record8=>record8.signature)).size<2)continue;let repetitions=1;for(;repetitions*period+period<=total;){let blockStart=total-(repetitions+1)*period,matches2=!0;for(let offset=0;offset<period;offset++)if(records[blockStart+offset]?.signature!==cycle[offset]?.signature){matches2=!1;break}if(!matches2)break;repetitions++}if(!(repetitions<3))return{kind:"cycle",period,count:repetitions,cycleTools:cycle.map(record8=>record8.toolName),fingerprint:cycle.map(record8=>record8.signature).join("")}}}function maximumObservableCount(detection){switch(detection.kind){case"identical":case"similar":return 64;case"cycle":return Math.floor(64/detection.period)}}var NoticeGate=class{constructor(){this.entries=new Map}admit(detection){let maximumCount=maximumObservableCount(detection),existing2=this.entries.get(detection.kind);if(existing2===void 0||existing2.fingerprint!==detection.fingerprint)return this.entries.set(detection.kind,{fingerprint:detection.fingerprint,lastNotifiedCount:detection.count,saturationNotified:detection.count>=maximumCount}),!0;let reachedDoubledCount=detection.count>=existing2.lastNotifiedCount*2,reachedSaturation=!existing2.saturationNotified&&detection.count>=maximumCount;return reachedDoubledCount||reachedSaturation?(existing2.lastNotifiedCount=detection.count,reachedSaturation&&(existing2.saturationNotified=!0),!0):!1}prune(active){for(let[kind,entry]of this.entries)active.get(kind)!==entry.fingerprint&&this.entries.delete(kind)}reset(){this.entries.clear()}};function detectLoop(records,gate){let detections=[detectIdenticalRun(records),detectCycle(records),detectSimilarRun(records)],active=new Map;for(let detection of detections)detection!==void 0&&active.set(detection.kind,detection.fingerprint);gate.prune(active);for(let detection of detections)if(detection!==void 0&&gate.admit(detection))return detection}var ALLOW_DECISION={kind:"allow"},IdenticalLoopEscalation=class{constructor(){this.attempts=new Map}observeAttempt(toolCallId,record8){let patternChanged=this.episode!==void 0&&this.episode.fingerprint!==record8.signature;return patternChanged&&this.reset(),this.attempts.set(toolCallId,record8),patternChanged}observeNotice(detection){switch(detection.kind){case"similar":case"cycle":return;case"identical":(this.episode===void 0||this.episode.fingerprint!==detection.fingerprint)&&(this.episode={fingerprint:detection.fingerprint,toolName:detection.toolName,admittedNoticeCount:0,activateBlockAfterAttempt:!1,blockActive:!1,blockedCallCount:0,hardStopAnnounced:!1}),this.episode.admittedNoticeCount++,this.episode.admittedNoticeCount>=2&&(this.episode.activateBlockAfterAttempt=!0)}}finishTurn(){this.attempts.clear()}consumeToolCall(toolCallId){let attempt2=this.attempts.get(toolCallId);if(this.attempts.delete(toolCallId),attempt2===void 0||this.episode===void 0||this.episode.fingerprint!==attempt2.signature)return ALLOW_DECISION;if(!this.episode.blockActive)return this.episode.activateBlockAfterAttempt&&(this.episode.activateBlockAfterAttempt=!1,this.episode.blockActive=!0),ALLOW_DECISION;if(this.episode.blockedCallCount++,this.episode.blockedCallCount>=3){let announce=!this.episode.hardStopAnnounced;return this.episode.hardStopAnnounced=!0,{kind:"hardStop",toolName:this.episode.toolName,blockedCallCount:this.episode.blockedCallCount,announce}}return{kind:"block",toolName:this.episode.toolName,blockedCallCount:this.episode.blockedCallCount}}reset(){this.episode=void 0,this.attempts.clear()}};var LOOP_GUARD_NOTICE_CUSTOM_TYPE="loop-guard:notice",LOOP_GUARD_ESCALATION_CUSTOM_TYPE="loop-guard:escalation",LOOP_GUARD_RECOVERY_CUSTOM_TYPE="loop-guard:recovery",POLLING_TOOL_NAMES=new Set(["bash_output","task_output"]);function buildLoopGuardBlockReason(toolName,blockedCallCount){let recovery=POLLING_TOOL_NAMES.has(toolName)?"Stop polling this target. If you need to wait for a change, arm a monitor or rely on a completion notification when this mode supports it; otherwise re-plan or choose a different tool.":"Reuse the existing result, stop repeating this call, and re-plan from the current goal or choose a different tool.";return[`Loop guard blocked repeated call ${blockedCallCount} to \`${toolName}\` with arguments that already triggered two identical-call warnings.`,recovery].join(" ")}function buildLoopGuardHardStopWarning(toolName,blockedCallCount){return`Loop guard interrupted the turn after blocking ${blockedCallCount} repeated calls to ${toolName}.`}function buildLoopGuardHardStopSteer(toolName){return[`The loop guard stopped the previous turn because you kept calling \`${toolName}\` with arguments that had already been blocked.`,"Do not repeat that call. Re-plan from the current goal and use a different tool or deliberately changed arguments."].join(" ")}function buildLoopGuardReminder(detection){switch(detection.kind){case"identical":{let{toolName,count:count2}=detection;return["<system-reminder>",`LOOP GUARD - IDENTICAL TOOL CALLS: you called \`${toolName}\` ${count2} times in a row with the EXACT same arguments. This is the tool-call stream, not consecutive text - another tool ran between these calls and it changed nothing about your plan. Re-issuing the same call returns the same result. Snap out of it:`,"- reuse the result you already received from this exact call;","- if you were re-checking for new output or state, switch to the monitor/watch tool or change one parameter deliberately (filter, offset, query);","- if nothing is actually changing, stop calling this tool, state what is blocking you, and try a different tool or ask the user.",`Do not call \`${toolName}\` again with identical arguments.`,"</system-reminder>"].join(`
|
|
714
713
|
`)}case"similar":{let{toolName,count:count2,similarity}=detection,percent=Math.round(similarity*100);return["<system-reminder>",`LOOP GUARD - NEAR-IDENTICAL TOOL CALLS: your last ${count2} calls to \`${toolName}\` had arguments about ${percent}% identical (bigram similarity over canonical args). This may be legitimate batch work - or it may be a lazy loop that only LOOKS like progress. Attention check:`,"- if these calls target genuinely different inputs (distinct files, queries, offsets), continue deliberately - but consider batching or widening the scope instead of one call per tiny variation;","- if you are scanning output incrementally (reads, peeks, polls), widen the window once or use the monitor/watch tool rather than nudging parameters;","- if the results keep saying the same thing, change strategy now - a different tool, a wider query, or asking the user beats a sixth near-copy.","</system-reminder>"].join(`
|
|
715
714
|
`)}case"cycle":{let{period,count:count2,cycleTools}=detection;return["<system-reminder>",`LOOP GUARD - REPEATING TOOL-CALL PATTERN: your recent tool calls repeat the cycle [${cycleTools.join(" -> ")}] ${count2} times (period ${period}), with other calls possibly interleaved between repetitions. A fixed rotation usually means waiting, guessing, or searching without a discriminator:`,"- if this is a wait/poll rotation (spawn then peek, write then check), replace the rotation with the monitor/watch tool and react to the decisive event instead;","- if this is a search rotation, change ONE axis decisively: broader query, different tool, or a different source - repeating the same rotation at the same parameters will not find new information;","- if the cycle is genuinely progressing (each rotation moves distinct work forward), keep going - but say what each rotation accomplished so the next rotation can end.","</system-reminder>"].join(`
|
|
716
|
-
`)}}}var renderLoopGuardNotice=noticeMessageRenderer(message=>{let details=message.details;if(details!==void 0)return{title:titleLine2(details),why:whyLine2(details),expandedLine:expandedLine2(details)}}),renderLoopGuardEscalation=noticeMessageRenderer(message=>{let details=message.details;if(details!==void 0)return{title:`! Loop guard \xB7 turn interrupted (${details.toolName})`,tone:"error",why:`The agent ignored two warnings and repeated ${details.blockedCallCount} calls after blocking began.`,expandedLine:"A user-role recovery message was queued and the active turn was stopped by a system abort."}});function titleLine2(detection){switch(detection.kind){case"identical":return`\u26A0 Loop guard \xB7 identical calls \xD7${detection.count} (${detection.toolName})`;case"similar":return`\u26A0 Loop guard \xB7 near-identical calls \xD7${detection.count} (${detection.toolName})`;case"cycle":return`\u26A0 Loop guard \xB7 repeating pattern \xD7${detection.count} (period ${detection.period})`}}function whyLine2(detection){switch(detection.kind){case"identical":return"Same tool, same arguments, again. The agent was told to reuse the result or change the call.";case"similar":return`Argument similarity ~${Math.round(detection.similarity*100)}%. The agent was told to verify this is distinct work, not a lazy loop.`;case"cycle":return`Tool-call cycle [${detection.cycleTools.join(" -> ")}]. The agent was told to break the rotation or justify the progress.`}}function expandedLine2(detection){switch(detection.kind){case"identical":return`tool ${detection.toolName} \xB7 ${detection.count} consecutive identical calls when the reminder fired`;case"similar":return`tool ${detection.toolName} \xB7 ${detection.count} consecutive same-tool calls at ~${Math.round(detection.similarity*100)}% args similarity`;case"cycle":return`cycle ${detection.cycleTools.join(" -> ")} \xB7 ${detection.count} full repetitions in the tracked window`}}function canonicalizeArgs(args){return stableStringify(args??{})}function stableStringify(value){if(value===null||typeof value!="object")return JSON.stringify(value)??"null";if(Array.isArray(value))return`[${value.map(item=>stableStringify(item)).join(",")}]`;let record8=value,keys=Object.keys(record8).sort(),parts=[];for(let key of keys){let entry=record8[key];entry!==void 0&&parts.push(`${JSON.stringify(key)}:${stableStringify(entry)}`)}return`{${parts.join(",")}}`}var ToolCallTracker=class{constructor(){this.calls=[]}record(toolName,args){let argsJson=canonicalizeArgs(args),record8={toolName,argsJson,signature:`${toolName}\0${argsJson}`};return this.calls.push(record8),this.calls.length>64&&(this.calls=this.calls.slice(-64)),record8}get records(){return this.calls}reset(){this.calls=[]}};var LOOP_GUARD_HARD_STOP_WAKE_SOURCE="loop-guard-hard-stop";function loopGuardExtension(pi){let tracker=new ToolCallTracker,gate=new NoticeGate,escalation=new IdenticalLoopEscalation,pendingRecoveryToolName,recoveryWakeSourceActive=!1,continuationHoldActive=!1,setRecoveryWakeSourceActive=active=>{recoveryWakeSourceActive!==active&&(recoveryWakeSourceActive=active,pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:LOOP_GUARD_HARD_STOP_WAKE_SOURCE,activeCount:active?1:0}))},setContinuationHoldActive=active=>{continuationHoldActive!==active&&(continuationHoldActive=active,pi.events?.emit(CONTINUATION_HOLD_STATE_EVENT,{source:LOOP_GUARD_HARD_STOP_WAKE_SOURCE,active}))},reset=()=>{tracker.reset(),gate.reset(),escalation.reset(),pendingRecoveryToolName=void 0,setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1)};pi.registerMessageRenderer(LOOP_GUARD_NOTICE_CUSTOM_TYPE,renderLoopGuardNotice),pi.registerMessageRenderer(LOOP_GUARD_ESCALATION_CUSTOM_TYPE,renderLoopGuardEscalation),pi.on("session_start",()=>reset()),pi.on("session_shutdown",()=>reset()),pi.on("input",event=>{event.source!=="extension"&&reset()}),pi.on("tool_execution_start",event=>{let record8=tracker.record(event.toolName,event.args);escalation.observeAttempt(event.toolCallId,record8)&&(pendingRecoveryToolName=void 0,setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1));let detection=detectLoop(tracker.records,gate);detection!==void 0&&(escalation.observeNotice(detection),pi.sendMessage({customType:LOOP_GUARD_NOTICE_CUSTOM_TYPE,content:buildLoopGuardReminder(detection),display:!0,details:detection},{triggerTurn:!1,deliverAs:"steer"}))}),pi.on("turn_end",()=>{escalation.finishTurn()}),pi.on("tool_call",(event,ctx)=>{let decision=escalation.consumeToolCall(event.toolCallId);switch(decision.kind){case"allow":return;case"block":return{block:!0,reason:buildLoopGuardBlockReason(decision.toolName,decision.blockedCallCount),terminate:!1};case"hardStop":{let warning=buildLoopGuardHardStopWarning(decision.toolName,decision.blockedCallCount);return setRecoveryWakeSourceActive(!0),decision.announce||setContinuationHoldActive(!0),decision.announce&&(pi.sendMessage({customType:LOOP_GUARD_ESCALATION_CUSTOM_TYPE,content:warning,display:!0,details:{toolName:decision.toolName,blockedCallCount:decision.blockedCallCount}},{triggerTurn:!1,deliverAs:"steer"}),ctx.hasUI&&ctx.ui.notify(warning,"warning"),pendingRecoveryToolName=decision.toolName),ctx.abort("system"),{block:!0,reason:buildLoopGuardBlockReason(decision.toolName,decision.blockedCallCount),terminate:!1}}}}),pi.on("agent_start",()=>{setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1)}),pi.on("agent_settled",()=>{let toolName=pendingRecoveryToolName;toolName!==void 0&&(pendingRecoveryToolName=void 0,pi.sendMessage({customType:LOOP_GUARD_RECOVERY_CUSTOM_TYPE,content:buildLoopGuardHardStopSteer(toolName),display:!1},{triggerTurn:!0}))})}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";var CLAUDE_VERSIONED_MODEL_ID=/^claude-(?:opus|sonnet|fable)-(\d+)(?:-(\d+))?(?:-|$)/;function isSupportedModel(model){return model.compat?.supportsToolReferences??defaultSupportsToolSearch(model)}function defaultSupportsToolSearch(model){if(model.provider!=="anthropic"||model.id.includes("haiku"))return!1;let version=model.id.match(CLAUDE_VERSIONED_MODEL_ID);if(!version)return!1;let major=Number(version[1]),rawMinor=version[2],minor=rawMinor!==void 0&&rawMinor.length<8?Number(rawMinor):0;return major>4||major===4&&minor>=5}function supportsAnthropicNativeToolSearch(target){return target===void 0?!1:typeof target=="string"?target==="anthropic-messages":target.api!=="anthropic-messages"?!1:isSupportedModel(target)}var ANTHROPIC_TOOL_SEARCH_TYPE="tool_search_tool_bm25_20251119",ANTHROPIC_TOOL_SEARCH_NAME="tool_search_tool_bm25",ANTHROPIC_MAX_TOOLS=1e4,scopedMcpNativeToolSearchGate=new AsyncLocalStorage5,mcpNativeToolSearchGate=()=>!1;function installMcpNativeToolSearchGate(gate){mcpNativeToolSearchGate=gate,scopedMcpNativeToolSearchGate.enterWith(gate)}function isMcpNativeToolSearchEnabled(){return(scopedMcpNativeToolSearchGate.getStore()??mcpNativeToolSearchGate)()}function isRecord33(value){return typeof value=="object"&&value!==null}function addAnthropicNativeToolSearch(target,payload,config){if(!supportsAnthropicNativeToolSearch(target)||!isRecord33(payload))return payload;let tools=Array.isArray(payload.tools)?payload.tools:[],injected=injectInactiveCatalogTools(tools,config);if(injected.length>ANTHROPIC_MAX_TOOLS)return payload;let deferred=injected.map(tool=>maybeDefer(tool,config)),nextTools=deferred.some(tool=>isRecord33(tool)&&tool.type===ANTHROPIC_TOOL_SEARCH_TYPE)?deferred:[...deferred,{type:ANTHROPIC_TOOL_SEARCH_TYPE,name:ANTHROPIC_TOOL_SEARCH_NAME}];return nextTools.length>ANTHROPIC_MAX_TOOLS?payload:{...payload,tools:nextTools}}function injectInactiveCatalogTools(tools,config){let catalog=config.getCatalog?.()??[],residentNames=new Set(tools.flatMap(tool=>isRecord33(tool)&&typeof tool.name=="string"?[tool.name]:[])),injected=[...tools];for(let doc of catalog){if(doc.name===config.searchToolName||residentNames.has(doc.name)||!config.isDeferrable(doc.name))continue;let definition=config.getToolDefinition?.(doc.name);definition?.parameters!==void 0&&(injected.push({name:doc.name,description:definition.description??doc.description??doc.label,input_schema:anthropicInputSchema(definition.parameters),defer_loading:!0}),residentNames.add(doc.name))}return injected}function anthropicInputSchema(parameters){if(!isRecord33(parameters)||parameters.type==="object")return parameters;let resolved=resolveRootObjectSchema(parameters);return resolved.type==="object"?resolved:{...resolved,type:"object"}}function maybeDefer(tool,config){if(!isRecord33(tool))return tool;let name=typeof tool.name=="string"?tool.name:void 0;return name===void 0||name===config.searchToolName||!config.isDeferrable(name)||"cache_control"in tool||tool.defer_loading===!0?tool:{...tool,defer_loading:!0}}var AnthropicNativeToolSearchAdapter=class{#disabled=!1;#injectedLastRequest=!1;#fallbackReason=null;#deps;constructor(deps){this.#deps=deps}applyBeforeRequest(target,payload){if(this.#injectedLastRequest=!1,this.#disabled||!this.#deps.enabled())return payload;let next=addAnthropicNativeToolSearch(target,payload,this.#deps);return this.#injectedLastRequest=next!==payload,next}noteResponseStatus(status){status!==400||!this.#injectedLastRequest||this.#disabled||(this.#disabled=!0,this.#fallbackReason="Anthropic returned 400 for native tool-search; disabled it and fell back to local tool_search for this session.",this.#deps.onFallback?.(this.#fallbackReason))}get disabled(){return this.#disabled}get fallbackReason(){return this.#fallbackReason}};import{createServer}from"node:http";async function openCallbackChannel(options){if(options.overrideUrl!==void 0&&options.overrideUrl.length>0)return{redirectUrl:options.overrideUrl,usesLoopback:!1,waitForCode:()=>Promise.reject(new OAuthFlowError("headless",`MCP server ${options.serverName} uses a callback URL override; complete with /mcp auth-complete <redirect-url>.`,{serverName:options.serverName})),close:()=>Promise.resolve()};let server=new LoopbackCallbackServer(options);return{redirectUrl:await server.start(),usesLoopback:!0,waitForCode:()=>server.waitForCode(),close:()=>server.close()}}var DEFAULT_TIMEOUT_MS=300*1e3,SUCCESS_HTML="<!doctype html><title>senpi</title><p>Authorization complete. You can close this tab.</p>",FAILURE_HTML="<!doctype html><title>senpi</title><p>Authorization failed. Return to senpi and retry.</p>",LoopbackCallbackServer=class{#options;#server;#redirectUrl;#result;#resolve;#reject;#timer;#settled=!1;constructor(options){this.#options=options}get redirectUrl(){return this.#redirectUrl}get#sink(){let logger=this.#options.logger;return{logger:{error:(message,data)=>logger?.error(message,data)}}}async start(){let host=this.#options.host??"127.0.0.1",path14=this.#options.path??"/callback",server=createServer((req,res)=>this.#handle(req,res,path14));server.unref(),this.#server=server,await this.#listen(server,host,this.#options.port??0);let address=server.address();return this.#redirectUrl=`http://${host}:${address.port}${path14}`,this.#result=new Promise((resolve53,reject)=>{this.#resolve=resolve53,this.#reject=reject}),this.#timer=safeTimer("auth.callback.timeout",this.#options.timeoutMs??DEFAULT_TIMEOUT_MS,()=>this.#fail(new OAuthFlowError("needs_auth",`MCP server ${this.#options.serverName} authorization timed out after 5 minutes.`,{serverName:this.#options.serverName})),this.#sink),this.#redirectUrl}waitForCode(){if(this.#result===void 0)throw new Error("callback server not started");return this.#result}async close(){this.#timer!==void 0&&clearTimeout(this.#timer);let server=this.#server;this.#server=void 0,server!==void 0&&await new Promise(resolve53=>server.close(()=>resolve53()))}#listen(server,host,port){return new Promise((resolve53,reject)=>{let onError=error2=>{let detail=error2.code==="EADDRINUSE"?`port ${port} is already in use (another senpi auth flow may be running); free it or configure a different callback.`:error2.message;reject(new OAuthFlowError("needs_auth",`MCP server ${this.#options.serverName} callback listener failed: ${detail}`,{cause:error2,serverName:this.#options.serverName}))};server.once("error",onError),server.listen(port,host,()=>{server.removeListener("error",onError),resolve53()})})}#handle(req,res,path14){let url=new URL(req.url??"/",this.#redirectUrl);if(url.pathname!==path14){res.writeHead(404).end();return}let code=url.searchParams.get("code"),state2=url.searchParams.get("state")??void 0;if(url.searchParams.get("error")!==null||code===null||state2===void 0||!this.#options.validateState(state2)){res.writeHead(400,{"content-type":"text/html"}).end(FAILURE_HTML),this.#fail(new OAuthFlowError("state_mismatch",`MCP server ${this.#options.serverName} authorization state did not match (possible CSRF or a stale/replayed link); restart the auth flow.`,{serverName:this.#options.serverName}));return}res.writeHead(200,{"content-type":"text/html"}).end(SUCCESS_HTML),this.#succeed({code,state:state2,iss:url.searchParams.get("iss")??void 0})}#succeed(result3){this.#settled||(this.#settled=!0,this.#timer!==void 0&&clearTimeout(this.#timer),this.#resolve?.(result3),this.close())}async#fail(error2){this.#settled||(this.#settled=!0,this.#reject?.(error2),await this.close())}};import{randomBytes as randomBytes4}from"node:crypto";var REFRESH_LEEWAY_MS=300*1e3;function tokenExpiresAt(tokens,now2=Date.now()){if(tokens.expires_in!==void 0)return now2+tokens.expires_in*1e3}function sameAuthorizationServer(a,b){let normalize4=value=>{try{return new URL(value).href.replace(/\/$/,"")}catch(error2){if(error2 instanceof TypeError)return value.replace(/\/$/,"");throw error2}};return normalize4(a)===normalize4(b)}function storedGrantIssuer(record8){return record8?.issuer??record8?.discoveryState?.authorizationServerUrl?.toString()}function freezeGrantAttribution(record8){let next={...record8??{}};if(next.issuer!==void 0||next.accessToken===void 0&&next.refreshToken===void 0)return next;let issuer=storedGrantIssuer(next);return issuer!==void 0?next.issuer=issuer:delete next.refreshToken,next}function storedAuthToTokens(record8,now2=Date.now()){if(record8?.accessToken===void 0||record8.accessToken.length===0)return;let expiresIn=record8.expiresAt===void 0?void 0:Math.max(0,Math.ceil((record8.expiresAt-now2)/1e3)),issuer=storedGrantIssuer(record8);return{access_token:record8.accessToken,refresh_token:issuer===void 0?void 0:record8.refreshToken,token_type:"Bearer",...expiresIn===void 0?{}:{expires_in:expiresIn},...issuer===void 0?{}:{issuer}}}function mergeTokensIntoStoredAuth(current,tokens,serverUrl,issuer){let next={...current??{},accessToken:tokens.access_token,resource:current?.resource??serverUrl},refreshToken=tokens.refresh_token??current?.refreshToken;refreshToken!==void 0&&(next.refreshToken=refreshToken);let expiresAt=tokenExpiresAt(tokens);expiresAt!==void 0?next.expiresAt=expiresAt:delete next.expiresAt;let stamp=tokens.issuer??issuer;return stamp!==void 0&&(next.issuer=stamp),next}var McpOAuthProvider=class{#options;#expectedState;#lastAuthorizationUrl;constructor(options){this.#options=options}get lastAuthorizationUrl(){return this.#lastAuthorizationUrl}get redirectUrl(){return this.#options.redirectUrl}get clientMetadataUrl(){return this.#options.clientMetadataUrl}get clientMetadata(){let redirect=this.#options.redirectUrl;return{redirect_uris:redirect===void 0?[]:[String(redirect)],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",client_name:"senpi",scope:this.#options.scopes?.join(" ")}}state(){return this.#expectedState=randomBytes4(16).toString("base64url"),this.#expectedState}consumeState(candidate){let expected=this.#expectedState;return this.#expectedState=void 0,expected!==void 0&&candidate===expected}clientInformation(){return this.#options.clientId!==void 0?{client_id:this.#options.clientId}:this.#options.clientMetadataUrl!==void 0?{client_id:this.#options.clientMetadataUrl}:this.#store.read()?.clientInfo}async saveClientInformation(info){await this.#store.update(current=>({...current??{},clientInfo:info}))}async saveDiscoveryState(state2){await this.#store.update(current=>({...freezeGrantAttribution(current),discoveryState:state2}))}discoveryState(){return this.#store.read()?.discoveryState}tokens(){return storedAuthToTokens(this.#store.read())}async saveTokens(tokens){await this.#store.update(current=>mergeTokensIntoStoredAuth(current,tokens,this.serverUrl)),this.#logFingerprint("saveTokens",tokens.access_token)}async saveCodeVerifier(codeVerifier){await this.#store.update(current=>({...current??{},codeVerifier}))}codeVerifier(){let verifier=this.#store.read()?.codeVerifier;if(verifier===void 0||verifier.length===0)throw new OAuthFlowError("no_verifier",`Missing PKCE code verifier for MCP server ${this.serverName}`,{serverName:this.serverName});return verifier}async redirectToAuthorization(authorizationUrl){this.#lastAuthorizationUrl=authorizationUrl,await this.#options.onRedirect?.(authorizationUrl)}validateResourceURL(serverUrl,resource){return Promise.resolve(new URL(resource??String(serverUrl)))}async invalidateCredentials(scope){if(scope==="all"){await this.#store.clear();return}await this.#store.update(current=>{if(current===void 0)return current;let next={...current};return scope==="tokens"&&(delete next.accessToken,delete next.refreshToken,delete next.expiresAt),scope==="verifier"&&(next.codeVerifier=void 0),scope==="client"&&(next.clientInfo=void 0),scope==="discovery"&&(next.discoveryState=void 0),next})}get serverName(){return this.#options.serverName}get serverUrl(){return this.#options.serverUrl}get store(){return this.#options.store}get scopes(){return this.#options.scopes}get#store(){return this.#options.store}#logFingerprint(event,secret){this.#options.logger?.info(`oauth ${event}`,{token_fp:fingerprintSecret(secret)})}};var OPTIONAL_OAUTH_FIELDS=new Set(["expires_in","refresh_token","scope","id_token","client_secret","client_secret_expires_at","client_id_issued_at","registration_access_token","registration_client_uri"]);function withoutAbsentOptionalFields(body){if(body===null||typeof body!="object"||Array.isArray(body))return body;let changed=!1,next={};for(let[key,value]of Object.entries(body)){if(OPTIONAL_OAUTH_FIELDS.has(key)&&(value===null||value==="")){changed=!0;continue}next[key]=value}return changed?next:body}function oauthFetch(base=(input,init)=>fetch(input,init)){return async(input,init)=>{let response=await base(input,init);if(!(response.headers.get("content-type")??"").includes("application/json"))return response;let text3=await response.text(),body;try{body=JSON.parse(text3)}catch{return new Response(text3,response)}let normalized2=withoutAbsentOptionalFields(body);return new Response(normalized2===body?text3:JSON.stringify(normalized2),response)}}function isTokenStale(record8,now2){let token=record8?.accessToken;return token===void 0||token.length===0?!0:record8?.expiresAt===void 0?!1:record8.expiresAt-now2<=REFRESH_LEEWAY_MS}function assertS256Supported(metadata,serverName2){let methods=metadata?.code_challenge_methods_supported;if(methods===void 0||!methods.includes("S256"))throw new OAuthFlowError("s256_unsupported",`MCP server ${serverName2} authorization server does not advertise PKCE S256 (code_challenge_methods_supported); refusing to authorize without proof-key protection.`,{serverName:serverName2})}var McpRefreshManager=class{#provider;#options;#inflight;constructor(provider,options={}){this.#provider=provider,this.#options=options}async ensureFresh(){let record8=await this.#provider.store.readAsync();if(record8?.accessToken!==void 0)return isTokenStale(record8,Date.now())?this.refresh():storedAuthToTokens(record8)}refresh(){if(this.#inflight!==void 0)return this.#inflight;let run2=this.#refreshLocked().finally(()=>{this.#inflight=void 0});return this.#inflight=run2,run2}#refreshLocked(){return this.#provider.store.withLock(async()=>{let current=this.#provider.store.readUnlocked();if(current?.accessToken!==void 0&&!isTokenStale(current,Date.now())){let tokens=storedAuthToTokens(current);if(tokens!==void 0)return tokens}let refreshToken=current?.refreshToken;if(current===void 0||refreshToken===void 0)throw new OAuthFlowError("needs_auth",`MCP server ${this.#provider.serverName} has no refresh token`,{serverName:this.#provider.serverName});return this.#doRefresh(current,refreshToken)})}async#doRefresh(current,refreshToken){let info=await this.#discover(),issuer=storedGrantIssuer(current),authorizationServer=String(info.authorizationServerUrl);if(issuer===void 0||!sameAuthorizationServer(issuer,authorizationServer))throw this.#provider.store.writeUnlocked(void 0),new OAuthFlowError("needs_auth",issuer===void 0?`MCP server ${this.#provider.serverName} has a saved sign-in with no record of the authorization server that issued it; credentials cleared, re-authentication required.`:`MCP server ${this.#provider.serverName} now uses authorization server ${authorizationServer}, but its saved sign-in was issued by ${issuer}; credentials cleared, re-authentication required.`,{serverName:this.#provider.serverName});let clientInformation=this.#provider.clientInformation();if(clientInformation===void 0)throw new OAuthFlowError("needs_auth",`MCP server ${this.#provider.serverName} is not registered`,{serverName:this.#provider.serverName});let resource=new URL(current.resource??this.#provider.serverUrl),{refreshAuthorization}=await loadMcpSdkAuth(),maxRetries=this.#options.maxRetries??2;for(let attempt2=0;;attempt2++)try{let tokens=await refreshAuthorization(info.authorizationServerUrl,{metadata:info.authorizationServerMetadata,clientInformation,refreshToken,resource,fetchFn:oauthFetch(this.#options.fetchFn)});return this.#provider.store.writeUnlocked(mergeTokensIntoStoredAuth(current,tokens,this.#provider.serverUrl,authorizationServer)),{...tokens,issuer:authorizationServer}}catch(error2){if(isInvalidGrant(error2))throw this.#provider.store.writeUnlocked(void 0),new OAuthFlowError("invalid_grant",`MCP server ${this.#provider.serverName} refresh rejected (invalid_grant); credentials cleared, re-authentication required.`,{cause:error2,serverName:this.#provider.serverName});if(isTransientTokenError(error2)&&attempt2<maxRetries){await safeDelay(this.#options.retryDelayMs??50);continue}throw new OAuthFlowError("transient",`MCP server ${this.#provider.serverName} token refresh failed transiently; will retry on next use.`,{cause:error2,retriable:!0,serverName:this.#provider.serverName})}}async#discover(){if(this.#options.discover!==void 0)return this.#options.discover(this.#provider.serverUrl);let{discoverOAuthServerInfo}=await loadMcpSdkAuth();return discoverOAuthServerInfo(this.#provider.serverUrl,{fetchFn:oauthFetch(this.#options.fetchFn)})}};var import_proper_lockfile4=__toESM(require_proper_lockfile(),1);import{createHash as createHash17,randomBytes as randomBytes5}from"node:crypto";import{chmodSync as chmodSync7,existsSync as existsSync25,mkdirSync as mkdirSync15,readFileSync as readFileSync31,renameSync as renameSync9,rmSync as rmSync6,writeFileSync as writeFileSync15}from"node:fs";import{join as join51}from"node:path";import{closeSync as closeSync5,mkdirSync as mkdirSync14,openSync as openSync5,rmSync as rmSync5,statSync as statSync12}from"node:fs";import{open as open7,rm as rm8,stat as stat7}from"node:fs/promises";async function acquireLegacyLock(path14,stale){let deadline=Date.now()+stale;for(;;)try{let file=await open7(path14,"wx",384);return async()=>{try{await file.close()}finally{await rm8(path14,{force:!0})}}}catch(error2){if(!(error2 instanceof Error)||!("code"in error2)||error2.code!=="EEXIST")throw error2;try{if(Date.now()-(await stat7(path14)).mtimeMs>=stale){await rm8(path14,{force:!0});continue}}catch(error3){if(error3 instanceof Error&&"code"in error3&&error3.code==="ENOENT")continue;throw error3}if(Date.now()>=deadline)throw new Error("Legacy OAuth migration lock acquisition timed out");await safeDelay(20)}}function adoptLegacyRecord(options){let release4=acquireSync(options);try{return claim(options)}finally{release4()}}async function readRecordAsync(options){let record8=options.read(options.tokensPath);if(record8!==void 0)return record8;mkdirSync14(options.rootDir,{mode:448,recursive:!0});let release4;try{release4=options.disableLock?async()=>{}:await acquireLegacyLock(options.lockPath,options.stale)}catch(cause){throw options.lockError(cause)}try{return claim(options)}finally{await release4()}}function claim(options){let legacy=options.read(options.legacyTokens);if(legacy===void 0)return;let existing2=options.read(options.tokensPath);return existing2!==void 0?(rmSync5(options.legacyTokens,{force:!0}),existing2):(options.write(legacy),rmSync5(options.legacyTokens,{force:!0}),legacy)}function acquireSync(options){if(options.disableLock)return()=>{};mkdirSync14(options.rootDir,{mode:448,recursive:!0});let deadline=Date.now()+options.stale;for(;;){let fd;try{fd=openSync5(options.lockPath,"wx",384);let file=fd;return()=>{try{closeSync5(file)}catch{}rmSync5(options.lockPath,{force:!0})}}catch(cause){if(fd!==void 0&&closeSync5(fd),!(cause instanceof Error)||!("code"in cause)||cause.code!=="EEXIST")throw cause;let age;try{age=Date.now()-statSync12(options.lockPath).mtimeMs}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")continue;throw error2}if(age>=options.stale){rmSync5(options.lockPath,{force:!0});continue}if(Date.now()>=deadline)throw options.lockError(new Error(`legacy migration lock held for ${age}ms`));let until=Date.now()+20;for(;Date.now()<until;);}}}var AUTH_ROOT="mcp-auth",TOKENS_FILE="tokens.json",INDEX_FILE="index.json",DEFAULT_LOCK={retries:50,stale:3e4},LockAcquireError=class extends Error{constructor(lockPath,cause){super(`Could not acquire MCP auth lock at ${lockPath}: ${cause instanceof Error?cause.message:String(cause)}`),this.name="LockAcquireError",this.lockPath=lockPath}};function hashServerUrl(serverUrl){return createHash17("sha256").update(serverUrl).digest("hex")}function hashServerKey(serverName2,serverUrl){return createHash17("sha256").update(`${serverName2}\0${serverUrl}`).digest("hex")}var McpTokenStore=class{#agentDir;#hash;#legacyHash;#lock;#disableLock;constructor(options){this.serverName=options.serverName,this.serverUrl=options.serverUrl,this.#agentDir=options.agentDir??getAgentDir(),this.#hash=hashServerKey(options.serverName,options.serverUrl),this.#legacyHash=hashServerUrl(options.serverUrl),this.#lock={...DEFAULT_LOCK,...options.lock},this.#disableLock=options.disableLock??!1}get rootDir(){return join51(this.#agentDir,AUTH_ROOT)}get dir(){return join51(this.rootDir,this.#hash)}get tokensPath(){return join51(this.dir,TOKENS_FILE)}get lockPath(){return join51(this.dir,`${TOKENS_FILE}.lock`)}get legacyDir(){return join51(this.rootDir,this.#legacyHash)}get#legacyLockFile(){return join51(this.rootDir,`${this.#legacyHash}.migrate.lock`)}read(){let record8=readJsonFile(this.tokensPath);return record8!==void 0?record8:adoptLegacyRecord(this.#migration())}async readAsync(){return readRecordAsync(this.#migration())}#migration(){return{rootDir:this.rootDir,lockPath:this.#legacyLockFile,legacyTokens:join51(this.legacyDir,TOKENS_FILE),tokensPath:this.tokensPath,stale:this.#lock.stale,disableLock:this.#disableLock,read:readJsonFile,write:record8=>this.writeUnlocked(record8),lockError:cause=>new LockAcquireError(this.#legacyLockFile,cause)}}async update(mutate){let release4=await this.#acquire();try{let next=mutate(this.read());return next===void 0?this.#removeRecord():(this.#writeAtomic(next),this.#writeIndex()),next}finally{await release4()}}async write(record8){await this.update(()=>record8)}async withLock(fn){let release4=await this.#acquire();try{return await fn()}finally{await release4()}}readUnlocked(){return this.read()}writeUnlocked(record8){if(record8===void 0){this.#removeRecord();return}this.#writeAtomic(record8),this.#writeIndex()}async clear(){let release4=await this.#acquire();try{rmSync6(this.dir,{force:!0,recursive:!0}),rmSync6(join51(this.legacyDir,TOKENS_FILE),{force:!0})}finally{await release4().catch(()=>{})}removeIndexEntry(this.rootDir,this.serverName,this.#hash)}#ensureDir(){mkdirSync15(this.dir,{mode:448,recursive:!0}),chmodSync7(this.dir,448)}async#acquire(){if(this.#ensureDir(),this.#disableLock)return()=>Promise.resolve();try{return await import_proper_lockfile4.default.lock(this.dir,{lockfilePath:this.lockPath,realpath:!1,retries:{retries:this.#lock.retries,factor:1.2,minTimeout:20,maxTimeout:200},stale:this.#lock.stale})}catch(cause){throw new LockAcquireError(this.lockPath,cause)}}#writeAtomic(record8){this.#ensureDir();let tmp=join51(this.dir,`${TOKENS_FILE}.${randomBytes5(6).toString("hex")}.tmp`);writeFileSync15(tmp,`${JSON.stringify(record8,null,2)}
|
|
717
|
-
`,{mode:384}),chmodSync7(tmp,384),renameSync9(tmp,this.tokensPath),chmodSync7(this.tokensPath,384)}#removeTokens(){
|
|
715
|
+
`)}}}var renderLoopGuardNotice=noticeMessageRenderer(message=>{let details=message.details;if(details!==void 0)return{title:titleLine2(details),why:whyLine2(details),expandedLine:expandedLine2(details)}}),renderLoopGuardEscalation=noticeMessageRenderer(message=>{let details=message.details;if(details!==void 0)return{title:`! Loop guard \xB7 turn interrupted (${details.toolName})`,tone:"error",why:`The agent ignored two warnings and repeated ${details.blockedCallCount} calls after blocking began.`,expandedLine:"A user-role recovery message was queued and the active turn was stopped by a system abort."}});function titleLine2(detection){switch(detection.kind){case"identical":return`\u26A0 Loop guard \xB7 identical calls \xD7${detection.count} (${detection.toolName})`;case"similar":return`\u26A0 Loop guard \xB7 near-identical calls \xD7${detection.count} (${detection.toolName})`;case"cycle":return`\u26A0 Loop guard \xB7 repeating pattern \xD7${detection.count} (period ${detection.period})`}}function whyLine2(detection){switch(detection.kind){case"identical":return"Same tool, same arguments, again. The agent was told to reuse the result or change the call.";case"similar":return`Argument similarity ~${Math.round(detection.similarity*100)}%. The agent was told to verify this is distinct work, not a lazy loop.`;case"cycle":return`Tool-call cycle [${detection.cycleTools.join(" -> ")}]. The agent was told to break the rotation or justify the progress.`}}function expandedLine2(detection){switch(detection.kind){case"identical":return`tool ${detection.toolName} \xB7 ${detection.count} consecutive identical calls when the reminder fired`;case"similar":return`tool ${detection.toolName} \xB7 ${detection.count} consecutive same-tool calls at ~${Math.round(detection.similarity*100)}% args similarity`;case"cycle":return`cycle ${detection.cycleTools.join(" -> ")} \xB7 ${detection.count} full repetitions in the tracked window`}}function canonicalizeArgs(args){return stableStringify(args??{})}function stableStringify(value){if(value===null||typeof value!="object")return JSON.stringify(value)??"null";if(Array.isArray(value))return`[${value.map(item=>stableStringify(item)).join(",")}]`;let record8=value,keys=Object.keys(record8).sort(),parts=[];for(let key of keys){let entry=record8[key];entry!==void 0&&parts.push(`${JSON.stringify(key)}:${stableStringify(entry)}`)}return`{${parts.join(",")}}`}var ToolCallTracker=class{constructor(){this.calls=[]}record(toolName,args){let argsJson=canonicalizeArgs(args),record8={toolName,argsJson,signature:`${toolName}\0${argsJson}`};return this.calls.push(record8),this.calls.length>64&&(this.calls=this.calls.slice(-64)),record8}get records(){return this.calls}reset(){this.calls=[]}};var LOOP_GUARD_HARD_STOP_WAKE_SOURCE="loop-guard-hard-stop";function loopGuardExtension(pi){let tracker=new ToolCallTracker,gate=new NoticeGate,escalation=new IdenticalLoopEscalation,pendingRecoveryToolName,recoveryWakeSourceActive=!1,continuationHoldActive=!1,setRecoveryWakeSourceActive=active=>{recoveryWakeSourceActive!==active&&(recoveryWakeSourceActive=active,pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:LOOP_GUARD_HARD_STOP_WAKE_SOURCE,activeCount:active?1:0}))},setContinuationHoldActive=active=>{continuationHoldActive!==active&&(continuationHoldActive=active,pi.events?.emit(CONTINUATION_HOLD_STATE_EVENT,{source:LOOP_GUARD_HARD_STOP_WAKE_SOURCE,active}))},reset=()=>{tracker.reset(),gate.reset(),escalation.reset(),pendingRecoveryToolName=void 0,setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1)};pi.registerMessageRenderer(LOOP_GUARD_NOTICE_CUSTOM_TYPE,renderLoopGuardNotice),pi.registerMessageRenderer(LOOP_GUARD_ESCALATION_CUSTOM_TYPE,renderLoopGuardEscalation),pi.on("session_start",()=>reset()),pi.on("session_shutdown",()=>reset()),pi.on("input",event=>{event.source!=="extension"&&reset()}),pi.on("tool_execution_start",event=>{let record8=tracker.record(event.toolName,event.args);escalation.observeAttempt(event.toolCallId,record8)&&(pendingRecoveryToolName=void 0,setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1));let detection=detectLoop(tracker.records,gate);detection!==void 0&&(escalation.observeNotice(detection),pi.sendMessage({customType:LOOP_GUARD_NOTICE_CUSTOM_TYPE,content:buildLoopGuardReminder(detection),display:!0,details:detection},{triggerTurn:!1,deliverAs:"steer"}))}),pi.on("turn_end",()=>{escalation.finishTurn()}),pi.on("tool_call",(event,ctx)=>{let decision=escalation.consumeToolCall(event.toolCallId);switch(decision.kind){case"allow":return;case"block":return{block:!0,reason:buildLoopGuardBlockReason(decision.toolName,decision.blockedCallCount),terminate:!1};case"hardStop":{let warning=buildLoopGuardHardStopWarning(decision.toolName,decision.blockedCallCount);return setRecoveryWakeSourceActive(!0),decision.announce||setContinuationHoldActive(!0),decision.announce&&(pi.sendMessage({customType:LOOP_GUARD_ESCALATION_CUSTOM_TYPE,content:warning,display:!0,details:{toolName:decision.toolName,blockedCallCount:decision.blockedCallCount}},{triggerTurn:!1,deliverAs:"steer"}),ctx.hasUI&&ctx.ui.notify(warning,"warning"),pendingRecoveryToolName=decision.toolName),ctx.abort("system"),{block:!0,reason:buildLoopGuardBlockReason(decision.toolName,decision.blockedCallCount),terminate:!1}}}}),pi.on("agent_start",()=>{setRecoveryWakeSourceActive(!1),setContinuationHoldActive(!1)}),pi.on("agent_settled",()=>{let toolName=pendingRecoveryToolName;toolName!==void 0&&(pendingRecoveryToolName=void 0,pi.sendMessage({customType:LOOP_GUARD_RECOVERY_CUSTOM_TYPE,content:buildLoopGuardHardStopSteer(toolName),display:!1},{triggerTurn:!0}))})}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";var CLAUDE_VERSIONED_MODEL_ID=/^claude-(?:opus|sonnet|fable)-(\d+)(?:-(\d+))?(?:-|$)/;function isSupportedModel(model){return model.compat?.supportsToolReferences??defaultSupportsToolSearch(model)}function defaultSupportsToolSearch(model){if(model.provider!=="anthropic"||model.id.includes("haiku"))return!1;let version=model.id.match(CLAUDE_VERSIONED_MODEL_ID);if(!version)return!1;let major=Number(version[1]),rawMinor=version[2],minor=rawMinor!==void 0&&rawMinor.length<8?Number(rawMinor):0;return major>4||major===4&&minor>=5}function supportsAnthropicNativeToolSearch(target){return target===void 0?!1:typeof target=="string"?target==="anthropic-messages":target.api!=="anthropic-messages"?!1:isSupportedModel(target)}var ANTHROPIC_TOOL_SEARCH_TYPE="tool_search_tool_bm25_20251119",ANTHROPIC_TOOL_SEARCH_NAME="tool_search_tool_bm25",ANTHROPIC_MAX_TOOLS=1e4,scopedMcpNativeToolSearchGate=new AsyncLocalStorage5,mcpNativeToolSearchGate=()=>!1;function installMcpNativeToolSearchGate(gate){mcpNativeToolSearchGate=gate,scopedMcpNativeToolSearchGate.enterWith(gate)}function isMcpNativeToolSearchEnabled(){return(scopedMcpNativeToolSearchGate.getStore()??mcpNativeToolSearchGate)()}function isRecord33(value){return typeof value=="object"&&value!==null}function addAnthropicNativeToolSearch(target,payload,config){if(!supportsAnthropicNativeToolSearch(target)||!isRecord33(payload))return payload;let tools=Array.isArray(payload.tools)?payload.tools:[],injected=injectInactiveCatalogTools(tools,config);if(injected.length>ANTHROPIC_MAX_TOOLS)return payload;let deferred=injected.map(tool=>maybeDefer(tool,config)),nextTools=deferred.some(tool=>isRecord33(tool)&&tool.type===ANTHROPIC_TOOL_SEARCH_TYPE)?deferred:[...deferred,{type:ANTHROPIC_TOOL_SEARCH_TYPE,name:ANTHROPIC_TOOL_SEARCH_NAME}];return nextTools.length>ANTHROPIC_MAX_TOOLS?payload:{...payload,tools:nextTools}}function injectInactiveCatalogTools(tools,config){let catalog=config.getCatalog?.()??[],residentNames=new Set(tools.flatMap(tool=>isRecord33(tool)&&typeof tool.name=="string"?[tool.name]:[])),injected=[...tools];for(let doc of catalog){if(doc.name===config.searchToolName||residentNames.has(doc.name)||!config.isDeferrable(doc.name))continue;let definition=config.getToolDefinition?.(doc.name);definition?.parameters!==void 0&&(injected.push({name:doc.name,description:definition.description??doc.description??doc.label,input_schema:anthropicInputSchema(definition.parameters),defer_loading:!0}),residentNames.add(doc.name))}return injected}function anthropicInputSchema(parameters){if(!isRecord33(parameters)||parameters.type==="object")return parameters;let resolved=resolveRootObjectSchema(parameters);return resolved.type==="object"?resolved:{...resolved,type:"object"}}function maybeDefer(tool,config){if(!isRecord33(tool))return tool;let name=typeof tool.name=="string"?tool.name:void 0;return name===void 0||name===config.searchToolName||!config.isDeferrable(name)||"cache_control"in tool||tool.defer_loading===!0?tool:{...tool,defer_loading:!0}}var AnthropicNativeToolSearchAdapter=class{#disabled=!1;#injectedLastRequest=!1;#fallbackReason=null;#deps;constructor(deps){this.#deps=deps}applyBeforeRequest(target,payload){if(this.#injectedLastRequest=!1,this.#disabled||!this.#deps.enabled())return payload;let next=addAnthropicNativeToolSearch(target,payload,this.#deps);return this.#injectedLastRequest=next!==payload,next}noteResponseStatus(status){status!==400||!this.#injectedLastRequest||this.#disabled||(this.#disabled=!0,this.#fallbackReason="Anthropic returned 400 for native tool-search; disabled it and fell back to local tool_search for this session.",this.#deps.onFallback?.(this.#fallbackReason))}get disabled(){return this.#disabled}get fallbackReason(){return this.#fallbackReason}};import{createServer}from"node:http";async function openCallbackChannel(options){if(options.overrideUrl!==void 0&&options.overrideUrl.length>0)return{redirectUrl:options.overrideUrl,usesLoopback:!1,waitForCode:()=>Promise.reject(new OAuthFlowError("headless",`MCP server ${options.serverName} uses a callback URL override; complete with /mcp auth-complete <redirect-url>.`,{serverName:options.serverName})),close:()=>Promise.resolve()};let server=new LoopbackCallbackServer(options);return{redirectUrl:await server.start(),usesLoopback:!0,waitForCode:()=>server.waitForCode(),close:()=>server.close()}}var DEFAULT_TIMEOUT_MS=300*1e3,SUCCESS_HTML="<!doctype html><title>senpi</title><p>Authorization complete. You can close this tab.</p>",FAILURE_HTML="<!doctype html><title>senpi</title><p>Authorization failed. Return to senpi and retry.</p>",LoopbackCallbackServer=class{#options;#server;#redirectUrl;#result;#resolve;#reject;#timer;#settled=!1;constructor(options){this.#options=options}get redirectUrl(){return this.#redirectUrl}get#sink(){let logger=this.#options.logger;return{logger:{error:(message,data)=>logger?.error(message,data)}}}async start(){let host=this.#options.host??"127.0.0.1",path14=this.#options.path??"/callback",server=createServer((req,res)=>this.#handle(req,res,path14));server.unref(),this.#server=server,await this.#listen(server,host,this.#options.port??0);let address=server.address();return this.#redirectUrl=`http://${host}:${address.port}${path14}`,this.#result=new Promise((resolve53,reject)=>{this.#resolve=resolve53,this.#reject=reject}),this.#timer=safeTimer("auth.callback.timeout",this.#options.timeoutMs??DEFAULT_TIMEOUT_MS,()=>this.#fail(new OAuthFlowError("needs_auth",`MCP server ${this.#options.serverName} authorization timed out after 5 minutes.`,{serverName:this.#options.serverName})),this.#sink),this.#redirectUrl}waitForCode(){if(this.#result===void 0)throw new Error("callback server not started");return this.#result}async close(){this.#timer!==void 0&&clearTimeout(this.#timer);let server=this.#server;this.#server=void 0,server!==void 0&&await new Promise(resolve53=>server.close(()=>resolve53()))}#listen(server,host,port){return new Promise((resolve53,reject)=>{let onError=error2=>{let detail=error2.code==="EADDRINUSE"?`port ${port} is already in use (another senpi auth flow may be running); free it or configure a different callback.`:error2.message;reject(new OAuthFlowError("needs_auth",`MCP server ${this.#options.serverName} callback listener failed: ${detail}`,{cause:error2,serverName:this.#options.serverName}))};server.once("error",onError),server.listen(port,host,()=>{server.removeListener("error",onError),resolve53()})})}#handle(req,res,path14){let url=new URL(req.url??"/",this.#redirectUrl);if(url.pathname!==path14){res.writeHead(404).end();return}let code=url.searchParams.get("code"),state2=url.searchParams.get("state")??void 0;if(url.searchParams.get("error")!==null||code===null||state2===void 0||!this.#options.validateState(state2)){res.writeHead(400,{"content-type":"text/html"}).end(FAILURE_HTML),this.#fail(new OAuthFlowError("state_mismatch",`MCP server ${this.#options.serverName} authorization state did not match (possible CSRF or a stale/replayed link); restart the auth flow.`,{serverName:this.#options.serverName}));return}res.writeHead(200,{"content-type":"text/html"}).end(SUCCESS_HTML),this.#succeed({code,state:state2,iss:url.searchParams.get("iss")??void 0})}#succeed(result3){this.#settled||(this.#settled=!0,this.#timer!==void 0&&clearTimeout(this.#timer),this.#resolve?.(result3),this.close())}async#fail(error2){this.#settled||(this.#settled=!0,this.#reject?.(error2),await this.close())}};import{randomBytes as randomBytes4}from"node:crypto";var REFRESH_LEEWAY_MS=300*1e3;function tokenExpiresAt(tokens,now2=Date.now()){if(tokens.expires_in!==void 0)return now2+tokens.expires_in*1e3}function sameAuthorizationServer(a,b){let normalize4=value=>{try{return new URL(value).href.replace(/\/$/,"")}catch(error2){if(error2 instanceof TypeError)return value.replace(/\/$/,"");throw error2}};return normalize4(a)===normalize4(b)}function storedGrantIssuer(record8){return record8?.issuer??record8?.discoveryState?.authorizationServerUrl?.toString()}function freezeGrantAttribution(record8){let next={...record8??{}};if(next.issuer!==void 0||next.accessToken===void 0&&next.refreshToken===void 0)return next;let issuer=storedGrantIssuer(next);return issuer!==void 0?next.issuer=issuer:delete next.refreshToken,next}function storedAuthToTokens(record8,now2=Date.now()){if(record8?.accessToken===void 0||record8.accessToken.length===0)return;let expiresIn=record8.expiresAt===void 0?void 0:Math.max(0,Math.ceil((record8.expiresAt-now2)/1e3)),issuer=storedGrantIssuer(record8);return{access_token:record8.accessToken,refresh_token:issuer===void 0?void 0:record8.refreshToken,token_type:"Bearer",...expiresIn===void 0?{}:{expires_in:expiresIn},...issuer===void 0?{}:{issuer}}}function mergeTokensIntoStoredAuth(current,tokens,serverUrl,issuer){let next={...current??{},accessToken:tokens.access_token,resource:current?.resource??serverUrl},refreshToken=tokens.refresh_token??current?.refreshToken;refreshToken!==void 0&&(next.refreshToken=refreshToken);let expiresAt=tokenExpiresAt(tokens);expiresAt!==void 0?next.expiresAt=expiresAt:delete next.expiresAt;let stamp=tokens.issuer??issuer;return stamp!==void 0&&(next.issuer=stamp),next}var McpOAuthProvider=class{#options;#expectedState;#lastAuthorizationUrl;constructor(options){this.#options=options}get lastAuthorizationUrl(){return this.#lastAuthorizationUrl}get redirectUrl(){return this.#options.redirectUrl}get clientMetadataUrl(){return this.#options.clientMetadataUrl}get clientMetadata(){let redirect=this.#options.redirectUrl;return{redirect_uris:redirect===void 0?[]:[String(redirect)],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",client_name:"senpi",scope:this.#options.scopes?.join(" ")}}state(){return this.#expectedState=randomBytes4(16).toString("base64url"),this.#expectedState}consumeState(candidate){let expected=this.#expectedState;return this.#expectedState=void 0,expected!==void 0&&candidate===expected}clientInformation(){return this.#options.clientId!==void 0?{client_id:this.#options.clientId}:this.#options.clientMetadataUrl!==void 0?{client_id:this.#options.clientMetadataUrl}:this.#store.read()?.clientInfo}async saveClientInformation(info){await this.#store.update(current=>({...current??{},clientInfo:info}))}async saveDiscoveryState(state2){await this.#store.update(current=>({...freezeGrantAttribution(current),discoveryState:state2}))}discoveryState(){return this.#store.read()?.discoveryState}tokens(){return storedAuthToTokens(this.#store.read())}async saveTokens(tokens){await this.#store.update(current=>mergeTokensIntoStoredAuth(current,tokens,this.serverUrl)),this.#logFingerprint("saveTokens",tokens.access_token)}async saveCodeVerifier(codeVerifier){await this.#store.update(current=>({...current??{},codeVerifier}))}codeVerifier(){let verifier=this.#store.read()?.codeVerifier;if(verifier===void 0||verifier.length===0)throw new OAuthFlowError("no_verifier",`Missing PKCE code verifier for MCP server ${this.serverName}`,{serverName:this.serverName});return verifier}async redirectToAuthorization(authorizationUrl){this.#lastAuthorizationUrl=authorizationUrl,await this.#options.onRedirect?.(authorizationUrl)}validateResourceURL(serverUrl,resource){return Promise.resolve(new URL(resource??String(serverUrl)))}async invalidateCredentials(scope){if(scope==="all"){await this.#store.clear();return}await this.#store.update(current=>{if(current===void 0)return current;let next={...current};return scope==="tokens"&&(delete next.accessToken,delete next.refreshToken,delete next.expiresAt),scope==="verifier"&&(next.codeVerifier=void 0),scope==="client"&&(next.clientInfo=void 0),scope==="discovery"&&(next.discoveryState=void 0),next})}get serverName(){return this.#options.serverName}get serverUrl(){return this.#options.serverUrl}get store(){return this.#options.store}get scopes(){return this.#options.scopes}get#store(){return this.#options.store}#logFingerprint(event,secret){this.#options.logger?.info(`oauth ${event}`,{token_fp:fingerprintSecret(secret)})}};var OPTIONAL_OAUTH_FIELDS=new Set(["expires_in","refresh_token","scope","id_token","client_secret","client_secret_expires_at","client_id_issued_at","registration_access_token","registration_client_uri"]);function withoutAbsentOptionalFields(body){if(body===null||typeof body!="object"||Array.isArray(body))return body;let changed=!1,next={};for(let[key,value]of Object.entries(body)){if(OPTIONAL_OAUTH_FIELDS.has(key)&&(value===null||value==="")){changed=!0;continue}next[key]=value}return changed?next:body}function oauthFetch(base=(input,init)=>fetch(input,init)){return async(input,init)=>{let response=await base(input,init);if(!(response.headers.get("content-type")??"").includes("application/json"))return response;let text3=await response.text(),body;try{body=JSON.parse(text3)}catch{return new Response(text3,response)}let normalized2=withoutAbsentOptionalFields(body);return new Response(normalized2===body?text3:JSON.stringify(normalized2),response)}}function isTokenStale(record8,now2){let token=record8?.accessToken;return token===void 0||token.length===0?!0:record8?.expiresAt===void 0?!1:record8.expiresAt-now2<=REFRESH_LEEWAY_MS}function assertS256Supported(metadata,serverName2){let methods=metadata?.code_challenge_methods_supported;if(methods===void 0||!methods.includes("S256"))throw new OAuthFlowError("s256_unsupported",`MCP server ${serverName2} authorization server does not advertise PKCE S256 (code_challenge_methods_supported); refusing to authorize without proof-key protection.`,{serverName:serverName2})}var McpRefreshManager=class{#provider;#options;#inflight;constructor(provider,options={}){this.#provider=provider,this.#options=options}async ensureFresh(){let record8=await this.#provider.store.readAsync();if(record8?.accessToken!==void 0)return isTokenStale(record8,Date.now())?this.refresh():storedAuthToTokens(record8)}refresh(){if(this.#inflight!==void 0)return this.#inflight;let run2=this.#refreshLocked().finally(()=>{this.#inflight=void 0});return this.#inflight=run2,run2}#refreshLocked(){return this.#provider.store.withLock(async()=>{let current=this.#provider.store.readUnlocked();if(current?.accessToken!==void 0&&!isTokenStale(current,Date.now())){let tokens=storedAuthToTokens(current);if(tokens!==void 0)return tokens}let refreshToken=current?.refreshToken;if(current===void 0||refreshToken===void 0)throw new OAuthFlowError("needs_auth",`MCP server ${this.#provider.serverName} has no refresh token`,{serverName:this.#provider.serverName});return this.#doRefresh(current,refreshToken)})}async#doRefresh(current,refreshToken){let info=await this.#discover(),issuer=storedGrantIssuer(current),authorizationServer=String(info.authorizationServerUrl);if(issuer===void 0||!sameAuthorizationServer(issuer,authorizationServer))throw this.#provider.store.writeUnlocked(void 0),new OAuthFlowError("needs_auth",issuer===void 0?`MCP server ${this.#provider.serverName} has a saved sign-in with no record of the authorization server that issued it; credentials cleared, re-authentication required.`:`MCP server ${this.#provider.serverName} now uses authorization server ${authorizationServer}, but its saved sign-in was issued by ${issuer}; credentials cleared, re-authentication required.`,{serverName:this.#provider.serverName});let clientInformation=this.#provider.clientInformation();if(clientInformation===void 0)throw new OAuthFlowError("needs_auth",`MCP server ${this.#provider.serverName} is not registered`,{serverName:this.#provider.serverName});let resource=new URL(current.resource??this.#provider.serverUrl),{refreshAuthorization}=await loadMcpSdkAuth(),maxRetries=this.#options.maxRetries??2;for(let attempt2=0;;attempt2++)try{let tokens=await refreshAuthorization(info.authorizationServerUrl,{metadata:info.authorizationServerMetadata,clientInformation,refreshToken,resource,fetchFn:oauthFetch(this.#options.fetchFn)});return this.#provider.store.writeUnlocked(mergeTokensIntoStoredAuth(current,tokens,this.#provider.serverUrl,authorizationServer)),{...tokens,issuer:authorizationServer}}catch(error2){if(isInvalidGrant(error2))throw this.#provider.store.writeUnlocked(void 0),new OAuthFlowError("invalid_grant",`MCP server ${this.#provider.serverName} refresh rejected (invalid_grant); credentials cleared, re-authentication required.`,{cause:error2,serverName:this.#provider.serverName});if(isTransientTokenError(error2)&&attempt2<maxRetries){await safeDelay(this.#options.retryDelayMs??50);continue}throw new OAuthFlowError("transient",`MCP server ${this.#provider.serverName} token refresh failed transiently; will retry on next use.`,{cause:error2,retriable:!0,serverName:this.#provider.serverName})}}async#discover(){if(this.#options.discover!==void 0)return this.#options.discover(this.#provider.serverUrl);let{discoverOAuthServerInfo}=await loadMcpSdkAuth();return discoverOAuthServerInfo(this.#provider.serverUrl,{fetchFn:oauthFetch(this.#options.fetchFn)})}};var import_proper_lockfile4=__toESM(require_proper_lockfile(),1);import{createHash as createHash17,randomBytes as randomBytes5}from"node:crypto";import{chmodSync as chmodSync7,existsSync as existsSync25,mkdirSync as mkdirSync15,readFileSync as readFileSync31,renameSync as renameSync9,rmSync as rmSync7,writeFileSync as writeFileSync15}from"node:fs";import{join as join51}from"node:path";import{closeSync as closeSync5,mkdirSync as mkdirSync14,openSync as openSync5,rmSync as rmSync6,statSync as statSync12}from"node:fs";import{open as open7,rm as rm8,stat as stat7}from"node:fs/promises";async function acquireLegacyLock(path14,stale){let deadline=Date.now()+stale;for(;;)try{let file=await open7(path14,"wx",384);return async()=>{try{await file.close()}finally{await rm8(path14,{force:!0})}}}catch(error2){if(!(error2 instanceof Error)||!("code"in error2)||error2.code!=="EEXIST")throw error2;try{if(Date.now()-(await stat7(path14)).mtimeMs>=stale){await rm8(path14,{force:!0});continue}}catch(error3){if(error3 instanceof Error&&"code"in error3&&error3.code==="ENOENT")continue;throw error3}if(Date.now()>=deadline)throw new Error("Legacy OAuth migration lock acquisition timed out");await safeDelay(20)}}function adoptLegacyRecord(options){let release4=acquireSync(options);try{return claim(options)}finally{release4()}}async function readRecordAsync(options){let record8=options.read(options.tokensPath);if(record8!==void 0)return record8;mkdirSync14(options.rootDir,{mode:448,recursive:!0});let release4;try{release4=options.disableLock?async()=>{}:await acquireLegacyLock(options.lockPath,options.stale)}catch(cause){throw options.lockError(cause)}try{return claim(options)}finally{await release4()}}function claim(options){let legacy=options.read(options.legacyTokens);if(legacy===void 0)return;let existing2=options.read(options.tokensPath);return existing2!==void 0?(rmSync6(options.legacyTokens,{force:!0}),existing2):(options.write(legacy),rmSync6(options.legacyTokens,{force:!0}),legacy)}function acquireSync(options){if(options.disableLock)return()=>{};mkdirSync14(options.rootDir,{mode:448,recursive:!0});let deadline=Date.now()+options.stale;for(;;){let fd;try{fd=openSync5(options.lockPath,"wx",384);let file=fd;return()=>{try{closeSync5(file)}catch{}rmSync6(options.lockPath,{force:!0})}}catch(cause){if(fd!==void 0&&closeSync5(fd),!(cause instanceof Error)||!("code"in cause)||cause.code!=="EEXIST")throw cause;let age;try{age=Date.now()-statSync12(options.lockPath).mtimeMs}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")continue;throw error2}if(age>=options.stale){rmSync6(options.lockPath,{force:!0});continue}if(Date.now()>=deadline)throw options.lockError(new Error(`legacy migration lock held for ${age}ms`));let until=Date.now()+20;for(;Date.now()<until;);}}}var AUTH_ROOT="mcp-auth",TOKENS_FILE="tokens.json",INDEX_FILE="index.json",DEFAULT_LOCK={retries:50,stale:3e4},LockAcquireError=class extends Error{constructor(lockPath,cause){super(`Could not acquire MCP auth lock at ${lockPath}: ${cause instanceof Error?cause.message:String(cause)}`),this.name="LockAcquireError",this.lockPath=lockPath}};function hashServerUrl(serverUrl){return createHash17("sha256").update(serverUrl).digest("hex")}function hashServerKey(serverName2,serverUrl){return createHash17("sha256").update(`${serverName2}\0${serverUrl}`).digest("hex")}var McpTokenStore=class{#agentDir;#hash;#legacyHash;#lock;#disableLock;constructor(options){this.serverName=options.serverName,this.serverUrl=options.serverUrl,this.#agentDir=options.agentDir??getAgentDir(),this.#hash=hashServerKey(options.serverName,options.serverUrl),this.#legacyHash=hashServerUrl(options.serverUrl),this.#lock={...DEFAULT_LOCK,...options.lock},this.#disableLock=options.disableLock??!1}get rootDir(){return join51(this.#agentDir,AUTH_ROOT)}get dir(){return join51(this.rootDir,this.#hash)}get tokensPath(){return join51(this.dir,TOKENS_FILE)}get lockPath(){return join51(this.dir,`${TOKENS_FILE}.lock`)}get legacyDir(){return join51(this.rootDir,this.#legacyHash)}get#legacyLockFile(){return join51(this.rootDir,`${this.#legacyHash}.migrate.lock`)}read(){let record8=readJsonFile(this.tokensPath);return record8!==void 0?record8:adoptLegacyRecord(this.#migration())}async readAsync(){return readRecordAsync(this.#migration())}#migration(){return{rootDir:this.rootDir,lockPath:this.#legacyLockFile,legacyTokens:join51(this.legacyDir,TOKENS_FILE),tokensPath:this.tokensPath,stale:this.#lock.stale,disableLock:this.#disableLock,read:readJsonFile,write:record8=>this.writeUnlocked(record8),lockError:cause=>new LockAcquireError(this.#legacyLockFile,cause)}}async update(mutate){let release4=await this.#acquire();try{let next=mutate(this.read());return next===void 0?this.#removeRecord():(this.#writeAtomic(next),this.#writeIndex()),next}finally{await release4()}}async write(record8){await this.update(()=>record8)}async withLock(fn){let release4=await this.#acquire();try{return await fn()}finally{await release4()}}readUnlocked(){return this.read()}writeUnlocked(record8){if(record8===void 0){this.#removeRecord();return}this.#writeAtomic(record8),this.#writeIndex()}async clear(){let release4=await this.#acquire();try{rmSync7(this.dir,{force:!0,recursive:!0}),rmSync7(join51(this.legacyDir,TOKENS_FILE),{force:!0})}finally{await release4().catch(()=>{})}removeIndexEntry(this.rootDir,this.serverName,this.#hash)}#ensureDir(){mkdirSync15(this.dir,{mode:448,recursive:!0}),chmodSync7(this.dir,448)}async#acquire(){if(this.#ensureDir(),this.#disableLock)return()=>Promise.resolve();try{return await import_proper_lockfile4.default.lock(this.dir,{lockfilePath:this.lockPath,realpath:!1,retries:{retries:this.#lock.retries,factor:1.2,minTimeout:20,maxTimeout:200},stale:this.#lock.stale})}catch(cause){throw new LockAcquireError(this.lockPath,cause)}}#writeAtomic(record8){this.#ensureDir();let tmp=join51(this.dir,`${TOKENS_FILE}.${randomBytes5(6).toString("hex")}.tmp`);writeFileSync15(tmp,`${JSON.stringify(record8,null,2)}
|
|
716
|
+
`,{mode:384}),chmodSync7(tmp,384),renameSync9(tmp,this.tokensPath),chmodSync7(this.tokensPath,384)}#removeTokens(){rmSync7(this.tokensPath,{force:!0})}#removeRecord(){this.#removeTokens(),removeIndexEntry(this.rootDir,this.serverName,this.#hash)}#writeIndex(){writeIndexEntry(this.rootDir,this.serverName,this.#hash)}};function readJsonFile(path14){if(!existsSync25(path14))return;let raw=readFileSync31(path14,"utf-8").trim();if(raw.length!==0)return JSON.parse(raw)}function indexPath(rootDir){return join51(rootDir,INDEX_FILE)}function readIndex(rootDir){return readJsonFile(indexPath(rootDir))??{}}function writeIndexEntry(rootDir,name,hash){mkdirSync15(rootDir,{mode:448,recursive:!0});let index=readIndex(rootDir);index[name]!==hash&&(index[name]=hash,writeIndexAtomic(rootDir,index))}function removeIndexEntry(rootDir,name,hash){if(!existsSync25(indexPath(rootDir)))return;let index=readIndex(rootDir);index[name]!==hash&&index[name]!==void 0||(delete index[name],writeIndexAtomic(rootDir,index))}function writeIndexAtomic(rootDir,index){let tmp=join51(rootDir,`${INDEX_FILE}.${randomBytes5(6).toString("hex")}.tmp`);writeFileSync15(tmp,`${JSON.stringify(index,null,2)}
|
|
718
717
|
`,{mode:384}),chmodSync7(tmp,384),renameSync9(tmp,indexPath(rootDir)),chmodSync7(indexPath(rootDir),384)}var BACKGROUND_REDIRECT="http://127.0.0.1:0/callback";function resolveAuthMode(config){return config.auth==="oauth"?"oauth":config.auth===!1?"none":config.auth==="bearer"||config.bearerTokenEnv!==void 0?"bearer":config.headers!==void 0&&Object.keys(config.headers).length>0?"none":config.type==="http"&&typeof config.url=="string"&&config.url.length>0?"oauth":"none"}function resolveServerAuth(deps){let mode=resolveAuthMode(deps.config);if(mode!=="oauth")return{mode};let serverUrl=deps.config.url??"",store=new McpTokenStore({agentDir:deps.agentDir,serverName:deps.serverName,serverUrl}),provider=new McpOAuthProvider({serverName:deps.serverName,serverUrl,store,redirectUrl:deps.redirectUrl??BACKGROUND_REDIRECT,scopes:deps.config.oauth?.scopes,clientId:deps.config.oauth?.clientId,clientMetadataUrl:deps.config.oauth?.clientMetadataUrl,logger:deps.logger,onRedirect:deps.onRedirect});return{mode,provider,refresh:new McpRefreshManager(provider)}}var LITERAL_SECRET=/(?:bearer\s+\S|sk-[a-z0-9]|[a-z0-9]{24,})/i;function detectLiteralBearerWarnings(serverName2,config){let warnings=[];for(let[header2,value]of Object.entries(config.headers??{}))value.includes("${")||LITERAL_SECRET.test(value)&&warnings.push(`MCP server ${serverName2} header '${header2}' appears to contain a literal secret (fp ${fingerprintSecret(value)}); use \${ENV_VAR} so the token stays out of the config file.`);return warnings}async function assertAuthorizable(provider,options={}){let info=await discover(provider,options);return assertS256Supported(info.authorizationServerMetadata,provider.serverName),info}async function beginAuthorization(provider,options={}){await assertAuthorizable(provider,options);let{auth}=await loadMcpSdkAuth();return{status:await auth(provider,{serverUrl:provider.serverUrl,fetchFn:oauthFetch(options.fetchFn)})==="AUTHORIZED"?"authorized":"redirect",authorizationUrl:provider.lastAuthorizationUrl}}async function completeAuthorization(provider,redirectInput,options={}){let{code,state:state2,iss}=parseRedirect(redirectInput,provider.serverName);if(!provider.consumeState(state2))throw new OAuthFlowError("state_mismatch",`MCP server ${provider.serverName} authorization state did not match (possible CSRF or a stale/replayed link); restart with /mcp auth-start.`,{serverName:provider.serverName});await finishAuthorization(provider,code,options,iss)}async function finishAuthorization(provider,code,options={},iss){assertAuthorizationResponseIssuer(provider,iss);let result3,{auth}=await loadMcpSdkAuth();try{result3=await auth(provider,{serverUrl:provider.serverUrl,authorizationCode:code,fetchFn:oauthFetch(options.fetchFn)})}catch(error2){throw isInvalidGrant(error2)||isRejectedAuthorizationCode(error2)?(await provider.invalidateCredentials("tokens"),await provider.invalidateCredentials("verifier"),new OAuthFlowError("expired_code",`MCP server ${provider.serverName} authorization code was rejected or expired; restart with /mcp auth-start ${provider.serverName}.`,{cause:error2,serverName:provider.serverName})):error2}if(result3!=="AUTHORIZED")throw new OAuthFlowError("needs_auth",`MCP server ${provider.serverName} did not complete authorization.`,{serverName:provider.serverName})}function assertAuthorizationResponseIssuer(provider,iss){let metadata=provider.discoveryState()?.authorizationServerMetadata;if(metadata===void 0)return;let promised=metadata.authorization_response_iss_parameter_supported===!0;if(!(iss===void 0&&!promised)&&!(iss!==void 0&&iss===metadata.issuer))throw new OAuthFlowError("needs_auth",iss===void 0?`MCP server ${provider.serverName} authorization response has no issuer although its authorization server promises one; restart with /mcp auth-start ${provider.serverName}.`:`MCP server ${provider.serverName} authorization response names another authorization server (${iss}); restart with /mcp auth-start ${provider.serverName}.`,{serverName:provider.serverName})}async function clientCredentialsGrant(provider,options={}){let info=await discover(provider,options),clientInformation=provider.clientInformation();if(clientInformation===void 0)throw new OAuthFlowError("needs_auth",`MCP server ${provider.serverName} client_credentials requires a clientId.`,{serverName:provider.serverName});let requestedScope=provider.scopes?.join(" "),credentialsProvider={get redirectUrl(){},get clientMetadata(){return{...provider.clientMetadata,scope:requestedScope}},clientInformation:()=>clientInformation,tokens:()=>{},saveTokens:()=>{},redirectToAuthorization:()=>{},saveCodeVerifier:()=>{},codeVerifier:()=>{throw new OAuthFlowError("no_verifier","client_credentials has no PKCE verifier",{serverName:provider.serverName})},prepareTokenRequest(scope){let params=new URLSearchParams({grant_type:"client_credentials"}),requested=scope??requestedScope;return requested!==void 0&&requested.length>0&¶ms.set("scope",requested),params}},{fetchToken}=await loadMcpSdkAuth(),tokens=await fetchToken(credentialsProvider,info.authorizationServerUrl,{metadata:info.authorizationServerMetadata,resource:new URL(provider.serverUrl),fetchFn:oauthFetch(options.fetchFn)});await provider.saveTokens({...tokens,issuer:String(info.authorizationServerUrl)})}async function logout(provider){await provider.store.clear()}async function discover(provider,options){if(options.discover!==void 0)return options.discover(provider.serverUrl);let cached=provider.discoveryState();if(cached!==void 0)return cached;let{discoverOAuthServerInfo}=await loadMcpSdkAuth(),info=await discoverOAuthServerInfo(provider.serverUrl,{fetchFn:oauthFetch(options.fetchFn)});return await provider.saveDiscoveryState(toDiscoveryState(info)),info}function toDiscoveryState(info){return{authorizationServerUrl:info.authorizationServerUrl,authorizationServerMetadata:info.authorizationServerMetadata,resourceMetadata:info.resourceMetadata}}function parseRedirect(input,serverName2){let url;try{url=new URL(input.trim())}catch{throw new OAuthFlowError("needs_auth",`MCP server ${serverName2} received a malformed redirect URL; paste the full http://127.0.0.1/... address from your browser.`,{serverName:serverName2})}let error2=url.searchParams.get("error");if(error2!==null)throw new OAuthFlowError("needs_auth",`MCP server ${serverName2} authorization failed: ${error2}`,{serverName:serverName2});let code=url.searchParams.get("code");if(code===null||code.length===0)throw new OAuthFlowError("needs_auth",`MCP server ${serverName2} redirect URL has no authorization code; ensure you copied the entire address.`,{serverName:serverName2});return{code,state:url.searchParams.get("state")??void 0,iss:url.searchParams.get("iss")??void 0}}function isRejectedAuthorizationCode(error2){let message=error2 instanceof Error?error2.message.toLowerCase():String(error2).toLowerCase();return message.includes("authorization code invalid")||message.includes("authorization code")&&message.includes("used")||message.includes("pkce verification failed")}var PASTE_REDIRECT="http://127.0.0.1:0/callback",activeInteractiveAuthServers=new Set;function ensureOAuth(deps){if(deps.config.auth===!1||deps.config.type!=="http"||deps.config.url===void 0)throw new OAuthFlowError("headless",`MCP server ${deps.serverName} is not an OAuth HTTP server.`,{serverName:deps.serverName})}function buildProvider(deps,redirectUrl,onRedirect){let plan=resolveServerAuth({agentDir:deps.agentDir,config:{...deps.config,auth:"oauth"},env:deps.env,logger:deps.logger,onRedirect,redirectUrl,serverName:deps.serverName});if(plan.provider===void 0)throw new OAuthFlowError("headless",`MCP server ${deps.serverName} could not build an OAuth provider.`,{serverName:deps.serverName});return plan.provider}async function runAuth(deps){if(ensureOAuth(deps),deps.config.oauth?.flow==="client_credentials"){let provider=buildProvider(deps,deps.callbackUrl??PASTE_REDIRECT);await clientCredentialsGrant(provider,deps.flow),await deps.onReconnect(),deps.notify(`MCP server ${deps.serverName} authenticated (client_credentials)`);return}if(!deps.hasUI){deps.notify(`MCP server ${deps.serverName} needs interactive OAuth. Run senpi in a terminal, then: /mcp auth-start ${deps.serverName} and /mcp auth-complete ${deps.serverName} <redirect-url>`,"error");return}await runInteractive(deps)}async function runInteractive(deps){if(!(deps.interactiveGuard?.begin(deps.serverName)??!activeInteractiveAuthServers.has(deps.serverName)))throw new OAuthFlowError("needs_auth",`MCP server ${deps.serverName} authorization is already in progress; complete the existing browser flow or retry after it finishes.`,{serverName:deps.serverName});deps.interactiveGuard===void 0&&activeInteractiveAuthServers.add(deps.serverName);let provider,channel,oauth=deps.config.oauth,callbackPort;(deps.callbackUrl===void 0||deps.callbackUrl.length===0)&&oauth?.clientId!==void 0&&oauth.clientMetadataUrl===void 0&&(callbackPort=oauth.callbackPort);try{channel=await openCallbackChannel({overrideUrl:deps.callbackUrl,port:callbackPort,serverName:deps.serverName,validateState:state2=>provider?.consumeState(state2)??!1});let loopbackResult=channel.usesLoopback?channel.waitForCode():void 0,usesLoopback=channel.usesLoopback;provider=buildProvider(deps,channel.redirectUrl,async url=>{let instruction=usesLoopback?"":`
|
|
719
718
|
Then run /mcp auth-complete ${deps.serverName} <redirect-url> with the final redirect URL.`,announcement=`Open this URL to authorize ${deps.serverName}:
|
|
720
719
|
${url.toString()}${instruction}`;deps.notify(announcement);try{await deps.openBrowser?.(url)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);deps.notify(`Browser launch failed: ${message}
|
|
@@ -738,7 +737,7 @@ ${diagnostic2}`;return new ConnectError(message,{cause:options.cause,phase:"conn
|
|
|
738
737
|
${result3.stdout}`);return lines.length>0?boundDiagnostic(lines):isTimedOut(result3.error)?`diagnostic rerun timed out after ${MCP_STDIO_DIAGNOSTIC_TIMEOUT_MS}ms`:null}function extractCapturedStderr(logger){let messages=[];for(let line of logger.getRingBuffer()){let parsed=parseLogLine(line);parsed?.channel==="stderr"&&typeof parsed.message=="string"&&messages.push(parsed.message)}return meaningfulLines(messages.join(`
|
|
739
738
|
`))}function parseLogLine(line){try{let parsed=JSON.parse(line);if(typeof parsed=="object"&&parsed!==null)return parsed}catch{return null}return null}function meaningfulLines(text3){return text3.split(/\r?\n/).map(line=>redactMcpLogText(line.trim())).filter(line=>line.length>0)}function boundDiagnostic(lines){let output="";for(let line of lines){let next=output.length===0?line:`${output}
|
|
740
739
|
${line}`;if(Buffer.byteLength(next,"utf8")>MCP_STDIO_DIAGNOSTIC_MAX_BYTES)break;output=next}return output||lines[0]?.slice(0,MCP_STDIO_DIAGNOSTIC_MAX_BYTES)||""}function execFileForDiagnostics(command,args,options){return new Promise(resolve53=>{execFile2(command,args??[],{cwd:options.cwd,env:options.env,killSignal:"SIGKILL",maxBuffer:MCP_STDIO_DIAGNOSTIC_MAX_BYTES*4,timeout:MCP_STDIO_DIAGNOSTIC_TIMEOUT_MS},(error2,stdout,stderr)=>{resolve53({error:error2,stdout,stderr})})})}async function buildDiagnosticEnv(options){let{getDefaultEnvironment}=await loadMcpSdkStdioTransport();return{...getDefaultEnvironment(),...definedEnv(options.env),...options.config.env??{}}}function commandNotFoundDiagnostic(command,env,options){let cwd=options.config.cwd??process.cwd(),path14=env.PATH??"";return[`command not found: ${redactMcpLogText(command)}`,`cwd: ${redactMcpLogText(cwd)}`,`PATH: ${redactMcpLogText(path14)}`,"Install the command, add it to PATH, or configure an absolute command path in mcp.json."].join(`
|
|
741
|
-
`)}function definedEnv(env){let result3={};for(let[key,value]of Object.entries(env??{}))value!==void 0&&(result3[key]=value);return result3}function isTimedOut(error2){return error2===null?!1:getProperty(error2,"signal")==="SIGKILL"||error2.message.includes("timed out")}function isNodeErrorCode(error2,code){return error2!==null&&getProperty(error2,"code")===code}function getProperty(value,key){return value[key]}var MCP_LOG_RATE_LIMIT_PER_SECOND=10,LEVEL_ORDER=["emergency","alert","critical","error","warning","notice","info","debug"];function severity(level){let index=LEVEL_ORDER.indexOf(level);return index===-1?LEVEL_ORDER.indexOf("info"):index}function loggerMethod(level){switch(level){case"debug":return"debug";case"info":case"notice":return"info";case"warning":return"warn";default:return"error"}}function subscribeMcpServerLogging(client,options){let threshold=options.logLevel===void 0?void 0:severity(options.logLevel),rate=options.ratePerSecond??MCP_LOG_RATE_LIMIT_PER_SECOND,now2=options.now??Date.now,tokens=rate,lastRefill=now2();registerMcpNotificationHandler(client,LoggingMessageNotificationSchema,notification=>{let{level,data,logger:serverLogger}=notification.params;if(threshold!==void 0&&severity(level)>threshold)return;let at=now2();if(tokens=Math.min(rate,tokens+(at-lastRefill)/1e3*rate),lastRefill=at,tokens<1)return;tokens-=1;let text3=typeof data=="string"?data:JSON.stringify(data);options.logger[loggerMethod(level)](`[server${serverLogger?`:${serverLogger}`:""}] ${text3}`)})}function diffMcpToolNames(prev,next){let prevSet=new Set(prev),nextSet=new Set(next);return{added:[...nextSet].filter(name=>!prevSet.has(name)).sort(),removed:[...prevSet].filter(name=>!nextSet.has(name)).sort(),unchanged:[...nextSet].filter(name=>prevSet.has(name)).sort()}}function formatMcpListChangedDelta(diff){let parts=[];return diff.added.length>0&&parts.push(`${diff.added.length} added (inactive)`),diff.removed.length>0&&parts.push(`${diff.removed.length} removed`),parts.length===0?"no change":parts.join(", ")}function createMcpListChangeCoalescer(options){let delayMs=options.delayMs??300,minIntervalMs=options.minIntervalMs??1e3,now2=options.now??Date.now,scope=options.scope??"mcp.list_changed",timer,lastRefreshAt=Number.NEGATIVE_INFINITY,fire=async()=>{timer=void 0,lastRefreshAt=now2(),await options.onRefresh()};return{notify(){if(timer!==void 0)return;let sinceLast=now2()-lastRefreshAt,wait=Math.max(delayMs,minIntervalMs-sinceLast);timer=safeTimer(scope,wait,fire,options.sink)},dispose(){timer!==void 0&&(clearTimeout(timer),timer=void 0)}}}function subscribeMcpListChanged(client,onChange){for(let schema of[ToolListChangedNotificationSchema,ResourceListChangedNotificationSchema,PromptListChangedNotificationSchema])registerMcpNotificationHandler(client,schema,()=>{onChange()})}function buildMcpTombstoneDefinition(name,server){return{name,label:name,description:`This MCP tool was removed from ${server} and is no longer available.`,parameters:typebox_exports.Object({}),executionMode:"parallel",async execute(){throw new ToolExecError(`tool no longer available on ${server}`,{phase:"call",serverName:server})},renderCall(_args,theme2){return new Text(theme2.fg("toolOutput",`${name} (removed)`),0,0)}}}var SHUTDOWN_GRACE_MS=100,SHUTDOWN_TERM_WAIT_MS=400,SHUTDOWN_FINAL_WAIT_MS=500,SHUTDOWN_CLOSE_WAIT_MS=400;function createMcpTransport(options){let spec2=options.config.type==="stdio"?stdioSpec(options):httpSpec(options);return createConnection2(options,spec2,options.config.connectTimeoutMs)}async function connectMcpTransport(connection){let timedOut=!1,controller=new AbortController,captureInterval=safeInterval("transport.captureRootPid",25,()=>connection.captureRootPid?.(),connection.asyncErrorSink),timeout=safeTimer("transport.connectTimeout",connection.connectTimeoutMs,()=>{timedOut=!0,connection.captureRootPid?.(),controller.abort()},connection.asyncErrorSink);try{await connection.materialize(),await connection.client.connect(connection.transport,{signal:controller.signal,timeout:connection.connectTimeoutMs})}catch(error2){if(await shutdownMcpTransport(connection).catch(()=>{}),error2 instanceof ConnectError&&error2.phase==="modern-stdio")throw error2;if(timedOut)throw new TimeoutError(`MCP server ${connection.serverName} timed out during connect after ${connection.connectTimeoutMs}ms`,{cause:error2,phase:"connect",retriable:!0,serverName:connection.serverName});let reason=crossOriginRedirectReason(error2,connection.endpointUrl)??errorMessage4(error2);throw new ConnectError(`MCP server ${connection.serverName} failed during connect: ${reason}`,{cause:error2,phase:"connect",retriable:!0,serverName:connection.serverName})}finally{clearInterval(captureInterval),clearTimeout(timeout)}}async function shutdownMcpTransport(connection){let rootPid=connection.getRootPid(),closePromise=connection.closeTransport();await delay(SHUTDOWN_GRACE_MS),rootPid!==null&&await reapProcessTree(rootPid,{killWaitMs:SHUTDOWN_FINAL_WAIT_MS,termWaitMs:SHUTDOWN_TERM_WAIT_MS}),await Promise.race([closePromise,delay(SHUTDOWN_CLOSE_WAIT_MS)])}function stdioSpec(options){let command=options.config.command;if(command===void 0||command.trim().length===0)throw new ConnectError(`MCP server ${options.serverName} stdio command is required`,{phase:"create",serverName:options.serverName});return{args:options.config.args,authProvider:options.authProvider,command,cwd:options.config.cwd,env:{...definedEnv2(options.env),...options.config.env??{}},kind:"stdio"}}function httpSpec(options){if(options.config.url===void 0||options.config.url.trim().length===0)throw new ConnectError(`MCP server ${options.serverName} HTTP URL is required`,{phase:"create",serverName:options.serverName});let url;try{url=new URL(options.config.url)}catch(error2){throw new ConnectError(`MCP server ${options.serverName} HTTP URL is invalid: ${errorMessage4(error2)}`,{cause:error2,phase:"create",serverName:options.serverName})}let headers=buildHeaders(options);return{authProvider:options.authProvider,kind:"http",requestInit:Object.keys(headers).length===0?void 0:{headers},url}}function createConnection2(options,spec2,connectTimeoutMs){let asyncErrorSink={logger:options.logger},materialized,pending,abort=new AbortController,lastRootPid=null,captureRootPid=()=>{lastRootPid=materialized?.readPid()??lastRootPid},built=()=>{if(materialized===void 0)throw new ConnectError(`MCP server ${options.serverName} transport is not started`,{phase:"create",serverName:options.serverName});return materialized};return{asyncErrorSink,captureRootPid,get client(){return built().client},closeTransport:async()=>{abort.abort(),await materialized?.close()},connectTimeoutMs,getRootPid:()=>(captureRootPid(),materialized?.readPid()??lastRootPid),materialize:async()=>{pending??=import("./dispatch-R37L3FW5.js").then(({materializeNegotiatedTransport})=>materializeNegotiatedTransport({elicitationUiProvider:options.elicitationUiProvider,logger:options.logger,onStart:captureRootPid,sink:asyncErrorSink,spec:spec2},options.serverName,connectTimeoutMs,abort.signal)),materialized=await pending,abort.signal.aborted&&(await materialized.close(),abort.signal.throwIfAborted())},serverName:options.serverName,get transport(){return built().transport},transportKind:spec2.kind,...spec2.kind==="http"?{endpointUrl:spec2.url}:{}}}function definedEnv2(env){let result3={};for(let[key,value]of Object.entries(env??{}))value!==void 0&&(result3[key]=value);return result3}function buildHeaders(options){let headers={...options.config.headers??{}};if(!(options.config.auth==="bearer"||options.config.auth===void 0&&options.config.bearerTokenEnv!==void 0))return headers;let envName=options.config.bearerTokenEnv;if(envName===void 0||envName.trim().length===0)throw new AuthError(`MCP server ${options.serverName} bearer auth requires bearerTokenEnv`,{phase:"create",serverName:options.serverName});let token=options.env?.[envName]??process.env[envName];if(token===void 0||token.length===0)throw new AuthError(`MCP server ${options.serverName} bearer token env ${envName} is not set`,{phase:"create",serverName:options.serverName});return headers.authorization=`Bearer ${token}`,headers}var errorMessage4=error2=>error2 instanceof Error?error2.message:String(error2),UNFOLLOWED_REDIRECT=/Redirect to (\S+) not followed/;function crossOriginRedirectReason(error2,endpoint){if(endpoint===void 0||!(error2 instanceof Error))return;let code=error2.code;if(typeof code!="number"||code<300||code>=400)return;let target=UNFOLLOWED_REDIRECT.exec(error2.message)?.[1];if(target===void 0)return;let targetOrigin;try{targetOrigin=new URL(target).origin}catch(parseError){if(parseError instanceof TypeError)return;throw parseError}if(targetOrigin!==endpoint.origin)return`the endpoint at ${endpoint.origin} redirected to ${targetOrigin}, and senpi only follows redirects within the same origin, so credentials and requests never move to another server without your say-so. Point the server's url at ${target} if that is where it now lives.`}var ServerConnection=class{#logger;#env;#config;#authProvider;#elicitationUiProvider;#state;#generation=0;#connection;#pendingConnection;#pendingConnect;#lastError;#stateListeners=new Set;#toolsListeners=new Set;#shutdownConnections=new Map;constructor(options){this.serverName=options.serverName,this.#config=options.config,this.#logger=options.logger,this.#env=options.env,this.#authProvider=options.authProvider,this.#elicitationUiProvider=options.elicitationUiProvider,this.#state=options.config.enabled?"idle":"disabled"}get state(){return this.#state}get lastError(){return this.#lastError}get generation(){return this.#generation}refreshCapturedDiagnostics(){let current=this.#lastError;if(current===void 0)return;let capturedError=diagnoseCapturedMcpConnectFailure({config:this.#config,cause:current,env:this.#env,logger:this.#logger,serverName:this.serverName});capturedError!==null&&capturedError.message!==current.message&&(this.#lastError=capturedError)}get client(){if(this.#connection===void 0)throw new ConnectError(`MCP server ${this.serverName} is not connected`,{phase:"client",serverName:this.serverName});return this.#connection.client}getRootPid(){return this.#connection?.getRootPid()??null}connect(){if(this.#state==="disabled")return Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`,"connect"));if(this.#state==="connected")return Promise.resolve(this.client);if(this.#pendingConnect)return this.#pendingConnect;let generation2=this.#generation,connection;try{connection=this.#createTransportConnection()}catch(error2){return Promise.reject(error2)}return this.#pendingConnect=this.#openConnection(connection,generation2).finally(()=>{this.#pendingConnect!==void 0&&generation2===this.#generation&&(this.#pendingConnect=void 0)}),generation2===this.#generation&&this.#setState("connecting"),this.#pendingConnect}async#openConnection(connection,generation2){this.#pendingConnection=connection;try{return await this.#connectTransport(connection,generation2)}finally{this.#pendingConnection===connection&&(this.#pendingConnection=void 0)}}async renew(){if(this.#state==="disabled")throw this.#connectError(`MCP server ${this.serverName} is disabled`,"renew");return this.#generation++,this.#pendingConnect=void 0,this.#setState("idle"),await this.#disposeOwnedConnections(),this.connect()}bumpGeneration(){return this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#state!=="disabled"&&this.#setState("idle"),this.#disposeOwnedConnections()}disable(){return this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#setState("disabled"),this.#disposeOwnedConnections()}async dispose(){this.#generation++,this.#pendingConnect=void 0,this.#setState("disabled"),await this.#disposeOwnedConnections()}markDegraded(error2){this.#markFailure("degraded",error2)}markSuspended(error2){this.#markFailure("suspended",error2)}markNeedsAuth(error2){this.#markFailure("needs_auth",error2)}markNeedsClientRegistration(error2){this.#markFailure("needs_client_registration",error2)}markToolsChanged(cause="notification"){this.#emit(this.#toolsListeners,{type:"tools_changed",serverName:this.serverName,generation:this.#generation,cause})}onStateChange(listener){return this.#stateListeners.add(listener),()=>this.#stateListeners.delete(listener)}onToolsChanged(listener){return this.#toolsListeners.add(listener),()=>this.#toolsListeners.delete(listener)}#createTransportConnection(){return createMcpTransport({authProvider:this.#authProvider,config:this.#config,env:this.#env,elicitationUiProvider:this.#elicitationUiProvider,logger:this.#logger,serverName:this.serverName})}#trackTransport(connection,generation2){connection.transport.onclose=wrapAsync("connection.transport.onclose",()=>{if(!this.#shutdownConnections.has(connection)){if(connection===this.#pendingConnection&&this.#state==="connecting"){let closeError=this.#connectError(`MCP server ${this.serverName} transport closed`,"close",!0),capturedError=diagnoseCapturedMcpConnectFailure({config:this.#config,cause:closeError,env:this.#env,logger:this.#logger,serverName:this.serverName});capturedError!==null&&this.markDegraded(capturedError);return}connection!==this.#connection&&connection!==this.#pendingConnection||generation2===this.#generation&&this.#state!=="disabled"&&this.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`,"close",!0))}},this.#sink)}async#connectTransport(connection,generation2){try{await connection.materialize(),this.#trackTransport(connection,generation2),await connectMcpTransport(connection)}catch(error2){if(this.#pendingConnection===connection&&(this.#pendingConnection=void 0),await this.#shutdown(connection),generation2!==this.#generation||this.#state==="disabled")throw this.#connectError(`MCP server ${this.serverName} connect was superseded`,"connect",!0);if(error2 instanceof ConnectError&&error2.phase==="modern-stdio")throw this.markDegraded(error2),error2;if(isMcpNeedsAuthError(error2)){let authError=error2 instanceof Error?error2:new Error(String(error2));throw this.markNeedsAuth(authError),authError}let connectError=await diagnoseMcpConnectFailure({config:this.#config,cause:error2 instanceof Error?error2:new Error(String(error2)),env:this.#env,logger:this.#logger,serverName:this.serverName});throw this.markDegraded(connectError),connectError}if(generation2!==this.#generation||this.#state==="disabled")throw await this.#shutdown(connection),this.#connectError(`MCP server ${this.serverName} connect was superseded`,"connect",!0);return this.#pendingConnection===connection&&(this.#pendingConnection=void 0),this.#connection=connection,this.#lastError=void 0,subscribeMcpListChanged(connection.client,()=>this.markToolsChanged()),subscribeMcpResourceUpdated(connection.client,()=>this.markToolsChanged()),subscribeMcpServerLogging(connection.client,{logLevel:this.#config.logLevel,logger:this.#logger}),this.#setState("connected"),this.markToolsChanged("connect"),connection.client}async#disposeOwnedConnections(){let connections=new Set,connection=this.#connection;this.#connection=void 0,connection!==void 0&&connections.add(connection);let pendingConnection=this.#pendingConnection;this.#pendingConnection=void 0,pendingConnection!==void 0&&connections.add(pendingConnection),await Promise.all([...connections].map(item=>this.#shutdown(item)))}async#shutdown(connection){let pending=this.#shutdownConnections.get(connection);if(pending!==void 0){await pending;return}let shutdown=(async()=>{await shutdownMcpTransport(connection)})();this.#shutdownConnections.set(connection,shutdown);try{await shutdown}finally{this.#shutdownConnections.delete(connection)}}#setState(state2,error2){if(this.#state===state2)return;let previousState=this.#state;this.#state=state2,this.#emit(this.#stateListeners,{type:"state_changed",serverName:this.serverName,previousState,state:state2,generation:this.#generation,error:error2})}#emit(listeners3,event){for(let listener of listeners3)wrapAsync("connection.event",listener,this.#sink)(event)}#markFailure(state2,error2){this.#lastError=error2,this.#setState(state2,error2)}#connectError(message,phase,retriable,cause){return new ConnectError(message,{cause,phase,retriable,serverName:this.serverName})}get#sink(){return{logger:this.#logger}}};var requestMethods=new Set(["request","listTools","listResources","listResourceTemplates","listPrompts","readResource","getPrompt","subscribeResource","unsubscribeResource","complete","ping","setLoggingLevel"]),SharedMcpLease=class extends ServerConnection{#unsubscribeTools;#stateSubscriptions=new Set;#released=!1;#localGeneration=0;#client;#physicalClient;#refreshCatalog=!1;constructor(shared,options,owner,key){super(options),this.shared=shared,this.options=options,this.owner=owner,this.key=key,this.#unsubscribeTools=shared.connection.onToolsChanged(event=>this.markToolsChanged(event.cause))}get state(){return this.#released?"disabled":this.shared.connection.state}get generation(){return this.shared.connection.generation+this.#localGeneration}get lastError(){return this.shared.connection.lastError}get client(){this.#assertAttached();let physical=this.shared.connection.client;if(this.#physicalClient!==physical){this.#physicalClient=physical;let callTool=(...args)=>(this.#assertAttached(),this.shared.callTool(this,()=>physical.callTool(...args)));this.#client=new Proxy(physical,{get:(target,property)=>{if(property==="callTool")return callTool;let value=Reflect.get(target,property,target);return typeof value=="function"&&requestMethods.has(property)?(...args)=>(this.#assertAttached(),this.shared.runRequest(()=>Promise.resolve(Reflect.apply(value,target,args)))):typeof value=="function"?value.bind(target):value}})}if(this.#client===void 0)throw new ConnectError("MCP client unavailable",{phase:"client"});return this.#client}async connect(){return this.#assertAttached(),await this.shared.connect(),this.client}async renew(){return await this.bumpGeneration(),this.connect()}async bumpGeneration(){this.#assertAttached(),this.#localGeneration++,this.#refreshCatalog=!0,this.markToolsChanged()}async catalog(){let refresh=this.#refreshCatalog;return this.#refreshCatalog=!1,this.shared.catalog(refresh)}getRootPid(){return this.#released?null:this.shared.connection.getRootPid()}refreshCapturedDiagnostics(){this.shared.connection.refreshCapturedDiagnostics()}markDegraded(error2){this.shared.connection.markDegraded(error2)}markSuspended(error2){this.shared.connection.markSuspended(error2)}markNeedsAuth(error2){this.shared.connection.markNeedsAuth(error2)}markNeedsClientRegistration(error2){this.shared.connection.markNeedsClientRegistration(error2)}onStateChange(listener){let off=this.shared.connection.onStateChange(event=>listener({...event,generation:this.generation}));return this.#stateSubscriptions.add(off),()=>{this.#stateSubscriptions.delete(off),off()}}async disable(){await this.dispose()}async dispose(){if(!this.#released){this.#released=!0,this.#unsubscribeTools();for(let off of this.#stateSubscriptions)off();this.#stateSubscriptions.clear(),this.shared.release(this)}}#assertAttached(){if(this.#released)throw new ConnectError("MCP connection owner detached",{phase:"client",serverName:this.serverName})}};var MCP_STARTUP_RACE_MS=250;var MCP_ATTACH_SETTLE_TIMEOUT_MS=5e3;var McpDeferredAttach=class{#pending=new Set;track(settled2){let tracked=settled2.then(()=>{},error2=>{createMcpLogger("startup").warn("Deferred MCP attach failed",{error:error2 instanceof Error?error2.message:String(error2)})});this.#pending.add(tracked),tracked.then(()=>this.#pending.delete(tracked))}async wait(timeoutMs){let pending=[...this.#pending];return pending.length===0?"settled":await waitForMcpStartupRace(Promise.all(pending).then(()=>{}),timeoutMs)}clear(){this.#pending.clear()}};async function raceMcpStartupConnect(options){let{entry,pi}=options,claim2={cachedCatalog:entry.cachedCatalog,ownsRegistration:()=>pi!==void 0&&options.shouldRefreshTools(),settled:()=>connect};entry.startupCatalogClaim=claim2;let releaseClaim=()=>{entry.startupCatalogClaim===claim2&&(entry.startupCatalogClaim=void 0)},connect=ignoreStartupNeedsAuth(entry,connectAndRefreshMcpCatalog(entry,options.serverConfig)).finally(releaseClaim);await waitForMcpStartupRace(connect,options.deadlineMs)==="settled"||options.pi===void 0||options.onDeferred(connect.then(()=>refreshMcpToolsAfterStartupRace(options)))}var catalogRefreshes=new WeakMap;function connectAndRefreshMcpCatalog(entry,serverConfig){let pending=catalogRefreshes.get(entry);if(pending!==void 0)return pending;let refresh=refreshConnectedMcpCatalog(entry,serverConfig);catalogRefreshes.set(entry,refresh);let finish=()=>{catalogRefreshes.get(entry)===refresh&&catalogRefreshes.delete(entry)};return refresh.then(finish,finish),refresh}async function refreshConnectedMcpCatalog(entry,serverConfig){if(serverConfig===void 0||entry.isCurrent?.()===!1)return;try{await entry.authPlan?.refresh?.ensureFresh()}catch(error2){let authError=markMcpConnectionNeedsAuth(entry.connection,error2);throw authError!==void 0?(entry.logger.warn(authError.message),authError):error2}if(entry.credentialsCurrent?.()===!1){await entry.onCredentialsChanged?.();return}if(await connectMcpServer(entry.connection,entry.logger),entry.connection.state!=="connected"||entry.isCurrent?.()===!1)return;let generation2=entry.connection.generation,ownsCatalog=()=>entry.isCurrent?.()!==!1&&entry.credentialsCurrent?.()!==!1&&entry.connection.state==="connected"&&entry.connection.generation===generation2;if(entry.connection instanceof SharedMcpLease){let catalog=await entry.connection.catalog();if(!ownsCatalog()){entry.credentialsCurrent?.()===!1&&await entry.onCredentialsChanged?.();return}entry.cachedCatalog=catalog,entry.catalogGeneration=generation2,entry.cacheRefreshedAfterConnect=!0;return}if(!(entry.cacheRefreshedAfterConnect&&entry.catalogGeneration===generation2))try{let catalog=await collectServerCatalogForCache(entry.connection,serverConfig,entry.configHash,entry.credentialIdentity);if(!ownsCatalog()){entry.credentialsCurrent?.()===!1&&await entry.onCredentialsChanged?.();return}entry.cachedCatalog=catalog,entry.catalogGeneration=generation2,entry.cacheRefreshedAfterConnect=!0,await writeMcpCachedServer(entry.agentDir,entry.name,catalog,ownsCatalog),ownsCatalog()&&await ensureMcpResourceSubscriptions(entry.connection.client,catalog.resources??[])}catch(error2){entry.logger.warn("Failed to refresh MCP catalog cache",{error:error2 instanceof Error?error2.message:String(error2)})}}async function connectMcpServer(connection,logger){try{await connection.connect()}catch(error2){let failure2=error2 instanceof Error?error2:new Error(String(error2));connection.lastError===void 0&&connection.markDegraded(failure2),logger?.warn(failure2.message)}}async function ignoreStartupNeedsAuth(entry,connect){try{await connect}catch(error2){if(entry.connection.state==="needs_auth")return;throw error2}}async function refreshMcpToolsAfterStartupRace(options){if(!(options.pi===void 0||!options.shouldRefreshTools()))try{await options.registerDirectTools(options.pi)}catch(error2){createMcpLogger("service").warn("Failed to refresh MCP tools after startup race",{error:error2 instanceof Error?error2.message:String(error2)})}}async function waitForMcpStartupRace(connect,deadlineMs=MCP_STARTUP_RACE_MS){let timeout;try{return await Promise.race([connect.then(()=>"settled"),new Promise(resolve53=>{timeout=safeTimer("startup.race",deadlineMs,()=>resolve53("timeout"),{logger:createMcpLogger("startup")})})])}finally{timeout!==void 0&&clearTimeout(timeout)}}function shouldRaceMcpStartup(lifecycle){return lifecycle==="eager"||lifecycle==="keep-alive"}var McpConfigValidationError=class extends Error{constructor(message){super(message),this.name="McpConfigValidationError"}},trustedEnv=process.env;function loadMcpConfig(options){let agentDir=options.agentDir??getAgentDir(),env=options.env??trustedEnv,globalPath=join54(agentDir,"mcp.json"),projectPath=join54(options.cwd,CONFIG_DIR_NAME,"mcp.json"),claudePath=join54(options.cwd,".mcp.json"),globalConfig=readTrustedConfig(globalPath,env),projectRead=readConfigJson(projectPath,options.projectTrusted),projectRaw=projectRead.raw,shouldImportClaude=mergeConfigs(globalConfig,options.projectTrusted?validateRaw(projectRaw,projectPath):void 0).settings?.importConfigs?.includes("claude")===!0,claudeRead=shouldImportClaude?readConfigJson(claudePath,options.projectTrusted):{raw:void 0},claudeRaw=claudeRead.raw,sources=[{config:globalConfig,path:globalPath,source:"global",trusted:!0},{config:options.projectTrusted&&shouldImportClaude?readTrustedConfig(claudePath,env,claudeRaw):void 0,path:claudePath,source:"claude",trusted:options.projectTrusted},{config:options.projectTrusted?readTrustedConfig(projectPath,env,projectRaw):void 0,path:projectPath,source:"project",trusted:options.projectTrusted}],merged=mergeConfigs(...sources.map(item=>item.config)),result3={diagnostics:[],servers:{},settings:normalizeSettings(merged.settings)};for(let diagnostic2 of[projectRead.diagnostic,claudeRead.diagnostic])diagnostic2&&result3.diagnostics.push(diagnostic2);for(let item of sources){if(item.trusted&&item.config?.mcpServers){addTrustedServers(result3,item.config.mcpServers,item.source,item.path);continue}item.trusted||addUntrustedServers(result3,readServerNames(item.source==="claude"?claudeRaw:projectRaw),item.source,item.path)}return result3}function visitSpawnableMcpServers(config,visit){for(let[name,server]of Object.entries(config.servers))server.state==="enabled"&&visit(name,server)}function readTrustedConfig(path14,env,raw=readConfigJson(path14,!0).raw){let config=interpolateConfig(validateRaw(raw,path14),env),endpointError=config?getServerEndpointValidationError(config):void 0;if(endpointError)throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);return config}function readConfigJson(path14,trusted){if(!existsSync26(path14))return{raw:void 0};try{return{raw:JSON.parse(readFileSync32(path14,"utf-8"))}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);if(trusted)throw new McpConfigValidationError(`Invalid MCP config at ${path14}: ${reason}`);return{raw:void 0,diagnostic:`Blocked untrusted MCP config at ${path14}: invalid JSON (${reason})`}}}function validateRaw(raw,_path){if(raw===void 0)return;if(validateConfig.Check(raw)){let config=raw,endpointError=getServerEndpointValidationError(config);if(endpointError)throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);return config}let error2=Array.from(validateConfig.Errors(raw))[0];throw new McpConfigValidationError(`Invalid MCP config at ${formatErrorPath(error2)}: ${formatErrorMessage(error2)}`)}function formatErrorPath(error2){let trimmed=error2.instancePath.replace(/^\//,"");return trimmed.length===0?"$":trimmed.split("/").map(decodePathPart).join(".")}function decodePathPart(part){return part.replace(/~1/g,"/").replace(/~0/g,"~")}function formatErrorMessage(error2){return error2.message==="must be array"?"Expected array":error2.message}function mergeConfigs(...configs){let merged={};for(let config of configs)config&&(merged.settings={...merged.settings??{},...config.settings??{}},merged.mcpServers={...merged.mcpServers??{},...config.mcpServers??{}});return merged}function normalizeSettings(settings){return{...defaultSettings,...settings}}function addTrustedServers(result3,servers,source2,sourcePath){for(let[name,server]of Object.entries(servers)){let config=normalizeServer(server);inheritMcpSharingScope(server,config),result3.servers[name]={config,configHash:hashConfig(config),name,source:source2,sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type}}}function addUntrustedServers(result3,names,source2,sourcePath){for(let name of names){let existing2=result3.servers[name];if(existing2&&existing2.state!=="untrusted"){result3.diagnostics.push(`Blocked untrusted ${source2} MCP server '${name}' from shadowing trusted ${existing2.source} server.`);continue}result3.servers[name]={name,source:source2,sourcePath,state:"untrusted"}}}function readServerNames(raw){if(typeof raw!="object"||raw===null||Array.isArray(raw))return[];let servers=raw.mcpServers;return typeof servers!="object"||servers===null||Array.isArray(servers)?[]:Object.keys(servers)}function resolveExtensionMcpServer(name,raw,sourcePath,registrationCwd){let withCwd={...raw,cwd:raw.cwd??registrationCwd},config=normalizeServer(withCwd);return{config,configHash:hashConfig(config),name,source:"extension",sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type}}function mergeExtensionMcpServers(result3,declarations){for(let decl of declarations){let existing2=result3.servers[decl.name];if(existing2!==void 0&&existing2.state!=="untrusted"){result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped; ${existing2.source} config at ${existing2.sourcePath} wins.`);continue}existing2!==void 0&&result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} replaces untrusted ${existing2.source} placeholder from ${existing2.sourcePath}.`),result3.servers[decl.name]=resolveExtensionMcpServer(decl.name,decl.config,decl.extensionPath,decl.registrationCwd)}}function normalizeServer(server){let type2=server.type??(server.url?"http":"stdio");return{args:server.args??[],connectTimeoutMs:server.connectTimeoutMs??15e3,enabled:server.enabled??!0,exposure:server.exposure??"auto",idleTimeoutMin:server.idleTimeoutMin??10,lifecycle:server.lifecycle??"lazy",logLevel:server.logLevel??"info",requestTimeoutMs:server.requestTimeoutMs??3e4,startupTimeoutMs:server.startupTimeoutMs??MCP_STARTUP_RACE_MS,type:type2,...server}}function interpolateConfig(config,env){let resolved=interpolateValue(config,"mcp",env);for(let[name,raw]of Object.entries(config?.mcpServers??{})){let server=resolved?.mcpServers?.[name];server!==void 0&&inheritMcpSharingScope(raw,server)}return resolved}function interpolateValue(value,path14,env){if(typeof value=="string")return interpolateString(value,path14,env);if(Array.isArray(value))return value.map((item,index)=>interpolateValue(item,`${path14}.${index}`,env));if(typeof value=="object"&&value!==null){let out={};for(let[key,item]of Object.entries(value))out[key]=interpolateValue(item,`${path14}.${key}`,env);return out}return value}function interpolateString(value,path14,env){if(value.trimStart().startsWith("!")||value.includes("$(")){let displayPath5=path14.replace(/^mcp\./,"");throw new McpConfigValidationError(`MCP config interpolation rejected command substitution at ${displayPath5}: config values may reference only environment variables for security; shell commands are never executed.`)}return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\}/g,(_match,name,_fallback,fallbackValue)=>env[name]??fallbackValue??"")}function hashConfig(config){let hashable={...config};return delete hashable.startupTimeoutMs,createHash19("sha256").update(stableStringify2(hashable)).digest("hex")}function stableStringify2(value){return Array.isArray(value)?`[${value.map(stableStringify2).join(",")}]`:typeof value=="object"&&value!==null?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${stableStringify2(value[key])}`).join(",")}}`:JSON.stringify(value)}function getGlobalMcpConfigPath(agentDir=getAgentDir()){return join55(agentDir,"mcp.json")}function addGlobalMcpServer(name,server){let path14=getGlobalMcpConfigPath(),config=readGlobalMcpConfig(path14),next={...config,mcpServers:{...config.mcpServers??{},[name]:stripDefaults(server)}};return writeValidatedConfig(path14,next),path14}function setGlobalMcpServerEnabled(name,enabled){return updateMcpServerConfig(getGlobalMcpConfigPath(),name,{enabled})}function updateMcpServerConfig(path14,name,patch){let config=readGlobalMcpConfig(path14),existing2=config.mcpServers?.[name];if(existing2===void 0)return!1;let next={...config,mcpServers:{...config.mcpServers??{},[name]:{...existing2,...patch}}};return writeValidatedConfig(path14,next),!0}function readGlobalMcpConfig(path14){if(!existsSync27(path14))return{};let raw=JSON.parse(readFileSync33(path14,"utf8"));return assertValidConfig(raw),raw}function writeValidatedConfig(path14,config){assertValidConfig(config),mkdirSync16(dirname42(path14),{recursive:!0}),writeFileSync16(path14,`${JSON.stringify(config,null,2)}
|
|
740
|
+
`)}function definedEnv(env){let result3={};for(let[key,value]of Object.entries(env??{}))value!==void 0&&(result3[key]=value);return result3}function isTimedOut(error2){return error2===null?!1:getProperty(error2,"signal")==="SIGKILL"||error2.message.includes("timed out")}function isNodeErrorCode(error2,code){return error2!==null&&getProperty(error2,"code")===code}function getProperty(value,key){return value[key]}var MCP_LOG_RATE_LIMIT_PER_SECOND=10,LEVEL_ORDER=["emergency","alert","critical","error","warning","notice","info","debug"];function severity(level){let index=LEVEL_ORDER.indexOf(level);return index===-1?LEVEL_ORDER.indexOf("info"):index}function loggerMethod(level){switch(level){case"debug":return"debug";case"info":case"notice":return"info";case"warning":return"warn";default:return"error"}}function subscribeMcpServerLogging(client,options){let threshold=options.logLevel===void 0?void 0:severity(options.logLevel),rate=options.ratePerSecond??MCP_LOG_RATE_LIMIT_PER_SECOND,now2=options.now??Date.now,tokens=rate,lastRefill=now2();registerMcpNotificationHandler(client,LoggingMessageNotificationSchema,notification=>{let{level,data,logger:serverLogger}=notification.params;if(threshold!==void 0&&severity(level)>threshold)return;let at=now2();if(tokens=Math.min(rate,tokens+(at-lastRefill)/1e3*rate),lastRefill=at,tokens<1)return;tokens-=1;let text3=typeof data=="string"?data:JSON.stringify(data);options.logger[loggerMethod(level)](`[server${serverLogger?`:${serverLogger}`:""}] ${text3}`)})}function diffMcpToolNames(prev,next){let prevSet=new Set(prev),nextSet=new Set(next);return{added:[...nextSet].filter(name=>!prevSet.has(name)).sort(),removed:[...prevSet].filter(name=>!nextSet.has(name)).sort(),unchanged:[...nextSet].filter(name=>prevSet.has(name)).sort()}}function formatMcpListChangedDelta(diff){let parts=[];return diff.added.length>0&&parts.push(`${diff.added.length} added (inactive)`),diff.removed.length>0&&parts.push(`${diff.removed.length} removed`),parts.length===0?"no change":parts.join(", ")}function createMcpListChangeCoalescer(options){let delayMs=options.delayMs??300,minIntervalMs=options.minIntervalMs??1e3,now2=options.now??Date.now,scope=options.scope??"mcp.list_changed",timer,lastRefreshAt=Number.NEGATIVE_INFINITY,fire=async()=>{timer=void 0,lastRefreshAt=now2(),await options.onRefresh()};return{notify(){if(timer!==void 0)return;let sinceLast=now2()-lastRefreshAt,wait=Math.max(delayMs,minIntervalMs-sinceLast);timer=safeTimer(scope,wait,fire,options.sink)},dispose(){timer!==void 0&&(clearTimeout(timer),timer=void 0)}}}function subscribeMcpListChanged(client,onChange){for(let schema of[ToolListChangedNotificationSchema,ResourceListChangedNotificationSchema,PromptListChangedNotificationSchema])registerMcpNotificationHandler(client,schema,()=>{onChange()})}function buildMcpTombstoneDefinition(name,server){return{name,label:name,description:`This MCP tool was removed from ${server} and is no longer available.`,parameters:typebox_exports.Object({}),executionMode:"parallel",async execute(){throw new ToolExecError(`tool no longer available on ${server}`,{phase:"call",serverName:server})},renderCall(_args,theme2){return new Text(theme2.fg("toolOutput",`${name} (removed)`),0,0)}}}var SHUTDOWN_GRACE_MS=100,SHUTDOWN_TERM_WAIT_MS=400,SHUTDOWN_FINAL_WAIT_MS=500,SHUTDOWN_CLOSE_WAIT_MS=400;function createMcpTransport(options){let spec2=options.config.type==="stdio"?stdioSpec(options):httpSpec(options);return createConnection2(options,spec2,options.config.connectTimeoutMs)}async function connectMcpTransport(connection){let timedOut=!1,controller=new AbortController,captureInterval=safeInterval("transport.captureRootPid",25,()=>connection.captureRootPid?.(),connection.asyncErrorSink),timeout=safeTimer("transport.connectTimeout",connection.connectTimeoutMs,()=>{timedOut=!0,connection.captureRootPid?.(),controller.abort()},connection.asyncErrorSink);try{await connection.materialize(),await connection.client.connect(connection.transport,{signal:controller.signal,timeout:connection.connectTimeoutMs})}catch(error2){if(await shutdownMcpTransport(connection).catch(()=>{}),error2 instanceof ConnectError&&error2.phase==="modern-stdio")throw error2;if(timedOut)throw new TimeoutError(`MCP server ${connection.serverName} timed out during connect after ${connection.connectTimeoutMs}ms`,{cause:error2,phase:"connect",retriable:!0,serverName:connection.serverName});let reason=crossOriginRedirectReason(error2,connection.endpointUrl)??errorMessage4(error2);throw new ConnectError(`MCP server ${connection.serverName} failed during connect: ${reason}`,{cause:error2,phase:"connect",retriable:!0,serverName:connection.serverName})}finally{clearInterval(captureInterval),clearTimeout(timeout)}}async function shutdownMcpTransport(connection){let rootPid=connection.getRootPid(),closePromise=connection.closeTransport();await delay(SHUTDOWN_GRACE_MS),rootPid!==null&&await reapProcessTree(rootPid,{killWaitMs:SHUTDOWN_FINAL_WAIT_MS,termWaitMs:SHUTDOWN_TERM_WAIT_MS}),await Promise.race([closePromise,delay(SHUTDOWN_CLOSE_WAIT_MS)])}function stdioSpec(options){let command=options.config.command;if(command===void 0||command.trim().length===0)throw new ConnectError(`MCP server ${options.serverName} stdio command is required`,{phase:"create",serverName:options.serverName});return{args:options.config.args,authProvider:options.authProvider,command,cwd:options.config.cwd,env:{...definedEnv2(options.env),...options.config.env??{}},kind:"stdio"}}function httpSpec(options){if(options.config.url===void 0||options.config.url.trim().length===0)throw new ConnectError(`MCP server ${options.serverName} HTTP URL is required`,{phase:"create",serverName:options.serverName});let url;try{url=new URL(options.config.url)}catch(error2){throw new ConnectError(`MCP server ${options.serverName} HTTP URL is invalid: ${errorMessage4(error2)}`,{cause:error2,phase:"create",serverName:options.serverName})}let headers=buildHeaders(options);return{authProvider:options.authProvider,kind:"http",requestInit:Object.keys(headers).length===0?void 0:{headers},url}}function createConnection2(options,spec2,connectTimeoutMs){let asyncErrorSink={logger:options.logger},materialized,pending,abort=new AbortController,lastRootPid=null,captureRootPid=()=>{lastRootPid=materialized?.readPid()??lastRootPid},built=()=>{if(materialized===void 0)throw new ConnectError(`MCP server ${options.serverName} transport is not started`,{phase:"create",serverName:options.serverName});return materialized};return{asyncErrorSink,captureRootPid,get client(){return built().client},closeTransport:async()=>{abort.abort(),await materialized?.close()},connectTimeoutMs,getRootPid:()=>(captureRootPid(),materialized?.readPid()??lastRootPid),materialize:async()=>{pending??=import("./dispatch-YPCDRQYI.js").then(({materializeNegotiatedTransport})=>materializeNegotiatedTransport({elicitationUiProvider:options.elicitationUiProvider,logger:options.logger,onStart:captureRootPid,sink:asyncErrorSink,spec:spec2},options.serverName,connectTimeoutMs,abort.signal)),materialized=await pending,abort.signal.aborted&&(await materialized.close(),abort.signal.throwIfAborted())},serverName:options.serverName,get transport(){return built().transport},transportKind:spec2.kind,...spec2.kind==="http"?{endpointUrl:spec2.url}:{}}}function definedEnv2(env){let result3={};for(let[key,value]of Object.entries(env??{}))value!==void 0&&(result3[key]=value);return result3}function buildHeaders(options){let headers={...options.config.headers??{}};if(!(options.config.auth==="bearer"||options.config.auth===void 0&&options.config.bearerTokenEnv!==void 0))return headers;let envName=options.config.bearerTokenEnv;if(envName===void 0||envName.trim().length===0)throw new AuthError(`MCP server ${options.serverName} bearer auth requires bearerTokenEnv`,{phase:"create",serverName:options.serverName});let token=options.env?.[envName]??process.env[envName];if(token===void 0||token.length===0)throw new AuthError(`MCP server ${options.serverName} bearer token env ${envName} is not set`,{phase:"create",serverName:options.serverName});return headers.authorization=`Bearer ${token}`,headers}var errorMessage4=error2=>error2 instanceof Error?error2.message:String(error2),UNFOLLOWED_REDIRECT=/Redirect to (\S+) not followed/;function crossOriginRedirectReason(error2,endpoint){if(endpoint===void 0||!(error2 instanceof Error))return;let code=error2.code;if(typeof code!="number"||code<300||code>=400)return;let target=UNFOLLOWED_REDIRECT.exec(error2.message)?.[1];if(target===void 0)return;let targetOrigin;try{targetOrigin=new URL(target).origin}catch(parseError){if(parseError instanceof TypeError)return;throw parseError}if(targetOrigin!==endpoint.origin)return`the endpoint at ${endpoint.origin} redirected to ${targetOrigin}, and senpi only follows redirects within the same origin, so credentials and requests never move to another server without your say-so. Point the server's url at ${target} if that is where it now lives.`}var ServerConnection=class{#logger;#env;#config;#authProvider;#elicitationUiProvider;#state;#generation=0;#connection;#pendingConnection;#pendingConnect;#lastError;#stateListeners=new Set;#toolsListeners=new Set;#shutdownConnections=new Map;constructor(options){this.serverName=options.serverName,this.#config=options.config,this.#logger=options.logger,this.#env=options.env,this.#authProvider=options.authProvider,this.#elicitationUiProvider=options.elicitationUiProvider,this.#state=options.config.enabled?"idle":"disabled"}get state(){return this.#state}get lastError(){return this.#lastError}get generation(){return this.#generation}refreshCapturedDiagnostics(){let current=this.#lastError;if(current===void 0)return;let capturedError=diagnoseCapturedMcpConnectFailure({config:this.#config,cause:current,env:this.#env,logger:this.#logger,serverName:this.serverName});capturedError!==null&&capturedError.message!==current.message&&(this.#lastError=capturedError)}get client(){if(this.#connection===void 0)throw new ConnectError(`MCP server ${this.serverName} is not connected`,{phase:"client",serverName:this.serverName});return this.#connection.client}getRootPid(){return this.#connection?.getRootPid()??null}connect(){if(this.#state==="disabled")return Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`,"connect"));if(this.#state==="connected")return Promise.resolve(this.client);if(this.#pendingConnect)return this.#pendingConnect;let generation2=this.#generation,connection;try{connection=this.#createTransportConnection()}catch(error2){return Promise.reject(error2)}return this.#pendingConnect=this.#openConnection(connection,generation2).finally(()=>{this.#pendingConnect!==void 0&&generation2===this.#generation&&(this.#pendingConnect=void 0)}),generation2===this.#generation&&this.#setState("connecting"),this.#pendingConnect}async#openConnection(connection,generation2){this.#pendingConnection=connection;try{return await this.#connectTransport(connection,generation2)}finally{this.#pendingConnection===connection&&(this.#pendingConnection=void 0)}}async renew(){if(this.#state==="disabled")throw this.#connectError(`MCP server ${this.serverName} is disabled`,"renew");return this.#generation++,this.#pendingConnect=void 0,this.#setState("idle"),await this.#disposeOwnedConnections(),this.connect()}bumpGeneration(){return this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#state!=="disabled"&&this.#setState("idle"),this.#disposeOwnedConnections()}disable(){return this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#setState("disabled"),this.#disposeOwnedConnections()}async dispose(){this.#generation++,this.#pendingConnect=void 0,this.#setState("disabled"),await this.#disposeOwnedConnections()}markDegraded(error2){this.#markFailure("degraded",error2)}markSuspended(error2){this.#markFailure("suspended",error2)}markNeedsAuth(error2){this.#markFailure("needs_auth",error2)}markNeedsClientRegistration(error2){this.#markFailure("needs_client_registration",error2)}markToolsChanged(cause="notification"){this.#emit(this.#toolsListeners,{type:"tools_changed",serverName:this.serverName,generation:this.#generation,cause})}onStateChange(listener){return this.#stateListeners.add(listener),()=>this.#stateListeners.delete(listener)}onToolsChanged(listener){return this.#toolsListeners.add(listener),()=>this.#toolsListeners.delete(listener)}#createTransportConnection(){return createMcpTransport({authProvider:this.#authProvider,config:this.#config,env:this.#env,elicitationUiProvider:this.#elicitationUiProvider,logger:this.#logger,serverName:this.serverName})}#trackTransport(connection,generation2){connection.transport.onclose=wrapAsync("connection.transport.onclose",()=>{if(!this.#shutdownConnections.has(connection)){if(connection===this.#pendingConnection&&this.#state==="connecting"){let closeError=this.#connectError(`MCP server ${this.serverName} transport closed`,"close",!0),capturedError=diagnoseCapturedMcpConnectFailure({config:this.#config,cause:closeError,env:this.#env,logger:this.#logger,serverName:this.serverName});capturedError!==null&&this.markDegraded(capturedError);return}connection!==this.#connection&&connection!==this.#pendingConnection||generation2===this.#generation&&this.#state!=="disabled"&&this.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`,"close",!0))}},this.#sink)}async#connectTransport(connection,generation2){try{await connection.materialize(),this.#trackTransport(connection,generation2),await connectMcpTransport(connection)}catch(error2){if(this.#pendingConnection===connection&&(this.#pendingConnection=void 0),await this.#shutdown(connection),generation2!==this.#generation||this.#state==="disabled")throw this.#connectError(`MCP server ${this.serverName} connect was superseded`,"connect",!0);if(error2 instanceof ConnectError&&error2.phase==="modern-stdio")throw this.markDegraded(error2),error2;if(isMcpNeedsAuthError(error2)){let authError=error2 instanceof Error?error2:new Error(String(error2));throw this.markNeedsAuth(authError),authError}let connectError=await diagnoseMcpConnectFailure({config:this.#config,cause:error2 instanceof Error?error2:new Error(String(error2)),env:this.#env,logger:this.#logger,serverName:this.serverName});throw this.markDegraded(connectError),connectError}if(generation2!==this.#generation||this.#state==="disabled")throw await this.#shutdown(connection),this.#connectError(`MCP server ${this.serverName} connect was superseded`,"connect",!0);return this.#pendingConnection===connection&&(this.#pendingConnection=void 0),this.#connection=connection,this.#lastError=void 0,subscribeMcpListChanged(connection.client,()=>this.markToolsChanged()),subscribeMcpResourceUpdated(connection.client,()=>this.markToolsChanged()),subscribeMcpServerLogging(connection.client,{logLevel:this.#config.logLevel,logger:this.#logger}),this.#setState("connected"),this.markToolsChanged("connect"),connection.client}async#disposeOwnedConnections(){let connections=new Set,connection=this.#connection;this.#connection=void 0,connection!==void 0&&connections.add(connection);let pendingConnection=this.#pendingConnection;this.#pendingConnection=void 0,pendingConnection!==void 0&&connections.add(pendingConnection),await Promise.all([...connections].map(item=>this.#shutdown(item)))}async#shutdown(connection){let pending=this.#shutdownConnections.get(connection);if(pending!==void 0){await pending;return}let shutdown=(async()=>{await shutdownMcpTransport(connection)})();this.#shutdownConnections.set(connection,shutdown);try{await shutdown}finally{this.#shutdownConnections.delete(connection)}}#setState(state2,error2){if(this.#state===state2)return;let previousState=this.#state;this.#state=state2,this.#emit(this.#stateListeners,{type:"state_changed",serverName:this.serverName,previousState,state:state2,generation:this.#generation,error:error2})}#emit(listeners3,event){for(let listener of listeners3)wrapAsync("connection.event",listener,this.#sink)(event)}#markFailure(state2,error2){this.#lastError=error2,this.#setState(state2,error2)}#connectError(message,phase,retriable,cause){return new ConnectError(message,{cause,phase,retriable,serverName:this.serverName})}get#sink(){return{logger:this.#logger}}};var requestMethods=new Set(["request","listTools","listResources","listResourceTemplates","listPrompts","readResource","getPrompt","subscribeResource","unsubscribeResource","complete","ping","setLoggingLevel"]),SharedMcpLease=class extends ServerConnection{#unsubscribeTools;#stateSubscriptions=new Set;#released=!1;#localGeneration=0;#client;#physicalClient;#refreshCatalog=!1;constructor(shared,options,owner,key){super(options),this.shared=shared,this.options=options,this.owner=owner,this.key=key,this.#unsubscribeTools=shared.connection.onToolsChanged(event=>this.markToolsChanged(event.cause))}get state(){return this.#released?"disabled":this.shared.connection.state}get generation(){return this.shared.connection.generation+this.#localGeneration}get lastError(){return this.shared.connection.lastError}get client(){this.#assertAttached();let physical=this.shared.connection.client;if(this.#physicalClient!==physical){this.#physicalClient=physical;let callTool=(...args)=>(this.#assertAttached(),this.shared.callTool(this,()=>physical.callTool(...args)));this.#client=new Proxy(physical,{get:(target,property)=>{if(property==="callTool")return callTool;let value=Reflect.get(target,property,target);return typeof value=="function"&&requestMethods.has(property)?(...args)=>(this.#assertAttached(),this.shared.runRequest(()=>Promise.resolve(Reflect.apply(value,target,args)))):typeof value=="function"?value.bind(target):value}})}if(this.#client===void 0)throw new ConnectError("MCP client unavailable",{phase:"client"});return this.#client}async connect(){return this.#assertAttached(),await this.shared.connect(),this.client}async renew(){return await this.bumpGeneration(),this.connect()}async bumpGeneration(){this.#assertAttached(),this.#localGeneration++,this.#refreshCatalog=!0,this.markToolsChanged()}async catalog(){let refresh=this.#refreshCatalog;return this.#refreshCatalog=!1,this.shared.catalog(refresh)}getRootPid(){return this.#released?null:this.shared.connection.getRootPid()}refreshCapturedDiagnostics(){this.shared.connection.refreshCapturedDiagnostics()}markDegraded(error2){this.shared.connection.markDegraded(error2)}markSuspended(error2){this.shared.connection.markSuspended(error2)}markNeedsAuth(error2){this.shared.connection.markNeedsAuth(error2)}markNeedsClientRegistration(error2){this.shared.connection.markNeedsClientRegistration(error2)}onStateChange(listener){let off=this.shared.connection.onStateChange(event=>listener({...event,generation:this.generation}));return this.#stateSubscriptions.add(off),()=>{this.#stateSubscriptions.delete(off),off()}}async disable(){await this.dispose()}async dispose(){if(!this.#released){this.#released=!0,this.#unsubscribeTools();for(let off of this.#stateSubscriptions)off();this.#stateSubscriptions.clear(),this.shared.release(this)}}#assertAttached(){if(this.#released)throw new ConnectError("MCP connection owner detached",{phase:"client",serverName:this.serverName})}};var MCP_STARTUP_RACE_MS=250;var MCP_ATTACH_SETTLE_TIMEOUT_MS=5e3;var McpDeferredAttach=class{#pending=new Set;track(settled2){let tracked=settled2.then(()=>{},error2=>{createMcpLogger("startup").warn("Deferred MCP attach failed",{error:error2 instanceof Error?error2.message:String(error2)})});this.#pending.add(tracked),tracked.then(()=>this.#pending.delete(tracked))}async wait(timeoutMs){let pending=[...this.#pending];return pending.length===0?"settled":await waitForMcpStartupRace(Promise.all(pending).then(()=>{}),timeoutMs)}clear(){this.#pending.clear()}};async function raceMcpStartupConnect(options){let{entry,pi}=options,claim2={cachedCatalog:entry.cachedCatalog,ownsRegistration:()=>pi!==void 0&&options.shouldRefreshTools(),settled:()=>connect};entry.startupCatalogClaim=claim2;let releaseClaim=()=>{entry.startupCatalogClaim===claim2&&(entry.startupCatalogClaim=void 0)},connect=ignoreStartupNeedsAuth(entry,connectAndRefreshMcpCatalog(entry,options.serverConfig)).finally(releaseClaim);await waitForMcpStartupRace(connect,options.deadlineMs)==="settled"||options.pi===void 0||options.onDeferred(connect.then(()=>refreshMcpToolsAfterStartupRace(options)))}var catalogRefreshes=new WeakMap;function connectAndRefreshMcpCatalog(entry,serverConfig){let pending=catalogRefreshes.get(entry);if(pending!==void 0)return pending;let refresh=refreshConnectedMcpCatalog(entry,serverConfig);catalogRefreshes.set(entry,refresh);let finish=()=>{catalogRefreshes.get(entry)===refresh&&catalogRefreshes.delete(entry)};return refresh.then(finish,finish),refresh}async function refreshConnectedMcpCatalog(entry,serverConfig){if(serverConfig===void 0||entry.isCurrent?.()===!1)return;try{await entry.authPlan?.refresh?.ensureFresh()}catch(error2){let authError=markMcpConnectionNeedsAuth(entry.connection,error2);throw authError!==void 0?(entry.logger.warn(authError.message),authError):error2}if(entry.credentialsCurrent?.()===!1){await entry.onCredentialsChanged?.();return}if(await connectMcpServer(entry.connection,entry.logger),entry.connection.state!=="connected"||entry.isCurrent?.()===!1)return;let generation2=entry.connection.generation,ownsCatalog=()=>entry.isCurrent?.()!==!1&&entry.credentialsCurrent?.()!==!1&&entry.connection.state==="connected"&&entry.connection.generation===generation2;if(entry.connection instanceof SharedMcpLease){let catalog=await entry.connection.catalog();if(!ownsCatalog()){entry.credentialsCurrent?.()===!1&&await entry.onCredentialsChanged?.();return}entry.cachedCatalog=catalog,entry.catalogGeneration=generation2,entry.cacheRefreshedAfterConnect=!0;return}if(!(entry.cacheRefreshedAfterConnect&&entry.catalogGeneration===generation2))try{let catalog=await collectServerCatalogForCache(entry.connection,serverConfig,entry.configHash,entry.credentialIdentity);if(!ownsCatalog()){entry.credentialsCurrent?.()===!1&&await entry.onCredentialsChanged?.();return}entry.cachedCatalog=catalog,entry.catalogGeneration=generation2,entry.cacheRefreshedAfterConnect=!0,await writeMcpCachedServer(entry.agentDir,entry.name,catalog,ownsCatalog),ownsCatalog()&&await ensureMcpResourceSubscriptions(entry.connection.client,catalog.resources??[])}catch(error2){entry.logger.warn("Failed to refresh MCP catalog cache",{error:error2 instanceof Error?error2.message:String(error2)})}}async function connectMcpServer(connection,logger){try{await connection.connect()}catch(error2){let failure2=error2 instanceof Error?error2:new Error(String(error2));connection.lastError===void 0&&connection.markDegraded(failure2),logger?.warn(failure2.message)}}async function ignoreStartupNeedsAuth(entry,connect){try{await connect}catch(error2){if(entry.connection.state==="needs_auth")return;throw error2}}async function refreshMcpToolsAfterStartupRace(options){if(!(options.pi===void 0||!options.shouldRefreshTools()))try{await options.registerDirectTools(options.pi)}catch(error2){createMcpLogger("service").warn("Failed to refresh MCP tools after startup race",{error:error2 instanceof Error?error2.message:String(error2)})}}async function waitForMcpStartupRace(connect,deadlineMs=MCP_STARTUP_RACE_MS){let timeout;try{return await Promise.race([connect.then(()=>"settled"),new Promise(resolve53=>{timeout=safeTimer("startup.race",deadlineMs,()=>resolve53("timeout"),{logger:createMcpLogger("startup")})})])}finally{timeout!==void 0&&clearTimeout(timeout)}}function shouldRaceMcpStartup(lifecycle){return lifecycle==="eager"||lifecycle==="keep-alive"}var McpConfigValidationError=class extends Error{constructor(message){super(message),this.name="McpConfigValidationError"}},trustedEnv=process.env;function loadMcpConfig(options){let agentDir=options.agentDir??getAgentDir(),env=options.env??trustedEnv,globalPath=join54(agentDir,"mcp.json"),projectPath=join54(options.cwd,CONFIG_DIR_NAME,"mcp.json"),claudePath=join54(options.cwd,".mcp.json"),globalConfig=readTrustedConfig(globalPath,env),projectRead=readConfigJson(projectPath,options.projectTrusted),projectRaw=projectRead.raw,shouldImportClaude=mergeConfigs(globalConfig,options.projectTrusted?validateRaw(projectRaw,projectPath):void 0).settings?.importConfigs?.includes("claude")===!0,claudeRead=shouldImportClaude?readConfigJson(claudePath,options.projectTrusted):{raw:void 0},claudeRaw=claudeRead.raw,sources=[{config:globalConfig,path:globalPath,source:"global",trusted:!0},{config:options.projectTrusted&&shouldImportClaude?readTrustedConfig(claudePath,env,claudeRaw):void 0,path:claudePath,source:"claude",trusted:options.projectTrusted},{config:options.projectTrusted?readTrustedConfig(projectPath,env,projectRaw):void 0,path:projectPath,source:"project",trusted:options.projectTrusted}],merged=mergeConfigs(...sources.map(item=>item.config)),result3={diagnostics:[],servers:{},settings:normalizeSettings(merged.settings)};for(let diagnostic2 of[projectRead.diagnostic,claudeRead.diagnostic])diagnostic2&&result3.diagnostics.push(diagnostic2);for(let item of sources){if(item.trusted&&item.config?.mcpServers){addTrustedServers(result3,item.config.mcpServers,item.source,item.path);continue}item.trusted||addUntrustedServers(result3,readServerNames(item.source==="claude"?claudeRaw:projectRaw),item.source,item.path)}return result3}function visitSpawnableMcpServers(config,visit){for(let[name,server]of Object.entries(config.servers))server.state==="enabled"&&visit(name,server)}function readTrustedConfig(path14,env,raw=readConfigJson(path14,!0).raw){let config=interpolateConfig(validateRaw(raw,path14),env),endpointError=config?getServerEndpointValidationError(config):void 0;if(endpointError)throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);return config}function readConfigJson(path14,trusted){if(!existsSync26(path14))return{raw:void 0};try{return{raw:JSON.parse(readFileSync32(path14,"utf-8"))}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);if(trusted)throw new McpConfigValidationError(`Invalid MCP config at ${path14}: ${reason}`);return{raw:void 0,diagnostic:`Blocked untrusted MCP config at ${path14}: invalid JSON (${reason})`}}}function validateRaw(raw,_path){if(raw===void 0)return;if(validateConfig.Check(raw)){let config=raw,endpointError=getServerEndpointValidationError(config);if(endpointError)throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);return config}let error2=Array.from(validateConfig.Errors(raw))[0];throw new McpConfigValidationError(`Invalid MCP config at ${formatErrorPath(error2)}: ${formatErrorMessage(error2)}`)}function formatErrorPath(error2){let trimmed=error2.instancePath.replace(/^\//,"");return trimmed.length===0?"$":trimmed.split("/").map(decodePathPart).join(".")}function decodePathPart(part){return part.replace(/~1/g,"/").replace(/~0/g,"~")}function formatErrorMessage(error2){return error2.message==="must be array"?"Expected array":error2.message}function mergeConfigs(...configs){let merged={};for(let config of configs)config&&(merged.settings={...merged.settings??{},...config.settings??{}},merged.mcpServers={...merged.mcpServers??{},...config.mcpServers??{}});return merged}function normalizeSettings(settings){return{...defaultSettings,...settings}}function addTrustedServers(result3,servers,source2,sourcePath){for(let[name,server]of Object.entries(servers)){let config=normalizeServer(server);inheritMcpSharingScope(server,config),result3.servers[name]={config,configHash:hashConfig(config),name,source:source2,sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type}}}function addUntrustedServers(result3,names,source2,sourcePath){for(let name of names){let existing2=result3.servers[name];if(existing2&&existing2.state!=="untrusted"){result3.diagnostics.push(`Blocked untrusted ${source2} MCP server '${name}' from shadowing trusted ${existing2.source} server.`);continue}result3.servers[name]={name,source:source2,sourcePath,state:"untrusted"}}}function readServerNames(raw){if(typeof raw!="object"||raw===null||Array.isArray(raw))return[];let servers=raw.mcpServers;return typeof servers!="object"||servers===null||Array.isArray(servers)?[]:Object.keys(servers)}function resolveExtensionMcpServer(name,raw,sourcePath,registrationCwd){let withCwd={...raw,cwd:raw.cwd??registrationCwd},config=normalizeServer(withCwd);return{config,configHash:hashConfig(config),name,source:"extension",sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type}}function mergeExtensionMcpServers(result3,declarations){for(let decl of declarations){let existing2=result3.servers[decl.name];if(existing2!==void 0&&existing2.state!=="untrusted"){result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped; ${existing2.source} config at ${existing2.sourcePath} wins.`);continue}existing2!==void 0&&result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} replaces untrusted ${existing2.source} placeholder from ${existing2.sourcePath}.`),result3.servers[decl.name]=resolveExtensionMcpServer(decl.name,decl.config,decl.extensionPath,decl.registrationCwd)}}function normalizeServer(server){let type2=server.type??(server.url?"http":"stdio");return{args:server.args??[],connectTimeoutMs:server.connectTimeoutMs??15e3,enabled:server.enabled??!0,exposure:server.exposure??"auto",idleTimeoutMin:server.idleTimeoutMin??10,lifecycle:server.lifecycle??"lazy",logLevel:server.logLevel??"info",requestTimeoutMs:server.requestTimeoutMs??3e4,startupTimeoutMs:server.startupTimeoutMs??MCP_STARTUP_RACE_MS,type:type2,...server}}function interpolateConfig(config,env){let resolved=interpolateValue(config,"mcp",env);for(let[name,raw]of Object.entries(config?.mcpServers??{})){let server=resolved?.mcpServers?.[name];server!==void 0&&inheritMcpSharingScope(raw,server)}return resolved}function interpolateValue(value,path14,env){if(typeof value=="string")return interpolateString(value,path14,env);if(Array.isArray(value))return value.map((item,index)=>interpolateValue(item,`${path14}.${index}`,env));if(typeof value=="object"&&value!==null){let out={};for(let[key,item]of Object.entries(value))out[key]=interpolateValue(item,`${path14}.${key}`,env);return out}return value}function interpolateString(value,path14,env){if(value.trimStart().startsWith("!")||value.includes("$(")){let displayPath5=path14.replace(/^mcp\./,"");throw new McpConfigValidationError(`MCP config interpolation rejected command substitution at ${displayPath5}: config values may reference only environment variables for security; shell commands are never executed.`)}return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\}/g,(_match,name,_fallback,fallbackValue)=>env[name]??fallbackValue??"")}function hashConfig(config){let hashable={...config};return delete hashable.startupTimeoutMs,createHash19("sha256").update(stableStringify2(hashable)).digest("hex")}function stableStringify2(value){return Array.isArray(value)?`[${value.map(stableStringify2).join(",")}]`:typeof value=="object"&&value!==null?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${stableStringify2(value[key])}`).join(",")}}`:JSON.stringify(value)}function getGlobalMcpConfigPath(agentDir=getAgentDir()){return join55(agentDir,"mcp.json")}function addGlobalMcpServer(name,server){let path14=getGlobalMcpConfigPath(),config=readGlobalMcpConfig(path14),next={...config,mcpServers:{...config.mcpServers??{},[name]:stripDefaults(server)}};return writeValidatedConfig(path14,next),path14}function setGlobalMcpServerEnabled(name,enabled){return updateMcpServerConfig(getGlobalMcpConfigPath(),name,{enabled})}function updateMcpServerConfig(path14,name,patch){let config=readGlobalMcpConfig(path14),existing2=config.mcpServers?.[name];if(existing2===void 0)return!1;let next={...config,mcpServers:{...config.mcpServers??{},[name]:{...existing2,...patch}}};return writeValidatedConfig(path14,next),!0}function readGlobalMcpConfig(path14){if(!existsSync27(path14))return{};let raw=JSON.parse(readFileSync33(path14,"utf8"));return assertValidConfig(raw),raw}function writeValidatedConfig(path14,config){assertValidConfig(config),mkdirSync16(dirname42(path14),{recursive:!0}),writeFileSync16(path14,`${JSON.stringify(config,null,2)}
|
|
742
741
|
`,{mode:384})}function assertValidConfig(config){if(!validateConfig.Check(config)){let error2=Array.from(validateConfig.Errors(config))[0];throw new McpConfigValidationError(`Invalid MCP config: ${error2?.message??"unknown validation error"}`)}let endpointError=getServerEndpointValidationError(config);if(endpointError)throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`)}function stripDefaults(server){return server.type==="http"?{type:"http",url:server.url??""}:{type:"stdio",command:server.command??"",args:server.args}}var McpManagerView=class{constructor(tui,theme2,keybindings){this.content=new Container,this.disposed=!1,this.tui=tui,this.theme=theme2,this.keybindings=keybindings,this.status("MCP servers","Loading...")}menu(build,subscribe){return this.disposed?Promise.resolve(void 0):new Promise((resolve53,reject)=>{let generation2=0,settled2=!1,selected,unsubscribe,finish=(value,error2)=>{settled2||(settled2=!0,generation2++,unsubscribe?.(),this.cancelMenu=void 0,this.rebuild=void 0,this.inputHandler=void 0,error2!==void 0?reject(error2):resolve53(value))},render2=async()=>{let current=++generation2;try{let menu=await build();if(settled2||current!==generation2)return;let list3=new SelectList(menu.items.map(item=>({...item,label:sanitizeTerminalLabel(item.label||item.value)||"(empty)",description:item.description===void 0?void 0:sanitizeTerminalLabel(item.description)})),Math.max(1,Math.min(12,this.tui.terminal.rows-10)),getSelectListTheme()),wanted=selected??menu.selected,index=menu.items.findIndex(item=>item.value===wanted);index!==-1&&list3.setSelectedIndex(index),selected=list3.getSelectedItem()?.value,list3.onSelectionChange=item=>{selected=item.value},list3.onSelect=item=>finish(item.value),list3.onCancel=()=>finish(void 0);let body=[];menu.details&&body.push(new Text(this.theme.fg("muted",menu.details.split(`
|
|
743
742
|
`).map(sanitizeTerminalLabel).join(`
|
|
744
743
|
`)),1,0)),body.push(new Spacer(1)),body.push(menu.items.length>0?list3:new Text(sanitizeTerminalLabel(menu.empty??"Nothing to show."),1,0));let footer=menu.items.length>0?`${keyHint("tui.select.confirm",menu.confirmLabel)} | ${keyHint("tui.select.cancel",menu.cancelLabel)}`:keyHint("tui.select.cancel",menu.cancelLabel);this.setContent(menu.title,body,footer),this.inputHandler=data=>{menu.items.length>0?list3.handleInput(data):this.keybindings.matches(data,"tui.select.cancel")&&finish(void 0)}}catch(error2){!settled2&¤t===generation2&&finish(void 0,error2)}};this.cancelMenu=()=>finish(void 0),this.rebuild=()=>{render2()},this.inputHandler=data=>{this.keybindings.matches(data,"tui.select.cancel")&&finish(void 0)},unsubscribe=subscribe?.(()=>{render2()}),render2()})}status(title,message){this.setContent(title,[new Spacer(1),new Text(this.theme.fg("muted",message.split(`
|
|
@@ -1909,7 +1908,7 @@ Auth commands require at least one of --provider or --model. Checks refresh expi
|
|
|
1909
1908
|
${content}
|
|
1910
1909
|
</file>
|
|
1911
1910
|
`}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: Could not read file ${absolutePath}: ${message}`)),process.exit(1)}}return{text:text3,images}}async function resolveHelpExtensionFlags(options){let resourceLoader=new DefaultResourceLoader({cwd:options.cwd,agentDir:options.agentDir,settingsManager:options.settingsManager,additionalExtensionPaths:[...options.additionalExtensionPaths],noExtensions:options.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,...options.extensionFactories?{extensionFactories:[...options.extensionFactories]}:{}});await resourceLoader.reload();let{extensions}=resourceLoader.getExtensions();return{flags:extensions.flatMap(extension=>[...extension.flags.values()]),extensionPaths:extensions.map(extension=>extension.resolvedPath)}}function buildInitialMessage({parsed,fileText,fileImages,stdinContent}){let parts=[];stdinContent!==void 0&&parts.push(stdinContent),fileText&&parts.push(fileText);let titlePrompt=stdinContent!==void 0||fileText!==void 0||fileImages!==void 0&&fileImages.length>0?void 0:parsed.messages[0];return parsed.messages.length>0&&(parts.push(parsed.messages[0]),parsed.messages.shift()),{initialMessage:parts.length>0?parts.join(""):void 0,initialImages:fileImages&&fileImages.length>0?fileImages:void 0,initialTitlePrompt:titlePrompt}}function formatTokenCount(count2){if(count2>=1e6){let millions=count2/1e6;return millions%1===0?`${millions}M`:`${millions.toFixed(1)}M`}if(count2>=1e3){let thousands=count2/1e3;return thousands%1===0?`${thousands}K`:`${thousands.toFixed(1)}K`}return count2.toString()}async function listModels(modelRuntime,searchPattern2,signal){let loadError=modelRuntime.getError();if(loadError&&console.error(source_default.yellow(`Warning: errors loading models.json:
|
|
1912
|
-
${loadError}`)),signal?.aborted)return;let models=[...modelRuntime.getModels()];if(models.length===0){console.log(formatNoModelsAvailableMessage());return}let filteredModels=models;if(searchPattern2&&(filteredModels=fuzzyFilter(models,searchPattern2,m=>`${m.provider} ${m.id}`)),filteredModels.length===0){console.log(`No models matching "${searchPattern2}"`);return}filteredModels.sort((a,b)=>{let providerCmp=a.provider.localeCompare(b.provider);return providerCmp!==0?providerCmp:a.id.localeCompare(b.id)});let rows=filteredModels.map(m=>({provider:m.provider,model:m.id,context:formatTokenCount(m.contextWindow),maxOut:formatTokenCount(m.maxTokens),thinking:m.reasoning?"yes":"no",images:m.input.includes("image")?"yes":"no"})),headers={provider:"provider",model:"model",context:"context",maxOut:"max-out",thinking:"thinking",images:"images"},widths={provider:Math.max(headers.provider.length,...rows.map(r=>r.provider.length)),model:Math.max(headers.model.length,...rows.map(r=>r.model.length)),context:Math.max(headers.context.length,...rows.map(r=>r.context.length)),maxOut:Math.max(headers.maxOut.length,...rows.map(r=>r.maxOut.length)),thinking:Math.max(headers.thinking.length,...rows.map(r=>r.thinking.length)),images:Math.max(headers.images.length,...rows.map(r=>r.images.length))},headerLine=[headers.provider.padEnd(widths.provider),headers.model.padEnd(widths.model),headers.context.padEnd(widths.context),headers.maxOut.padEnd(widths.maxOut),headers.thinking.padEnd(widths.thinking),headers.images.padEnd(widths.images)].join(" ");console.log(headerLine);for(let row of rows){let line=[row.provider.padEnd(widths.provider),row.model.padEnd(widths.model),row.context.padEnd(widths.context),row.maxOut.padEnd(widths.maxOut),row.thinking.padEnd(widths.thinking),row.images.padEnd(widths.images)].join(" ");console.log(line)}}import{chmodSync as chmodSync8,readFileSync as readFileSync41,renameSync as renameSync10,rmSync as
|
|
1911
|
+
${loadError}`)),signal?.aborted)return;let models=[...modelRuntime.getModels()];if(models.length===0){console.log(formatNoModelsAvailableMessage());return}let filteredModels=models;if(searchPattern2&&(filteredModels=fuzzyFilter(models,searchPattern2,m=>`${m.provider} ${m.id}`)),filteredModels.length===0){console.log(`No models matching "${searchPattern2}"`);return}filteredModels.sort((a,b)=>{let providerCmp=a.provider.localeCompare(b.provider);return providerCmp!==0?providerCmp:a.id.localeCompare(b.id)});let rows=filteredModels.map(m=>({provider:m.provider,model:m.id,context:formatTokenCount(m.contextWindow),maxOut:formatTokenCount(m.maxTokens),thinking:m.reasoning?"yes":"no",images:m.input.includes("image")?"yes":"no"})),headers={provider:"provider",model:"model",context:"context",maxOut:"max-out",thinking:"thinking",images:"images"},widths={provider:Math.max(headers.provider.length,...rows.map(r=>r.provider.length)),model:Math.max(headers.model.length,...rows.map(r=>r.model.length)),context:Math.max(headers.context.length,...rows.map(r=>r.context.length)),maxOut:Math.max(headers.maxOut.length,...rows.map(r=>r.maxOut.length)),thinking:Math.max(headers.thinking.length,...rows.map(r=>r.thinking.length)),images:Math.max(headers.images.length,...rows.map(r=>r.images.length))},headerLine=[headers.provider.padEnd(widths.provider),headers.model.padEnd(widths.model),headers.context.padEnd(widths.context),headers.maxOut.padEnd(widths.maxOut),headers.thinking.padEnd(widths.thinking),headers.images.padEnd(widths.images)].join(" ");console.log(headerLine);for(let row of rows){let line=[row.provider.padEnd(widths.provider),row.model.padEnd(widths.model),row.context.padEnd(widths.context),row.maxOut.padEnd(widths.maxOut),row.thinking.padEnd(widths.thinking),row.images.padEnd(widths.images)].join(" ");console.log(line)}}import{chmodSync as chmodSync8,readFileSync as readFileSync41,renameSync as renameSync10,rmSync as rmSync9,statSync as statSync21,writeFileSync as writeFileSync20}from"node:fs";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";function displayUrl(url){let query=[...url.searchParams.keys()].map(name=>`${encodeURIComponent(name)}=<redacted>`).join("&");return`${url.origin}${url.pathname}${query?`?${query}`:""}`}function listingUrl(baseUrl){let url;try{url=new URL(baseUrl.trim())}catch{return}return url.pathname=`${url.pathname.replace(/\/+$/u,"")}/models`,{request:url.toString(),display:displayUrl(url)}}function redactUrlInMessage(message,url){return message.split(url.request).join(url.display).replace(/\/\/[^/\s@]+@/gu,"//")}var ModelsDiscoveryError=class extends Error{},THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"],OPENAI_COMPATIBLE_APIS=new Set(["openai-completions","openai-responses"]),isRecord49=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function readDocument(modelsPath){let content;try{content=readFileSync41(modelsPath,"utf-8")}catch(error2){throw new ModelsDiscoveryError(`Cannot read ${modelsPath}: ${error2 instanceof Error?error2.message:error2}`)}let document;try{document=JSON.parse(stripJsonComments(stripBom(content)))}catch(error2){throw new ModelsDiscoveryError(`Cannot parse ${modelsPath}: ${error2 instanceof Error?error2.message:error2}`)}if(!isRecord49(document))throw new ModelsDiscoveryError(`${modelsPath} is not a JSON object`);return{content,document}}function findProvider(document,providerId,modelsPath){let wanted=normalizeProviderId(providerId),providers=isRecord49(document.providers)?document.providers:{},key=Object.keys(providers).find(candidate=>normalizeProviderId(candidate)===wanted),provider=key===void 0?void 0:providers[key];if(key===void 0||!isRecord49(provider))throw new ModelsDiscoveryError(`Provider "${providerId}" is not defined in ${modelsPath}`);return{key,providers,provider}}function providerListingUrl(provider,providerId){if(typeof provider.api=="string"&&!OPENAI_COMPATIBLE_APIS.has(provider.api))throw new ModelsDiscoveryError(`Provider "${providerId}" uses api "${provider.api}", not an OpenAI-compatible api`);if(typeof provider.baseUrl!="string"||provider.baseUrl.trim()==="")throw new ModelsDiscoveryError(`Provider "${providerId}" needs a "baseUrl" to discover models`);let url=listingUrl(provider.baseUrl);if(!url)throw new ModelsDiscoveryError(`Provider "${providerId}" has a "baseUrl" that is not a valid URL`);return url}async function fetchListing(url,auth,fetchImpl,signal){let headers={accept:"application/json"};for(let[name,value]of Object.entries(auth.headers??{}))value===null?delete headers[name]:headers[name]=value;auth.apiKey&&!Object.keys(headers).some(name=>name.toLowerCase()==="authorization")&&(headers.authorization=`Bearer ${auth.apiKey}`);let response;try{response=await fetchImpl(url.request,{headers,signal})}catch(error2){let reason=redactUrlInMessage(error2 instanceof Error?error2.message:String(error2),url);throw new ModelsDiscoveryError(`GET ${url.display} failed: ${reason}`)}if(!response.ok)throw new ModelsDiscoveryError(`GET ${url.display} failed: HTTP ${response.status}`);let payload;try{payload=await response.json()}catch{throw new ModelsDiscoveryError(`GET ${url.display} did not return JSON`)}let data=Array.isArray(payload)?payload:isRecord49(payload)?payload.data:void 0;if(!Array.isArray(data))throw new ModelsDiscoveryError(`GET ${url.display} did not return a model list`);let listed=new Map;for(let entry of data)!isRecord49(entry)||typeof entry.id!="string"||entry.id.trim()===""||listed.has(entry.id)||listed.set(entry.id,{id:entry.id,reasoningEfforts:entry.reasoning_efforts});return[...listed.values()]}function describeEfforts(parsed){let map=parsed.thinkingLevelMap??{},levels=THINKING_LEVELS.filter(level=>typeof map[level]=="string");return parsed.defaultThinkingLevel===void 0?{levels,unmapped:parsed.unmapped}:{levels,defaultThinkingLevel:parsed.defaultThinkingLevel,unmapped:parsed.unmapped}}function withEfforts(entry,parsed){if(!parsed)return entry;let{defaultThinkingLevel:_previousDefault,thinkingLevelMap:_previousMap,...rest}=entry;return parsed.thinkingLevelMap?parsed.defaultThinkingLevel===void 0?{...rest,reasoning:!0,thinkingLevelMap:parsed.thinkingLevelMap}:{...rest,reasoning:!0,thinkingLevelMap:parsed.thinkingLevelMap,defaultThinkingLevel:parsed.defaultThinkingLevel}:{...rest,reasoning:!1}}function writeWithBackup(modelsPath,original,next){let backupPath=uniqueBackupPath(modelsPath),temporary=`${modelsPath}.${process.pid}.tmp`,mode=statSync21(modelsPath).mode&511;writeFileSync20(backupPath,original,{encoding:"utf-8",mode,flag:"wx"});try{if(writeFileSync20(temporary,next,{encoding:"utf-8",mode,flag:"wx"}),chmodSync8(temporary,mode),readFileSync41(modelsPath,"utf-8")!==original)throw new ModelsDiscoveryError(`${modelsPath} changed during discovery; nothing was written`);return renameSync10(temporary,modelsPath),backupPath}catch(error2){throw rmSync9(temporary,{force:!0}),rmSync9(backupPath,{force:!0}),error2}}async function discoverProviderModels(options){let{content,document}=readDocument(options.modelsPath),{key:providerKey,providers,provider}=findProvider(document,options.providerId,options.modelsPath),url=providerListingUrl(provider,options.providerId),listing=await fetchListing(url,options.auth,options.fetch??fetch,options.signal),honorEfforts=isRecord49(provider.compat)&&provider.compat.supportsReasoningEffort===!0,configured=Array.isArray(provider.models)?[...provider.models]:[],report={providerId:providerKey,url:url.display,modelsPath:options.modelsPath,added:[],updated:[],unchanged:[],unlisted:[],efforts:{},effortsIgnored:!1,written:!1,commentsDropped:!1};for(let listed of listing){let parsed=honorEfforts?parseEndpointReasoningEfforts(listed.reasoningEfforts):void 0;!honorEfforts&&Array.isArray(listed.reasoningEfforts)&&(report.effortsIgnored=!0),parsed&&(report.efforts[listed.id]=describeEfforts(parsed));let index=configured.findIndex(entry=>isRecord49(entry)&&entry.id===listed.id),existing2=index>=0?configured[index]:void 0,current=isRecord49(existing2)?existing2:void 0,next=withEfforts(current??{id:listed.id},parsed);current===void 0?(configured.push(next),report.added.push(listed.id)):isDeepStrictEqual4(current,next)?report.unchanged.push(listed.id):(configured[index]=next,report.updated.push(listed.id))}let listedIds=new Set(listing.map(listed=>listed.id));for(let entry of configured)isRecord49(entry)&&typeof entry.id=="string"&&!listedIds.has(entry.id)&&report.unlisted.push(entry.id);if(report.added.length===0&&report.updated.length===0)return report;let nextDocument={...document,providers:{...providers,[providerKey]:{...provider,models:configured}}},nextContent=`${JSON.stringify(nextDocument,null,2)}
|
|
1913
1912
|
`,invalid2=ModelConfig.validationError(nextContent,options.modelsPath);if(invalid2!==void 0)throw new ModelsDiscoveryError(`Discovery would leave an invalid models.json, so nothing was written.
|
|
1914
1913
|
${invalid2}`);return report.backupPath=writeWithBackup(options.modelsPath,content,nextContent),report.written=!0,report.commentsDropped=stripJsonComments(stripBom(content))!==stripBom(content),report}var USAGE5=`${APP_NAME} models discover <provider>`,DISCOVERY_TIMEOUT_MS=3e4;function isModelsDiscoverCommand(args){return args[0]==="models"&&args[1]==="discover"}function printHelp2(){console.log(`Usage:
|
|
1915
1914
|
${USAGE5}
|
|
@@ -1926,9 +1925,9 @@ ${message}`,[{label:"Yes",value:!0},{label:"No",value:!1}])??!1,input:async(titl
|
|
|
1926
1925
|
`),writeMemoryReports(sources)};return process.on("SIGUSR2",onSignal),()=>process.off("SIGUSR2",onSignal)}async function writeSnapshot(path14){let bun=Reflect.get(globalThis,"Bun"),generate=typeof bun=="object"&&bun!==null?Reflect.get(bun,"generateHeapSnapshot"):void 0;if(typeof generate!="function")return writeHeapSnapshot(path14);let snapshot=Reflect.apply(generate,bun,["v8"]);if(typeof snapshot!="string")throw new Error("Bun.generateHeapSnapshot did not return a V8 snapshot");return await writeFile11(path14,snapshot),path14}function presetTrustsProject(presetFlag,globalPreset){return typeof presetFlag=="string"?presetFlag==="full-access":globalPreset==="full-access"}function formatProjectTrustPrompt(cwd){return`Trust project folder?
|
|
1927
1926
|
${cwd}
|
|
1928
1927
|
|
|
1929
|
-
This allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`}async function selectProjectTrustOption(cwd,ctx){let options=getProjectTrustOptions(cwd,{includeSessionOnly:!0}),selected=await ctx.ui.select(formatProjectTrustPrompt(cwd),options.map(option=>option.label));return options.find(option=>option.label===selected)}function saveProjectTrustPromptResult(trustStore,result3){result3.updates.length>0&&trustStore.setMany(result3.updates)}async function resolveProjectTrusted(options){if(options.trustOverride!==void 0)return options.trustOverride;if(!hasTrustRequiringProjectResources(options.cwd))return!0;if(options.extensionsResult){let{result:result3,errors}=await emitProjectTrustEvent(options.extensionsResult,{type:"project_trust",cwd:options.cwd},options.projectTrustContext);for(let error2 of errors)options.onExtensionError?.(`Extension "${error2.extensionPath}" project_trust error: ${error2.error}`);if(result3){let trusted=result3.trusted==="yes";return result3.remember===!0&&options.trustStore.set(options.cwd,trusted),trusted}}let decision=options.trustStore.get(options.cwd);if(decision!==null)return decision;switch(options.defaultProjectTrust??"ask"){case"always":return!0;case"never":return!1;case"ask":break}if(!options.projectTrustContext.hasUI)return!1;let selected=await selectProjectTrustOption(options.cwd,options.projectTrustContext);return selected!==void 0?(saveProjectTrustPromptResult(options.trustStore,selected),selected.trusted):!1}import{cpSync as cpSync2,existsSync as existsSync37,mkdirSync as mkdirSync20,readdirSync as readdirSync9,readFileSync as readFileSync42,renameSync as renameSync11,rmSync as
|
|
1930
|
-
${rest}`,{flag:"wx"}),target!==source2&&moveSessionSidecars(dirname55(source2),targetDir,header2.id),renameSync11(temp,target),target!==source2&&
|
|
1931
|
-
`),firstLine2=newline===-1?content:content.slice(0,newline),parsed;try{parsed=JSON.parse(firstLine2)}catch{parsed=void 0}if(!isSessionHeader(parsed))throw new Error(`Cannot rebind session: ${sessionFile} does not start with a session header`);return{header:parsed,rest:newline===-1?"":content.slice(newline+1)}}function isSessionHeader(value){return typeof value=="object"&&value!==null&&value.type==="session"&&typeof value.id=="string"}function moveSessionSidecars(fromDir,toDir,sessionId){let extensionsDir=join82(fromDir,"extensions"),sidecarName=`${encodedSessionId(sessionId)}.json`;if(existsSync37(extensionsDir))for(let extension of readdirSync9(extensionsDir,{withFileTypes:!0})){if(!extension.isDirectory())continue;let from=join82(extensionsDir,extension.name,sidecarName);existsSync37(from)&&movePath(from,join82(toDir,"extensions",extension.name,sidecarName))}let blobs=join82(fromDir,"resident-blobs",sessionId);existsSync37(blobs)&&movePath(blobs,join82(toDir,"resident-blobs",sessionId))}function movePath(from,to){if(!existsSync37(to)){mkdirSync20(dirname55(to),{recursive:!0});try{renameSync11(from,to)}catch(error2){if(error2.code!=="EXDEV")throw error2;cpSync2(from,to,{recursive:!0}),
|
|
1928
|
+
This allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`}async function selectProjectTrustOption(cwd,ctx){let options=getProjectTrustOptions(cwd,{includeSessionOnly:!0}),selected=await ctx.ui.select(formatProjectTrustPrompt(cwd),options.map(option=>option.label));return options.find(option=>option.label===selected)}function saveProjectTrustPromptResult(trustStore,result3){result3.updates.length>0&&trustStore.setMany(result3.updates)}async function resolveProjectTrusted(options){if(options.trustOverride!==void 0)return options.trustOverride;if(!hasTrustRequiringProjectResources(options.cwd))return!0;if(options.extensionsResult){let{result:result3,errors}=await emitProjectTrustEvent(options.extensionsResult,{type:"project_trust",cwd:options.cwd},options.projectTrustContext);for(let error2 of errors)options.onExtensionError?.(`Extension "${error2.extensionPath}" project_trust error: ${error2.error}`);if(result3){let trusted=result3.trusted==="yes";return result3.remember===!0&&options.trustStore.set(options.cwd,trusted),trusted}}let decision=options.trustStore.get(options.cwd);if(decision!==null)return decision;switch(options.defaultProjectTrust??"ask"){case"always":return!0;case"never":return!1;case"ask":break}if(!options.projectTrustContext.hasUI)return!1;let selected=await selectProjectTrustOption(options.cwd,options.projectTrustContext);return selected!==void 0?(saveProjectTrustPromptResult(options.trustStore,selected),selected.trusted):!1}import{cpSync as cpSync2,existsSync as existsSync37,mkdirSync as mkdirSync20,readdirSync as readdirSync9,readFileSync as readFileSync42,renameSync as renameSync11,rmSync as rmSync10,writeFileSync as writeFileSync21}from"node:fs";import{basename as basename28,dirname as dirname55,join as join82}from"node:path";function readRecordedRepositoryIdentity(sessionFile){let recorded;for(let entry of loadEntriesFromFile(sessionFile))entry.type==="custom"&&entry.customType===REPOSITORY_IDENTITY_ENTRY_TYPE&&(recorded=parseRepositoryIdentity(entry.data)??recorded);return recorded}async function classifySessionRepository(sessionFile,sessionCwd,cwd,read=readRepositoryIdentity){let[current,live]=await Promise.all([read(cwd),existsSync37(sessionCwd)?read(sessionCwd):Promise.resolve(void 0)]);return compareRepositoryIdentities(live??readRecordedRepositoryIdentity(sessionFile),current)}function readSessionCwd(sessionFile){let{cwd}=readHeaderLine(resolvePath(sessionFile)).header;return typeof cwd=="string"&&cwd!==""?cwd:void 0}async function rebindSessionFile(sourcePath,targetCwd,sessionDir,options={}){let source2=resolvePath(sourcePath),cwd=resolvePath(targetCwd),targetDir=sessionDir?normalizePath(sessionDir):getDefaultSessionDir(cwd),target=join82(targetDir,basename28(source2));if(target!==source2&&!existsSync37(source2)&&existsSync37(target))return target;let header2=readHeaderBeforeLock(source2,target);return header2===void 0?target:withSessionMoveLock(source2,header2.id,()=>moveSessionFile(source2,target,cwd),{...options.moveLockWaitMs===void 0?{}:{waitMs:options.moveLockWaitMs}})}function readHeaderBeforeLock(source2,target){try{return readHeaderLine(source2).header}catch(error2){if(error2.code==="ENOENT"&&target!==source2&&existsSync37(target))return;throw error2}}function moveSessionFile(source2,target,cwd){if(target!==source2&&!existsSync37(source2)&&existsSync37(target))return target;let{header:header2,rest}=readHeaderLine(source2);if(target!==source2&&existsSync37(target))throw new Error(`Cannot rebind session: ${target} already exists`);let targetDir=dirname55(target);mkdirSync20(targetDir,{recursive:!0});let temp=join82(targetDir,`.${basename28(source2)}.rebind-${process.pid}.tmp`);return writeFileSync21(temp,`${JSON.stringify({...header2,cwd})}
|
|
1929
|
+
${rest}`,{flag:"wx"}),target!==source2&&moveSessionSidecars(dirname55(source2),targetDir,header2.id),renameSync11(temp,target),target!==source2&&rmSync10(source2,{force:!0}),target}function readHeaderLine(sessionFile){let content=readFileSync42(sessionFile,"utf8"),newline=content.indexOf(`
|
|
1930
|
+
`),firstLine2=newline===-1?content:content.slice(0,newline),parsed;try{parsed=JSON.parse(firstLine2)}catch{parsed=void 0}if(!isSessionHeader(parsed))throw new Error(`Cannot rebind session: ${sessionFile} does not start with a session header`);return{header:parsed,rest:newline===-1?"":content.slice(newline+1)}}function isSessionHeader(value){return typeof value=="object"&&value!==null&&value.type==="session"&&typeof value.id=="string"}function moveSessionSidecars(fromDir,toDir,sessionId){let extensionsDir=join82(fromDir,"extensions"),sidecarName=`${encodedSessionId(sessionId)}.json`;if(existsSync37(extensionsDir))for(let extension of readdirSync9(extensionsDir,{withFileTypes:!0})){if(!extension.isDirectory())continue;let from=join82(extensionsDir,extension.name,sidecarName);existsSync37(from)&&movePath(from,join82(toDir,"extensions",extension.name,sidecarName))}let blobs=join82(fromDir,"resident-blobs",sessionId);existsSync37(blobs)&&movePath(blobs,join82(toDir,"resident-blobs",sessionId))}function movePath(from,to){if(!existsSync37(to)){mkdirSync20(dirname55(to),{recursive:!0});try{renameSync11(from,to)}catch(error2){if(error2.code!=="EXDEV")throw error2;cpSync2(from,to,{recursive:!0}),rmSync10(from,{recursive:!0,force:!0})}}}function sessionCwdOf(sessionPath){try{return readSessionCwd(sessionPath)}catch(error2){if(error2 instanceof Error)return;throw error2}}async function resolveResumeTarget(choice){let unchanged2={path:choice.sessionPath,rebound:!1},sessionCwd=sessionCwdOf(choice.sessionPath);return sessionCwd===void 0||resolvePath(resolveMovedPath(sessionCwd))===resolvePath(choice.cwd)||await classifySessionRepository(choice.sessionPath,sessionCwd,choice.cwd,choice.readIdentity??readRepositoryIdentity)!=="same"||!await choice.confirm(sessionCwd)?unchanged2:{path:await rebindSessionFile(choice.sessionPath,choice.cwd,choice.sessionDir),rebound:!0}}function sessionExtensionFlagValues(hostFlags,launchProfile){let flags2=new Map(hostFlags);return launchProfile?.permissionPreset!==void 0&&flags2.set("permission-preset",launchProfile.permissionPreset),flags2}function providerSettingsWarnings(settingsManager){let warnings=[];for(let[providerId,settings]of Object.entries(settingsManager.getProviderSettings())){let value=settings?.maxConcurrency;value!==void 0&&(typeof value!="number"||!Number.isInteger(value)||value<0)&&warnings.push(`Invalid providers.${providerId}.maxConcurrency: expected a non-negative integer; using unlimited`)}return warnings}function collectSettingsDiagnosticsWithContext(settingsManager,context){return[...settingsManager.drainErrors().map(({scope,error:error2})=>({type:"warning",message:`(${context}, ${scope} settings) ${error2.message}`})),...providerSettingsWarnings(settingsManager).map(message=>({type:"warning",message:`(${context}) ${message}`}))]}import{randomUUID as randomUUID14}from"node:crypto";import{join as join83}from"node:path";var EXPIRING_WITHIN_MS2=5*6e4,SIGN_IN_NEEDED="auth stale - run /login";async function listPollAccounts(sources){let[claude,chatgpt]=await Promise.all([sources.store.read("anthropic-subscription"),sources.store.read("chatgpt-subscription")]);return[...claudeAccounts(claude,sources),...chatgptAccounts(chatgpt,sources.now)]}function claudeAccounts(stored,sources){let credential=stored?.type==="oauth"?stored:emptyCredential();return listAccounts(credential,sources.env).map(slot2=>({provider:"anthropic-subscription",account:slot2.name,async access(signal){if(slot2.source==="env"){let token=envSlotToken(sources.env,slot2.name);return token===void 0?void 0:{access:token}}let expiring=expires=>sources.now()>=expires-EXPIRING_WITHIN_MS2;if(!expiring(slot2.expires))return{access:slot2.access};if(slot2.blockReason==="auth_error")return{error:SIGN_IN_NEEDED};try{let refreshed=await refreshSlot(sources.store,"anthropic-subscription",slot2.name,sources.refresher,signal,expiring),renewed=refreshed?.type==="oauth"?listAccounts(refreshed).find(candidate=>candidate.name===slot2.name):void 0;return renewed===void 0||expiring(renewed.expires)?{error:SIGN_IN_NEEDED}:{access:renewed.access}}catch(error2){if(signal.aborted||error2 instanceof CredentialStoreBusyError||!isGrantRejected(error2))return;try{await markAuthRejected(sources,slot2.name,slot2.refresh)}catch{}return{error:SIGN_IN_NEEDED}}}}))}async function markAuthRejected(sources,name,rejectedRefresh){let now2=sources.now();await sources.store.modify("anthropic-subscription",async current=>{if(current?.type!=="oauth")return current;let credential=current;return credential.accounts?.some(slot2=>slot2.name===name&&slot2.refresh===rejectedRefresh)?{...credential,accounts:credential.accounts.map(slot2=>slot2.name===name?{...slot2,blockedUntil:now2+9e5,blockReason:"auth_error",blockedAt:now2}:slot2)}:current})}function chatgptAccounts(stored,now2){return stored?.type!=="oauth"?[]:listSlots(stored).flatMap(slot2=>slot2.access===void 0||slot2.access===""?[]:[{provider:"chatgpt-subscription",account:slot2.name,async access(){return slot2.expires!==void 0&&now2()>=slot2.expires?void 0:{access:slot2.access??""}}}])}import{mkdirSync as mkdirSync21,readFileSync as readFileSync43,renameSync as renameSync12,writeFileSync as writeFileSync22}from"node:fs";import{dirname as dirname56}from"node:path";var CLAIM_MS=3e4;function usageKey(provider,account){return`${provider}/${account}`}function isDue(cache,key,now2){let reading=cache.accounts[key];if(reading!==void 0&&now2<reading.nextAt)return!1;let claim2=cache.fetching[key];return claim2===void 0||now2-claim2.claimedAt>=CLAIM_MS}function withClaims(cache,keys,now2,token){let fetching={...cache.fetching};for(let key of keys)fetching[key]={claimedAt:now2,token};return{accounts:cache.accounts,fetching}}function claimedBy(cache,keys,token){return keys.filter(key=>cache.fetching[key]?.token===token)}function withResults(cache,results,token){let accounts={...cache.accounts},fetching={...cache.fetching};for(let[key,reading]of results){if(fetching[key]?.token!==token)continue;delete fetching[key];let previous=accounts[key];accounts[key]=reading.error!==void 0&&previous!==void 0?{...reading,windows:previous.windows}:reading}return{accounts,fetching}}function readUsageCache(path14){try{return sanitize(JSON.parse(readFileSync43(path14,"utf8")))}catch{return{accounts:{},fetching:{}}}}function writeUsageCache(path14,cache){try{mkdirSync21(dirname56(path14),{recursive:!0});let temporary=`${path14}.${process.pid}.tmp`;writeFileSync22(temporary,JSON.stringify(cache),{mode:384}),renameSync12(temporary,path14)}catch(error2){process.stderr.write(`senpi subscription limits: usage cache not written: ${String(error2)}
|
|
1932
1931
|
`)}}function object(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?Object.fromEntries(Object.entries(value)):void 0}function finite(value){return typeof value=="number"&&Number.isFinite(value)?value:void 0}function text2(value){return typeof value=="string"&&value!==""?value:void 0}function sanitizeWindow(value){let window=object(value),id=text2(window?.id),label3=text2(window?.label),usedPercent=finite(window?.usedPercent);if(id===void 0||label3===void 0||usedPercent===void 0)return[];let windowMinutes=finite(window?.windowMinutes),resetsAt=text2(window?.resetsAt);return[{id,label:label3,usedPercent,...windowMinutes===void 0?{}:{windowMinutes},...resetsAt===void 0?{}:{resetsAt}}]}function sanitize(value){let file=object(value),accounts={};for(let[key,raw]of Object.entries(object(file?.accounts)??{})){let reading=object(raw),updatedAt=finite(reading?.updatedAt),nextAt=finite(reading?.nextAt);if(updatedAt===void 0||nextAt===void 0)continue;let plan=text2(reading?.plan),error2=text2(reading?.error);accounts[key]={windows:(Array.isArray(reading?.windows)?reading.windows:[]).flatMap(sanitizeWindow),updatedAt,nextAt,...plan===void 0?{}:{plan},...error2===void 0?{}:{error:error2}}}let fetching={};for(let[key,raw]of Object.entries(object(file?.fetching)??{})){let claimedAt=finite(object(raw)?.claimedAt),token=text2(object(raw)?.token);claimedAt!==void 0&&token!==void 0&&(fetching[key]={claimedAt,token})}return{accounts,fetching}}var CLAUDE_USAGE_URL="https://api.anthropic.com/api/oauth/usage",CODEX_USAGE_URL="https://chatgpt.com/backend-api/wham/usage",UsageHttpError=class extends Error{constructor(status,retryAfterMs4){super(`HTTP ${status}`),this.name="UsageHttpError",this.status=status,this.retryAfterMs=retryAfterMs4}},USAGE_TIMEOUT_MS=1e4,fetchUsageJson=async(url,headers)=>{let response=await fetch(url,{headers,redirect:"error",signal:AbortSignal.timeout(USAGE_TIMEOUT_MS)});if(!response.ok)throw new UsageHttpError(response.status,retryAfterMs3(response.headers.get("retry-after"),Date.now()));return await response.json()};function retryAfterMs3(value,now2){if(value===null)return;let seconds2=Number(value);if(Number.isFinite(seconds2)&&seconds2>0)return seconds2*1e3;let delay3=Date.parse(value)-now2;return Number.isFinite(delay3)&&delay3>0?delay3:void 0}async function readUsage(provider,access8,fetchJson){if(provider==="anthropic-subscription"){let payload2=await fetchJson(CLAUDE_USAGE_URL,{Authorization:`Bearer ${access8}`,Accept:"application/json"});return{windows:claudeWindowsFromUsage(payload2)}}let accountId=codexAccountId(access8),payload=await fetchJson(CODEX_USAGE_URL,{Authorization:`Bearer ${access8}`,Accept:"application/json",...accountId===void 0?{}:{"ChatGPT-Account-Id":accountId}});return codexUsage(payload)}function record7(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?Object.fromEntries(Object.entries(value)):void 0}function finite2(value){return typeof value=="number"&&Number.isFinite(value)?value:void 0}function isoInstant(value){if(typeof value!="string")return;let parsed=Date.parse(value);return Number.isFinite(parsed)?new Date(parsed).toISOString():void 0}function claudeWindow(id,label3,percent,resetsAt){return{id,label:label3,windowMinutes:id==="claude:5h"?300:10080,usedPercent:percent,...resetsAt?{resetsAt}:{}}}function scopedWindow(model,percent,resetsAt){let slug=model.toLowerCase().replace(/[^a-z0-9]+/g,"_");return claudeWindow(`claude:7d_${slug}`,`7d ${model.toLowerCase()}`,percent,resetsAt)}function claudeWindowsFromUsage(payload){let data=record7(payload),windows=[];for(let item of Array.isArray(data?.limits)?data.limits:[]){let limit=record7(item),percent=finite2(limit?.percent);if(limit===void 0||percent===void 0)continue;let resetsAt=isoInstant(limit.resets_at);if(limit.kind==="session")windows.push(claudeWindow("claude:5h","5h",percent,resetsAt));else if(limit.kind==="weekly_all")windows.push(claudeWindow("claude:7d","7d",percent,resetsAt));else if(limit.kind==="weekly_scoped"){let model=record7(record7(limit.scope)?.model)?.display_name;typeof model=="string"&&model!==""&&windows.push(scopedWindow(model,percent,resetsAt))}}if(windows.length>0)return windows;for(let[key,value]of Object.entries(data??{})){let utilization=finite2(record7(value)?.utilization);if(utilization===void 0)continue;let resetsAt=isoInstant(record7(value)?.resets_at);key==="five_hour"?windows.push(claudeWindow("claude:5h","5h",utilization,resetsAt)):key==="seven_day"?windows.push(claudeWindow("claude:7d","7d",utilization,resetsAt)):key.startsWith("seven_day_")&&windows.push(scopedWindow(key.slice(10),utilization,resetsAt))}return windows}function codexUsage(payload){let data=record7(payload),rateLimit=record7(data?.rate_limit),windows=[];for(let slot2 of["primary","secondary"]){let window=record7(rateLimit?.[`${slot2}_window`]),used=finite2(window?.used_percent);if(window===void 0||used===void 0)continue;let seconds2=finite2(window.limit_window_seconds),minutes=seconds2===void 0?void 0:Math.round(seconds2/60),resetSeconds=finite2(window.reset_at);windows.push({id:`codex:${slot2}`,label:windowLabel(minutes,slot2),...minutes===void 0?{}:{windowMinutes:minutes},usedPercent:used,...resetSeconds===void 0?{}:{resetsAt:new Date(resetSeconds*1e3).toISOString()}})}let plan=data?.plan_type;return{windows,...typeof plan=="string"&&plan!==""?{plan}:{}}}function codexAccountId(token){let payload=token.split(".")[1];if(payload)try{let claims=record7(JSON.parse(Buffer.from(payload,"base64url").toString("utf8"))),auth=record7(claims?.["https://api.openai.com/auth"]);for(let key of["chatgpt_account_id","account_id"]){let value=auth?.[key];if(typeof value=="string"&&value!=="")return value}}catch{}}var POLL_INTERVAL_MS={"anthropic-subscription":3e5,"chatgpt-subscription":15e4},TICK_MS=3e4,MAX_BACKOFF_MS=60*6e4,SIGNED_OUT_INTERVALS=5,UsagePoller=class{#deps;#adopted=new Map;#running=!1;constructor(deps){this.#deps=deps}async pollOnce(signal=new AbortController().signal){if(!this.#running){this.#running=!0;try{let accounts=new Map((await this.#deps.listAccounts()).map(account=>[keyOf(account),account])),path14=this.#deps.cachePath,before=readUsageCache(path14);this.#adopt(before,accounts);let now2=this.#deps.now(),due=[...accounts.keys()].filter(key=>isDue(before,key,now2));if(due.length===0)return;let token=randomUUID14();writeUsageCache(path14,withClaims(before,due,now2,token));let owned=claimedBy(readUsageCache(path14),due,token),results=new Map;await Promise.all(owned.flatMap(key=>{let account=accounts.get(key);return account===void 0?[]:[this.#read(account,before.accounts[key],signal).then(reading=>results.set(key,reading))]}));let after2=withResults(readUsageCache(path14),results,token);writeUsageCache(path14,after2),this.#adopt(after2,accounts)}finally{this.#running=!1}}}#adopt(cache,accounts){for(let[key,account]of accounts){let reading=cache.accounts[key];if(reading===void 0||this.#adopted.get(key)===reading.updatedAt)continue;this.#adopted.set(key,reading.updatedAt);let reportedAt=new Date(reading.updatedAt);this.#deps.store.report(account.provider,account.account,reading.error!==void 0?{error:reading.error,reportedAt}:{windows:reading.windows,...reading.plan===void 0?{}:{plan:reading.plan},reportedAt})}}async#read(account,previous,signal){let interval=POLL_INTERVAL_MS[account.provider],now2=this.#deps.now(),credential=await account.access(signal);if(credential===void 0)return{...previous??{windows:[],updatedAt:now2},nextAt:now2+interval};if("error"in credential)return{windows:[],error:credential.error,updatedAt:now2,nextAt:now2+SIGNED_OUT_INTERVALS*interval};try{return{...await readUsage(account.provider,credential.access,this.#deps.fetch),updatedAt:now2,nextAt:now2+interval}}catch(error2){let failure2=describeFailure(error2,interval);return{windows:[],error:failure2.error,updatedAt:now2,nextAt:now2+Math.min(failure2.waitMs,MAX_BACKOFF_MS)}}}};function keyOf(account){return usageKey(account.provider,account.account)}function describeFailure(error2,interval){if(error2 instanceof UsageHttpError)return error2.status===401||error2.status===403?{error:SIGN_IN_NEEDED,waitMs:SIGNED_OUT_INTERVALS*interval}:error2.status===429?{error:"rate limited",waitMs:error2.retryAfterMs??interval}:{error:`HTTP ${error2.status}`,waitMs:error2.retryAfterMs??2*interval};let message=error2 instanceof Error?error2.message:String(error2);return{error:/abort|timeout|timed out/i.test(message)?"timed out":"unreachable",waitMs:2*interval}}var running;function startSubscriptionUsagePolling(options){if(running!==void 0)return running;let storage=AuthStorage.create(join83(options.agentDir,"auth.json")),poller=new UsagePoller({store:subscriptionLimits,cachePath:join83(options.agentDir,"subscription-usage.json"),listAccounts:()=>listPollAccounts({store:storage,env:name=>process.env[name],refresher:authLaneRefresher(),now:Date.now}),fetch:fetchUsageJson,now:Date.now}),controller=new AbortController,tick=()=>{poller.pollOnce(controller.signal).catch(error2=>{options.report(`senpi subscription limits: usage poll failed: ${String(error2)}`)})};tick();let timer=setInterval(tick,TICK_MS);return timer.unref(),running={stop(){controller.abort(),clearInterval(timer),running=void 0}},running}function errorMessage5(payload,fallback){if(typeof payload!="object"||payload===null)return fallback;let error2=payload.error;if(typeof error2!="object"||error2===null)return fallback;let message=error2.message;return typeof message=="string"&&message?message:fallback}function isModelInfo(value){if(typeof value!="object"||value===null)return!1;let candidate=value;return typeof candidate.id=="string"&&typeof candidate.status?.value=="string"}function linkSignal(source2,target){if(!source2)return()=>{};if(source2.aborted)return target.abort(source2.reason),()=>{};let abort=()=>target.abort(source2.reason);return source2.addEventListener("abort",abort,{once:!0}),()=>source2.removeEventListener("abort",abort)}function sleep2(ms,signal){return new Promise((resolve53,reject)=>{if(signal?.aborted){reject(signal.reason??new Error("Cancelled"));return}let abort=()=>{clearTimeout(timeout),reject(signal?.reason??new Error("Cancelled"))},timeout=setTimeout(()=>{signal?.removeEventListener("abort",abort),resolve53()},ms);signal?.addEventListener("abort",abort,{once:!0})})}function parseLoadProgress(data){if(typeof data!="object"||data===null)return;let progress=data.progress;if(typeof progress!="object"||progress===null)return;let value=progress,stage=typeof value.current=="string"?value.current:typeof value.stage=="string"?value.stage:void 0,stages=Array.isArray(value.stages)?value.stages.filter(entry=>typeof entry=="string"):[],stageRatio=typeof value.value=="number"?Math.max(0,Math.min(1,value.value)):void 0,ratio=stageRatio;if(stage&&stages.length>0){let index=stages.indexOf(stage);index>=0&&(ratio=(index+(stageRatio??0))/stages.length)}return{message:stage?`Loading ${stage.replaceAll("_"," ")}`:"Loading model",ratio}}function parseDownloadProgress(data){if(typeof data!="object"||data===null)return;let nested=data.progress,files=typeof nested=="object"&&nested!==null?nested:data,done=0,total=0;for(let value of Object.values(files)){if(typeof value!="object"||value===null)continue;let entry=value;typeof entry.done!="number"||typeof entry.total!="number"||(done+=entry.done,total+=entry.total)}if(!(total<=0))return{message:"Downloading model",ratio:done/total,detail:`${formatBytes2(done)} / ${formatBytes2(total)}`}}function formatBytes2(bytes){if(bytes<1024)return`${bytes} B`;let units=["KiB","MiB","GiB","TiB"],value=bytes/1024,unit=units[0];for(let index=1;index<units.length&&value>=1024;index++)value/=1024,unit=units[index];return`${value>=10?value.toFixed(1):value.toFixed(2)} ${unit}`}function normalizeLlamaServerUrl(value){let url=new URL(value.trim());if(url.protocol!=="http:"&&url.protocol!=="https:")throw new Error("Server URL must use http or https");return url.hash="",url.search="",url.pathname=url.pathname.replace(/\/+$/u,"").replace(/\/v1$/u,"")||"/",url.toString().replace(/\/$/u,"")}function llamaInferenceUrl(serverUrl){return`${normalizeLlamaServerUrl(serverUrl)}/v1`}var LlamaClient=class{constructor(serverUrl,apiKey){this.serverUrl=normalizeLlamaServerUrl(serverUrl),this.apiKey=apiKey}async request(path14,init={}){let headers=new Headers(init.headers);init.body!==void 0&&headers.set("Content-Type","application/json"),this.apiKey&&headers.set("Authorization",`Bearer ${this.apiKey}`);let timeout=AbortSignal.timeout(15e3),signal=init.signal?AbortSignal.any([init.signal,timeout]):timeout,response=await fetch(`${this.serverUrl}${path14}`,{...init,headers,signal}),payload;try{payload=await response.json()}catch{payload=void 0}if(!response.ok)throw new Error(errorMessage5(payload,`llama.cpp returned HTTP ${response.status}`));return payload}async list(options={}){let payload=await this.request(`/models${options.reload?"?reload=1":""}`,{signal:options.signal});if(typeof payload!="object"||payload===null||!Array.isArray(payload.data))throw new Error("llama.cpp returned an invalid model catalog");let data=payload.data;if(!data.every(isModelInfo))throw new Error("Server is not running in llama.cpp router mode");return data}async props(options={}){let query=options.model?`?${new URLSearchParams({model:options.model,autoload:"false"})}`:"",payload=await this.request(`/props${query}`,{signal:options.signal});if(typeof payload!="object"||payload===null)return{};let{models_autoload:modelsAutoload,chat_template:chatTemplate}=payload;return{...typeof modelsAutoload=="boolean"?{models_autoload:modelsAutoload}:{},...typeof chatTemplate=="string"?{chat_template:chatTemplate}:{}}}async load(model,signal){await this.request("/models/load",{method:"POST",body:JSON.stringify({model}),signal})}async unload(model,signal){await this.request("/models/unload",{method:"POST",body:JSON.stringify({model}),signal})}async unloadAndWait(model,signal){for(await this.unload(model,signal);;){let entry=(await this.list({signal})).find(candidate=>candidate.id===model);if(!entry||entry.status.value==="unloaded")return;await sleep2(100,signal)}}async download(model,signal){await this.request("/models",{method:"POST",body:JSON.stringify({model}),signal})}async watch(onEvent,signal){let headers=new Headers;this.apiKey&&headers.set("Authorization",`Bearer ${this.apiKey}`);let response=await fetch(`${this.serverUrl}/models/sse`,{headers,signal});if(!response.ok||!response.body)throw new Error(`llama.cpp SSE returned HTTP ${response.status}`);let reader=response.body.getReader(),decoder=new TextDecoder,buffer="";for(;;){let chunk=await reader.read();if(chunk.done)break;buffer+=decoder.decode(chunk.value,{stream:!0}).replaceAll(`\r
|
|
1933
1932
|
`,`
|
|
1934
1933
|
`);let boundary=buffer.indexOf(`
|
|
@@ -1948,11 +1947,11 @@ ${approval} at:
|
|
|
1948
1947
|
https://huggingface.co/${details.id}
|
|
1949
1948
|
|
|
1950
1949
|
The llama.cpp server needs HF_TOKEN with access.`,["Continue","Back"])!=="Continue")return}let quantization=parsed.quantization;if(!quantization&&details.quantizations.length>0){let options=details.quantizations.map(entry=>{let detail=[entry.size===void 0?void 0:formatBytes2(entry.size),entry.name==="Q4_K_M"?"recommended":void 0].filter(value=>!!value).join(" \xB7 ");return detail?`${entry.name} \xB7 ${detail}`:entry.name}),choice=await ui.select(`Select quantization
|
|
1951
|
-
${details.id}`,options);if(!choice||(quantization=details.quantizations[options.indexOf(choice)]?.name,!quantization))return}let model=quantization?`${details.id}:${quantization}`:details.id,result3=await runWithProgress(ui,{title:"Downloading model",model,initialMessage:"Starting\u2026",cancelTitle:"Stop download?",cancelMessage:model,run:(signal,update)=>client.downloadAndWait(model,update,signal),cancel:()=>client.unload(model)});result3.cancelled||(await syncCatalog(ctx,client,result3.value),ctx.ui.notify(`Downloaded ${model}`))};pi.registerCommand("llama",{description:"Manage llama.cpp router models",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify("/llama is available in interactive mode","warning");return}let client=await configuredClient(ctx);client&&await showLlamaUi(ctx,async ui=>{let readCatalog=async()=>{for(;;)try{return await syncCatalog(ctx,client)}catch(error2){if(await ui.connectionError(client.serverUrl,connectionErrorMessage(error2))==="close")return}},catalog=await readCatalog();if(catalog)for(;;){let action=await ui.showModels(client.serverUrl,catalog);if(action.type==="close")return;let actionError;try{action.type==="download"?await downloadModel(ctx,ui,client):modelIsLoaded(action.model)?await unloadModel(ctx,ui,client,action.model):action.model.status.value==="unloaded"?await loadModel(ctx,ui,client,catalog,action.model):ctx.ui.notify(`${action.model.id} is ${action.model.status.value}`,"warning")}catch(error2){actionError=error2}let refreshed=await readCatalog();if(!refreshed)return;catalog=refreshed,actionError&&!isConnectionError(actionError)&&ctx.ui.notify(actionError instanceof Error?actionError.message:String(actionError),"error")}})}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,builtin:!0}];import{homedir as homedir17}from"os";import{join as join85}from"path";var SOURCE_MODULE_PATTERN=/\.(ts|mts|cts|tsx)$/;function isFromSourceRun(moduleUrl=import.meta.url,bunBinary=isBunBinary){return!bunBinary&&SOURCE_MODULE_PATTERN.test(moduleUrl)}function targetsRealUserAgentDir(agentDir,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir17()){return!envAgentDir&&agentDir===join85(homeDir,CONFIG_DIR_NAME,"agent")}function getFromSourceRealConfigWarning(agentDir,moduleUrl=import.meta.url,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir17(),bunBinary=isBunBinary){if(!(!isFromSourceRun(moduleUrl,bunBinary)||!targetsRealUserAgentDir(agentDir,envAgentDir,homeDir)))return`Warning: running from source against the real user config (${agentDir}). Set ${ENV_AGENT_DIR} to an isolated directory for dev and QA runs.`}import{copyFileSync as copyFileSync2,existsSync as existsSync39,mkdirSync as mkdirSync24,readFileSync as readFileSync45,statSync as statSync22}from"node:fs";import{homedir as homedir18}from"node:os";import{join as join88}from"node:path";import{constants as constants10,cpSync as cpSync3,existsSync as existsSync38,mkdirSync as mkdirSync22,readdirSync as readdirSync10,realpathSync as realpathSync13}from"node:fs";import{basename as basename29,dirname as dirname57,isAbsolute as isAbsolute28,join as join86,relative as relative20,resolve as resolve48}from"node:path";var REGENERABLE_ENTRIES=new Set(["cache","logs","tmp","migrations-state.json"]);function isRegenerableEntry(entry){return REGENERABLE_ENTRIES.has(entry)||entry.endsWith(".log")}function pathsPointToSameLocation(leftPath,rightPath){try{return realpathSync13(leftPath)===realpathSync13(rightPath)}catch(error2){if(isMissingPathError2(error2))return!1;throw error2}}function canonicalPath(path14){let absolute=resolve48(path14);if(existsSync38(absolute))return realpathSync13(absolute);let parent=dirname57(absolute);return parent===absolute?absolute:join86(canonicalPath(parent),basename29(absolute))}function isWithinOrSamePath(childPath,parentPath){let relativePath=relative20(canonicalPath(parentPath),canonicalPath(childPath));return relativePath===""||!relativePath.startsWith("..")&&!isAbsolute28(relativePath)}function isMissingPathError2(error2){return error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR")}function copyMissingEntries(source2,target,include){let entries;try{entries=readdirSync10(source2)}catch(error2){if(isMissingPathError2(error2))return[];throw error2}let copied=[];for(let entry of entries)if(!(!include(entry)||existsSync38(join86(target,entry))))try{mkdirSync22(target,{recursive:!0}),cpSync3(join86(source2,entry),join86(target,entry),{recursive:!0,force:!1,errorOnExist:!1,preserveTimestamps:!0,mode:constants10.COPYFILE_FICLONE}),copied.push(entry)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not copy ${join86(source2,entry)} \u2192 ${join86(target,entry)}: ${reason}`))}return copied}import{mkdirSync as mkdirSync23,readFileSync as readFileSync44,renameSync as renameSync13,rmSync as
|
|
1952
|
-
`),renameSync13(temporary,target)}catch{try{
|
|
1953
|
-
`)}catch{return{...result3,copied}}return{migrated:!0,copied,from:legacyAgentDir,to:brandDir}}function migrateEngineStateForBrand(homeDir=homedir19()){if(!CONFIG_FLAT_LAYOUT)return;let result3=migrateEngineStateToBrandDir(join89(homeDir,".senpi","agent"),join89(homeDir,CONFIG_DIR_NAME));return result3.migrated&&result3.copied.length>0&&(console.log(source_default.green(`Copied existing settings from ${result3.from} to ${result3.to}`)),console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on."))),result3}import{existsSync as existsSync41,readdirSync as readdirSync12,renameSync as renameSync14}from"fs";import{join as join90}from"path";function migrateCommandsToPrompts(baseDir,label3){let commandsDir=join90(baseDir,"commands"),promptsDir=join90(baseDir,"prompts");if(existsSync41(commandsDir)&&!existsSync41(promptsDir))try{return renameSync14(commandsDir,promptsDir),console.log(source_default.green(`Migrated ${label3} commands/ \u2192 prompts/`)),!0}catch(err){console.log(source_default.yellow(`Warning: Could not migrate ${label3} commands/ to prompts/: ${err instanceof Error?err.message:err}`))}return!1}function checkDeprecatedExtensionDirs(baseDir,label3){let hooksDir=join90(baseDir,"hooks"),toolsDir=join90(baseDir,"tools"),warnings=[];if(existsSync41(hooksDir)&&warnings.push(`${label3} hooks/ directory found. Hooks have been renamed to extensions.`),existsSync41(toolsDir))try{readdirSync12(toolsDir).filter(entry=>existsSync41(join90(toolsDir,entry,"index.ts"))).length>0&&warnings.push(`${label3} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{return warnings}return warnings}function migrateExtensionSystem(cwd){let agentDir=getAgentDir(),projectDir=join90(cwd,CONFIG_DIR_NAME);return migrateCommandsToPrompts(agentDir,"Global"),migrateCommandsToPrompts(projectDir,"Project"),[...checkDeprecatedExtensionDirs(agentDir,"Global"),...checkDeprecatedExtensionDirs(projectDir,"Project")]}import os6 from"node:os";import{existsSync as existsSync42,mkdirSync as mkdirSync26,readdirSync as readdirSync13,renameSync as renameSync15}from"fs";import{dirname as dirname58,join as join91}from"path";function copyLegacyDir({from,to,label:label3,isAgentConfig}){copyMissingEntries(from,to,entry=>!isRegenerableEntry(entry)).length!==0&&(console.log(source_default.green(`Copied ${label3} ${from} \u2192 ${to}`)),isAgentConfig?(recordLegacyPiAgentDirCopy(to),console.log(source_default.dim(`${APP_NAME} reads its config from ${to} now; edits to ${from} no longer reach ${APP_NAME}.`))):console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on.")))}function moveLegacyDir({from,to,label:label3}){if(!existsSync42(to)){mkdirSync26(dirname58(to),{recursive:!0}),renameSync15(from,to),console.log(source_default.green(`Migrated ${label3} ${from} \u2192 ${to}`));return}let movedAny=!1;for(let entry of readdirSync13(from)){let target=join91(to,entry);existsSync42(target)||(renameSync15(join91(from,entry),target),movedAny=!0)}movedAny&&console.log(source_default.green(`Migrated missing ${label3} entries ${from} \u2192 ${to}`))}function transferLegacyDir(dir){if(existsSync42(dir.from)&&!(existsSync42(dir.to)&&pathsPointToSameLocation(dir.from,dir.to)))try{switch(dir.transfer){case"copy":copyLegacyDir(dir);return;case"move":moveLegacyDir(dir);return}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Skipped the ${dir.label} ${dir.from}: ${reason}`))}}function migrateLegacySenpiDirs(cwd){if(CONFIG_DIR_NAME===".pi")return;let homeDir=os6.homedir(),globalNewAgentDir=getAgentDir(),globalNewMomDir=join91(homeDir,CONFIG_DIR_NAME,"mom"),projectNewDir=join91(cwd,CONFIG_DIR_NAME),shouldMigrateHomeConfig=isWithinOrSamePath(globalNewAgentDir,join91(homeDir,CONFIG_DIR_NAME)),dirs=[{from:join91(cwd,".pi"),to:projectNewDir,label:"project config directory",transfer:"copy"},{from:join91(cwd,CONFIG_DIR_NAME,".pi"),to:projectNewDir,label:"nested project config directory",transfer:"move"}];shouldMigrateHomeConfig&&dirs.unshift({from:join91(homeDir,".pi","agent"),to:globalNewAgentDir,label:"global agent directory",transfer:"copy",isAgentConfig:!0},{from:join91(homeDir,CONFIG_DIR_NAME,".pi","agent"),to:globalNewAgentDir,label:"nested global agent directory",transfer:"move"},{from:join91(homeDir,".pi","mom"),to:globalNewMomDir,label:"global mom directory",transfer:"copy"},{from:join91(homeDir,CONFIG_DIR_NAME,".pi","mom"),to:globalNewMomDir,label:"nested global mom directory",transfer:"move"});for(let dir of dirs)transferLegacyDir(dir)}import{existsSync as existsSync43,lstatSync as lstatSync8,readdirSync as readdirSync14,readFileSync as readFileSync46,rmSync as
|
|
1950
|
+
${details.id}`,options);if(!choice||(quantization=details.quantizations[options.indexOf(choice)]?.name,!quantization))return}let model=quantization?`${details.id}:${quantization}`:details.id,result3=await runWithProgress(ui,{title:"Downloading model",model,initialMessage:"Starting\u2026",cancelTitle:"Stop download?",cancelMessage:model,run:(signal,update)=>client.downloadAndWait(model,update,signal),cancel:()=>client.unload(model)});result3.cancelled||(await syncCatalog(ctx,client,result3.value),ctx.ui.notify(`Downloaded ${model}`))};pi.registerCommand("llama",{description:"Manage llama.cpp router models",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify("/llama is available in interactive mode","warning");return}let client=await configuredClient(ctx);client&&await showLlamaUi(ctx,async ui=>{let readCatalog=async()=>{for(;;)try{return await syncCatalog(ctx,client)}catch(error2){if(await ui.connectionError(client.serverUrl,connectionErrorMessage(error2))==="close")return}},catalog=await readCatalog();if(catalog)for(;;){let action=await ui.showModels(client.serverUrl,catalog);if(action.type==="close")return;let actionError;try{action.type==="download"?await downloadModel(ctx,ui,client):modelIsLoaded(action.model)?await unloadModel(ctx,ui,client,action.model):action.model.status.value==="unloaded"?await loadModel(ctx,ui,client,catalog,action.model):ctx.ui.notify(`${action.model.id} is ${action.model.status.value}`,"warning")}catch(error2){actionError=error2}let refreshed=await readCatalog();if(!refreshed)return;catalog=refreshed,actionError&&!isConnectionError(actionError)&&ctx.ui.notify(actionError instanceof Error?actionError.message:String(actionError),"error")}})}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,builtin:!0}];import{homedir as homedir17}from"os";import{join as join85}from"path";var SOURCE_MODULE_PATTERN=/\.(ts|mts|cts|tsx)$/;function isFromSourceRun(moduleUrl=import.meta.url,bunBinary=isBunBinary){return!bunBinary&&SOURCE_MODULE_PATTERN.test(moduleUrl)}function targetsRealUserAgentDir(agentDir,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir17()){return!envAgentDir&&agentDir===join85(homeDir,CONFIG_DIR_NAME,"agent")}function getFromSourceRealConfigWarning(agentDir,moduleUrl=import.meta.url,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir17(),bunBinary=isBunBinary){if(!(!isFromSourceRun(moduleUrl,bunBinary)||!targetsRealUserAgentDir(agentDir,envAgentDir,homeDir)))return`Warning: running from source against the real user config (${agentDir}). Set ${ENV_AGENT_DIR} to an isolated directory for dev and QA runs.`}import{copyFileSync as copyFileSync2,existsSync as existsSync39,mkdirSync as mkdirSync24,readFileSync as readFileSync45,statSync as statSync22}from"node:fs";import{homedir as homedir18}from"node:os";import{join as join88}from"node:path";import{constants as constants10,cpSync as cpSync3,existsSync as existsSync38,mkdirSync as mkdirSync22,readdirSync as readdirSync10,realpathSync as realpathSync13}from"node:fs";import{basename as basename29,dirname as dirname57,isAbsolute as isAbsolute28,join as join86,relative as relative20,resolve as resolve48}from"node:path";var REGENERABLE_ENTRIES=new Set(["cache","logs","tmp","migrations-state.json"]);function isRegenerableEntry(entry){return REGENERABLE_ENTRIES.has(entry)||entry.endsWith(".log")}function pathsPointToSameLocation(leftPath,rightPath){try{return realpathSync13(leftPath)===realpathSync13(rightPath)}catch(error2){if(isMissingPathError2(error2))return!1;throw error2}}function canonicalPath(path14){let absolute=resolve48(path14);if(existsSync38(absolute))return realpathSync13(absolute);let parent=dirname57(absolute);return parent===absolute?absolute:join86(canonicalPath(parent),basename29(absolute))}function isWithinOrSamePath(childPath,parentPath){let relativePath=relative20(canonicalPath(parentPath),canonicalPath(childPath));return relativePath===""||!relativePath.startsWith("..")&&!isAbsolute28(relativePath)}function isMissingPathError2(error2){return error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR")}function copyMissingEntries(source2,target,include){let entries;try{entries=readdirSync10(source2)}catch(error2){if(isMissingPathError2(error2))return[];throw error2}let copied=[];for(let entry of entries)if(!(!include(entry)||existsSync38(join86(target,entry))))try{mkdirSync22(target,{recursive:!0}),cpSync3(join86(source2,entry),join86(target,entry),{recursive:!0,force:!1,errorOnExist:!1,preserveTimestamps:!0,mode:constants10.COPYFILE_FICLONE}),copied.push(entry)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not copy ${join86(source2,entry)} \u2192 ${join86(target,entry)}: ${reason}`))}return copied}import{mkdirSync as mkdirSync23,readFileSync as readFileSync44,renameSync as renameSync13,rmSync as rmSync11,writeFileSync as writeFileSync23}from"node:fs";import{join as join87}from"node:path";var MIGRATIONS_STATE_SCHEMA_VERSION=1,MIGRATIONS_STATE_FILENAME="migrations-state.json",SCAN_MIGRATIONS=["migrateLegacySenpiDirs","migrateSessionsFromAgentRoot","restoreDrainedPiDirs"],SCAN_MIGRATION_NAMES=new Set(SCAN_MIGRATIONS);function isScanMigrationName(value){return SCAN_MIGRATION_NAMES.has(value)}function isRecord50(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isStringArray3(value){return Array.isArray(value)&&value.every(entry=>typeof entry=="string")}function readState(agentDir){let parsed;try{parsed=JSON.parse(readFileSync44(join87(agentDir,MIGRATIONS_STATE_FILENAME),"utf-8"))}catch{return}if(!(!isRecord50(parsed)||parsed.schemaVersion!==MIGRATIONS_STATE_SCHEMA_VERSION))return parsed}function completedOf(state2){let completed=state2?.completed;return isStringArray3(completed)?completed.filter(name=>isScanMigrationName(name)):[]}function readCompletedScanMigrations(agentDir=getAgentDir()){return new Set(completedOf(readState(agentDir)))}function writeCompletedScanMigrations(completed,agentDir=getAgentDir()){writeState(agentDir,{...readState(agentDir),completed:[...completed]})}function isMtimeEntry(entry){return typeof entry[1]=="number"&&Number.isFinite(entry[1])}function readLegacyPiAgentDirRecord(agentDir=getAgentDir()){let raw=readState(agentDir)?.legacyPiAgentDir;if(!isRecord50(raw))return{noticedMtimes:{}};let noticedMtimes=isRecord50(raw.noticedMtimes)?Object.fromEntries(Object.entries(raw.noticedMtimes).filter(isMtimeEntry)):{},copiedAt=raw.copiedAt;return typeof copiedAt=="number"&&Number.isFinite(copiedAt)?{copiedAt,noticedMtimes}:{noticedMtimes}}function writeLegacyPiAgentDirRecord(record8,agentDir=getAgentDir()){let state2=readState(agentDir);writeState(agentDir,{...state2,completed:completedOf(state2),legacyPiAgentDir:record8})}function recordLegacyPiAgentDirCopy(agentDir=getAgentDir(),copiedAt=Date.now()){writeLegacyPiAgentDirRecord({copiedAt,noticedMtimes:{}},agentDir)}function writeState(agentDir,fields){mkdirSync23(agentDir,{recursive:!0});let target=join87(agentDir,MIGRATIONS_STATE_FILENAME),temporary=`${target}.${process.pid}.tmp`,payload={schemaVersion:MIGRATIONS_STATE_SCHEMA_VERSION,...fields};try{writeFileSync23(temporary,`${JSON.stringify(payload,null,2)}
|
|
1951
|
+
`),renameSync13(temporary,target)}catch{try{rmSync11(temporary,{force:!0})}catch{}}}var LEGACY_PI_CONFIG_FILES=["auth.json","keybindings.json","models.json","settings.json"];function isLegacyPiConfigFile(name){return LEGACY_PI_CONFIG_FILES.some(file=>file===name)}function dirsFor(options){return{agentDir:options.agentDir??getAgentDir(),piAgentDir:join88(options.homeDir??homedir18(),".pi","agent")}}function hasSeparatePiAgentDir(dirs){return CONFIG_DIR_NAME===".pi"||!existsSync39(dirs.piAgentDir)?!1:!existsSync39(dirs.agentDir)||!pathsPointToSameLocation(dirs.piAgentDir,dirs.agentDir)}function fileStat(path14){try{let stat17=statSync22(path14);return stat17.isFile()?stat17:void 0}catch(error2){if(error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR"))return;throw error2}}function editOf(file,dirs,copiedAt){let piPath=join88(dirs.piAgentDir,file),agentPath=join88(dirs.agentDir,file),pi=fileStat(piPath);if(pi===void 0)return;let agent=fileStat(agentPath),baseline=copiedAt??agent?.mtimeMs??0;if(!(pi.mtimeMs<=baseline)&&!(agent!==void 0&&readFileSync45(piPath).equals(readFileSync45(agentPath))))return{file,piPath,agentPath,mtimeMs:pi.mtimeMs}}function editsIn(dirs,copiedAt){return hasSeparatePiAgentDir(dirs)?LEGACY_PI_CONFIG_FILES.flatMap(file=>editOf(file,dirs,copiedAt)??[]):[]}function findLegacyPiEdits(options={}){let dirs=dirsFor(options);return editsIn(dirs,readLegacyPiAgentDirRecord(dirs.agentDir).copiedAt)}function takeLegacyPiEditNotice(options={}){let dirs=dirsFor(options),record8=readLegacyPiAgentDirRecord(dirs.agentDir),unreported=editsIn(dirs,record8.copiedAt).filter(edit=>record8.noticedMtimes[edit.file]!==edit.mtimeMs);if(unreported.length>0){let noticed=Object.fromEntries(unreported.map(edit=>[edit.file,edit.mtimeMs]));writeLegacyPiAgentDirRecord({...record8,noticedMtimes:{...record8.noticedMtimes,...noticed}},dirs.agentDir)}return unreported}function formatLegacyPiEditNotice(edits,agentDir){let files=edits.map(edit=>edit.file).join(" "),command=`${APP_COMMAND} config import-pi ${files}`,[only]=edits;return edits.length===1&&only!==void 0?`You edited ${only.piPath} after ${APP_NAME} moved to ${agentDir}; ${APP_NAME} reads ${only.agentPath}. Copy your change there (or run: ${command}).`:`You edited ${edits.map(edit=>edit.piPath).join(", ")} after ${APP_NAME} moved to ${agentDir}; ${APP_NAME} reads its config from ${agentDir}. Copy your changes there (or run: ${command}).`}function legacyPiEditStartupNotice(options={}){try{let edits=takeLegacyPiEditNotice(options);return edits.length>0?formatLegacyPiEditNotice(edits,dirsFor(options).agentDir):void 0}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return`Could not check ${dirsFor(options).piAgentDir} for config edits: ${reason}`}}function backupSuffix(now2){return now2.toISOString().replace(/[-:.]/g,"")}function importOne(file,dirs,now2){if(!isLegacyPiConfigFile(file))return{file,reason:`not one of ${LEGACY_PI_CONFIG_FILES.join(", ")}`};let from=join88(dirs.piAgentDir,file),to=join88(dirs.agentDir,file);if(fileStat(from)===void 0)return{file,reason:`${from} does not exist`};mkdirSync24(dirs.agentDir,{recursive:!0});let backupPath;return fileStat(to)!==void 0&&(backupPath=`${to}.bak-${backupSuffix(now2)}`,copyFileSync2(to,backupPath)),copyFileSync2(from,to),backupPath===void 0?{file,from,to}:{file,from,to,backupPath}}function importLegacyPiConfig(files,options={}){let dirs=dirsFor(options);if(!hasSeparatePiAgentDir(dirs))return{...dirs,imported:[],failures:[{file:dirs.piAgentDir,reason:"no separate pi config to import"}]};let requested=files.length>0?files:findLegacyPiEdits(options).map(edit=>edit.file),imported=[],failures=[];for(let file of requested){let outcome=importOne(file,dirs,options.now??new Date);"reason"in outcome?failures.push(outcome):imported.push(outcome)}return{...dirs,imported,failures}}import{existsSync as existsSync44,mkdirSync as mkdirSync27,readdirSync as readdirSync15,readFileSync as readFileSync47,renameSync as renameSync16,rmSync as rmSync13,writeFileSync as writeFileSync25}from"fs";import{dirname as dirname59,join as join93}from"path";import{cpSync as cpSync4,existsSync as existsSync40,mkdirSync as mkdirSync25,readdirSync as readdirSync11,writeFileSync as writeFileSync24}from"node:fs";import{homedir as homedir19}from"node:os";import{join as join89}from"node:path";var MIGRATION_MARKER=".migrated-from-senpi",SKIPPED_ENTRIES=new Set(["cache","logs","omo-local-update"]);function isDesktopReserved(entry){let name=process.platform==="darwin"||process.platform==="win32"?entry.toLowerCase():entry;return name==="desktop"||name.startsWith("desktop.init-")}function isSkipped(entry){return SKIPPED_ENTRIES.has(entry)||entry.endsWith(".log")||isDesktopReserved(entry)}function migrateEngineStateToBrandDir(legacyAgentDir,brandDir){let result3={migrated:!1,copied:[],from:legacyAgentDir,to:brandDir};if(!existsSync40(legacyAgentDir)||existsSync40(join89(brandDir,MIGRATION_MARKER))||existsSync40(join89(brandDir,FLAT_LAYOUT_SENTINEL)))return result3;let entries;try{entries=readdirSync11(legacyAgentDir)}catch{return result3}mkdirSync25(brandDir,{recursive:!0});let copied=[];for(let entry of entries){if(isSkipped(entry))continue;let target=join89(brandDir,entry);if(!existsSync40(target))try{cpSync4(join89(legacyAgentDir,entry),target,{recursive:!0,errorOnExist:!1}),copied.push(entry)}catch{}}try{writeFileSync24(join89(brandDir,MIGRATION_MARKER),`${legacyAgentDir}
|
|
1952
|
+
`)}catch{return{...result3,copied}}return{migrated:!0,copied,from:legacyAgentDir,to:brandDir}}function migrateEngineStateForBrand(homeDir=homedir19()){if(!CONFIG_FLAT_LAYOUT)return;let result3=migrateEngineStateToBrandDir(join89(homeDir,".senpi","agent"),join89(homeDir,CONFIG_DIR_NAME));return result3.migrated&&result3.copied.length>0&&(console.log(source_default.green(`Copied existing settings from ${result3.from} to ${result3.to}`)),console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on."))),result3}import{existsSync as existsSync41,readdirSync as readdirSync12,renameSync as renameSync14}from"fs";import{join as join90}from"path";function migrateCommandsToPrompts(baseDir,label3){let commandsDir=join90(baseDir,"commands"),promptsDir=join90(baseDir,"prompts");if(existsSync41(commandsDir)&&!existsSync41(promptsDir))try{return renameSync14(commandsDir,promptsDir),console.log(source_default.green(`Migrated ${label3} commands/ \u2192 prompts/`)),!0}catch(err){console.log(source_default.yellow(`Warning: Could not migrate ${label3} commands/ to prompts/: ${err instanceof Error?err.message:err}`))}return!1}function checkDeprecatedExtensionDirs(baseDir,label3){let hooksDir=join90(baseDir,"hooks"),toolsDir=join90(baseDir,"tools"),warnings=[];if(existsSync41(hooksDir)&&warnings.push(`${label3} hooks/ directory found. Hooks have been renamed to extensions.`),existsSync41(toolsDir))try{readdirSync12(toolsDir).filter(entry=>existsSync41(join90(toolsDir,entry,"index.ts"))).length>0&&warnings.push(`${label3} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{return warnings}return warnings}function migrateExtensionSystem(cwd){let agentDir=getAgentDir(),projectDir=join90(cwd,CONFIG_DIR_NAME);return migrateCommandsToPrompts(agentDir,"Global"),migrateCommandsToPrompts(projectDir,"Project"),[...checkDeprecatedExtensionDirs(agentDir,"Global"),...checkDeprecatedExtensionDirs(projectDir,"Project")]}import os6 from"node:os";import{existsSync as existsSync42,mkdirSync as mkdirSync26,readdirSync as readdirSync13,renameSync as renameSync15}from"fs";import{dirname as dirname58,join as join91}from"path";function copyLegacyDir({from,to,label:label3,isAgentConfig}){copyMissingEntries(from,to,entry=>!isRegenerableEntry(entry)).length!==0&&(console.log(source_default.green(`Copied ${label3} ${from} \u2192 ${to}`)),isAgentConfig?(recordLegacyPiAgentDirCopy(to),console.log(source_default.dim(`${APP_NAME} reads its config from ${to} now; edits to ${from} no longer reach ${APP_NAME}.`))):console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on.")))}function moveLegacyDir({from,to,label:label3}){if(!existsSync42(to)){mkdirSync26(dirname58(to),{recursive:!0}),renameSync15(from,to),console.log(source_default.green(`Migrated ${label3} ${from} \u2192 ${to}`));return}let movedAny=!1;for(let entry of readdirSync13(from)){let target=join91(to,entry);existsSync42(target)||(renameSync15(join91(from,entry),target),movedAny=!0)}movedAny&&console.log(source_default.green(`Migrated missing ${label3} entries ${from} \u2192 ${to}`))}function transferLegacyDir(dir){if(existsSync42(dir.from)&&!(existsSync42(dir.to)&&pathsPointToSameLocation(dir.from,dir.to)))try{switch(dir.transfer){case"copy":copyLegacyDir(dir);return;case"move":moveLegacyDir(dir);return}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Skipped the ${dir.label} ${dir.from}: ${reason}`))}}function migrateLegacySenpiDirs(cwd){if(CONFIG_DIR_NAME===".pi")return;let homeDir=os6.homedir(),globalNewAgentDir=getAgentDir(),globalNewMomDir=join91(homeDir,CONFIG_DIR_NAME,"mom"),projectNewDir=join91(cwd,CONFIG_DIR_NAME),shouldMigrateHomeConfig=isWithinOrSamePath(globalNewAgentDir,join91(homeDir,CONFIG_DIR_NAME)),dirs=[{from:join91(cwd,".pi"),to:projectNewDir,label:"project config directory",transfer:"copy"},{from:join91(cwd,CONFIG_DIR_NAME,".pi"),to:projectNewDir,label:"nested project config directory",transfer:"move"}];shouldMigrateHomeConfig&&dirs.unshift({from:join91(homeDir,".pi","agent"),to:globalNewAgentDir,label:"global agent directory",transfer:"copy",isAgentConfig:!0},{from:join91(homeDir,CONFIG_DIR_NAME,".pi","agent"),to:globalNewAgentDir,label:"nested global agent directory",transfer:"move"},{from:join91(homeDir,".pi","mom"),to:globalNewMomDir,label:"global mom directory",transfer:"copy"},{from:join91(homeDir,CONFIG_DIR_NAME,".pi","mom"),to:globalNewMomDir,label:"nested global mom directory",transfer:"move"});for(let dir of dirs)transferLegacyDir(dir)}import{existsSync as existsSync43,lstatSync as lstatSync8,readdirSync as readdirSync14,readFileSync as readFileSync46,rmSync as rmSync12,statSync as statSync23}from"node:fs";import{homedir as homedir20}from"node:os";import{join as join92}from"node:path";var UPSTREAM_PI_AGENT_ENTRIES=new Set(["auth.json","settings.json","models.json","models-store.json","keybindings.json","sessions","extensions","skills","prompts","themes","npm","git","experimental","AGENTS.md","CLAUDE.md","SYSTEM.md","APPEND_SYSTEM.md"]);function isDirectory(path14){return existsSync43(path14)&&statSync23(path14).isDirectory()}function movingMigrationMayHaveRun(agentDir,completed){return completed.has("migrateLegacySenpiDirs")?!0:existsSync43(join92(agentDir,MIGRATIONS_STATE_FILENAME))?!1:isDirectory(agentDir)&&readdirSync14(agentDir).some(entry=>UPSTREAM_PI_AGENT_ENTRIES.has(entry))}function isEmptyJsonStub(path14){let stat17=lstatSync8(path14);if(!stat17.isFile()||stat17.size>16)return!1;let text3=readFileSync46(path14,"utf-8").trim();return text3==="{}"||text3==="[]"}function holdsNoUserState(dir){return existsSync43(dir)?readdirSync14(dir).every(entry=>isRegenerableEntry(entry)||isEmptyJsonStub(join92(dir,entry))):!0}function restoreDir(from,to,include){if(!isDirectory(from)||!holdsNoUserState(to)||existsSync43(to)&&pathsPointToSameLocation(from,to))return!1;for(let entry of existsSync43(to)?readdirSync14(to):[])include(entry)&&existsSync43(join92(from,entry))&&isEmptyJsonStub(join92(to,entry))&&rmSync12(join92(to,entry));let restored=copyMissingEntries(from,to,include);return restored.length>0&&(console.log(source_default.green(`Restored ${to} from ${from}: an earlier start had moved it there.`)),console.log(source_default.dim("Both directories now hold independent copies."))),restored.length>0}function restoreDrainedPiDirs(completed,homeDir=homedir20()){if(CONFIG_DIR_NAME===".pi")return;let agentDir=getAgentDir(),brandDir=join92(homeDir,CONFIG_DIR_NAME),piDir=join92(homeDir,".pi");if(!(!isWithinOrSamePath(agentDir,brandDir)||!isDirectory(piDir))&&movingMigrationMayHaveRun(agentDir,completed))try{restoreDir(agentDir,join92(piDir,"agent"),entry=>UPSTREAM_PI_AGENT_ENTRIES.has(entry))&&recordLegacyPiAgentDirCopy(agentDir),restoreDir(join92(brandDir,"mom"),join92(piDir,"mom"),entry=>!isRegenerableEntry(entry))}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not restore ${piDir}: ${reason}`))}}var MIGRATION_GUIDE_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join93(agentDir,"auth.json"),oauthPath=join93(agentDir,"oauth.json"),settingsPath=join93(agentDir,"settings.json");if(existsSync44(authPath))return[];let migrated={},providers=[];if(existsSync44(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync47(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync16(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync44(settingsPath))try{let content=readFileSync47(settingsPath,"utf-8"),settings=JSON.parse(stripBom(content));if(settings.apiKeys&&typeof settings.apiKeys=="object"){for(let[provider,key]of Object.entries(settings.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings.apiKeys,writeFileSync25(settingsPath,JSON.stringify(settings,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync27(dirname59(authPath),{recursive:!0}),writeFileSync25(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync15(agentDir).filter(f=>f.endsWith(".jsonl")).map(f=>join93(agentDir,f))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine2=readFileSync47(file,"utf8").split(`
|
|
1954
1953
|
`)[0];if(!firstLine2?.trim())continue;let header2=JSON.parse(firstLine2);if(header2.type!=="session"||!header2.cwd)continue;let safePath=`--${header2.cwd.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`,correctDir=join93(agentDir,"sessions",safePath);existsSync44(correctDir)||mkdirSync27(correctDir,{recursive:!0});let fileName=file.split("/").pop()||file.split("\\").pop(),newPath=join93(correctDir,fileName);if(existsSync44(newPath))continue;renameSync16(file,newPath)}catch{}}function migrateKeybindingsConfigFile(){let configPath=join93(getAgentDir(),"keybindings.json");if(existsSync44(configPath))try{let parsed=JSON.parse(stripBom(readFileSync47(configPath,"utf-8")));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let{config,migrated}=migrateKeybindingsConfig(parsed);if(!migrated)return;writeFileSync25(configPath,`${JSON.stringify(config,null,2)}
|
|
1955
|
-
`,"utf-8")}catch{}}function migrateToolsToBin(){let agentDir=getAgentDir(),toolsDir=join93(agentDir,"tools"),binDir=getBinDir();if(!existsSync44(toolsDir))return;let binaries=["fd","rg","fd.exe","rg.exe"],movedAny=!1;for(let bin of binaries){let oldPath=join93(toolsDir,bin),newPath=join93(binDir,bin);if(existsSync44(oldPath))if(existsSync44(binDir)||mkdirSync27(binDir,{recursive:!0}),existsSync44(newPath))try{
|
|
1954
|
+
`,"utf-8")}catch{}}function migrateToolsToBin(){let agentDir=getAgentDir(),toolsDir=join93(agentDir,"tools"),binDir=getBinDir();if(!existsSync44(toolsDir))return;let binaries=["fd","rg","fd.exe","rg.exe"],movedAny=!1;for(let bin of binaries){let oldPath=join93(toolsDir,bin),newPath=join93(binDir,bin);if(existsSync44(oldPath))if(existsSync44(binDir)||mkdirSync27(binDir,{recursive:!0}),existsSync44(newPath))try{rmSync13?.(oldPath,{force:!0})}catch{}else try{renameSync16(oldPath,newPath),movedAny=!0}catch{}}movedAny&&console.log(source_default.green("Migrated managed binaries tools/ \u2192 bin/"))}async function showDeprecationWarnings(warnings){if(warnings.length!==0){for(let warning of warnings)console.log(source_default.yellow(`Warning: ${warning}`));console.log(source_default.yellow(`
|
|
1956
1955
|
Move your extensions to the extensions/ directory.`)),console.log(source_default.yellow(`Migration guide: ${MIGRATION_GUIDE_URL}`)),console.log(source_default.yellow(`Documentation: ${EXTENSIONS_DOC_URL}`)),console.log(source_default.dim(`
|
|
1957
1956
|
Press any key to continue...`)),await new Promise(resolve53=>{process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.once("data",()=>{process.stdin.setRawMode?.(!1),process.stdin.pause(),resolve53()})}),console.log()}}function runMigrations(cwd){migrateEngineStateForBrand();let migratedAuthProviders=migrateAuthToAuthJson(),completed=readCompletedScanMigrations();completed.has("restoreDrainedPiDirs")||restoreDrainedPiDirs(completed),completed.has("migrateLegacySenpiDirs")||migrateLegacySenpiDirs(cwd),completed.has("migrateSessionsFromAgentRoot")||migrateSessionsFromAgentRoot(),migrateToolsToBin(),migrateKeybindingsConfigFile();let deprecationWarnings=migrateExtensionSystem(cwd);return completed.size!==SCAN_MIGRATIONS.length&&writeCompletedScanMigrations(SCAN_MIGRATIONS),{migratedAuthProviders,deprecationWarnings}}function isRecord51(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function readRecord(record8,key){let value=record8?.[key];return isRecord51(value)?value:void 0}function readArray(record8,key){let value=record8?.[key];return Array.isArray(value)?value:[]}function readString2(record8,key){let value=record8?.[key];return typeof value=="string"?value:void 0}function readStringArray(record8,key){return readArray(record8,key).filter(value=>typeof value=="string")}function formatProviderName(message){return message.provider?`${message.provider} \xB7 `:""}function pluralize2(count2,singular,plural2=`${singular}s`){return`${count2} ${count2===1?singular:plural2}`}function shorten5(value,max){return value.length<=max?value:`${value.slice(0,max-1)}\u2026`}function quoted(value){return JSON.stringify(value)}function unique2(values){return[...new Set(values)]}function getWebSearchResults(raw){if(!(!isRecord51(raw)||!Array.isArray(raw.content)))return raw.content.filter(isRecord51).filter(item=>readString2(item,"type")==="web_search_result")}function sourceFromRecord(record8){if(!record8)return;let title=readString2(record8,"title")??readString2(record8,"name"),url=readString2(record8,"url")??readString2(record8,"uri")??readString2(record8,"retrievedUrl")??readString2(record8,"sourceUrl"),snippet=readString2(record8,"snippet")??readString2(record8,"text")??readString2(record8,"summary")??readString2(record8,"page_age"),status=readString2(record8,"status")??readString2(record8,"urlRetrievalStatus");if(!(!title&&!url&&!snippet&&!status))return{...title&&{title},...url&&{url},...snippet&&{snippet},...status&&{status}}}function sourceFromGoogleGroundingChunk(record8){return sourceFromRecord(readRecord(record8,"web")??record8)}function formatQueries(queries){let values=unique2(queries);return values.length===0?[]:values.length===1?[`query: ${quoted(values[0])}`]:["queries:",...values.map(query=>`- ${quoted(query)}`)]}function formatSources(sources,label3,expanded){if(sources.length===0)return[];let visibleSources=expanded?sources:sources.slice(0,3),lines=[pluralize2(sources.length,label3)];for(let source2 of visibleSources){let title=source2.title?shorten5(source2.title,100):void 0,url=source2.url?shorten5(source2.url,120):void 0,status=source2.status?` (${source2.status})`:"";title&&url?lines.push(`${title} ${url}${status}`):title?lines.push(`${title}${status}`):url?lines.push(`${url}${status}`):source2.status&&lines.push(source2.status),source2.snippet&&lines.push(` ${shorten5(source2.snippet,160)}`)}return!expanded&&sources.length>visibleSources.length&&lines.push(`\u2026 ${sources.length-visibleSources.length} more ${label3}s`),lines}function base64ByteLength(value){let padding=value.endsWith("==")?2:value.endsWith("=")?1:0;return Math.max(0,Math.floor(value.length/4)*3-padding)}function formatImageGenerationCallBody(raw){let record8=isRecord51(raw)?raw:void 0;if(!record8)return;let status=readString2(record8,"status"),result3=readString2(record8,"result"),revisedPrompt=readString2(record8,"revised_prompt"),lines=[...status?[`status: ${status}`]:[],...result3?[`${base64ByteLength(result3)} bytes`]:[],...revisedPrompt?.trim()?[`revised prompt: ${shorten5(revisedPrompt,200)}`]:[]];return lines.length>0?lines.join(`
|
|
1958
1957
|
`):void 0}function formatServerToolUseBody(raw){let record8=isRecord51(raw)?raw:void 0,input=readRecord(record8,"input"),query=readString2(input,"query");if(query)return`query: ${quoted(query)}`;let name=readString2(record8,"name");if(name)return`name: ${name}`}function formatToolSearchResultBody(raw,expanded){let content=readRecord(isRecord51(raw)?raw:void 0,"content");if(!content)return;let errorCode4=readString2(content,"error_code");if(errorCode4){let message=readString2(content,"error_message");return message?`${errorCode4}: ${shorten5(message,200)}`:errorCode4}let names=unique2(readArray(content,"tool_references").flatMap(reference2=>{let name=readString2(isRecord51(reference2)?reference2:void 0,"tool_name");return name?[name]:[]}));if(names.length===0)return"0 tools";let visible=expanded?names:names.slice(0,10),lines=[pluralize2(names.length,"tool"),...visible.map(name=>shorten5(name,100))];return names.length>visible.length&&lines.push(`\u2026 ${names.length-visible.length} more tools`),lines.join(`
|
|
@@ -1965,17 +1964,17 @@ Press any key to continue...`)),await new Promise(resolve53=>{process.stdin.setR
|
|
|
1965
1964
|
`)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});if(await session.waitForSettledSessionWork(),mode==="json"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");lastMessage?.role==="assistant"&&lastMessage.stopReason==="error"&&lastMessage.errorMessage===REQUIRED_COMPACTION_ERROR_MESSAGE&&(exitCode=1)}if(mode==="text"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");if(lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted"){let described=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}`)),exitCode=1}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
|
|
1966
1965
|
`):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
|
|
1967
1966
|
`),writeRawStdout(`${formatProviderNativeBody(content,!1)}
|
|
1968
|
-
`))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync48}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync48(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat17=linuxStat(pid),tail=stat17?.slice(stat17.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat17=linuxStat(pid),open11=stat17?.indexOf("(")??-1,close=stat17?.lastIndexOf(")")??-1;return stat17===void 0||open11===-1||close<=open11?"":stat17.slice(open11+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-FRQK5GAC.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 randomUUID15}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync28,renameSync as renameSync17,rmSync as rmSync13}from"node:fs";import{basename as basename30,dirname as dirname60,join as join94,relative as relative21,resolve as resolve49,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve49(path14))}function getQuarantineRoot(packageDir){let current=resolve49(packageDir);for(;;){if(basename30(current).toLowerCase()==="node_modules")return join94(current,QUARANTINE_DIR_NAME);let parent=dirname60(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{rmSync13(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=join94(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID15()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join94(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync28(dirname60(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){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}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(`
|
|
1967
|
+
`))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync48}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync48(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat17=linuxStat(pid),tail=stat17?.slice(stat17.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat17=linuxStat(pid),open11=stat17?.indexOf("(")??-1,close=stat17?.lastIndexOf(")")??-1;return stat17===void 0||open11===-1||close<=open11?"":stat17.slice(open11+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-ZDCO62Z4.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 randomUUID15}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync28,renameSync as renameSync17,rmSync as rmSync14}from"node:fs";import{basename as basename30,dirname as dirname60,join as join94,relative as relative21,resolve as resolve49,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve49(path14))}function getQuarantineRoot(packageDir){let current=resolve49(packageDir);for(;;){if(basename30(current).toLowerCase()==="node_modules")return join94(current,QUARANTINE_DIR_NAME);let parent=dirname60(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=join94(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID15()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join94(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync28(dirname60(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){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}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(`
|
|
1969
1968
|
`));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}
|
|
1970
1969
|
`),!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}
|
|
1971
|
-
`),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 localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve53=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve53(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)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{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-US5YPKC7.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 SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(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("--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=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-L6PQ6MLC.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-EMI54PTJ.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join95(agentDir,"auth.json")),authPath:join95(agentDir,"auth.json"),agentDir,modelsPath:join95(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
1970
|
+
`),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 localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve53=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve53(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)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{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-RQDVWJRL.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 SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(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("--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=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-L6PQ6MLC.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-25XQFXJC.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join95(agentDir,"auth.json")),authPath:join95(agentDir,"auth.json"),agentDir,modelsPath:join95(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
1972
1971
|
`)}}),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"),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"))),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}
|
|
1973
1972
|
`)});if(!offlineMode&&(appMode==="rpc"||appMode==="interactive")&&startSubscriptionUsagePolling({agentDir,report:appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
1974
|
-
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-
|
|
1973
|
+
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-LOODTK3J.js");printTimings(),await runRpcMode2(runtime,toolRuntime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-5KYT7LMW.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve53=>setTimeout(resolve53,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve53=>process.stdout.once("drain",resolve53)),process.stderr.writableLength>0&&await new Promise(resolve53=>process.stderr.once("drain",resolve53)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import*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 entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="usage"&&entry.kind==="cache_warm"){let promptTokens=entry.usage.input+entry.usage.cacheRead+entry.usage.cacheWrite;promptTokens>0&&(prev={promptTokens,modelKey:`${entry.provider}/${entry.model}`,timestamp:Date.parse(entry.timestamp),reportedCache:!0})}else if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals2.missedTokens+=miss.missedTokens,totals2.missedCost+=miss.missedCost,totals2.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals:totals2,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}var MAX_AGE=10080*60*1e3;function normalizeStackPath(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(`
|
|
1975
1974
|
`).slice(1).filter(line=>/^\s+at\s/u.test(line)).map(line=>{try{return decodeURI(line)}catch{return line}}).join(`
|
|
1976
1975
|
`).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(resolve53=>{if(signal.aborted){resolve53({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),resolve53({code:null,stdout,stderr:error2.message,aborted:signal.aborted})}),child.on("close",code=>{signal.removeEventListener("abort",onAbort),resolve53({code,stdout,stderr,aborted:signal.aborted})}),child.stdin.on("error",()=>{}),child.stdin.end(html)})}import{homedir as homedir21,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:homedir21(),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}:
|
|
1977
|
-
${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 createHash26}from"node:crypto";import{mkdtempSync,rmSync as
|
|
1978
|
-
`)}function parseGistUrl(stdout){let url=stdout.trim().split(/\s+/).find(token=>token.startsWith("https://"));return url?.split("/").pop()?url:void 0}async function runShare(deps){let reason=deps.disabledReason();if(reason!==void 0)return{kind:"disabled",reason};let gh=deps.checkGh();if(gh==="missing")return{kind:"gh-missing"};if(gh==="logged-out")return{kind:"gh-logged-out"};let prepared;try{prepared=prepareShare(deps.render,deps.context)}catch(error2){return{kind:"export-failed",message:error2 instanceof Error?error2.message:String(error2)}}let reviewDir;try{for(;;){let omittedOutputs=prepared.includesOutputs?0:prepared.omittedOutputs,options={omittedOutputs,includesOutputs:prepared.includesOutputs},decision=await deps.ask(describeShare(prepared,deps.viewerBase),options);if(decision==="cancel")return{kind:"cancelled"};if(decision==="upload")break;if(decision==="include-outputs"||decision==="exclude-outputs"){let include=decision==="include-outputs";if(include?omittedOutputs===0:!prepared.includesOutputs)continue;try{prepared=prepareShare(deps.render,deps.context,include)}catch(error2){return{kind:"export-failed",message:error2 instanceof Error?error2.message:String(error2)}}continue}reviewDir??=mkdtempSync(join96(tmpdir8(),"senpi-share-"));let reviewPath=join96(reviewDir,"session.html");writeFileSync26(reviewPath,prepared.html,{encoding:"utf8",mode:384,flag:"w"}),deps.showReviewCopy(reviewPath)}let result3=await deps.upload(prepared.html);if(result3.aborted)return{kind:"cancelled"};if(result3.code!==0)return{kind:"upload-failed",message:result3.stderr.trim()||"Unknown error"};let gistUrl=parseGistUrl(result3.stdout);if(gistUrl===void 0)return{kind:"upload-failed",message:"Failed to parse gist URL from gh output"};let gistId=gistUrl.split("/").pop()??"",viewerUrl=deps.viewerBase===void 0?void 0:`${deps.viewerBase}#${gistId}`;return{kind:"shared",gistUrl,viewerUrl}}finally{reviewDir!==void 0&&
|
|
1976
|
+
${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 createHash26}from"node:crypto";import{mkdtempSync,rmSync as rmSync15,writeFileSync as writeFileSync26}from"node:fs";import{tmpdir as tmpdir8}from"node:os";import{join as join96}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(record8,omissions){if(record8.role==="toolResult"){omit(omissions);let toolName=typeof record8.toolName=="string"?record8.toolName:"tool";return{...record8,content:[note(toolName)],details:void 0}}if(record8.role==="bashExecution")return omit(omissions),{...record8,output:"[output omitted: command]",fullOutputPath:void 0};if(record8.role==="custom"||record8.type==="custom_message"){omit(omissions);let customType=typeof record8.customType=="string"?record8.customType:"extension";return{...record8,content:[note(customType)],details:void 0}}if(record8.type==="custom")return{...record8,data:void 0};if(record8.type==="compaction")return{...record8,details:void 0,systemMessage:void 0};if(record8.type==="branch_summary")return{...record8,details:void 0};if(record8.type==="context_edit"&&record8.replacement!==null&&typeof record8.replacement=="object")return omit(omissions),{...record8,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 record8=value,projected=projectRecord(record8,omissions);if(projected)return projected;let out={};for(let[key,child]of Object.entries(record8))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 record8=value;if(isImageBlock(record8))return count(tally,"image"),{type:"text",text:"[image omitted from share]"};let out={};for(let[key,child]of Object.entries(record8))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=createHash26("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(`
|
|
1977
|
+
`)}function parseGistUrl(stdout){let url=stdout.trim().split(/\s+/).find(token=>token.startsWith("https://"));return url?.split("/").pop()?url:void 0}async function runShare(deps){let reason=deps.disabledReason();if(reason!==void 0)return{kind:"disabled",reason};let gh=deps.checkGh();if(gh==="missing")return{kind:"gh-missing"};if(gh==="logged-out")return{kind:"gh-logged-out"};let prepared;try{prepared=prepareShare(deps.render,deps.context)}catch(error2){return{kind:"export-failed",message:error2 instanceof Error?error2.message:String(error2)}}let reviewDir;try{for(;;){let omittedOutputs=prepared.includesOutputs?0:prepared.omittedOutputs,options={omittedOutputs,includesOutputs:prepared.includesOutputs},decision=await deps.ask(describeShare(prepared,deps.viewerBase),options);if(decision==="cancel")return{kind:"cancelled"};if(decision==="upload")break;if(decision==="include-outputs"||decision==="exclude-outputs"){let include=decision==="include-outputs";if(include?omittedOutputs===0:!prepared.includesOutputs)continue;try{prepared=prepareShare(deps.render,deps.context,include)}catch(error2){return{kind:"export-failed",message:error2 instanceof Error?error2.message:String(error2)}}continue}reviewDir??=mkdtempSync(join96(tmpdir8(),"senpi-share-"));let reviewPath=join96(reviewDir,"session.html");writeFileSync26(reviewPath,prepared.html,{encoding:"utf8",mode:384,flag:"w"}),deps.showReviewCopy(reviewPath)}let result3=await deps.upload(prepared.html);if(result3.aborted)return{kind:"cancelled"};if(result3.code!==0)return{kind:"upload-failed",message:result3.stderr.trim()||"Unknown error"};let gistUrl=parseGistUrl(result3.stdout);if(gistUrl===void 0)return{kind:"upload-failed",message:"Failed to parse gist URL from gh output"};let gistId=gistUrl.split("/").pop()??"",viewerUrl=deps.viewerBase===void 0?void 0:`${deps.viewerBase}#${gistId}`;return{kind:"shared",gistUrl,viewerUrl}}finally{reviewDir!==void 0&&rmSync15(reviewDir,{recursive:!0,force:!0})}}function containStaleExtensionError(error2,origin){if(!isStaleExtensionContextError(error2))return!1;try{appendDebugLogEntry(`contained stale extension ctx (${origin})`,error2.stack??error2.message)}catch{}return!0}var installed2=!1;function installStaleExtensionContainment(){installed2||(installed2=!0,process.on("uncaughtException",(error2,origin)=>{containStaleExtensionError(error2,origin??"uncaughtException")||hasModeCrashHandler("uncaughtException")||isRecoverableInspectorVmImportError(error2,origin??"uncaughtException")||(console.error(error2),process.exit(1))}))}function createAllToolRenderers(){return{read:readRenderers,bash:createShellRenderers("$"),powershell:createShellRenderers("PS>"),edit:editRenderers,write:writeRenderers,grep:grepRenderers,find:findRenderers,glob:findRenderers,ls:lsRenderers}}function withBuiltInRenderers(toolName,definition){let builtIn=createAllToolRenderers()[toolName];return definition?builtIn?{...definition,renderCall:definition.renderCall??builtIn.renderCall,renderResult:definition.renderResult??builtIn.renderResult}:definition:builtIn}var import_semver=__toESM(require_semver(),1);import path10 from"node:path";import{existsSync as existsSync47,readFileSync as readFileSync49}from"fs";var GITHUB_REPO="earendil-works/pi",CHANGELOG_LINK_BASE_PATH="packages/coding-agent",LEGACY_REPO_RE=/^https:\/\/github\.com\/(?:badlogic|earendil-works)\/pi-mono(?=\/|$)/,URL_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,INLINE_MARKDOWN_LINK_RE=/(!?\[[^\]\n]+\]\()([^\s)]+)((?:\s+[^)]*)?\))/g;function entryVersion(entry){return entry.version??`${entry.major}.${entry.minor}.${entry.patch}${entry.suffix?`-${entry.suffix}`:""}`}var VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/,CALVER_RE=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([2-9]\d*))?$/;function isValidDate(value){let match=/^(\d{4})-(\d{2})-(\d{2})$/.exec(value);if(!match)return!1;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]),date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}function isForeignVersion(version){return version.startsWith("0.0.0-omob.")||/^\d+\.\d+\.\d+-0\.beta\./.test(version)}function compareVersionStrings(left,right){let leftCalver=CALVER_RE.exec(left),rightCalver=CALVER_RE.exec(right);if(leftCalver&&rightCalver){let leftParts=[Number(leftCalver[1]),Number(leftCalver[2]),Number(leftCalver[3]),Number(leftCalver[4]??1)],rightParts=[Number(rightCalver[1]),Number(rightCalver[2]),Number(rightCalver[3]),Number(rightCalver[4]??1)];for(let index=0;index<leftParts.length;index+=1)if(leftParts[index]!==rightParts[index])return leftParts[index]<rightParts[index]?-1:1;return 0}let leftValid=(0,import_semver.valid)(left),rightValid=(0,import_semver.valid)(right);if(!(!leftValid||!rightValid||isForeignVersion(left)!==isForeignVersion(right)))return Math.sign((0,import_semver.compare)(leftValid,rightValid))}function normalizeTag(version){let versionString=typeof version=="string"?version:entryVersion(version);return versionString.startsWith("v")?versionString:`v${versionString}`}function splitLocalTarget(target){let hashIndex=target.indexOf("#"),beforeHash=hashIndex===-1?target:target.slice(0,hashIndex),fragment=hashIndex===-1?"":target.slice(hashIndex),queryIndex=beforeHash.indexOf("?");return queryIndex===-1?{fragment,pathPart:beforeHash,query:""}:{fragment,pathPart:beforeHash.slice(0,queryIndex),query:beforeHash.slice(queryIndex)}}function normalizePathPart(value){return value.replaceAll("\\","/")}function resolveRepositoryPath(targetPath){let normalizedTarget=normalizePathPart(targetPath),joined=normalizedTarget.startsWith("/")?path10.posix.normalize(normalizedTarget.replace(/^\/+/,"")):path10.posix.normalize(path10.posix.join(CHANGELOG_LINK_BASE_PATH,normalizedTarget));if(!(joined==="."||joined.startsWith("../")||joined===".."))return joined}function isDirectoryTarget(originalPath,repositoryPath){return originalPath.endsWith("/")?!0:!path10.posix.basename(repositoryPath).includes(".")}function normalizeChangelogLinkTarget(target,tag){let canonicalTarget=target.replace(LEGACY_REPO_RE,`https://github.com/${GITHUB_REPO}`),repoUrl=`https://github.com/${GITHUB_REPO}`;for(let route2 of["blob","tree"])for(let branch of["main","master"]){let floatingRefPrefix=`${repoUrl}/${route2}/${branch}/`;canonicalTarget.startsWith(floatingRefPrefix)&&(canonicalTarget=`${repoUrl}/${route2}/${tag}/${canonicalTarget.slice(floatingRefPrefix.length)}`)}if(canonicalTarget.startsWith("#")||canonicalTarget.startsWith("//")||URL_SCHEME_RE.test(canonicalTarget))return canonicalTarget;let{fragment,pathPart,query}=splitLocalTarget(canonicalTarget);if(!pathPart)return canonicalTarget;let repositoryPath=resolveRepositoryPath(pathPart);if(!repositoryPath)return canonicalTarget;let route=isDirectoryTarget(pathPart,repositoryPath)?"tree":"blob";return`https://github.com/${GITHUB_REPO}/${route}/${tag}/${encodeURI(repositoryPath)}${query}${fragment}`}function normalizeChangelogLinks(markdown,version){let tag=normalizeTag(version);return markdown.replace(INLINE_MARKDOWN_LINK_RE,(_match,prefix,target,suffix)=>`${prefix}${normalizeChangelogLinkTarget(target,tag)}${suffix}`)}function parseChangelog(changelogPath){if(!existsSync47(changelogPath))return[];try{let lines=readFileSync49(changelogPath,"utf-8").split(`
|
|
1979
1978
|
`),entries=[],currentLines=[],currentVersion=null,fence=null;for(let line of lines){let fenceMatch=/^ {0,3}(`{3,}|~{3,})/.exec(line);if(fenceMatch){let character=fenceMatch[1][0]==="`"?"`":"~";fence?fence.character===character&&fenceMatch[1].length>=fence.length&&(fence=null):fence={character,length:fenceMatch[1].length}}let headerMatch=fence===null?/^##[ \t]+(?:\[([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?)\]|([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)))(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/.exec(line):null;if(headerMatch||fence===null&&/^##[ \t]+\[?Unreleased\]?[ \t]*(?:-[ \t]+\d{4}-\d{2}-\d{2})?[ \t]*$/.test(line))if(currentVersion&¤tLines.length>0&&entries.push({...currentVersion,content:currentLines.join(`
|
|
1980
1979
|
`).trim()}),headerMatch&&isValidDate(headerMatch[3]??"2026-01-01")){let parts=/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/.exec(headerMatch[1]??headerMatch[2]);if(!parts){currentVersion=null,currentLines=[];continue}currentVersion={major:Number(parts[1]),minor:Number(parts[2]),patch:Number(parts[3]),suffix:parts[4],version:`${parts[1]}.${parts[2]}.${parts[3]}${parts[4]?`-${parts[4]}`:""}`},currentLines=[]}else currentVersion=null,currentLines=[];else currentVersion&¤tLines.push(line)}return currentVersion&¤tLines.length>0&&entries.push({...currentVersion,content:currentLines.join(`
|
|
1981
1980
|
`).trim()}),entries}catch(error2){return console.error(`Warning: Could not parse changelog: ${error2}`),[]}}function getNewEntries(entries,lastVersion,currentVersion){if(!lastVersion.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/)||isForeignVersion(lastVersion))return[];let current=currentVersion&&VERSION_RE.test(currentVersion)?currentVersion:void 0;return current&&(isForeignVersion(current)||compareVersionStrings(lastVersion,current)===void 0)?[]:entries.filter((entry,index,all2)=>{let version=entryVersion(entry),lower2=compareVersionStrings(version,lastVersion),upper=current?compareVersionStrings(version,current):0;return lower2!==void 0&&lower2>0&&(upper===void 0||upper<=0)&&all2.findIndex(candidate=>entryVersion(candidate)===version)===index})}import{randomUUID as randomUUID16}from"crypto";import{readFileSync as readFileSync50,unlinkSync as unlinkSync5}from"fs";import{tmpdir as tmpdir9}from"os";import{join as join97}from"path";var SUPPORTED_IMAGE_MIME_TYPES=["image/png","image/jpeg","image/webp","image/gif"],DEFAULT_LIST_TIMEOUT_MS=1e3,DEFAULT_POWERSHELL_TIMEOUT_MS=5e3;function isWaylandSession(env=process.env){return!!env.WAYLAND_DISPLAY||env.XDG_SESSION_TYPE==="wayland"}function baseMimeType2(mimeType){return mimeType.split(";")[0]?.trim().toLowerCase()??mimeType.toLowerCase()}function selectPreferredImageMimeType(mimeTypes){let normalized2=mimeTypes.map(t=>t.trim()).filter(Boolean).map(t=>({raw:t,base:baseMimeType2(t)}));for(let preferred of SUPPORTED_IMAGE_MIME_TYPES){let match=normalized2.find(t=>t.base===preferred);if(match)return match.raw}return normalized2.find(t=>t.base.startsWith("image/"))?.raw??null}function isSupportedImageMimeType(mimeType){let base=baseMimeType2(mimeType);return SUPPORTED_IMAGE_MIME_TYPES.some(t=>t===base)}async function convertToPng2(bytes){let photon=await loadPhoton();if(!photon)return null;try{let image=photon.PhotonImage.new_from_byteslice(bytes);try{return image.get_bytes()}finally{image.free()}}catch{return null}}async function readClipboardImageViaWlPaste(){let list3=await runClipboardCommand("wl-paste",["--list-types"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(list3===void 0)return;let types=list3.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean),selectedType=selectPreferredImageMimeType(types);if(!selectedType)return null;let data=await runClipboardCommand("wl-paste",["--type",selectedType,"--no-newline"]);if(data!==void 0)return data.length===0?null:{bytes:data,mimeType:baseMimeType2(selectedType)}}async function readClipboardImageViaPowerShell(){let tmpFile=join97(tmpdir9(),`pi-wsl-clip-${randomUUID16()}.png`);try{let winPathResult=await runClipboardCommand("wslpath",["-w",tmpFile],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(winPathResult===void 0)return null;let winPath=winPathResult.toString("utf-8").trim();if(!winPath)return null;let psScript=["Add-Type -AssemblyName System.Windows.Forms","Add-Type -AssemblyName System.Drawing",`$path = '${winPath.replaceAll("'","''")}'`,"$img = [System.Windows.Forms.Clipboard]::GetImage()","if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }"].join("; "),result3=await runClipboardCommand("powershell.exe",["-NoProfile","-Command",psScript],{timeoutMs:DEFAULT_POWERSHELL_TIMEOUT_MS});if(result3===void 0||result3.toString("utf-8").trim()!=="ok")return null;let bytes=readFileSync50(tmpFile);return bytes.length===0?null:{bytes:new Uint8Array(bytes),mimeType:"image/png"}}catch{return null}finally{try{unlinkSync5(tmpFile)}catch{}}}async function readClipboardImageViaXclip(){let targets2=await runClipboardCommand("xclip",["-selection","clipboard","-t","TARGETS","-o"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(targets2===void 0)return;let candidateTypes=targets2.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean),preferred=selectPreferredImageMimeType(candidateTypes);if(!preferred)return null;let data=await runClipboardCommand("xclip",["-selection","clipboard","-t",preferred,"-o"]);if(data!==void 0)return data.length===0?null:{bytes:data,mimeType:baseMimeType2(preferred)}}async function readClipboardImageViaNativeClipboard(){let bytes=await getNativeClipboard()?.getImage();if(bytes!==void 0)return bytes?.length?{bytes,mimeType:detectSupportedImageMimeType(bytes)??"application/octet-stream"}:null}async function readClipboardImage(options){let env=options?.env??process.env,platform5=options?.platform??process.platform;if(env.TERMUX_VERSION)return null;let image;if(platform5==="linux"){let wsl=isWSL(env);(isWaylandSession(env)||wsl)&&(image=await readClipboardImageViaWlPaste()),image===void 0&&(image=await readClipboardImageViaXclip()),!image&&wsl&&(image=await readClipboardImageViaPowerShell()??image),image===void 0&&(image=await readClipboardImageViaNativeClipboard())}else image=await readClipboardImageViaNativeClipboard();if(!image)return null;if(!isSupportedImageMimeType(image.mimeType)){let pngBytes=await convertToPng2(image.bytes);return pngBytes?{bytes:pngBytes,mimeType:"image/png"}:null}return image}var PERSISTED_SOURCE_LABELS=new Set(["Operation aborted","System operation aborted"]),PERSISTED_PROVIDER_LABEL_RE=/^(?:Provider retry failed after \d+ attempts?|Provider request failed(?::.*)?)$/;function abortedMessageForRendering(message,retryAttempt,abortSource){return message.stopReason!=="aborted"?message:{...message,errorMessage:abortedErrorLabel(message.errorMessage,retryAttempt,abortSource)}}function abortedErrorLabel(persisted,retryAttempt,abortSource){if(abortSource==="user")return"Operation aborted";if(abortSource==="system")return"System operation aborted";if(abortSource==="provider")return persisted??"Provider request failed";if(persisted!==void 0&&PERSISTED_SOURCE_LABELS.has(persisted)||persisted!==void 0&&PERSISTED_PROVIDER_LABEL_RE.test(persisted))return persisted;let legacyRetry=persisted?.match(/^Aborted after (\d+) retry attempts?$/);return legacyRetry?`Provider retry failed after ${legacyRetry[1]} attempt${legacyRetry[1]==="1"?"":"s"}`:retryAttempt>0?`Provider retry failed after ${retryAttempt} attempt${retryAttempt===1?"":"s"}`:persisted!==void 0&&persisted!=="Request was aborted"?`Provider request failed: ${persisted}`:"Provider request failed"}function createChatViewport(options){let transcript=new ScrollView(options.document,{follow:"end",primary:!0,overscroll:"chain",scrollbar:options.scrollbar??"auto",...options.scrollbarTrackStyle===void 0?{}:{scrollbarTrackStyle:options.scrollbarTrackStyle},...options.scrollbarThumbStyle===void 0?{}:{scrollbarThumbStyle:options.scrollbarThumbStyle}}),dock=new VStack([{component:options.pendingMessages,shrink:1,minSize:0},{component:options.status,shrink:1,minSize:0},...options.hookStatus===void 0?[]:[{component:options.hookStatus,shrink:1,minSize:0}],...options.widgetsAbove===void 0?[]:[{component:options.widgetsAbove,shrink:1,minSize:0}],{component:options.editor,shrink:1,minSize:3},...options.widgetsBelow===void 0?[]:[{component:options.widgetsBelow,shrink:1,minSize:0}],{component:options.footer,shrink:1,minSize:0}]);return{transcript,root:new VStack([{component:transcript,basis:0,grow:1,shrink:1,minSize:1},{component:dock,basis:"auto",grow:0,shrink:1,minSize:1}])}}async function transferCompactionQueue(dependencies,options={}){let batch=dependencies.takeBatch();if(batch.length===0)return;let acceptedCount=0;try{if(options.willRetry||options.deferAdmission){for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):await dependencies.deliverQueued(message),!dependencies.commitAccepted(message))return;acceptedCount+=1}return}let promptWorkOwned=!1;for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):promptWorkOwned?await dependencies.deliverQueued(message):promptWorkOwned=await dependencies.deliverFirstPrompt(message)!=="handled",!dependencies.commitAccepted(message))return;acceptedCount+=1}}catch(error2){let failure2=error2 instanceof Error?error2:new Error(String(error2)),undelivered=batch.slice(acceptedCount),restoredCount=dependencies.restoreUndelivered(undelivered);restoredCount>0&&dependencies.reportFailure(failure2,restoredCount)}}function waitForPromptDisposition(startPrompt,reportPostAcceptanceFailure){return new Promise((resolve53,reject)=>{let accepted=!1,rejectedAtPreflight=!1,disposition,resolveAcceptedDisposition=()=>{accepted&&disposition&&resolve53(disposition)};startPrompt(success=>{success?(accepted=!0,resolveAcceptedDisposition()):rejectedAtPreflight=!0},nextDisposition=>{disposition=nextDisposition,resolveAcceptedDisposition()}).then(()=>{rejectedAtPreflight&&!accepted&&reject(new Error("Queued prompt was rejected before acceptance"))},error2=>{accepted?reportPostAcceptanceFailure(error2):reject(error2)})})}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower2=getPixel(x,row*2+1);return upper&&lower2?"\u2588":upper?"\u2580":lower2?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state2=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state2.pos/WIDTH),x=state2.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state2.pos++}return!1}tickScanline(){let state2=this.effectState;if(state2.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state2.row][x]=this.finalGrid[state2.row][x];return state2.row++,!1}tickRain(){let state2=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state2.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state2=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state2.idx>=state2.positions.length)return!0;let[row,x]=state2.positions[state2.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state2.idx++}return!1}tickCrt(){let state2=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state2.expansion,bottom=midRow+state2.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state2.expansion++,state2.expansion>DISPLAY_HEIGHT}tickGlitch(){let state2=this.effectState;return state2.phase<state2.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state2.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state2=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state2.idx>=state2.positions.length)return!0;let[row,x]=state2.positions[state2.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state2.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function getAskUserAnswerHeaders(entries,requestId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==ASK_USER_QUESTION_ENTRY)continue;let data=entry.data;if(typeof data!="object"||data===null||!("requestId"in data)||data.requestId!==requestId||!("headers"in data)||!Array.isArray(data.headers))continue;return data.headers.filter(header2=>typeof header2=="string")}return[]}function summaryRows(frame2,headers){let fallbackHeaders=headers.length>0?headers:[frame2.requestId];if(/^(?:The user did not answer|The user dismissed|The pending question|This session has no user)/.test(frame2.body))return fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`);let answers=[],comment,unanswered=[];for(let line of frame2.body.split(`
|
|
@@ -2018,9 +2017,9 @@ ${details}
|
|
|
2018
2017
|
|
|
2019
2018
|
${boundedContent}`}let output=getTextOutput(result3,showImages);return output&&(text3+=`
|
|
2020
2019
|
${sanitizeFallbackString(output,FALLBACK_JSON_MAX_LENGTH)}`),text3}function isComponent(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&typeof Reflect.get(value,"render")=="function"&&typeof Reflect.get(value,"invalidate")=="function"}var ToolRendererBoundary=class{constructor(component,fallback,onFailure){this.componentDisposed=!1,this.failed=!1,this.component=component,this.fallback=fallback,this.onFailure=onFailure}render(width){if(!this.failed){try{let lines=this.component.render(width);if(Array.isArray(lines)){let safeLines=[];for(let line of lines){if(typeof line!="string")throw new TypeError("Tool renderer returned a non-string line");safeLines.push(line)}return safeLines}}catch{return this.fail(),this.renderFallback(width)}this.fail()}return this.renderFallback(width)}invalidate(){if(!this.failed)try{this.component.invalidate()}catch{this.fail()}this.fallback?.invalidate()}dispose(){this.disposeComponent(),this.fallback?.dispose?.()}fail(){this.failed||(this.failed=!0,this.onFailure(),this.disposeComponent())}disposeComponent(){if(!this.componentDisposed){this.componentDisposed=!0;try{this.component.dispose?.()}catch{return}}}renderFallback(width){return this.fallback?.render(width)??[]}};var builtInDefinitionsByCwd=new Map;function builtInDefinitionsFor(cwd){let definitions=builtInDefinitionsByCwd.get(cwd);return definitions===void 0&&(definitions=createAllToolDefinitions(cwd),builtInDefinitionsByCwd.set(cwd,definitions)),definitions}var RELEASED_STATE={args:void 0,executionStarted:!1,argsComplete:!1,isPartial:!1,expanded:!1,showImages:!1,spinnerFrame:0,result:void 0},ToolExecutionRenderer=class extends Container{constructor(identity,state2,onInvalidate,onToggleExpanded){super(),this.selfRenderContainer=new Container,this.rendererState={},this.identity=identity,this.state=state2,this.onInvalidate=onInvalidate,this.onToggleExpanded=onToggleExpanded,this.builtInDefinition=builtInDefinitionsFor(identity.cwd)[identity.toolName],this.contentBox=new Box(1,1,text3=>theme.bg("toolPendingBg",text3)),this.contentText=new Text("",1,1,text3=>theme.bg("toolPendingBg",text3)),this.addChild(this.hasRendererDefinition?this.renderShell==="self"?this.selfRenderContainer:this.contentBox:this.clickToExpand(this.contentText))}clickToExpand(component){let onToggleExpanded=this.onToggleExpanded;return onToggleExpanded?new MouseRegion(component,event=>{if(!(!this.state.result||event.type!=="click"||event.button!=="left"))return onToggleExpanded(),{handled:!0}}):component}get hasRendererDefinition(){return this.builtInDefinition!==void 0||this.identity.toolDefinition!==void 0}get hasResultRenderer(){return this.getResultRenderer()!==void 0}get renderShell(){return this.identity.toolDefinition?.renderShell??this.builtInDefinition?.renderShell??"default"}update(state2){this.state=state2;let background=state2.isPartial?text3=>theme.bg("toolPendingBg",text3):state2.result?.isError?text3=>theme.bg("toolErrorBg",text3):text3=>theme.bg("toolSuccessBg",text3),progress=state2.isPartial?readToolProgress(state2.result?.details):void 0;if(!this.hasRendererDefinition){this.contentText.setCustomBgFn(background);let text3=formatToolExecutionFallback(this.identity.toolName,state2.args,state2.result,state2.showImages);progress&&(text3+=`
|
|
2021
|
-
${formatToolProgressLine(progress,Date.now(),state2.spinnerFrame)}`),this.contentText.setText(text3);return}let container=this.renderShell==="self"?this.selfRenderContainer:this.contentBox;container instanceof Box&&container.setBgFn(background),container.detachAll(),this.renderCall(container),state2.result&&this.renderResult(container,state2.result),progress&&container.addChild(new Text(formatToolProgressLine(progress,Date.now(),state2.spinnerFrame),0,0))}releaseContent(){this.contentBox.detachAll(),this.selfRenderContainer.detachAll(),this.contentText.setText(""),this.callRendererComponent=void 0,this.resultRendererComponent=void 0,this.state=RELEASED_STATE}getCallRenderer(){return this.identity.toolDefinition?.renderCall??this.builtInDefinition?.renderCall}getResultRenderer(){return this.identity.toolDefinition?.renderResult??this.builtInDefinition?.renderResult}getRenderContext(lastComponent){return{args:this.state.args,toolCallId:this.identity.toolCallId,invalidate:this.onInvalidate,lastComponent,state:this.rendererState,cwd:this.identity.cwd,executionStarted:this.state.executionStarted,argsComplete:this.state.argsComplete,isPartial:this.state.isPartial,expanded:this.state.expanded,showImages:this.state.showImages,imageProtocol:getCapabilities().images,isError:this.state.result?.isError??!1,hasResult:this.state.result!==void 0,spinnerFrame:this.state.spinnerFrame}}renderCall(container){let fallback=createToolCallFallback(this.identity.toolName,this.state.args,this.state.expanded),renderer=this.getCallRenderer();if(!renderer){container.addChild(this.clickToExpand(fallback));return}try{let component=renderer(this.state.args,theme,this.getRenderContext(this.callRendererComponent));this.addRendererComponent(container,"call",component,fallback)}catch{this.callRendererComponent=void 0,container.addChild(this.clickToExpand(fallback))}}renderResult(container,result3){let fallback=createToolResultFallback(result3,this.state.showImages),renderer=this.getResultRenderer();if(!renderer){fallback&&container.addChild(this.clickToExpand(fallback));return}try{let agentResult={content:result3.content,details:result3.details},component=renderer(agentResult,{expanded:this.state.expanded,isPartial:this.state.isPartial},theme,this.getRenderContext(this.resultRendererComponent));this.addRendererComponent(container,"result",component,fallback)}catch{this.resultRendererComponent=void 0,fallback&&container.addChild(this.clickToExpand(fallback))}}addRendererComponent(container,slot2,value,fallback){if(!isComponent(value)){this.setRendererComponent(slot2,void 0),fallback&&container.addChild(this.clickToExpand(fallback));return}this.setRendererComponent(slot2,value),container.addChild(this.clickToExpand(new ToolRendererBoundary(value,fallback,()=>{this.getRendererComponent(slot2)===value&&this.setRendererComponent(slot2,void 0)})))}getRendererComponent(slot2){return slot2==="call"?this.callRendererComponent:this.resultRendererComponent}setRendererComponent(slot2,component){slot2==="call"?this.callRendererComponent=component:this.resultRendererComponent=component}};var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.displayReleased=!1,this.renderCache=new ToolExecutionRenderCache,this.animation=new ToolExecutionAnimation({invalidate:()=>this.invalidateRenderCache(),redraw:()=>{this.updateDisplay(),this.ui.requestRender()}}),this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.rebuildNow(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0,this.renderCache.finalizeResult(serializedToolResultBytes(result3))),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.renderCache.setImages(result3.content.filter(part=>part.type==="image").length),this.invalidateRenderCache()}stopAnimation(){this.animation.stop()}dispose(){this.stopAnimation(),this.renderCache.dispose(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}rebuildNow(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0;let renderer=this.renderer;if(renderer!==void 0&&!this.animation.running){renderer.releaseContent(),this.displayReleased=!0;return}this.updateDisplay()}getRenderRevision(){if(!(this.presentation==="grok"||this.isPartial||!this.argsComplete||this.result===void 0||this.animation.running))return this.renderCache.revision}render(width){if(this.presentation==="grok")return super.render(width);this.displayReleased&&(this.displayReleased=!1,this.updateDisplay());let signature=this.createRenderSignature(),cached=this.renderCache.read(width,signature);if(cached)return cached;let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.renderCache.store(width,signature,lines),lines}updateDisplay(){if(this.displayReleased){this.invalidateRenderCache();return}let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state2=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state2.isPartial,result:state2.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state2,result:collapseFallbackResult(state2.result,state2.showImages,state2.expanded)}:state2;renderer.update(renderState2),this.images.updateOptions({showImages:state2.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.animation.frame,result:this.result?{...this.result,content:this.result.content.filter(part=>!isModelOnlyText(part))}:void 0}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){this.animation.spin(toolCardSpins(this.identity.toolName,this.createRenderState()))}updateTodoStrikeAnimation(){this.animation.strike(toolCardStrikes(this.identity.toolName,this.createRenderState()))}invalidateRenderCache(){this.renderCache.invalidate()}};var ExplorationTranscriptContainer=class extends Container{constructor(options){super(),this.groups=new WeakMap,this.calls=new WeakMap,this.display=new ProgressiveTranscriptContainer(options)}render(width){return this.display.children=this.project(),renderAtFrameRow(this.display,width,claimFrameRow(this))}project(){let memo2=this.projection;if(memo2&&memo2.clock===currentRenderRevision()&&sameComponents(memo2.source,this.children))return memo2.projected;let projected=[],group,members=[],calls=[],rules=[],closeGroup=()=>{group?.setMembers(members,calls,rules),group=void 0};for(let child of this.children){let call=child instanceof ToolExecutionComponent?this.explorationCallOf(child):void 0;if(child instanceof ToolExecutionComponent&&call){group||(group=this.groups.get(child)??new ExplorationGroup,this.groups.set(child,group),projected.push(group),members=[],calls=[],rules=[]),members.push(child),calls.push({component:child,call});continue}let childRules=group&&child instanceof CustomEntryComponent?projectRulesOfCall(child,calls):void 0;group&&child instanceof AssistantMessageComponent&&child.isExplorationDetail?members.push(child):group&&childRules?(members.push(child),rules=[...rules,...childRules]):(closeGroup(),projected.push(child))}return closeGroup(),this.projection={source:[...this.children],clock:currentRenderRevision(),projected},projected}handleMouse(event){return this.display.handleMouse(event)}explorationCallOf(child){let revision=child.getRenderRevision();if(revision===void 0)return explorationCall(child);let cached=this.calls.get(child);if(cached?.revision===revision)return cached.call;let call=explorationCall(child);return this.calls.set(child,{revision,call}),call}invalidate(){this.display.invalidateCache(),this.calls=new WeakMap,super.invalidate()}clear(){this.display.detachAll(),this.groups=new WeakMap,this.projection=void 0,super.clear()}detachAll(){this.display.detachAll(),this.groups=new WeakMap,this.projection=void 0,super.detachAll()}dispose(){this.display.detachAll(),this.display.dispose(),super.dispose()}};function sameComponents(left,right){if(left.length!==right.length)return!1;for(let index=0;index<left.length;index++)if(left[index]!==right[index])return!1;return!0}import{spawn as spawn11}from"node:child_process";import{mkdtempSync as mkdtempSync2,readFileSync as readFileSync52,rmSync as rmSync15,writeFileSync as writeFileSync27}from"node:fs";import{tmpdir as tmpdir10}from"node:os";import{join as join98}from"node:path";async function editInExternalEditor(options){let directory=mkdtempSync2(join98(tmpdir10(),"pi-editor-")),filePath=join98(directory,"prompt.md");try{writeFileSync27(filePath,options.content,"utf-8");let[editor,...editorArgs]=options.command.split(" ");process.stdout.write(`Launching external editor: ${options.command}
|
|
2020
|
+
${formatToolProgressLine(progress,Date.now(),state2.spinnerFrame)}`),this.contentText.setText(text3);return}let container=this.renderShell==="self"?this.selfRenderContainer:this.contentBox;container instanceof Box&&container.setBgFn(background),container.detachAll(),this.renderCall(container),state2.result&&this.renderResult(container,state2.result),progress&&container.addChild(new Text(formatToolProgressLine(progress,Date.now(),state2.spinnerFrame),0,0))}releaseContent(){this.contentBox.detachAll(),this.selfRenderContainer.detachAll(),this.contentText.setText(""),this.callRendererComponent=void 0,this.resultRendererComponent=void 0,this.state=RELEASED_STATE}getCallRenderer(){return this.identity.toolDefinition?.renderCall??this.builtInDefinition?.renderCall}getResultRenderer(){return this.identity.toolDefinition?.renderResult??this.builtInDefinition?.renderResult}getRenderContext(lastComponent){return{args:this.state.args,toolCallId:this.identity.toolCallId,invalidate:this.onInvalidate,lastComponent,state:this.rendererState,cwd:this.identity.cwd,executionStarted:this.state.executionStarted,argsComplete:this.state.argsComplete,isPartial:this.state.isPartial,expanded:this.state.expanded,showImages:this.state.showImages,imageProtocol:getCapabilities().images,isError:this.state.result?.isError??!1,hasResult:this.state.result!==void 0,spinnerFrame:this.state.spinnerFrame}}renderCall(container){let fallback=createToolCallFallback(this.identity.toolName,this.state.args,this.state.expanded),renderer=this.getCallRenderer();if(!renderer){container.addChild(this.clickToExpand(fallback));return}try{let component=renderer(this.state.args,theme,this.getRenderContext(this.callRendererComponent));this.addRendererComponent(container,"call",component,fallback)}catch{this.callRendererComponent=void 0,container.addChild(this.clickToExpand(fallback))}}renderResult(container,result3){let fallback=createToolResultFallback(result3,this.state.showImages),renderer=this.getResultRenderer();if(!renderer){fallback&&container.addChild(this.clickToExpand(fallback));return}try{let agentResult={content:result3.content,details:result3.details},component=renderer(agentResult,{expanded:this.state.expanded,isPartial:this.state.isPartial},theme,this.getRenderContext(this.resultRendererComponent));this.addRendererComponent(container,"result",component,fallback)}catch{this.resultRendererComponent=void 0,fallback&&container.addChild(this.clickToExpand(fallback))}}addRendererComponent(container,slot2,value,fallback){if(!isComponent(value)){this.setRendererComponent(slot2,void 0),fallback&&container.addChild(this.clickToExpand(fallback));return}this.setRendererComponent(slot2,value),container.addChild(this.clickToExpand(new ToolRendererBoundary(value,fallback,()=>{this.getRendererComponent(slot2)===value&&this.setRendererComponent(slot2,void 0)})))}getRendererComponent(slot2){return slot2==="call"?this.callRendererComponent:this.resultRendererComponent}setRendererComponent(slot2,component){slot2==="call"?this.callRendererComponent=component:this.resultRendererComponent=component}};var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.displayReleased=!1,this.renderCache=new ToolExecutionRenderCache,this.animation=new ToolExecutionAnimation({invalidate:()=>this.invalidateRenderCache(),redraw:()=>{this.updateDisplay(),this.ui.requestRender()}}),this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.rebuildNow(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0,this.renderCache.finalizeResult(serializedToolResultBytes(result3))),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.renderCache.setImages(result3.content.filter(part=>part.type==="image").length),this.invalidateRenderCache()}stopAnimation(){this.animation.stop()}dispose(){this.stopAnimation(),this.renderCache.dispose(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}rebuildNow(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0;let renderer=this.renderer;if(renderer!==void 0&&!this.animation.running){renderer.releaseContent(),this.displayReleased=!0;return}this.updateDisplay()}getRenderRevision(){if(!(this.presentation==="grok"||this.isPartial||!this.argsComplete||this.result===void 0||this.animation.running))return this.renderCache.revision}render(width){if(this.presentation==="grok")return super.render(width);this.displayReleased&&(this.displayReleased=!1,this.updateDisplay());let signature=this.createRenderSignature(),cached=this.renderCache.read(width,signature);if(cached)return cached;let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.renderCache.store(width,signature,lines),lines}updateDisplay(){if(this.displayReleased){this.invalidateRenderCache();return}let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state2=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state2.isPartial,result:state2.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state2,result:collapseFallbackResult(state2.result,state2.showImages,state2.expanded)}:state2;renderer.update(renderState2),this.images.updateOptions({showImages:state2.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.animation.frame,result:this.result?{...this.result,content:this.result.content.filter(part=>!isModelOnlyText(part))}:void 0}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){this.animation.spin(toolCardSpins(this.identity.toolName,this.createRenderState()))}updateTodoStrikeAnimation(){this.animation.strike(toolCardStrikes(this.identity.toolName,this.createRenderState()))}invalidateRenderCache(){this.renderCache.invalidate()}};var ExplorationTranscriptContainer=class extends Container{constructor(options){super(),this.groups=new WeakMap,this.calls=new WeakMap,this.display=new ProgressiveTranscriptContainer(options)}render(width){return this.display.children=this.project(),renderAtFrameRow(this.display,width,claimFrameRow(this))}project(){let memo2=this.projection;if(memo2&&memo2.clock===currentRenderRevision()&&sameComponents(memo2.source,this.children))return memo2.projected;let projected=[],group,members=[],calls=[],rules=[],closeGroup=()=>{group?.setMembers(members,calls,rules),group=void 0};for(let child of this.children){let call=child instanceof ToolExecutionComponent?this.explorationCallOf(child):void 0;if(child instanceof ToolExecutionComponent&&call){group||(group=this.groups.get(child)??new ExplorationGroup,this.groups.set(child,group),projected.push(group),members=[],calls=[],rules=[]),members.push(child),calls.push({component:child,call});continue}let childRules=group&&child instanceof CustomEntryComponent?projectRulesOfCall(child,calls):void 0;group&&child instanceof AssistantMessageComponent&&child.isExplorationDetail?members.push(child):group&&childRules?(members.push(child),rules=[...rules,...childRules]):(closeGroup(),projected.push(child))}return closeGroup(),this.projection={source:[...this.children],clock:currentRenderRevision(),projected},projected}handleMouse(event){return this.display.handleMouse(event)}explorationCallOf(child){let revision=child.getRenderRevision();if(revision===void 0)return explorationCall(child);let cached=this.calls.get(child);if(cached?.revision===revision)return cached.call;let call=explorationCall(child);return this.calls.set(child,{revision,call}),call}invalidate(){this.display.invalidateCache(),this.calls=new WeakMap,super.invalidate()}clear(){this.display.detachAll(),this.groups=new WeakMap,this.projection=void 0,super.clear()}detachAll(){this.display.detachAll(),this.groups=new WeakMap,this.projection=void 0,super.detachAll()}dispose(){this.display.detachAll(),this.display.dispose(),super.dispose()}};function sameComponents(left,right){if(left.length!==right.length)return!1;for(let index=0;index<left.length;index++)if(left[index]!==right[index])return!1;return!0}import{spawn as spawn11}from"node:child_process";import{mkdtempSync as mkdtempSync2,readFileSync as readFileSync52,rmSync as rmSync16,writeFileSync as writeFileSync27}from"node:fs";import{tmpdir as tmpdir10}from"node:os";import{join as join98}from"node:path";async function editInExternalEditor(options){let directory=mkdtempSync2(join98(tmpdir10(),"pi-editor-")),filePath=join98(directory,"prompt.md");try{writeFileSync27(filePath,options.content,"utf-8");let[editor,...editorArgs]=options.command.split(" ");process.stdout.write(`Launching external editor: ${options.command}
|
|
2022
2021
|
Pi will resume when the editor exits.
|
|
2023
|
-
`);let outcome=await new Promise(resolve53=>{let child=spawn11(editor,[...editorArgs,filePath],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve53({launched:!1})),child.on("close",code=>resolve53({launched:!0,code}))});return outcome.launched?outcome.code!==0?{status:"failed"}:{status:"complete",content:stripBom(readFileSync52(filePath,"utf-8")).replace(/\n$/,"")}:{status:"launch-failed"}}finally{try{
|
|
2022
|
+
`);let outcome=await new Promise(resolve53=>{let child=spawn11(editor,[...editorArgs,filePath],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve53({launched:!1})),child.on("close",code=>resolve53({launched:!0,code}))});return outcome.launched?outcome.code!==0?{status:"failed"}:{status:"complete",content:stripBom(readFileSync52(filePath,"utf-8")).replace(/\n$/,"")}:{status:"launch-failed"}}finally{try{rmSync16(directory,{recursive:!0,force:!0})}catch{}}}async function editFileInExternalEditor(options){let[editor,...editorArgs]=options.command.split(" "),outcome=await new Promise(resolve53=>{let child=spawn11(editor,[...editorArgs,options.path],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve53({launched:!1})),child.on("close",code=>resolve53({launched:!0,code}))});return outcome.launched?outcome.code===0?{status:"complete"}:{status:"exited",code:outcome.code??-1}:{status:"launch-failed"}}import*as fs5 from"node:fs";import*as path11 from"node:path";import{format}from"node:util";import{closeSync as closeSync6,openSync as openSync6}from"node:fs";var STDERR_FD=2;async function loadStderrFdSyscalls(platform5=process.platform){if(platform5!=="darwin"&&platform5!=="linux"||typeof globalThis.Bun>"u")return;let{dlopen,FFIType}=await import("bun:ffi");try{let libc=dlopen(platform5==="darwin"?"libSystem.B.dylib":"libc.so.6",{dup:{args:[FFIType.i32],returns:FFIType.i32},dup2:{args:[FFIType.i32,FFIType.i32],returns:FFIType.i32},close:{args:[FFIType.i32],returns:FFIType.i32}});return{dup:fd=>libc.symbols.dup(fd),dup2:(source2,target)=>libc.symbols.dup2(source2,target),close:fd=>libc.symbols.close(fd)}}catch{return}}function redirectStderrFd(syscalls,logPath){let saved=syscalls.dup(STDERR_FD);if(saved<0)return;let target;try{target=openSync6(logPath,"a",384)}catch{syscalls.close(saved);return}let moved=syscalls.dup2(target,STDERR_FD);if(closeSync6(target),moved<0){syscalls.close(saved);return}let restored=!1;return{restore(){restored||(restored=!0,syscalls.dup2(saved,STDERR_FD),syscalls.close(saved))}}}import{closeSync as closeSync7,createWriteStream as createWriteStream3,openSync as openSync7}from"node:fs";import{isatty,WriteStream as TtyWriteStream}from"node:tty";var STDOUT_FD=1,terminal,ownWrites=new WeakSet,baseWrite;function terminalHandle(syscalls){if(terminal)return terminal;let fd=syscalls.dup(STDOUT_FD);if(fd<0)return;let stream2=isatty(fd)?new TtyWriteStream(fd):createWriteStream3("",{fd,autoClose:!1});return terminal={fd,stream:stream2},terminal}function redirectStdoutFd(syscalls,logPath,stdout=process.stdout){let handle=terminalHandle(syscalls);if(!handle)return;let target;try{target=openSync7(logPath,"a",384)}catch{return}let moved=syscalls.dup2(target,STDOUT_FD);if(closeSync7(target),!(moved<0))try{return installTerminalWriter(syscalls,handle,stdout)}catch{syscalls.dup2(handle.fd,STDOUT_FD);return}}function installTerminalWriter(syscalls,handle,stdout){let active=!0;ownWrites.has(stdout.write)||(baseWrite=stdout.write);let originalWrite=baseWrite??stdout.write,write=function(...args){return active?handle.stream.write.apply(handle.stream,args):originalWrite.apply(stdout,args)};ownWrites.add(write),stdout.write=write;let sizeProperties=["columns","rows"],ownDescriptors=new Map(sizeProperties.map(name=>[name,Object.getOwnPropertyDescriptor(stdout,name)]));for(let name of sizeProperties)Object.defineProperty(stdout,name,{configurable:!0,enumerable:!0,get:()=>handle.stream[name]});let onWindowChange=()=>{handle.stream._refreshSize?.(),stdout.emit("resize")};return process.on("SIGWINCH",onWindowChange),{restore(){if(active){active=!1,process.removeListener("SIGWINCH",onWindowChange),syscalls.dup2(handle.fd,STDOUT_FD),stdout.write===write&&(stdout.write=originalWrite);for(let name of sizeProperties){let descriptor=ownDescriptors.get(name);descriptor?Object.defineProperty(stdout,name,descriptor):delete stdout[name]}}}}}var consoleLevels=["error","info","warn"],interactiveConsoleState,stderrFdSyscalls,stderrFdRedirect,stdoutFdRedirect,hiddenOutputCapTimer,HIDDEN_OUTPUT_LOG_MAX_BYTES=32*1024*1024,HIDDEN_OUTPUT_LOG_KEPT_TAIL_BYTES=256*1024,HIDDEN_OUTPUT_CAP_CHECK_MS=5e3;function capHiddenOutputLog(logPath,maxBytes=HIDDEN_OUTPUT_LOG_MAX_BYTES){let size;try{size=fs5.statSync(logPath).size}catch{return!1}if(size<=maxBytes)return!1;let keep=Math.min(HIDDEN_OUTPUT_LOG_KEPT_TAIL_BYTES,maxBytes),tail=Buffer.alloc(keep),fd=fs5.openSync(logPath,"r"),read;try{read=fs5.readSync(fd,tail,0,keep,size-keep)}finally{fs5.closeSync(fd)}return fs5.truncateSync(logPath,0),fs5.appendFileSync(logPath,`[${new Date().toISOString()}] debug log cut at ${size} bytes (cap ${maxBytes}); the last ${keep} bytes follow
|
|
2024
2023
|
`),fs5.appendFileSync(logPath,tail.subarray(0,read)),!0}function appendHiddenInteractiveStderr(text3){if(text3.length===0)return;let debugLogPath=getDebugLogPath(),prefix=`[${new Date().toISOString()}] hidden stderr while TUI active
|
|
2025
2024
|
`,redactedText=redactSensitiveOutput(text3),suffix=redactedText.endsWith(`
|
|
2026
2025
|
`)?"":`
|
|
@@ -2047,7 +2046,7 @@ ${skill.content}`).join(`
|
|
|
2047
2046
|
`)}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:errorMessage6(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage6(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 errorMessage6(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(entry){if(!(entry.duringTurn!==!0||entry.source===void 0||isAnnouncedElsewhere(entry.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:entry.originalModelId,to:entry.modelId,origin:entry.actor===void 0?{source:entry.source}:{source:entry.source,actor:entry.actor}})}}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let 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 errorMessage7=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage7}],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}
|
|
2048
2047
|
This directory is the same git repository: ${cwd}
|
|
2049
2048
|
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 mkdirSync30,readFileSync as readFileSync54,realpathSync as realpathSync14,writeFileSync as writeFileSync28}from"node:fs";import{join as join99}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync54(join99(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{mkdirSync30(agentDir,{recursive:!0}),writeFileSync28(join99(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2050
|
-
`)}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,realpathSync14)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-
|
|
2049
|
+
`)}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,realpathSync14)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-MLANJVB2.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=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=`
|
|
2051
2050
|
${theme.bold("Failures")}
|
|
2052
2051
|
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2053
2052
|
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|