@code-yeongyu/senpi 2026.10.25-3 → 2026.10.25-4
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 +17 -0
- package/dist/bundle/chunks/{chunk-WLHNEUGD.js → chunk-2RB5EL4X.js} +1 -1
- package/dist/bundle/chunks/{chunk-MJ5NNWX4.js → chunk-3QCYBOKN.js} +1 -1
- package/dist/bundle/chunks/{chunk-FFQOEC76.js → chunk-4MOZXOJX.js} +3 -3
- package/dist/bundle/chunks/{chunk-ODTGC6YU.js → chunk-5JJDR6XI.js} +1 -1
- package/dist/bundle/chunks/chunk-6VWIMHMH.js +2 -0
- package/dist/bundle/chunks/{chunk-SWJXRC2I.js → chunk-BZ7726QO.js} +1 -1
- package/dist/bundle/chunks/{chunk-YRF4I43T.js → chunk-C2MQ4QXN.js} +12 -12
- package/dist/bundle/chunks/{chunk-7W7OJDIY.js → chunk-DODH3N6U.js} +4 -4
- package/dist/bundle/chunks/{chunk-EHQXLHRB.js → chunk-E6D4RIT7.js} +2 -2
- package/dist/bundle/chunks/{chunk-6O4SEW2W.js → chunk-J37GRED2.js} +1 -1
- package/dist/bundle/chunks/chunk-JMOUU75H.js +2 -0
- package/dist/bundle/chunks/{chunk-Z3UYNSVR.js → chunk-KKD4CYCI.js} +1 -1
- package/dist/bundle/chunks/{chunk-JA2R2ZSE.js → chunk-KNVNKDER.js} +1 -1
- package/dist/bundle/chunks/{chunk-CNL6QSUB.js → chunk-LOIF6PHI.js} +2 -2
- package/dist/bundle/chunks/{chunk-P3M2PF6K.js → chunk-N7IN46Q5.js} +1 -1
- package/dist/bundle/chunks/{chunk-C5UFJ7B3.js → chunk-PT6JJUN2.js} +1 -1
- package/dist/bundle/chunks/{chunk-O3Q2ET6W.js → chunk-SBGIXMX3.js} +1 -1
- package/dist/bundle/chunks/{chunk-HVJI5T75.js → chunk-STMXIBXF.js} +2 -2
- package/dist/bundle/chunks/{chunk-H3HNMY2W.js → chunk-TBU6VYHN.js} +1 -1
- package/dist/bundle/chunks/{chunk-UQNRW3VU.js → chunk-V2UYXTRR.js} +1 -1
- package/dist/bundle/chunks/chunk-XMJKZK5H.js +2 -0
- package/dist/bundle/chunks/cli-main-YYH3IBC6.js +3 -0
- package/dist/bundle/chunks/{dispatch-NYAULNVW.js → dispatch-MXG5YWLV.js} +1 -1
- package/dist/bundle/chunks/{host-command-Z3WPHJOW.js → host-command-TDLLHXVI.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-ONQIMWMX.js → host-lifecycle-3VHHIGDL.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +1 -1
- package/dist/bundle/chunks/{host-session-command-J65ENSV5.js → host-session-command-56XF6ACS.js} +1 -1
- package/dist/bundle/chunks/{host-socket-request-3CWE4265.js → host-socket-request-QL2WEZTN.js} +1 -1
- package/dist/bundle/chunks/interactive-mode-OEPULLZK.js +2 -0
- package/dist/bundle/chunks/{multi-session-host-YI2WZOET.js → multi-session-host-Z2CW4SDM.js} +2 -2
- package/dist/bundle/chunks/{package-manager-cli-GHZPJMRF.js → package-manager-cli-N55U6PEO.js} +1 -1
- package/dist/bundle/chunks/rotation-stream-CBGCBYHV.js +2 -0
- package/dist/bundle/chunks/rpc-mode-ETXQWEB2.js +2 -0
- package/dist/bundle/chunks/{rpc-monitor-source-FFEQS744.js → rpc-monitor-source-AE3C6EQV.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-YWG6D6ZF.js → schedule-command-VS7CZC2J.js} +1 -1
- package/dist/bundle/chunks/session-control-endpoint-4LEIDIVI.js +3 -0
- package/dist/bundle/chunks/session-picker-E4KUJDLO.js +2 -0
- package/dist/bundle/chunks/session-worker.js +45 -45
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/host-supervisor.js +1 -1
- 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/extensions/builtin/mcp/elicitation.js +2 -4
- package/dist/core/session-control-actions.js +0 -2
- package/dist/modes/interactive/session-control-attach.d.ts +20 -0
- package/dist/modes/interactive/session-control-attach.js +13 -0
- package/dist/modes/interactive/session-control-commands.js +16 -6
- package/dist/modes/interactive/session-control-registry.d.ts +2 -1
- package/dist/modes/interactive/session-control-registry.js +3 -2
- package/dist/modes/interactive/session-control-rpc-commands.d.ts +4 -2
- package/dist/modes/interactive/session-control-rpc-commands.js +114 -4
- package/dist/modes/interactive/session-control-server.js +9 -3
- package/dist/modes/rpc/connection-handler.js +6 -40
- package/dist/modes/rpc/custom-capability.d.ts +6 -0
- package/dist/modes/rpc/custom-capability.js +6 -0
- package/dist/modes/rpc/get-entries-command.d.ts +13 -0
- package/dist/modes/rpc/get-entries-command.js +61 -0
- package/dist/modes/rpc/get-entries-page.d.ts +22 -0
- package/dist/modes/rpc/get-entries-page.js +41 -2
- package/dist/modes/rpc/host-capabilities.js +4 -1
- package/dist/modes/rpc/host-observe-request.d.ts +2 -1
- package/dist/modes/rpc/host-observe-request.js +4 -1
- package/dist/modes/rpc/rpc-read-response-types.d.ts +2 -0
- package/dist/modes/rpc/rpc-session-command-types.d.ts +8 -1
- package/docs/rpc.md +43 -11
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-3LNSLJ7N.js +0 -2
- package/dist/bundle/chunks/chunk-MSQCTH6V.js +0 -2
- package/dist/bundle/chunks/cli-main-HEKFFB5S.js +0 -3
- package/dist/bundle/chunks/interactive-mode-DEPQC6TX.js +0 -2
- package/dist/bundle/chunks/rotation-stream-ZPVCFOVD.js +0 -2
- package/dist/bundle/chunks/rpc-mode-ORHBGBBV.js +0 -2
- package/dist/bundle/chunks/session-control-endpoint-36HAQSQO.js +0 -3
- package/dist/bundle/chunks/session-picker-25H5KNYP.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,UNKNOWN_COMMAND_CONFIRM_HINT,UnknownCommandError,assertSessionCwdExists,commandShapedName,findUnknownCommand,formatMissingSessionCwdPrompt,getMissingSessionCwdIssue,isTransportGoneError}from"./chunk-ODTGC6YU.js";import{DEFERRED_RETRY_MS,InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,ensureDir,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,ownRunnerIdentity,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,removeRunnerLease,runDueJobs,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock,writeRunnerLease}from"./chunk-FHXR4ZAC.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7CNOCJCN.js";import{AccountUsageLimitError,BlockedSkillLinkError,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,CircuitProbes,ContinueFromLeafError,CountdownTimer,DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS,DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,DefaultPackageManager,DynamicBorder,ENGINE_TURN_LIMIT_ENTRY_TYPE,ENGINE_TURN_LIMIT_EVENT,ENGINE_TURN_START_ENTRY_TYPE,ExtensionInputComponent,ExtensionSelectorComponent,FABLE55_LAUNCH,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,authorizeSkillPath,buildSkillAllowedSet,configureHttpDispatcher,createFallbackCircuitAccess,describeUsageLimitEntry,describeUsageLimitMessage,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,insideSkillRoot,isBillingErrorMessage,isFable55ModelId,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillFileChecked,readSkillFileCheckedSync,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,resetsEngineTurnHistory,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,skillProjectRoot,stopResumeDirective,takeOverStderr,takeOverStdout,trackTurnAdmission,usageLimitCause,usageLimitScope,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-FFQOEC76.js";import{TIP_DEFINITIONS}from"./chunk-DXJJP6RP.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-GXY5JEI5.js";import{ClientAdmissions,ClientMessageIdConflict,ConnectionQuestionBridge,DEFAULT_COMPACTION_SETTINGS,DEFAULT_EXTENSION_SESSION_PROFILE,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,EMPTY_SESSION_CONTEXT,EffectLedger,ExecuteToolError,IDLE_COMPACTION_INSTRUCTIONS,McpPresenterAuthority,ModelSwitchAuthError,ModelUsabilityBudgetError,PROMPT_CACHE_PREWARM_ENTRY_TYPE,RESOLUTION_TIMED_OUT,RUNTIME_EXTENSION_PATH,SERVER_SEARCH_FALLBACK,SESSION_CONTROL_DELIVERY_TYPE,SUMMARIZATION_INPUT_BUDGET_RATIO,SessionExtensionUiRequests,SummarizationOverflowExhaustedError,ToolBarrier,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,allowOverflowRetry,attachMcpGrantPresentation,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,boundSummarizationInput,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,clearMcpGrantPresentations,clientFacingIdentity,clientInputContext,collectEntriesForBranchSummary,combineUsage,compact,compat_exports,completeSimple,computeEffectiveKeepRecentTokens,computeEffectiveThreshold,consumePendingPayload,countDiffChanges,createBlockingRemoteCompactionEvent,createFsWatchEventSource,createRemoteCompactionDeadline,createRestorationDirectiveState,createRestorationTrackerState,createUnifiedPatch,createUsageTotals,cursorProvider,defineTool,degradeQuestion,diffLines,diffWords,disableServerSearch,endCompactionFeedback,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,estimateTotalTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,getMcpGrantPresentation,getModels,getPromptCachePrewarmUsage,getPromptContextWindow,getProviders,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,getUsageCostBreakdown,hasServerSearchFailed,injectTokenBudgetReminder,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,interruptRunningTurn,isAbortedAssistantMessage,isAtHardLimit,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isMissingPathError,isMonitorableMessageEvent,isPowerShellToolResult,isReadToolResult,isServerSearchDisabled,isServerSearchFallback,isSessionControlDeliveryDetails,isToolCallEventType,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,pruneOldMessagesToBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveThresholdContextTokens,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,selectMcpGrant,serializeConversation,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,shrinkSummarizationInputForOverflowRetry,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,toolBarrierSpecError,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-7W7OJDIY.js";import{DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,DEFAULT_SUMMARIZATION_MAX_DURATION_MS,RPC_ERROR_ENTRY_NOT_FOUND,RPC_ERROR_EVAL_CELLS_UNAVAILABLE,RPC_ERROR_EVAL_CELL_NOT_FOUND,RPC_ERROR_INVALID_ARGUMENT,RPC_ERROR_INVALID_EVAL_CELL_REQUEST,RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MODEL_NOT_FOUND,RPC_ERROR_RESPONSE_TOO_LARGE,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,USER_ACTIVITY_CAPABILITY,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-GY5MR5KR.js";import{FS_WATCH_RETRY_DELAY_MS,SYSTEM_THEME_NAME,Theme,canonicalWatchPath,closeWatcher,findReservedKeywordRuns,findReservedKeywordSpans,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getReservedKeywordHighlight,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,setRegisteredThemes,sharedMarkdownTheme,stopThemeWatcher,theme,watchWithErrorHandler}from"./chunk-EHQXLHRB.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SESSION_MOVED_IN,SESSION_RELEASED,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,elidedImageIds,environmentContextMessageIfChanged,findLatestResponse,findMostRecentSession,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,hasUnsafeRetainedContent,imageContentId,inheritSessionContextEntryId,isSafeBoundedValue,isVirtualModel,listSessionsFromDir,loadEntriesFromFileAsync,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,sessionFileNameId,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-XF3LJC3O.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-CNPDUC4D.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-MLVIYDHK.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,collectMrtrForm,createMcpLogger,createMcpRequestOrigin,delay,fingerprintSecret,isEphemeralIdentity,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isModernMcpClient,isRetriableMcpError,isTransientTokenError,keyedIdentity,legacyMcpFormEligible,legacyMcpFormsAdvertised,loadMcpSdkAuth,loadMcpSdkStdioTransport,mcpRequestOptions,reapProcessTree,redactMcpLogText,registerMcpClientAlias,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-H3HNMY2W.js";import{McpMrtrError,getMcpMrtrPresentation,inheritMcpMrtrPresentation,markMcpFormPresented,queuedForm,registerMcpMrtrPresentation}from"./chunk-JPGT64RV.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-UQNRW3VU.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-P3M2PF6K.js";import{AUTH_KEY_VERIFY_CAPABILITY,AUTO_TITLE_SESSIONS_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,DEFAULT_CUSTOM_EXTENSION_LABEL,EVAL_CELLS_CAPABILITY,EXTENSION_EVENTS_CAPABILITY,GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,INTERACTIVE_USER_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RESUME_SESSION_CAPABILITY,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,SESSION_RELOCATION_CAPABILITY,TASK_PARENT_CAPABILITY,TOOL_BARRIER_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-HVJI5T75.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-C5UFJ7B3.js";import{createRgEngine,ensureTool}from"./chunk-TIVW4P37.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{ACCOUNT_POOL_REFUSAL_NOTE,ConfigValueSchema,CredentialFailoverError,MAX_SLOT_BLOCK_MS,NonemptyConfigValueSchema,applyAccountOrder,assertConfigReferenceAuthority,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigReference,isConfigValueConfigured,rememberConfigReferenceOrigin,rendezvousOrder,resolveConfigReference,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,slotKind,slotsOfOwnKind,unusedSlotKinds,warnMissingConfigEnvironment,warnOpaqueConfigEnvironment,withoutOrderedAccount}from"./chunk-3LNSLJ7N.js";import{activeModelBlockUntil,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,usageLimitResetMs,withModelBlock}from"./chunk-MSQCTH6V.js";import{discoverEnvSlots}from"./chunk-4AOMNOGY.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{CredentialSlotRepository,slotHealth}from"./chunk-JFFS72FL.js";import{lockWithLossHandling}from"./chunk-ORXZXUMC.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-WD6WBYC5.js";import{source_default}from"./chunk-26UBFF6N.js";import{readOwnFootprint,readProcessFootprint}from"./chunk-MTQQ2VQH.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-CNL6QSUB.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-4WZRVZNX.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,isLockError,redactSensitiveOutput,redactSensitiveTokenValues}from"./chunk-Z6WGAK7W.js";import{redactResolvedReferenceData,redactResolvedReferenceValues}from"./chunk-DLAY7CIU.js";import{deriveOpenAIPromptCacheKey}from"./chunk-3BTN337S.js";import{installClaudeCodeVersionStore}from"./chunk-QXREUA5F.js";import{resolveRootObjectSchema}from"./chunk-RUGYFYH7.js";import{hasRefusedForcedToolChoice}from"./chunk-OEFCY46F.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DescendantsLedger,HostCallAdmission,LaunchLog,MODULE_JOB_KIND,PayloadRefReader,PayloadRefWriter,TERMINAL_CHILD_JOB_KINDS,TEST_CONTROL_DIR_ENV,TOOL_CHILD_GENERATION_ENV,TOOL_CHILD_MODULE_ROOTS_ENV,TOOL_CHILD_PROTOCOL_VERSION,TerminalManager,TerminalNotifier,WindowsJob,WindowsJobError,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createPtyBashTool,defaultGroupProbes,describeExit,ensureMonitorStateDir,errorResult,formatSize,generationLedgerPath,getTerminalNotificationDelivery,isModelOnlyText,loadKernel32Job,modelOnlyText,packPayload,proofIsOrdered,readTestControls,recordGenerationChild,removeMonitorStateDir,renderMonitorCall,resolveForegroundWindowSeconds,resolveTerminalId,sanitizeTerminalOutput,spawnCommandSession,sweepGroups,sweepStaleGenerations,terminalChildJob,terminalStateDir,textResult,truncateHead,truncateLine,truncateTail,truncateToVisualLines,unpackPayload}from"./chunk-TTU2RNVX.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports as dist_exports2,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-FDL4CF6F.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,STREAMED_DELTA_TYPES,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,reasonedBeforeFirstDelta,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-BWA4FVFW.js";import{require_ignore}from"./chunk-YU4AYH4C.js";import{Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,renderCursorCliModelString,require_dist,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-E6WYH3ZL.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-E4LBKOZG.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-T36LJ6MW.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-QGJLZ6BI.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{sanitizeProviderDiagnostic}from"./chunk-AA2L2RHH.js";import{estimateTextTokens}from"./chunk-4P7WARQZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{ConfigReferenceError,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountDisplayName,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,costCardAt,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,pinSlot,projectSlot,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-6AOVUTUR.js";import{createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,StaleExtensionContextError,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,dispatchConfigCommand,dispatchHostCommand,dispatchPackageCommand,dispatchScheduleCommand,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,hasModeCrashHandler,isRecoverableInspectorVmImportError,isStaleExtensionContextError,markModeCrashHandler,printThenExit,processBunRuntimeOptions}from"./chunk-WLHNEUGD.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{TOOL_CHILD_LIMITS,TOOL_CHILD_ROLE_ENV,openChannelListener}from"./chunk-V3CK2AVC.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerBase,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,isShareDisabledByEnvironment,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-7YO7VQZW.js";import{Check,build_exports,typebox_exports,value_exports,value_exports2}from"./chunk-MIENF2YK.js";import{TOOL_CHILD_LEDGER_ENV,TOOL_CHILD_REENTRY_ENV,TOOL_CHILD_REFS_ROOT_ENV}from"./chunk-OXNWERO4.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-QN2BHP3M.js";import{DEFAULT_COLS,DEFAULT_MAX_SESSIONS,DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,DEFAULT_MONITOR_RUNAWAY_MINUTES,DEFAULT_MONITOR_WAKES_PER_HOUR,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,MONITOR_OVERFLOW_FILE_MAX_BYTES,RESTORE_GRACE_MS,RUNAWAY_PAUSE_SUMMARY_PREFIX,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL,runawayPauseSummary}from"./chunk-NTK2MHJ5.js";import{PROCESS_START_TOLERANCE_MS,sameProcessStartMs}from"./chunk-O5RYI3IW.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win327){return win327===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state3={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state3.prefix="./"),output};exports.wrapOutput=(input,state3={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state3.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path14,{windows}={})=>{let segs=path14.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state3={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state3.maxDepth=0,isPathSeparator(code)||tokens.push(token),state3.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value2=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state3.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value2),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value=input.slice(n);parts.push(value),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value,depth(tokens[tokens.length-1]),state3.maxDepth+=tokens[tokens.length-1].depth),state3.slashes=slashes,state3.parts=parts}return state3};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value=`[${args.join("-")}]`;try{new RegExp(value)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value="",escaped=!1;for(let ch of input){if(escaped===!0){value+=ch,escaped=!1;continue}if(ch==="\\"){value+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value),value="";continue}}}value+=ch}return parts.push(value),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value)&&(value=value.slice(2,-1),changed=!0);if(isPlainBranch(value))return value.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value=pattern.trim(),match=parseRepeatedExtglob(value);for(;match;)depth++,value=match.body.trim(),match=parseRepeatedExtglob(value);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse6=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state3={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state3),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state3.index===len-1,peek=state3.peek=(n=1)=>input[state3.index+n],advance=state3.advance=()=>input[++state3.index]||"",remaining=()=>input.slice(state3.index+1),consume=(value2="",num2=0)=>{state3.consumed+=value2,state3.index+=num2},append=token=>{state3.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state3.start++,count2++;return count2%2===0?!1:(state3.negated=!0,state3.start++,!0)},increment=type2=>{state3[type2]++,stack.push(type2)},decrement=type2=>{state3[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state3.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state3.output=state3.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state3.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value2)=>{let token={...EXTGLOB_CHARS[value2],conditions:1,inner:""};token.prev=prev,token.parens=state3.parens,token.output=state3.output,token.startIndex=state3.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state3.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state3.index+1),body=input.slice(token.startIndex+2,state3.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open12=tokens[token.tokensIndex];open12.type="text",open12.value=literal,open12.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state3.output=token.output+open12.output,state3.backtrack=!0,push({type:"paren",extglob:!0,value,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse6(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state3.negatedExtglob=!0)}push({type:"paren",extglob:!0,value,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state3.output=input,state3):(state3.output=utils.wrapOutput(output,state3,options),state3)}for(;!eos();){if(value=advance(),value==="\0")continue;if(value==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value+="\\",push({type:"text",value});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state3.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state3.brackets===0){push({type:"text",value});continue}}if(state3.brackets>0&&(value!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix6=POSIX_REGEX_SOURCE[rest2];if(posix6){prev.value=pre+posix6,state3.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value==="["&&peek()!==":"||value==="-"&&peek()==="]")&&(value=`\\${value}`),value==="]"&&(prev.value==="["||prev.value==="[^")&&(value=`\\${value}`),opts.posix===!0&&value==="!"&&prev.value==="["&&(value="^"),prev.value+=value,append({value});continue}if(state3.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state3.quotes=state3.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state3.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state3.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state3.parens?")":"\\)"}),decrement("parens");continue}if(value==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value=`\\${value}`}else increment("brackets");push({type:"bracket",value});continue}if(value==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value,output:`\\${value}`});continue}if(state3.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value,output:`\\${value}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value=`/${value}`),prev.value+=value,append({value}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state3.output=state3.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state3.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state3.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open12={type:"brace",value,output:"(",outputIndex:state3.output.length,tokensIndex:state3.tokens.length};braces.push(open12),push(open12);continue}if(value==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value,output:value});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state3.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state3.output.slice(0,brace.outputIndex),toks=state3.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state3.output=out;for(let t of toks)state3.output+=t.output||t.value}push({type:"brace",value,output}),decrement("braces"),braces.pop();continue}if(value==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value});continue}if(value===","){let output=value,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value,output});continue}if(value==="/"){if(prev.type==="dot"&&state3.index===state3.start+1){state3.start=state3.index+1,state3.consumed="",state3.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state3.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value,prev.value+=value,brace.dots=!0;continue}if(state3.braces+state3.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value,output:DOT_LITERAL});continue}push({type:"dot",value,output:DOT_LITERAL});continue}if(value==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value}`),push({type:"text",value,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value,output:QMARK_NO_DOT});continue}push({type:"qmark",value,output:QMARK});continue}if(value==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value);continue}if(opts.nonegate!==!0&&state3.index===0){negate();continue}}if(value==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state3.parens>0){push({type:"plus",value});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value,output:""});continue}push({type:"text",value});continue}if(value!=="*"){(value==="$"||value==="^")&&(value=`\\${value}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value+=match[0],state3.index+=match[0].length),push({type:"text",value});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value,prev.output=star,state3.backtrack=!0,state3.globstar=!0,consume(value);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value,output:""});continue}let isBrace=state3.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value,output:""});continue}for(;rest.slice(0,3)==="/**";){let after2=input[state3.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state3.parens>0&&rest===")".repeat(state3.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state3.output=prev.output,state3.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state3.globstar=!0,state3.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value,state3.output+=prior.output+prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state3.output=prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state3.output=state3.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state3.output+=prev.output,state3.globstar=!0,consume(value);continue}let token={type:"star",value,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value,push(token);continue}(state3.index===state3.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state3.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state3.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state3.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state3.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state3.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state3.output=utils.escapeLast(state3.output,"["),decrement("brackets")}for(;state3.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state3.output=utils.escapeLast(state3.output,"("),decrement("parens")}for(;state3.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state3.output=utils.escapeLast(state3.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state3.backtrack===!0){state3.output="";for(let token of state3.tokens)state3.output+=token.output!=null?token.output:token.value,token.suffix&&(state3.output+=token.suffix)}return state3};parse6.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state3={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state3),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state4=isMatch(str3);if(state4)return state4}return!1}}let isState2=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState2)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix6=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state3=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix6}),result3={glob,state:state3,regex:regex2,posix:posix6,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state3),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix6}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix6?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix6):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix6=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix6}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse6(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state3,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state3.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state3.output})${append}`;state3&&state3.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state3),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err){if(options&&options.debug===!0)throw err;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});function toJsonAssistantMessageEvent(event){if(event.type==="toolcall_start"){let toolCall=event.partial.content[event.contentIndex];if(toolCall?.type!=="toolCall")throw new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);let{partial:_partial2,...deltaEvent2}=event;return{...deltaEvent2,id:toolCall.id,toolName:toolCall.name}}if(!("partial"in event))return event;let{partial:_partial,...deltaEvent}=event;return deltaEvent}function toJsonEvent(event){if(event.type!=="message_update")return event;if(event.message.role!=="assistant")throw new Error("message_update message is not an assistant message");return{type:"message_update",usage:event.message.usage,assistantMessageEvent:toJsonAssistantMessageEvent(event.assistantMessageEvent),...event.resolvedToolName===void 0?{}:{resolvedToolName:event.resolvedToolName}}}import{realpathSync as realpathSync2,statSync as statSync2}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute,join as join2,resolve as resolve2,win32}from"node:path";import{existsSync,realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{dirname,join,resolve}from"node:path";var PROJECT_MARKERS=[".git","pnpm-workspace.yaml","package.json","pyproject.toml","Cargo.toml","go.mod",".venv"],PROJECT_RULE_SUBDIRS=[[".pi","rules"],[".omo","rules"],[".claude","rules"],[".cursor","rules"],[".github","instructions"]],PROJECT_SINGLE_FILES=[".github/copilot-instructions.md","AGENTS.md","CLAUDE.md","CONTEXT.md"],USER_HOME_RULE_SUBDIRS=[".pi/rules",".omo/rules",".opencode/rules",".claude/rules"],USER_HOME_SINGLE_FILES=[".config/opencode/AGENTS.md",".claude/CLAUDE.md"],RULE_FILE_EXTENSIONS=[".md",".mdc"],SOURCE_PRIORITY=new Map([[".pi/rules",0],[".omo/rules",1],[".claude/rules",2],[".cursor/rules",3],[".github/instructions",4],[".github/copilot-instructions.md",5],["AGENTS.md",6],["CLAUDE.md",7],["CONTEXT.md",8],["~/.pi/rules",100],["~/.omo/rules",101],["~/.opencode/rules",102],["~/.claude/rules",103],["~/.config/opencode/AGENTS.md",104],["~/.claude/CLAUDE.md",105]]),GLOBAL_DISTANCE=9999,DEFAULT_MAX_RULE_CHARS=12e3,DEFAULT_MAX_RESULT_CHARS=4e4,TRUNCATION_NOTICE=`
|
|
2
|
+
import{MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,UNKNOWN_COMMAND_CONFIRM_HINT,UnknownCommandError,assertSessionCwdExists,commandShapedName,findUnknownCommand,formatMissingSessionCwdPrompt,getMissingSessionCwdIssue,isTransportGoneError}from"./chunk-5JJDR6XI.js";import{DEFERRED_RETRY_MS,InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,ensureDir,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,ownRunnerIdentity,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,removeRunnerLease,runDueJobs,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock,writeRunnerLease}from"./chunk-FHXR4ZAC.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7CNOCJCN.js";import{BlockedSkillLinkError,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,CircuitProbes,ContinueFromLeafError,CountdownTimer,DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS,DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,DefaultPackageManager,DynamicBorder,ENGINE_TURN_LIMIT_ENTRY_TYPE,ENGINE_TURN_LIMIT_EVENT,ENGINE_TURN_START_ENTRY_TYPE,ExtensionInputComponent,ExtensionSelectorComponent,FABLE55_LAUNCH,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,authorizeSkillPath,buildSkillAllowedSet,configureHttpDispatcher,createFallbackCircuitAccess,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,insideSkillRoot,isFable55ModelId,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillFileChecked,readSkillFileCheckedSync,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,resetsEngineTurnHistory,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,skillProjectRoot,stopResumeDirective,takeOverStderr,takeOverStdout,trackTurnAdmission,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-4MOZXOJX.js";import{TIP_DEFINITIONS}from"./chunk-DXJJP6RP.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-GXY5JEI5.js";import{CONNECTION_ROLE_FIXED,ClientAdmissions,ClientMessageIdConflict,ConnectionQuestionBridge,ConnectionRoles,DEFAULT_COMPACTION_SETTINGS,DEFAULT_EXTENSION_SESSION_PROFILE,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,EMPTY_SESSION_CONTEXT,EffectLedger,ExecuteToolError,IDLE_COMPACTION_INSTRUCTIONS,McpPresenterAuthority,ModelSwitchAuthError,ModelUsabilityBudgetError,PROMPT_CACHE_PREWARM_ENTRY_TYPE,RESOLUTION_TIMED_OUT,RUNTIME_EXTENSION_PATH,SERVER_SEARCH_FALLBACK,SESSION_CONTROL_DELIVERY_TYPE,SUMMARIZATION_INPUT_BUDGET_RATIO,SessionExtensionUiRequests,SummarizationOverflowExhaustedError,ToolBarrier,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,allowOverflowRetry,answerGetEntries,attachMcpGrantPresentation,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,boundSummarizationInput,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,clearMcpGrantPresentations,clientFacingIdentity,clientInputContext,collectEntriesForBranchSummary,combineUsage,compact,compat_exports,completeSimple,computeEffectiveKeepRecentTokens,computeEffectiveThreshold,consumePendingPayload,countDiffChanges,createBlockingRemoteCompactionEvent,createFsWatchEventSource,createRemoteCompactionDeadline,createRestorationDirectiveState,createRestorationTrackerState,createUnifiedPatch,createUsageTotals,cursorProvider,defineTool,degradeQuestion,diffLines,diffWords,disableServerSearch,endCompactionFeedback,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,estimateTotalTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,getMcpGrantPresentation,getModels,getPromptCachePrewarmUsage,getPromptContextWindow,getProviders,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,getUsageCostBreakdown,hasServerSearchFailed,injectTokenBudgetReminder,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,interruptRunningTurn,isAbortedAssistantMessage,isAtHardLimit,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isMissingPathError,isMonitorableMessageEvent,isPowerShellToolResult,isReadToolResult,isServerSearchDisabled,isServerSearchFallback,isSessionControlDeliveryDetails,isToolCallEventType,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,pruneOldMessagesToBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveThresholdContextTokens,roleConnection,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,selectMcpGrant,serializeConversation,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,shrinkSummarizationInputForOverflowRetry,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,toolBarrierSpecError,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-DODH3N6U.js";import{DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,DEFAULT_SUMMARIZATION_MAX_DURATION_MS,RPC_ERROR_EVAL_CELLS_UNAVAILABLE,RPC_ERROR_EVAL_CELL_NOT_FOUND,RPC_ERROR_INVALID_ARGUMENT,RPC_ERROR_INVALID_EVAL_CELL_REQUEST,RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MODEL_NOT_FOUND,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,USER_ACTIVITY_CAPABILITY,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-GY5MR5KR.js";import{AccountUsageLimitError,FS_WATCH_RETRY_DELAY_MS,SYSTEM_THEME_NAME,Theme,canonicalWatchPath,closeWatcher,describeUsageLimitEntry,describeUsageLimitMessage,findReservedKeywordRuns,findReservedKeywordSpans,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getReservedKeywordHighlight,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,isBillingErrorMessage,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,setRegisteredThemes,sharedMarkdownTheme,stopThemeWatcher,theme,usageLimitCause,usageLimitScope,watchWithErrorHandler}from"./chunk-E6D4RIT7.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SESSION_MOVED_IN,SESSION_RELEASED,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,elidedImageIds,environmentContextMessageIfChanged,findLatestResponse,findMostRecentSession,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,hasUnsafeRetainedContent,imageContentId,inheritSessionContextEntryId,isSafeBoundedValue,isVirtualModel,listSessionsFromDir,loadEntriesFromFileAsync,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,sessionFileNameId,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-XF3LJC3O.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-CNPDUC4D.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-MLVIYDHK.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,collectMrtrForm,createMcpLogger,createMcpRequestOrigin,delay,fingerprintSecret,isEphemeralIdentity,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isModernMcpClient,isRetriableMcpError,isTransientTokenError,keyedIdentity,legacyMcpFormEligible,legacyMcpFormsAdvertised,loadMcpSdkAuth,loadMcpSdkStdioTransport,mcpRequestOptions,reapProcessTree,redactMcpLogText,registerMcpClientAlias,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-TBU6VYHN.js";import{McpMrtrError,getMcpMrtrPresentation,inheritMcpMrtrPresentation,markMcpFormPresented,queuedForm,registerMcpMrtrPresentation}from"./chunk-JPGT64RV.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-V2UYXTRR.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-N7IN46Q5.js";import{AUTH_KEY_VERIFY_CAPABILITY,AUTO_TITLE_SESSIONS_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,DEFAULT_CUSTOM_EXTENSION_LABEL,ENTRIES_TAIL_CAPABILITY,EVAL_CELLS_CAPABILITY,EXTENSION_EVENTS_CAPABILITY,GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,INTERACTIVE_USER_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RESUME_SESSION_CAPABILITY,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,SESSION_RELOCATION_CAPABILITY,TASK_PARENT_CAPABILITY,TOOL_BARRIER_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-STMXIBXF.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-PT6JJUN2.js";import{createRgEngine,ensureTool}from"./chunk-TIVW4P37.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{ACCOUNT_POOL_REFUSAL_NOTE,ConfigValueSchema,CredentialFailoverError,MAX_SLOT_BLOCK_MS,NonemptyConfigValueSchema,applyAccountOrder,assertConfigReferenceAuthority,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigReference,isConfigValueConfigured,rememberConfigReferenceOrigin,rendezvousOrder,resolveConfigReference,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,slotKind,slotsOfOwnKind,unusedSlotKinds,warnMissingConfigEnvironment,warnOpaqueConfigEnvironment,withoutOrderedAccount}from"./chunk-JMOUU75H.js";import{usageLimitResetMs}from"./chunk-XMJKZK5H.js";import{activeModelBlockUntil,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-6VWIMHMH.js";import{discoverEnvSlots}from"./chunk-4AOMNOGY.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{CredentialSlotRepository,slotHealth}from"./chunk-JFFS72FL.js";import{lockWithLossHandling}from"./chunk-ORXZXUMC.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-WD6WBYC5.js";import{source_default}from"./chunk-26UBFF6N.js";import{readOwnFootprint,readProcessFootprint}from"./chunk-MTQQ2VQH.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-LOIF6PHI.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-4WZRVZNX.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,isLockError,redactSensitiveOutput,redactSensitiveTokenValues}from"./chunk-Z6WGAK7W.js";import{redactResolvedReferenceData,redactResolvedReferenceValues}from"./chunk-DLAY7CIU.js";import{deriveOpenAIPromptCacheKey}from"./chunk-3BTN337S.js";import{installClaudeCodeVersionStore}from"./chunk-QXREUA5F.js";import{resolveRootObjectSchema}from"./chunk-RUGYFYH7.js";import{hasRefusedForcedToolChoice}from"./chunk-OEFCY46F.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DescendantsLedger,HostCallAdmission,LaunchLog,MODULE_JOB_KIND,PayloadRefReader,PayloadRefWriter,TERMINAL_CHILD_JOB_KINDS,TEST_CONTROL_DIR_ENV,TOOL_CHILD_GENERATION_ENV,TOOL_CHILD_MODULE_ROOTS_ENV,TOOL_CHILD_PROTOCOL_VERSION,TerminalManager,TerminalNotifier,WindowsJob,WindowsJobError,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createPtyBashTool,defaultGroupProbes,describeExit,ensureMonitorStateDir,errorResult,formatSize,generationLedgerPath,getTerminalNotificationDelivery,isModelOnlyText,loadKernel32Job,modelOnlyText,packPayload,proofIsOrdered,readTestControls,recordGenerationChild,removeMonitorStateDir,renderMonitorCall,resolveForegroundWindowSeconds,resolveTerminalId,sanitizeTerminalOutput,spawnCommandSession,sweepGroups,sweepStaleGenerations,terminalChildJob,terminalStateDir,textResult,truncateHead,truncateLine,truncateTail,truncateToVisualLines,unpackPayload}from"./chunk-TTU2RNVX.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports as dist_exports2,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-FDL4CF6F.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,STREAMED_DELTA_TYPES,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,reasonedBeforeFirstDelta,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-BWA4FVFW.js";import{require_ignore}from"./chunk-YU4AYH4C.js";import{Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,renderCursorCliModelString,require_dist,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-E6WYH3ZL.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-E4LBKOZG.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-T36LJ6MW.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-QGJLZ6BI.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{sanitizeProviderDiagnostic}from"./chunk-AA2L2RHH.js";import{estimateTextTokens}from"./chunk-4P7WARQZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{ConfigReferenceError,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountDisplayName,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,costCardAt,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,pinSlot,projectSlot,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-6AOVUTUR.js";import{createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,StaleExtensionContextError,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,dispatchConfigCommand,dispatchHostCommand,dispatchPackageCommand,dispatchScheduleCommand,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,hasModeCrashHandler,isRecoverableInspectorVmImportError,isStaleExtensionContextError,markModeCrashHandler,printThenExit,processBunRuntimeOptions}from"./chunk-2RB5EL4X.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{TOOL_CHILD_LIMITS,TOOL_CHILD_ROLE_ENV,openChannelListener}from"./chunk-V3CK2AVC.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerBase,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,isShareDisabledByEnvironment,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-7YO7VQZW.js";import{Check,build_exports,typebox_exports,value_exports,value_exports2}from"./chunk-MIENF2YK.js";import{TOOL_CHILD_LEDGER_ENV,TOOL_CHILD_REENTRY_ENV,TOOL_CHILD_REFS_ROOT_ENV}from"./chunk-OXNWERO4.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-QN2BHP3M.js";import{DEFAULT_COLS,DEFAULT_MAX_SESSIONS,DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,DEFAULT_MONITOR_RUNAWAY_MINUTES,DEFAULT_MONITOR_WAKES_PER_HOUR,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,MONITOR_OVERFLOW_FILE_MAX_BYTES,RESTORE_GRACE_MS,RUNAWAY_PAUSE_SUMMARY_PREFIX,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL,runawayPauseSummary}from"./chunk-NTK2MHJ5.js";import{PROCESS_START_TOLERANCE_MS,sameProcessStartMs}from"./chunk-O5RYI3IW.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win327){return win327===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state3={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state3.prefix="./"),output};exports.wrapOutput=(input,state3={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state3.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path14,{windows}={})=>{let segs=path14.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state3={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state3.maxDepth=0,isPathSeparator(code)||tokens.push(token),state3.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value2=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state3.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value2),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value=input.slice(n);parts.push(value),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value,depth(tokens[tokens.length-1]),state3.maxDepth+=tokens[tokens.length-1].depth),state3.slashes=slashes,state3.parts=parts}return state3};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value=`[${args.join("-")}]`;try{new RegExp(value)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value="",escaped=!1;for(let ch of input){if(escaped===!0){value+=ch,escaped=!1;continue}if(ch==="\\"){value+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value),value="";continue}}}value+=ch}return parts.push(value),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value)&&(value=value.slice(2,-1),changed=!0);if(isPlainBranch(value))return value.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value=pattern.trim(),match=parseRepeatedExtglob(value);for(;match;)depth++,value=match.body.trim(),match=parseRepeatedExtglob(value);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse6=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state3={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state3),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state3.index===len-1,peek=state3.peek=(n=1)=>input[state3.index+n],advance=state3.advance=()=>input[++state3.index]||"",remaining=()=>input.slice(state3.index+1),consume=(value2="",num2=0)=>{state3.consumed+=value2,state3.index+=num2},append=token=>{state3.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state3.start++,count2++;return count2%2===0?!1:(state3.negated=!0,state3.start++,!0)},increment=type2=>{state3[type2]++,stack.push(type2)},decrement=type2=>{state3[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state3.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state3.output=state3.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state3.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value2)=>{let token={...EXTGLOB_CHARS[value2],conditions:1,inner:""};token.prev=prev,token.parens=state3.parens,token.output=state3.output,token.startIndex=state3.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state3.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state3.index+1),body=input.slice(token.startIndex+2,state3.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open12=tokens[token.tokensIndex];open12.type="text",open12.value=literal,open12.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state3.output=token.output+open12.output,state3.backtrack=!0,push({type:"paren",extglob:!0,value,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse6(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state3.negatedExtglob=!0)}push({type:"paren",extglob:!0,value,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state3.output=input,state3):(state3.output=utils.wrapOutput(output,state3,options),state3)}for(;!eos();){if(value=advance(),value==="\0")continue;if(value==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value+="\\",push({type:"text",value});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state3.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state3.brackets===0){push({type:"text",value});continue}}if(state3.brackets>0&&(value!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix6=POSIX_REGEX_SOURCE[rest2];if(posix6){prev.value=pre+posix6,state3.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value==="["&&peek()!==":"||value==="-"&&peek()==="]")&&(value=`\\${value}`),value==="]"&&(prev.value==="["||prev.value==="[^")&&(value=`\\${value}`),opts.posix===!0&&value==="!"&&prev.value==="["&&(value="^"),prev.value+=value,append({value});continue}if(state3.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state3.quotes=state3.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state3.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state3.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state3.parens?")":"\\)"}),decrement("parens");continue}if(value==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value=`\\${value}`}else increment("brackets");push({type:"bracket",value});continue}if(value==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value,output:`\\${value}`});continue}if(state3.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value,output:`\\${value}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value=`/${value}`),prev.value+=value,append({value}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state3.output=state3.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state3.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state3.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open12={type:"brace",value,output:"(",outputIndex:state3.output.length,tokensIndex:state3.tokens.length};braces.push(open12),push(open12);continue}if(value==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value,output:value});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state3.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state3.output.slice(0,brace.outputIndex),toks=state3.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state3.output=out;for(let t of toks)state3.output+=t.output||t.value}push({type:"brace",value,output}),decrement("braces"),braces.pop();continue}if(value==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value});continue}if(value===","){let output=value,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value,output});continue}if(value==="/"){if(prev.type==="dot"&&state3.index===state3.start+1){state3.start=state3.index+1,state3.consumed="",state3.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state3.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value,prev.value+=value,brace.dots=!0;continue}if(state3.braces+state3.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value,output:DOT_LITERAL});continue}push({type:"dot",value,output:DOT_LITERAL});continue}if(value==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value}`),push({type:"text",value,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value,output:QMARK_NO_DOT});continue}push({type:"qmark",value,output:QMARK});continue}if(value==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value);continue}if(opts.nonegate!==!0&&state3.index===0){negate();continue}}if(value==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state3.parens>0){push({type:"plus",value});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value,output:""});continue}push({type:"text",value});continue}if(value!=="*"){(value==="$"||value==="^")&&(value=`\\${value}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value+=match[0],state3.index+=match[0].length),push({type:"text",value});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value,prev.output=star,state3.backtrack=!0,state3.globstar=!0,consume(value);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value,output:""});continue}let isBrace=state3.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value,output:""});continue}for(;rest.slice(0,3)==="/**";){let after2=input[state3.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state3.parens>0&&rest===")".repeat(state3.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state3.output=prev.output,state3.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state3.globstar=!0,state3.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value,state3.output+=prior.output+prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state3.output=prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state3.output=state3.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state3.output+=prev.output,state3.globstar=!0,consume(value);continue}let token={type:"star",value,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value,push(token);continue}(state3.index===state3.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state3.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state3.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state3.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state3.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state3.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state3.output=utils.escapeLast(state3.output,"["),decrement("brackets")}for(;state3.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state3.output=utils.escapeLast(state3.output,"("),decrement("parens")}for(;state3.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state3.output=utils.escapeLast(state3.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state3.backtrack===!0){state3.output="";for(let token of state3.tokens)state3.output+=token.output!=null?token.output:token.value,token.suffix&&(state3.output+=token.suffix)}return state3};parse6.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state3={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state3),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state4=isMatch(str3);if(state4)return state4}return!1}}let isState2=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState2)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix6=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state3=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix6}),result3={glob,state:state3,regex:regex2,posix:posix6,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state3),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix6}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix6?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix6):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix6=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix6}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse6(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state3,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state3.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state3.output})${append}`;state3&&state3.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state3),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err){if(options&&options.debug===!0)throw err;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});function toJsonAssistantMessageEvent(event){if(event.type==="toolcall_start"){let toolCall=event.partial.content[event.contentIndex];if(toolCall?.type!=="toolCall")throw new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);let{partial:_partial2,...deltaEvent2}=event;return{...deltaEvent2,id:toolCall.id,toolName:toolCall.name}}if(!("partial"in event))return event;let{partial:_partial,...deltaEvent}=event;return deltaEvent}function toJsonEvent(event){if(event.type!=="message_update")return event;if(event.message.role!=="assistant")throw new Error("message_update message is not an assistant message");return{type:"message_update",usage:event.message.usage,assistantMessageEvent:toJsonAssistantMessageEvent(event.assistantMessageEvent),...event.resolvedToolName===void 0?{}:{resolvedToolName:event.resolvedToolName}}}import{realpathSync as realpathSync2,statSync as statSync2}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute,join as join2,resolve as resolve2,win32}from"node:path";import{existsSync,realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{dirname,join,resolve}from"node:path";var PROJECT_MARKERS=[".git","pnpm-workspace.yaml","package.json","pyproject.toml","Cargo.toml","go.mod",".venv"],PROJECT_RULE_SUBDIRS=[[".pi","rules"],[".omo","rules"],[".claude","rules"],[".cursor","rules"],[".github","instructions"]],PROJECT_SINGLE_FILES=[".github/copilot-instructions.md","AGENTS.md","CLAUDE.md","CONTEXT.md"],USER_HOME_RULE_SUBDIRS=[".pi/rules",".omo/rules",".opencode/rules",".claude/rules"],USER_HOME_SINGLE_FILES=[".config/opencode/AGENTS.md",".claude/CLAUDE.md"],RULE_FILE_EXTENSIONS=[".md",".mdc"],SOURCE_PRIORITY=new Map([[".pi/rules",0],[".omo/rules",1],[".claude/rules",2],[".cursor/rules",3],[".github/instructions",4],[".github/copilot-instructions.md",5],["AGENTS.md",6],["CLAUDE.md",7],["CONTEXT.md",8],["~/.pi/rules",100],["~/.omo/rules",101],["~/.opencode/rules",102],["~/.claude/rules",103],["~/.config/opencode/AGENTS.md",104],["~/.claude/CLAUDE.md",105]]),GLOBAL_DISTANCE=9999,DEFAULT_MAX_RULE_CHARS=12e3,DEFAULT_MAX_RESULT_CHARS=4e4,TRUNCATION_NOTICE=`
|
|
3
3
|
|
|
4
4
|
[Rule truncated. Read full rule: {path}]`,TRACKED_BUILTIN_TOOLS=["read","edit","write"],TRACKED_BUILTIN_TOOL_SET=new Set(TRACKED_BUILTIN_TOOLS),PROJECT_RULES_START_MARKER="<project_rules>",PROJECT_RULES_END_MARKER="</project_rules>",PROJECT_RULES_HEADING="## Project Instructions",PROJECT_RULES_REGION_START_MARKER="<!--senpi:project-rules:1:start-->",PROJECT_RULES_REGION_END_MARKER="<!--senpi:project-rules:1:end-->",SCANNER_EXCLUDED_DIRS=["node_modules",".git","dist","build",".turbo",".next","coverage"];function findProjectRoot(startPath,markers=PROJECT_MARKERS){let normalizedStartPath=resolve(startPath);if(!existsSync(normalizedStartPath))return null;let resolvedStartPath;try{resolvedStartPath=realpathSync.native(normalizedStartPath)}catch{return null}let currentDirectory;try{currentDirectory=statSync(resolvedStartPath).isDirectory()?resolvedStartPath:dirname(resolvedStartPath)}catch{return null}let filesystemRoot=resolve("/");for(;;){for(let marker of markers)if(existsSync(join(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}function widenToRepositoryRoot(projectRoot2){if(projectRoot2===null)return null;let repositoryFilesystemRoot=resolve("/"),homeDirectory=resolveExistingPath(homedir()),currentDirectory=resolveExistingPath(projectRoot2);for(;;){if(currentDirectory===homeDirectory)return projectRoot2;if(existsSync(join(currentDirectory,".git")))return currentDirectory;if(currentDirectory===repositoryFilesystemRoot)return projectRoot2;let parentDirectory=dirname(currentDirectory);if(parentDirectory===currentDirectory)return projectRoot2;currentDirectory=parentDirectory}}function resolveExistingPath(path14){try{return realpathSync.native(resolve(path14))}catch{return resolve(path14)}}function isLocalMessagePath(path14,platform5=process.platform){return path14.includes("\0")?!1:platform5==="win32"?/^[A-Za-z]:[\\/]/.test(path14):isAbsolute(path14)&&!path14.startsWith("//")}function messagePathProjectRoot(cwd){let home=resolve2(homedir2()),candidate=findProjectRoot(cwd,[".git"])??findProjectRoot(cwd)??void 0;return candidate===void 0||resolve2(candidate)===home?void 0:candidate}function existing(candidate){try{let realpath4=realpathSync2.native(candidate),stats=statSync2(realpath4);return stats.isFile()?{realpath:realpath4,kind:"file"}:stats.isDirectory()?{realpath:realpath4,kind:"directory"}:void 0}catch{return}}function expandHome(path14){return path14==="~"?homedir2():path14.startsWith("~/")||path14.startsWith("~\\")?join2(homedir2(),path14.slice(2)):path14}function resolveMessagePath(input){let platform5=input.platform??process.platform,pathApi=platform5==="win32"?win32:{isAbsolute,resolve:resolve2},path14=expandHome(input.path.trim());if(path14.length===0||path14.includes("\0"))return{status:"not_found",tried:[]};let bases=pathApi.isAbsolute(path14)?[["absolute",path14]]:[["cwd",pathApi.resolve(input.cwd,path14)],...input.projectRoot!==void 0&&pathApi.resolve(input.projectRoot)!==pathApi.resolve(input.cwd)?[["project-root",pathApi.resolve(input.projectRoot,path14)]]:[]],local=bases.filter(([,candidate])=>isLocalMessagePath(candidate,platform5));if(local.length!==bases.length)return{status:"not_found",tried:[]};for(let[base,candidate]of local){let found=existing(candidate);if(found!==void 0&&isLocalMessagePath(found.realpath,platform5))return{status:"found",...found,base}}return{status:"not_found",tried:local.map(([,candidate])=>candidate)}}import*as crypto2 from"node:crypto";import{basename as basename38,dirname as dirname71,extname as extname6}from"node:path";var BUILT_IN_PROVIDER_DISPLAY_NAMES={anthropic:"Anthropic","anthropic-subscription":"Anthropic Subscription","amazon-bedrock":"Amazon Bedrock","ant-ling":"Ant Ling","azure-openai-responses":"Azure OpenAI Responses",cerebras:"Cerebras","cloudflare-ai-gateway":"Cloudflare AI Gateway","cloudflare-workers-ai":"Cloudflare Workers AI",cursor:"Cursor","cursor-cli-oauth":"Cursor CLI (OAuth)",deepseek:"DeepSeek",fireworks:"Fireworks",google:"Google Gemini","google-vertex":"Google Vertex AI",groq:"Groq",huggingface:"Hugging Face","kimi-coding":"Kimi For Coding",minimax:"MiniMax","minimax-cn":"MiniMax (China)",moonshotai:"Moonshot AI","moonshotai-cn":"Moonshot AI (China)",nvidia:"NVIDIA NIM",opencode:"OpenCode Zen","opencode-go":"OpenCode Go",openai:"OpenAI","chatgpt-subscription":"ChatGPT Subscription",opengateway:"OpenGateway",ollama:"Ollama Cloud",openrouter:"OpenRouter",together:"Together AI",venice:"Venice AI","vercel-ai-gateway":"Vercel AI Gateway",xai:"xAI",zai:"ZAI Coding Plan (Global)","zai-coding-cn":"ZAI Coding Plan (China)",xiaomi:"Xiaomi MiMo","xiaomi-token-plan-cn":"Xiaomi MiMo Token Plan (China)","xiaomi-token-plan-ams":"Xiaomi MiMo Token Plan (Amsterdam)","xiaomi-token-plan-sgp":"Xiaomi MiMo Token Plan (Singapore)","alibaba-token-plan":"Alibaba Token Plan"};var BUILT_IN_MODEL_PROVIDERS=new Set(getProviders());function isApiKeyLoginProvider(providerId,oauthProviderIds,builtInProviderIds=BUILT_IN_MODEL_PROVIDERS){return BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId]?!0:builtInProviderIds.has(providerId)?!1:!oauthProviderIds.has(providerId)}function buildLoginProviderInfos(modelRegistry,authType){let oauthProviders=modelRegistry.authStorage.getOAuthProviders(),oauthProviderIds=new Set(oauthProviders.map(provider=>provider.id)),options=oauthProviders.map(provider=>({id:provider.id,name:provider.name,authType:"oauth"})),modelProviders=new Set(modelRegistry.getAll().map(model=>model.provider));for(let providerId of modelProviders)isApiKeyLoginProvider(providerId,oauthProviderIds)&&options.push({id:providerId,name:modelRegistry.getProviderDisplayName(providerId),authType:"api_key"});return(authType?options.filter(option=>option.authType===authType):options).sort((a,b)=>a.name.localeCompare(b.name))}function authMethodStatus(modelRegistry,info){if(modelRegistry.authStorage.get(info.id)?.type===info.authType)return{configured:!0,source:"stored"};let{status,signIn}=modelRegistry.resolveProviderAuth(info.id);return!status.configured||status.source==="stored"?{configured:!1}:(signIn?"oauth":"api_key")===info.authType?status:{configured:!1}}function loginRowStatus(modelRegistry,provider,authType){for(let type2 of[authType,authType==="oauth"?"api_key":"oauth"]){let status=authMethodStatus(modelRegistry,{...provider,authType:type2});if(!status.configured)continue;let source2=status.label??status.source;return source2===void 0?{type:type2}:{type:type2,source:source2}}}import{dirname as dirname2,join as join3}from"node:path";var listeners=new Set;function subscribeProviderAccountEvents(listener){return listeners.add(listener),()=>listeners.delete(listener)}function emitProviderAccountsChanged(provider){emit({type:"accounts_changed",provider})}function emitProviderAccountFailover(provider,from,to,reason){emit({type:"failover",provider,from,to,reason})}function emit(event){for(let listener of listeners)listener(event)}import{createHash}from"node:crypto";var SENTINEL_OAUTH_FIELDS={access:"claude-sdk-oauth-managed",refresh:"claude-sdk-oauth-managed",expires:41024448e5};function emptyCredential(){return{type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]}}function storedSlots(credential){return credential.accounts??[]}function isSentinelSlot(slot2){return slot2.access===SENTINEL_OAUTH_FIELDS.access&&slot2.refresh===SENTINEL_OAUTH_FIELDS.refresh}function authGrantDigest(refresh){return createHash("sha256").update(refresh).digest("hex").slice(0,32)}function listAccounts(credential,env){let slots=storedSlots(credential).filter(slot2=>!isSentinelSlot(slot2));if(env){let state3=credential.slotState??{};for(let slot2 of envSlots(env)){let persisted=state3[slot2.name];slots.push(persisted?{...slot2,...persisted}:slot2)}}return slots}var ACCOUNT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName(name){if(!ACCOUNT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function addAccount(credential,slot2){if(assertValidAccountName(slot2.name),storedSlots(credential).some(existing2=>existing2.name===slot2.name))throw new Error(`Account '${slot2.name}' already exists`);return{...credential,accounts:[...storedSlots(credential),slot2]}}function upsertAccount(credential,slot2){assertValidAccountName(slot2.name);let existing2=storedSlots(credential).find(candidate=>candidate.name===slot2.name);if(!existing2)return{...credential,accounts:[...storedSlots(credential),slot2]};let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,modelBlocks:_modelBlocks,authRecoveryGrant:_authRecoveryGrant,...identity}=existing2,refreshed={...identity,access:slot2.access,refresh:slot2.refresh,expires:slot2.expires,source:slot2.source};return{...credential,accounts:storedSlots(credential).map(candidate=>candidate.name===slot2.name?refreshed:candidate)}}function removeAccount(credential,name){let accounts=storedSlots(credential).filter(slot2=>slot2.name!==name),next={...credential,accounts};return credential.pinned===name&&delete next.pinned,withoutOrderedAccount(next,name)}function pinAccount(credential,name){return{...credential,pinned:name}}function envSlots(env){let slots=[],read2=suffix=>env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`),names=[{slot:"env"}];for(let index=2;index<=16;index++)names.push({suffix:String(index),slot:`env-${index}`});for(let{suffix,slot:slot2}of names)read2(suffix)&&slots.push({name:slot2,refresh:"",access:"",expires:0,source:"env"});return slots}function envSlotToken(env,slotName){let match=/^env(?:-(\d+))?$/.exec(slotName);if(!match)return;let suffix=match[1];return env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`)}async function refreshSlot(store,providerId,slotName,refresher,signal,isExpiring=expires=>Date.now()>=expires){return store.modify(providerId,async current=>{if(current?.type!=="oauth")return;let credential=current,slot2=storedSlots(credential).find(candidate=>candidate.name===slotName);if(!slot2||!isExpiring(slot2.expires))return current;let refreshed=await refresher(slot2.refresh,signal),accounts=storedSlots(credential).map(candidate=>candidate.name===slotName?{...candidate,refresh:refreshed.refresh,access:refreshed.access,expires:refreshed.expires}:candidate);return{...credential,accounts}})}var ACCOUNT_NAME_PATTERN2=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName2(name){if(!ACCOUNT_NAME_PATTERN2.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function pooledFrom(credential){return credential===void 0?void 0:credential}function pinnedName(credential){return credential?.pinned}function numberField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="number"?found:void 0}function credentialPoolRepository(storage){let authPath=storage.getStoragePath();return new CredentialSlotRepository(authPath?join3(dirname2(authPath),"credential-pool-state.json"):void 0)}function stringField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="string"?found:void 0}function slotBlocked(slot2,sidecar,now2){if(slotHealth(sidecar,now2)==="blocked"||stringField(slot2,"blockReason")==="account_disabled")return!0;let blockedUntil=numberField(slot2,"blockedUntil");return blockedUntil!==void 0&&blockedUntil>now2}function storedModelBlocks(slot2){let found=Object.entries(slot2).find(([candidate])=>candidate==="modelBlocks")?.[1];if(found===null||typeof found!="object")return;let entries=Object.entries(found).flatMap(([model,block])=>{let until=block!==null&&typeof block=="object"?numberField(block,"blockedUntil"):void 0;return until===void 0?[]:[[model,{blockedUntil:until}]]});return entries.length===0?void 0:Object.fromEntries(entries)}function blockedModels(now2,...sources){let until=new Map;for(let blocks of sources)for(let[model,block]of Object.entries(pruneModelBlocks(blocks,now2)??{}))until.set(model,Math.max(until.get(model)??0,block.blockedUntil));return until.size===0?{}:{blockedModels:[...until].map(([model,at])=>({model,until:at}))}}async function getCredentialAccounts(storage,provider,env=process.env,repository){return summarizeCredentialAccounts(provider,storage.get(provider),env,repository??credentialPoolRepository(storage))}async function summarizeCredentialAccounts(provider,stored,env=process.env,repository=new CredentialSlotRepository){let credential=pooledFrom(stored);return applyAccountOrder(credential?.order,await summarizeInStoredOrder(provider,credential,env,repository))}async function summarizeInStoredOrder(provider,credential,env,repository){let now2=Date.now(),pinned=pinnedName(credential),summaries=[];if(credential){let state4=await repository.listSlots(provider,"stored"),storedAccounts3=normalizeProviderId(provider)==="anthropic-subscription"?Array.isArray(credential.accounts)?listSlots(credential):[]:listSlots(credential),usable2=new Set(slotsOfOwnKind(credential).map(slot2=>slot2.name));for(let slot2 of storedAccounts3){let displayName=accountDisplayName(slot2.displayName),persisted=state4[slot2.name],revision=await repository.storedCredentialRevision(provider,slot2.name,{key:slot2.key,access:slot2.access,refresh:slot2.refresh}),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot2.name,...displayName===void 0?{}:{displayName},source:slot2.source??"login",blocked:slotBlocked(slot2,applicable,now2),pinned:pinned===slot2.name,...blockedModels(now2,applicable?.modelBlocks,storedModelBlocks(slot2)),...usable2.has(slot2.name)?{}:{unused:!0}})}if(normalizeProviderId(provider)!=="anthropic-subscription")return summaries}let state3=await repository.listSlots(provider,"env");for(let slot2 of discoverEnvSlots(provider,name=>env[name])){let persisted=state3[slot2.name],revision=await repository.envCredentialRevision(slot2.envVarName,slot2.key),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot2.name,source:"env",blocked:slotHealth(applicable,now2)==="blocked",pinned:pinned===slot2.name,...blockedModels(now2,applicable?.modelBlocks)})}return summaries}async function renameCredentialAccount(storage,provider,name,displayName){await storage.modify(provider,async current=>{if(!current)throw new Error(`No stored credential for provider: ${provider}`);if(current.type==="oauth"&&!Array.isArray(current.accounts)&¤t.access===current.refresh&¤t.access.endsWith("-managed"))throw new Error(`Stored provider account not found: ${name}`);return renameSlotDisplayName(current,name,displayName)}),emitProviderAccountsChanged(provider)}async function pinCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);if(name!==null){assertValidAccountName2(name);let account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.unused)throw new Error(`Account ${name} holds a login of the other kind and is never used, so it cannot be pinned. To switch ${provider} to it, save it again with /login.`)}await storage.modify(provider,async current=>{if(current===void 0){if(normalizeProviderId(provider)!=="anthropic-subscription"||name===null)throw new Error(`No stored credential for provider: ${provider}`);return pinSlot({type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]},name)}if(name===null){if(pinnedName(current)===void 0)return current;let{pinned:_pinned,...unpinned}={...current,pinned:void 0};return unpinned}return pinSlot(current,name)}),emitProviderAccountsChanged(provider)}async function removeCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage),account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.source==="env")throw new Error(`Environment provider account cannot be removed: ${name}`);let next=await storage.read(provider);if(next===void 0)throw new Error(`No stored credential for provider: ${provider}`);let removed=removeSlot(next,name),remaining=removed===void 0?void 0:withoutOrderedAccount(removed,name);remaining===void 0?await storage.delete(provider):await storage.modify(provider,async()=>remaining),await repo.mutateSlotState(provider,"stored",name,()=>{}),emitProviderAccountsChanged(provider)}function storedOrder(credential){return credential?.order??[]}async function listCredentialAccounts(storage,provider,env=process.env,repository){let accounts=await getCredentialAccounts(storage,provider,env,repository),order=storedOrder(storage.get(provider));return{accounts,ordered:accounts.some(account=>order.includes(account.name))}}function assertOrderNames(names,known){if(names.length===0)throw new Error("Account order must name at least one account");let seen=new Set;for(let name of names){if(assertValidAccountName2(name),seen.has(name))throw new Error(`Duplicate provider account in order: ${name}`);if(seen.add(name),!known.some(account=>account.name===name))throw new Error(`Provider account not found: ${name}`)}}function withOrder(credential,names){let{order:_previous,...rest}=credential;return names===null?rest:{...rest,order:[...names]}}async function orderCredentialAccounts(storage,provider,names,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);await storage.modify(provider,async current=>{if(current===void 0)throw new Error(`No stored credential for provider: ${provider}`);return names!==null&&assertOrderNames(names,await summarizeCredentialAccounts(provider,current,env,repo)),withOrder(current,names)}),emitProviderAccountsChanged(provider)}var EDIT_CODES={empty:"empty","not-assistant":"not_assistant","not-found":"not_found","stale-leaf":"stale_leaf"},AssistantEditError=class extends Error{constructor(reason,message){super(message),this.name="AssistantEditError",this.reason=reason}get code(){return EDIT_CODES[this.reason]}},SessionStreamingError=class extends Error{constructor(){super("Wait for the current response to finish before navigating the session tree."),this.code="streaming",this.name="SessionStreamingError"}};function assertExpectedLeaf(expectedLeafId,currentLeafId){if(!(expectedLeafId===void 0||expectedLeafId===currentLeafId))throw new AssistantEditError("stale-leaf",`Session leaf moved (expected ${expectedLeafId}, now ${currentLeafId??"root"})`)}function assistantTextEquals(original,text3){return contentText(original.content,"").trim()===text3.trim()}function buildEditedAssistantMessage(original,text3){let trimmed=text3.trim();if(trimmed.length===0)throw new AssistantEditError("empty","Edited assistant response cannot be empty");return{role:"assistant",content:[{type:"text",text:trimmed}],api:original.api,provider:original.provider,model:original.model,...original.responseModel!==void 0?{responseModel:original.responseModel}:{},usage:original.usage,stopReason:"stop",timestamp:Date.now()}}var EDIT_CODES2={empty:"empty","not-user":"not_user","not-found":"not_found","stale-leaf":"stale_leaf"},UserEditError=class extends Error{constructor(reason,message){super(message),this.name="UserEditError",this.reason=reason}get code(){return EDIT_CODES2[this.reason]}};function assertExpectedUserLeaf(expectedLeafId,currentLeafId){if(!(expectedLeafId===void 0||expectedLeafId===currentLeafId))throw new UserEditError("stale-leaf",`Session leaf moved (expected ${expectedLeafId}, now ${currentLeafId??"root"})`)}function userTextEquals(original,text3){return contentText(original.content,"").trim()===text3.trim()}function buildEditedUserMessage(original,text3){let trimmed=text3.trim();if(trimmed.length===0)throw new UserEditError("empty","Edited user message cannot be empty");let attachments=Array.isArray(original.content)?original.content.filter(block=>block.type!=="text"):[];return{role:"user",content:[{type:"text",text:trimmed},...attachments],timestamp:Date.now()}}import{createHash as createHash2}from"node:crypto";var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default",AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt3,blockReason,limitedModel2,unavailableAccount){let until=soonestUnblockAt3===void 0?void 0:new Date(soonestUnblockAt3).toISOString();super(limitedModel2!==void 0&&until!==void 0?`All Anthropic Subscription accounts have hit the usage limit for model ${limitedModel2} until ${until}.`:until===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${until}.`),this.limitedModel=limitedModel2,this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt3,this.blockReason=blockReason,this.unavailableAccount=unavailableAccount}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName2){return createHash2("sha256").update(`${key}\0${accountName2}`).digest().readBigUInt64BE(0)}function rendezvousOrder2(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isAccountBlocked(account,now2){return account.blockedUntil!==void 0&&account.blockedUntil>now2}function isBlockedFor(account,now2,model){return isAccountBlocked(account,now2)||activeModelBlockUntil(account.modelBlocks,model,now2)!==void 0}function clearExpiredBlocks(accounts,now2=Date.now()){return accounts.map(account=>{let available=account;if(account.blockReason!==void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now2)){let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,...rest2}=account;available=rest2}if(available.modelBlocks===void 0)return available;let{modelBlocks,...rest}=available,live=pruneModelBlocks(modelBlocks,now2);return live===void 0?rest:{...rest,modelBlocks:live}})}function selectUnblocked(accounts,options,now2){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);if(pinned&&!isBlockedFor(pinned,now2,options.model))return pinned;let preferred=options.preferredAccount===void 0?void 0:accounts.find(account=>account.name===options.preferredAccount);return preferred&&!isBlockedFor(preferred,now2,options.model)?preferred:applyAccountOrder(options.accountOrder,rendezvousOrder2(getAffinityKey(options),accounts)).find(account=>!isBlockedFor(account,now2,options.model))}function unblockAt(account,now2,model){let accountUntil=account.blockedUntil!==void 0&&account.blockedUntil>now2?account.blockedUntil:void 0,modelUntil=activeModelBlockUntil(account.modelBlocks,model,now2);return accountUntil===void 0?modelUntil:modelUntil===void 0?accountUntil:Math.max(accountUntil,modelUntil)}function soonestUnblockAt(accounts,now2,model){let candidates=accounts.map(account=>unblockAt(account,now2,model)).filter(value=>value!==void 0);return candidates.length===0?void 0:Math.min(...candidates)}function limitedModel(accounts,now2,model){return accounts.some(account=>!isAccountBlocked(account,now2)&&activeModelBlockUntil(account.modelBlocks,model,now2)!==void 0)?model:void 0}function selectAccount(accounts,options={}){let now2=options.now??Date.now(),candidates=accounts,unavailableAccount;if(options.accountFallback===!1){let name=options.pinnedAccount??options.preferredAccount??applyAccountOrder(options.accountOrder,rendezvousOrder2(getAffinityKey(options),accounts))[0]?.name;candidates=accounts.filter(account=>account.name===name);let pinnedBy=options.pinnedAccount!==void 0?options.pinSource:void 0;name!==void 0&&(unavailableAccount={name,configured:candidates.length>0,...pinnedBy===void 0?{}:{pinnedBy}})}let selected=selectUnblocked(candidates,options,now2);if(selected)return selected;let cleared=clearExpiredBlocks(candidates,now2),afterClear=selectUnblocked(cleared,options,now2);if(afterClear)return afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(candidates,now2,options.model),candidates.length>0&&candidates.every(account=>account.blockReason==="auth_error")?"auth_error":void 0,limitedModel(candidates,now2,options.model),unavailableAccount)}var CODEX_FAMILY=/^x-([a-z0-9-]+)-(?:primary|secondary)-used-percent$/;function number(value){if(value===void 0||value.trim()==="")return;let parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}function iso(epochSeconds){return epochSeconds===void 0?void 0:new Date(epochSeconds*1e3).toISOString()}function windowLabel(minutes,fallback){return minutes===void 0||minutes<=0?fallback:minutes%1440===0?`${minutes/1440}d`:minutes%60===0?`${minutes/60}h`:`${minutes}m`}function lower(headers){return new Map(Object.entries(headers).map(([name,value])=>[name.toLowerCase(),value]))}function codexWindow(headers,family,slot2){let used=number(headers.get(`x-${family}-${slot2}-used-percent`));if(used===void 0)return;let minutes=number(headers.get(`x-${family}-${slot2}-window-minutes`)),resetAt=number(headers.get(`x-${family}-${slot2}-reset-at`));if(used===0&&(minutes??0)===0&&resetAt===void 0)return;let limit=family.replace(/-/g,"_"),resetsAt=iso(resetAt);return{id:`${limit}:${slot2}`,label:limit==="codex"?windowLabel(minutes,slot2):`${windowLabel(minutes,slot2)} ${limit}`,...minutes===void 0?{}:{windowMinutes:minutes},usedPercent:used,...resetsAt===void 0?{}:{resetsAt}}}function codexWindowsFromHeaders(raw){let headers=lower(raw),families=new Set;for(let name of headers.keys()){let family=CODEX_FAMILY.exec(name)?.[1];family!==void 0&&families.add(family)}return[...families].sort().flatMap(family=>["primary","secondary"].flatMap(slot2=>codexWindow(headers,family,slot2)??[]))}var CLAUDE_WINDOWS=[{key:"5h",minutes:300},{key:"7d",minutes:10080}];function claudeWindowsFromHeaders(raw){let headers=lower(raw);return CLAUDE_WINDOWS.flatMap(({key,minutes})=>{let utilization=number(headers.get(`anthropic-ratelimit-unified-${key}-utilization`));if(utilization===void 0)return[];let resetsAt=iso(number(headers.get(`anthropic-ratelimit-unified-${key}-reset`)));return[{id:`claude:${key}`,label:key,windowMinutes:minutes,usedPercent:Math.round(utilization*1e4)/100,...resetsAt===void 0?{}:{resetsAt}}]})}var SDK_WINDOWS={five_hour:{id:"claude:5h",label:"5h",minutes:300},seven_day:{id:"claude:7d",label:"7d",minutes:10080},seven_day_opus:{id:"claude:7d_opus",label:"7d opus",minutes:10080},seven_day_sonnet:{id:"claude:7d_sonnet",label:"7d sonnet",minutes:10080}};function claudeWindowsFromSdkEvent(data){if(typeof data!="object"||data===null||!("type"in data)||data.type!=="rate_limit_event")return[];let info=data.rate_limit_info,window=typeof info?.rateLimitType=="string"?SDK_WINDOWS[info.rateLimitType]:void 0;if(window===void 0||typeof info?.utilization!="number")return[];let resetsAt=iso(typeof info.resetsAt=="number"?info.resetsAt:void 0);return[{id:window.id,label:window.label,windowMinutes:window.minutes,usedPercent:Math.round(info.utilization*1e4)/100,...resetsAt===void 0?{}:{resetsAt}}]}var SubscriptionLimitStore=class{#accounts=new Map;#listeners=new Set;#mirrorListeners=new Set;record(provider,account,windows,now2=new Date){if(windows.length===0)return;let key=`${provider}\0${account}`,previous=this.#accounts.get(key),merged=new Map((previous?.windows??[]).map(window=>[window.id,window]));for(let window of windows)merged.set(window.id,window);this.#write(key,previous,{provider,account,windows:[...merged.values()],reportedAt:now2.toISOString(),...previous?.plan===void 0?{}:{plan:previous.plan}})}report(provider,account,report){let key=`${provider}\0${account}`,previous=this.#accounts.get(key),reportedAt=report.reportedAt.toISOString();if(!(previous!==void 0&&reportedAt<changedAtOf(previous))){if("error"in report){if(previous?.error===report.error)return;let{updatedAt:_changedAt,revision:_revision,...base}=previous??{provider,account,windows:[],reportedAt};this.#write(key,previous,{...base,error:report.error},reportedAt);return}report.windows.length===0&&previous===void 0||this.#write(key,previous,{provider,account,windows:[...report.windows],reportedAt,...report.plan===void 0?{}:{plan:report.plan}})}}adopt(limits){this.#offer(`${limits.provider}\0${limits.account}`,limits)}#write(key,previous,limits,changedAt=limits.reportedAt){let held=previous===void 0?void 0:changedAtOf(previous),later=held===void 0||changedAt>held,time2=later?changedAt:held,revision=later?0:(previous?.revision??0)+1;this.#publish(key,{...limits,...time2===limits.reportedAt?{}:{updatedAt:time2},...revision===0?{}:{revision}})}#offer(key,limits){let previous=this.#accounts.get(key);if(previous===void 0){this.#publish(key,limits);return}if(canonical(limits)!==canonical(previous)){if(changedAtOf(limits)===changedAtOf(previous)&&(limits.revision??0)===(previous.revision??0)){let combined=combineConcurrent(previous,limits);canonical(combined)!==canonical(previous)&&this.#publish(key,combined);return}compareRecords(limits,previous)<=0||this.#publish(key,limits)}}#publish(key,limits){this.#accounts.set(key,limits);let shown=publicShape(limits),calls=[...[...this.#mirrorListeners].map(listener=>()=>listener(limits)),...[...this.#listeners].map(listener=>()=>listener(shown))];for(let call of calls)try{call()}catch(error2){process.stderr.write(`senpi subscription limits: a listener failed: ${String(error2)}
|
|
5
5
|
`)}}snapshot(){return[...this.#accounts.values()].map(publicShape)}mirrorSnapshot(){return[...this.#accounts.values()]}subscribe(listener){return this.#listeners.add(listener),()=>this.#listeners.delete(listener)}subscribeMirror(listener){return this.#mirrorListeners.add(listener),()=>this.#mirrorListeners.delete(listener)}};function changedAtOf(limits){return limits.updatedAt??limits.reportedAt}function compareRecords(a,b){let[first,second]=[changedAtOf(a),changedAtOf(b)];if(first!==second)return first<second?-1:1;let[firstRevision,secondRevision]=[a.revision??0,b.revision??0];if(firstRevision!==secondRevision)return firstRevision<secondRevision?-1:1;let[left,right]=[canonical(a),canonical(b)];return left<right?-1:left>right?1:0}function combineConcurrent(a,b){let later=(x,y)=>x===void 0?y:y===void 0||canonical(x)>=canonical(y)?x:y;if(a.reportedAt!==b.reportedAt){let newer=a.reportedAt<b.reportedAt?b:a;return concurrentRecord(a,newer.windows,newer.plan,later(a.error,b.error),newer.reportedAt)}let windows=new Map(a.windows.map(window=>[window.id,window]));for(let window of b.windows)windows.set(window.id,later(windows.get(window.id),window)??window);return concurrentRecord(a,[...windows.values()],later(a.plan,b.plan),later(a.error,b.error),a.reportedAt)}function concurrentRecord(a,windows,plan,error2,reportedAt){let updatedAt=changedAtOf(a);return{provider:a.provider,account:a.account,windows:[...windows].sort((x,y)=>x.id<y.id?-1:x.id>y.id?1:0),reportedAt,...plan===void 0?{}:{plan},...error2===void 0?{}:{error:error2},...updatedAt===reportedAt?{}:{updatedAt},...a.revision===void 0||a.revision===0?{}:{revision:a.revision}}}function publicShape({updatedAt:_changedAt,revision:_revision,...limits}){return limits}function canonical(value){return JSON.stringify(value,(_key,field3)=>field3!==null&&typeof field3=="object"&&!Array.isArray(field3)?Object.fromEntries(Object.entries(field3).sort(([a],[b])=>a<b?-1:a>b?1:0)):field3)}var subscriptionLimits=new SubscriptionLimitStore;function limitAccountOf(slotAuth){return slotAuth?.slotName!==void 0?slotAuth.slotName:slotAuth?.apiKey!==void 0?"env":"default"}function withLimitCapture(options,provider,account,store=subscriptionLimits){let inner=options.onResponse;return{...options,onResponse:(response,model)=>(store.record(provider,account,[...codexWindowsFromHeaders(response.headers),...claudeWindowsFromHeaders(response.headers)]),inner?.(response,model))}}var PROVIDER="anthropic-subscription",HOUR_MS=3600*1e3,CLAUDE_USAGE_LIMIT=/^(?:You['\u2019]ve|You have) (?:hit|reached) your (?:(session|weekly|daily|monthly|\d+-hour|usage) )?limit(?=$|\s*[\u00b7\u2219.,{(]|\s+resets?\b)|^Claude AI usage limit reached\b/i,TERMINAL_LIMIT_REASON=/\bblocking_limit\b/,NAMED_STATUS=/\b(?:HTTP|status(?: code)?)\s*(\d{3})\b/i,WINDOW_MS={session:5*HOUR_MS,daily:24*HOUR_MS,weekly:168*HOUR_MS,monthly:744*HOUR_MS},UNNAMED_WINDOW_MS=5*HOUR_MS;function namedWindowMs(word){if(word===void 0)return;let lower2=word.toLowerCase(),hours=/^(\d+)-hour$/.exec(lower2);return hours?Number(hours[1])*HOUR_MS:WINDOW_MS[lower2]}function spentWindow(accountName2,now2){let limits=subscriptionLimits.snapshot().find(entry2=>entry2.provider===PROVIDER&&entry2.account===accountName2),spent;for(let window of limits?.windows??[]){if(window.usedPercent<100||window.resetsAt===void 0)continue;let resetsAt=Date.parse(window.resetsAt);!Number.isFinite(resetsAt)||resetsAt<=now2||(spent===void 0||resetsAt-now2>spent.resetMs)&&(spent={resetMs:resetsAt-now2,windowMs:window.windowMinutes===void 0?void 0:window.windowMinutes*6e4})}return spent}function isConfirmedAccountUsageLimit(text3){let trimmed=text3.trim();if(!CLAUDE_USAGE_LIMIT.test(trimmed)&&!TERMINAL_LIMIT_REASON.test(trimmed))return!1;let status=NAMED_STATUS.exec(trimmed)?.[1];return status===void 0||status==="429"}function usageLimitBlockMs(text3,accountName2,now2){let trimmed=text3.trim();if(!isConfirmedAccountUsageLimit(trimmed))return;let shape=CLAUDE_USAGE_LIMIT.exec(trimmed),window=spentWindow(accountName2,now2),parsed=usageLimitResetMs(trimmed,now2),resetMs=parsed!==void 0&&parsed>0?parsed:window?.resetMs;if(resetMs===void 0)return;let capMs=namedWindowMs(shape?.[1])??window?.windowMs??UNNAMED_WINDOW_MS;return Math.min(resetMs,capMs)}var MAX_RATE_LIMIT_BLOCK_MS=2880*60*1e3,DEFAULT_RATE_LIMIT_BLOCK_MS=6e4,TRANSIENT_RETRIES_PER_TURN=2,TRANSIENT_RETRY_DELAY_MS=1e3,TURN_RETRY_SUPPRESSION_PREFIX2="senpi:no-turn-retry:",sessionBlocks=new Map;function isSharedVerdict(classification,error2){return classification.kind==="auth_error"||classification.kind==="billing"||classification.kind==="org_not_allowed"?!0:classification.kind==="rate_limit"&&classification.modelFamily===void 0&&isConfirmedAccountUsageLimit(errorText(error2))}function rememberSessionBlock(sessionKey,account){if(sessionKey===void 0)return;let blocks=sessionBlocks.get(sessionKey)??new Map;blocks.set(account.name,{blockedUntil:account.blockedUntil,blockReason:account.blockReason,blockedAt:account.blockedAt,modelBlocks:account.modelBlocks}),sessionBlocks.set(sessionKey,blocks)}function pruneSessionBlocks(now2){for(let[sessionKey,blocks]of sessionBlocks){for(let[name,block]of blocks)(block.blockedUntil??0)<=now2&&pruneModelBlocks(block.modelBlocks,now2)===void 0&&blocks.delete(name);blocks.size===0&&sessionBlocks.delete(sessionKey)}}function withSessionBlocks(accounts,sessionKey,now2){pruneSessionBlocks(now2);let blocks=sessionKey===void 0?void 0:sessionBlocks.get(sessionKey);return blocks===void 0?[...accounts]:accounts.map(account=>{let own=blocks.get(account.name);if(own===void 0)return account;let later=(own.blockedUntil??0)>(account.blockedUntil??0);return{...account,...later?{blockedUntil:own.blockedUntil,blockReason:own.blockReason,blockedAt:own.blockedAt}:{},modelBlocks:mergeModelBlocks(account.modelBlocks,own.modelBlocks,0)}})}function forgetSessionBlock(sessionKey,name){if(sessionKey===void 0)return;let blocks=sessionBlocks.get(sessionKey);blocks?.delete(name)&&blocks.size===0&&sessionBlocks.delete(sessionKey)}function forgetSessionBlocksFor(name){let lifted=!1;for(let[sessionKey,blocks]of[...sessionBlocks])blocks.has(name)&&(lifted=!0,forgetSessionBlock(sessionKey,name));return lifted}var ClassifiedSdkError=class extends Error{constructor(classification,original,suppressTurnRetry){let detail=original instanceof Error?original.message:String(original);super(`${suppressTurnRetry?TURN_RETRY_SUPPRESSION_PREFIX2:""}${detail}`),this.name="ClassifiedSdkError",this.classification=classification,this.original=original,this.suppressTurnRetry=suppressTurnRetry}};function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:void 0}function defaultErrorFromEvent(event){let value=record(event);return value?.type==="error"?value.error:void 0}function defaultIsVisibleDelta(event){let value=record(event);return typeof value?.type!="string"?!1:/^(?:text|thinking|toolcall)_(?:start|delta|end)$/.test(value.type)}function errorText(error2){if(typeof error2=="string")return error2;if(error2 instanceof Error)return error2.message;let value=record(error2);return typeof value?.message=="string"?value.message:String(error2)}function retryAfterMs(error2){let explicit=record(error2)?.retryAfterMs;if(typeof explicit=="number"&&Number.isFinite(explicit)&&explicit>0)return Math.ceil(explicit);let text3=errorText(error2),milliseconds=text3.match(/\bretry[-_ ]?after[-_ ]?ms\s*[:=]\s*(\d+(?:\.\d+)?)/i);if(milliseconds)return Math.ceil(Number(milliseconds[1]));let seconds2=text3.match(/\bretry[-_ ]?after\s*[:=]\s*(\d+(?:\.\d+)?)/i);return seconds2?Math.ceil(Number(seconds2[1])*1e3):void 0}function blockedAccount(account,classification,now2,attempt2,baseBlockMs,error2,model){if(classification.kind==="auth_error")return{...account,blockedUntil:now2+9e5,blockReason:"auth_error",blockedAt:now2};let fallback=Math.min(MAX_RATE_LIMIT_BLOCK_MS,baseBlockMs*2**attempt2);if(classification.modelFamily!==void 0&&model!==void 0){let resetMs=retryAfterMs(error2)??usageLimitResetMs(errorText(error2),now2),duration2=Math.min(MAX_RATE_LIMIT_BLOCK_MS,resetMs!==void 0&&resetMs>0?resetMs:fallback),key=modelBlockKey(classification.modelFamily,model);return{...account,modelBlocks:withModelBlock(account.modelBlocks,key,now2+duration2,now2)}}let hinted=retryAfterMs(error2)??usageLimitBlockMs(errorText(error2),account.name,now2),duration=Math.min(MAX_RATE_LIMIT_BLOCK_MS,hinted??fallback);return{...account,blockedUntil:now2+duration,blockReason:classification.kind,blockedAt:now2}}async function clearBlockAfterSuccess(store,providerId,name,startedAt){let clearable=slot3=>slot3?.blockedUntil!==void 0&&slot3.blockReason!=="auth_error"&&(slot3.blockedAt??0)<=startedAt,stored=await store.read(providerId);if(stored?.type!=="oauth")return;let read2=stored,slot2=read2.accounts?.find(account=>account.name===name)??read2.slotState?.[name];clearable(slot2)&&await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current,state3=credential.slotState?.[name],slotState=state3===void 0||!clearable(state3)?credential.slotState:{...credential.slotState,[name]:{...state3.modelBlocks?{modelBlocks:state3.modelBlocks}:{}}};return{...credential,...slotState===void 0?{}:{slotState},accounts:(credential.accounts??[]).map(account=>{if(account.name!==name||!clearable(account))return account;let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,...rest}=account;return rest})}})}function isTransient(classification){return classification.kind==="overloaded"||classification.kind==="other"}function abortableSleep(ms,signal){return new Promise((resolve55,reject)=>{if(signal?.aborted){reject(signal.reason);return}let timer=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve55()},ms),onAbort=()=>{clearTimeout(timer),reject(signal?.reason)};signal?.addEventListener("abort",onAbort,{once:!0})})}function replaceAccount(accounts,replacement){return accounts.map(account=>account.name===replacement.name?replacement:account)}async function persistBlock(store,providerId,account,now2){let superseded;return await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current;if(account.source==="env")return{...credential,slotState:{...credential.slotState,[account.name]:{blockedUntil:account.blockedUntil,blockReason:account.blockReason,...account.blockedAt===void 0?{}:{blockedAt:account.blockedAt},modelBlocks:mergeModelBlocks(credential.slotState?.[account.name]?.modelBlocks,account.modelBlocks,now2)}}};let stored=(credential.accounts??[]).find(existing2=>existing2.name===account.name);if(account.blockReason==="auth_error"&&stored!==void 0&&(stored.access!==account.access||stored.refresh!==account.refresh))return superseded=stored,current;let accounts=(credential.accounts??[]).map(existing2=>existing2.name===account.name?{...existing2,blockedUntil:account.blockedUntil,blockReason:account.blockReason,...account.blockedAt===void 0?{}:{blockedAt:account.blockedAt},modelBlocks:mergeModelBlocks(existing2.modelBlocks,account.modelBlocks,now2)}:existing2);return{...credential,accounts}}),superseded}function usable(account,now2,model){return account.blockReason===void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now2)&&activeModelBlockUntil(account.modelBlocks,model,now2)===void 0}async function*runFailover(options){let now2=options.now??Date.now,baseBlockMs=options.baseBlockMs??DEFAULT_RATE_LIMIT_BLOCK_MS,accounts=clearExpiredBlocks(withSessionBlocks(options.accounts,options.sessionKey,now2()),now2()),attemptLimit=options.accountFallback===!1?Math.min(accounts.length,1):accounts.length,lastError,retriedOnStoredMaterial=new Set,transientRetriesUsed=0,longContextRetried=!1,retryAccountName;for(let attempt2=0;attempt2<attemptLimit;attempt2++){let retrySlot=retryAccountName===void 0?void 0:accounts.find(slot2=>slot2.name===retryAccountName);retryAccountName=void 0;let account={...retrySlot??options.selectFn(accounts)},visibleDeltaEmitted=!1,completed=!1,startedAt=now2();try{let attemptStream=await options.runAttempt(account);for await(let event of attemptStream){let failure2=(options.errorFromEvent??defaultErrorFromEvent)(event);if(failure2!==void 0)throw failure2;visibleDeltaEmitted||=(options.isVisibleDelta??defaultIsVisibleDelta)(event),yield event}completed=!0}catch(error2){let classification=options.classify(error2),classified=new ClassifiedSdkError(classification,error2,visibleDeltaEmitted);if(lastError=classified,!classification.retryable)throw classified;if(classification.kind==="long_context_unavailable"){if(visibleDeltaEmitted||longContextRetried)throw classified;longContextRetried=!0,options.onLongContextRefused?.(),retryAccountName=account.name,attempt2--;continue}if(isTransient(classification)){if(visibleDeltaEmitted||transientRetriesUsed>=TRANSIENT_RETRIES_PER_TURN)throw classified;let delayMs=TRANSIENT_RETRY_DELAY_MS*2**transientRetriesUsed;transientRetriesUsed+=1;try{await(options.sleep??abortableSleep)(delayMs,options.signal)}catch{throw classified}retryAccountName=account.name,attempt2--;continue}let blocked=blockedAccount(account,classification,now2(),attempt2,baseBlockMs,error2,options.model),shared=isSharedVerdict(classification,error2)||options.sessionKey===void 0;shared||rememberSessionBlock(options.sessionKey,blocked);let superseded=shared?await persistBlock(options.store,options.providerId,blocked,now2()):void 0;if(superseded&&!visibleDeltaEmitted&&usable(superseded,now2(),options.model)&&!retriedOnStoredMaterial.has(account.name)){retriedOnStoredMaterial.add(account.name),accounts=replaceAccount(accounts,superseded),attempt2--;continue}accounts=replaceAccount(accounts,blocked);let event={account:blocked,classification,attempt:attempt2+1,visibleDeltaEmitted};try{!visibleDeltaEmitted&&attempt2+1<attemptLimit&&(event.nextAccount=options.selectFn(accounts))}finally{await options.onFailover?.(event)}if(visibleDeltaEmitted)throw classified}if(completed){forgetSessionBlock(options.sessionKey,account.name),await clearBlockAfterSuccess(options.store,options.providerId,account.name,startedAt).catch(error2=>{process.stderr.write(`senpi anthropic-subscription: could not clear a stored block on ${account.name}: ${error2 instanceof Error?error2.message:String(error2)}
|
|
@@ -168,13 +168,13 @@ File: ${path14}`)}return _ModelConfig.parseAndMigrate(content,path14)}static loa
|
|
|
168
168
|
|
|
169
169
|
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 join19}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry2=this.entries.get(providerId);return entry2?structuredClone(entry2):void 0}async write(providerId,entry2,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry2))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path14=join19(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 entry2=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry2?structuredClone(entry2):void 0}async write(providerId,entry2,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry2),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(isConfiguredCredentialHeader(header2))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders);for(let header2 of headers.values())if(isConfiguredCredentialHeader(header2))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(typeof header2.value!="string")return{type:"api_key",source:source2};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&&isConfiguredCredentialHeader(header2))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??{}))source2==="extension_headers"&&assertConfigReferenceAuthority(value,{origin:"provider extension",field:`extension.headers.${name}`,authority:"extension"}),!(typeof value!="string"&&!isConfigReference(value))&&(assertConfigReferenceAuthority(value),target.set(name.toLowerCase(),{name,value,source:source2}))}function isConfiguredCredentialHeader(header2){return isCredentialHeaderName(header2.name)&&(typeof header2.value!="string"||hasCredentialHeaders({[header2.name]:header2.value}))}function composeApiKeyAuth(providerId,base,config,extension){let inherited2=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!inherited2&&rawKey===void 0&&!headerSource&&ambient?ambientApiKeyAuth(providerId,ambient,rawHeaders,headerSource,authHeader):!inherited2&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited2?.name??"API key",...inherited2?.keyOptional?{keyOptional:!0}:{},login:inherited2?.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 inherited2?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(typeof rawKey!="string")return{type:"api_key",source:"configured API key"};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 inherited2?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited2?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited2,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 resolve55=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 resolve55(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve55}}function ambientApiKeyAuth(providerId,ambient,rawHeaders,headerSource,authHeader){let resolve55=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:resolve55}}function configuredApiKey(config,extension){return extension?.apiKey!==void 0&&assertConfigReferenceAuthority(extension.apiKey,{origin:"provider extension",field:"extension.apiKey",authority:"extension"}),config?.apiKey!==void 0&&assertConfigReferenceAuthority(config.apiKey),extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){for(let model of extension?.models??[])for(let[name,value]of Object.entries(model.headers??{}))assertConfigReferenceAuthority(value,{origin:"provider extension",field:`extension.models.${model.id}.headers.${name}`,authority:"extension"});for(let[name,value]of Object.entries(extension?.headers??{}))assertConfigReferenceAuthority(value,{origin:"provider extension",field:`extension.headers.${name}`,authority:"extension"});for(let value of Object.values(config?.headers??{}))assertConfigReferenceAuthority(value);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,inherited2,rawKey,input){if(input.credential?.key)return inherited2?inherited2.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited2?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited2?inherited2.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||values.some(value=>typeof value!="string")?env:void 0}function rawModelHeaders(model,config,extension){let chatDefinition=isModelType(model,"chat")?config?.models?.find(entry2=>entry2.id===model.id):void 0,extensionModel=extension?.models?.find(entry2=>(entry2.type??"chat")===(model.type??"chat")&&entry2.id===model.id);for(let[name,value]of Object.entries(extensionModel?.headers??{}))assertConfigReferenceAuthority(value,{origin:"provider extension",field:`extension.models.${model.id}.headers.${name}`,authority:"extension"});for(let value of[...Object.values(isModelType(model,"chat")?config?.modelOverrides?.[model.id]?.headers??{}:{}),...Object.values(chatDefinition?.headers??{})])assertConfigReferenceAuthority(value);let 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 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 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 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(entry2=>entry2.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.unknown&&!setsEveryRate(override.cost)?{unknown:!0}:{}}: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)}}var UNKNOWN_COST={input:0,output:0,cacheRead:0,cacheWrite:0,unknown:!0},FREE_COST={input:0,output:0,cacheRead:0,cacheWrite:0};function setsEveryRate(cost){return cost.input!==void 0&&cost.output!==void 0&&cost.cacheRead!==void 0&&cost.cacheWrite!==void 0}function modelFromJson(providerId,definition,providerConfig,defaults,catalogCost){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??catalogCost??(providerId==="ollama"?FREE_COST:UNKNOWN_COST),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),existing2=existingIndex>=0?models[existingIndex]:void 0,model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl},existing2?.cost);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.unknown&&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 rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry2=>entry2.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(entry2=>entry2.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 resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry2=>entry2.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 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((resolve55,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;resolve55(()=>{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(entry2=>entry2.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field3=>!isDeepStrictEqual2(staticModel[field3],model[field3]));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 isRecord8(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 isRecord8(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 isRecord8(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(entry2=>typeof entry2=="object"&&entry2!==null).filter(isSupportedModelType),isNonChat=entry2=>NON_CHAT_MODEL_TYPES.includes(entry2.type),chat=supported.filter(entry2=>!isNonChat(entry2)),other=supported.filter(entry2=>isNonChat(entry2)&&"id"in entry2).map(model=>({...model,provider:providerId}));return[...parseRemoteCatalog(providerId,chat),...other]}function remoteModels(entry2,localGeneratedAt){return entry2?localGeneratedAt!==void 0&&(entry2.lastModified===void 0||entry2.lastModified<=localGeneratedAt)?[]:entry2.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 entry2={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry2,localGeneratedAt);await context.publish({persist:entry2,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 readSlot(providerId,slotName,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?projectSlot({type:"api_key",key:override},slotName):this.store.readSlot?this.store.readSlot(providerId,slotName,options):projectSlot(await this.store.read(providerId,options),slotName)}async list(options){let entries=new Map((await this.store.list(options)).map(entry2=>[entry2.providerId,entry2]));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);var BUSY_AVAILABILITY_RETRY_LIMIT=5,BUSY_AVAILABILITY_RETRY_BASE_MS=250;function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join20(dirname17(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.busyAvailabilityRetries=0,this.credentialOperations=new Map,this.outerSlotStateRetired=new Set,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??join20(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join20(dirname17(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?join20(options.agentDir,"credential-pool-state.json"):options.authPath?join20(dirname17(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??join20(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join20(dirname17(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?join20(options.agentDir,"credential-pool-state.json"):options.authPath?join20(dirname17(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(entry2=>entry2.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(entry2=>entry2[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry2=>entry2.providerId)),auth},this.availabilityInitialized=!0,this.busyAvailabilityRetries=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"),this.scheduleBusyAvailabilityRetry(),!0)}scheduleBusyAvailabilityRetry(){if(this.busyAvailabilityRetryTimer!==void 0||this.busyAvailabilityRetries>=BUSY_AVAILABILITY_RETRY_LIMIT)return;let delayMs=BUSY_AVAILABILITY_RETRY_BASE_MS*2**this.busyAvailabilityRetries;this.busyAvailabilityRetries+=1,this.busyAvailabilityRetryTimer=setTimeout(()=>{this.busyAvailabilityRetryTimer=void 0,this.queueAvailabilityRefresh().catch(()=>{})},delayMs),this.busyAvailabilityRetryTimer.unref?.()}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(`
|
|
170
170
|
|
|
171
|
-
`):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(resolve55=>{markStarted=resolve55}),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-ZPVCFOVD.js"),import("./state-store-WGZUO4JK.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||this.ownsAccountSelection(model.provider))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}ownsAccountSelection(providerId){return this.extensionProviders.get(providerId)?.ownsAccountSelection===!0}async retireOuterSlotState(providerId){if(this.outerSlotStateRetired.has(providerId))return;let[{repository},{STORE_BUSY,writeHealthUnlessStoreBusy}]=await Promise.all([this.loadCredentialPool(),import("./health-write-7FBGTL6K.js")]);await writeHealthUnlessStoreBusy(`retire generic-pool health for ${providerId}`,()=>repository.clearProvider(providerId))!==STORE_BUSY&&this.outerSlotStateRetired.add(providerId)}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;this.ownsAccountSelection(model.provider)&&await this.retireOuterSlotState(model.provider);let 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;this.ownsAccountSelection(model.provider)&&await this.retireOuterSlotState(model.provider);let 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=join21(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,reference3){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference3.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=entry2=>{let id=canonicalId(entry2.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry2),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),canonical3=providerMap.get(maybeProvider.toLowerCase());canonical3&&(provider=canonical3,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 record10={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?(record10.argumentsBytes=bytes,this.complete=!1):(record10.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record10),this.startedAt.set(record10,performance.now()),record10}finish(record10,isError,errorText6){record10&&(record10.status=isError?"error":"ok",record10.durationMs=Math.round(performance.now()-(this.startedAt.get(record10)??performance.now())),this.startedAt.delete(record10),isError&&errorText6&&(record10.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(`
|
|
171
|
+
`):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(resolve55=>{markStarted=resolve55}),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-CBGCBYHV.js"),import("./state-store-WGZUO4JK.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||this.ownsAccountSelection(model.provider))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}ownsAccountSelection(providerId){return this.extensionProviders.get(providerId)?.ownsAccountSelection===!0}async retireOuterSlotState(providerId){if(this.outerSlotStateRetired.has(providerId))return;let[{repository},{STORE_BUSY,writeHealthUnlessStoreBusy}]=await Promise.all([this.loadCredentialPool(),import("./health-write-7FBGTL6K.js")]);await writeHealthUnlessStoreBusy(`retire generic-pool health for ${providerId}`,()=>repository.clearProvider(providerId))!==STORE_BUSY&&this.outerSlotStateRetired.add(providerId)}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;this.ownsAccountSelection(model.provider)&&await this.retireOuterSlotState(model.provider);let 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;this.ownsAccountSelection(model.provider)&&await this.retireOuterSlotState(model.provider);let 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=join21(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,reference3){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference3.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=entry2=>{let id=canonicalId(entry2.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry2),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),canonical3=providerMap.get(maybeProvider.toLowerCase());canonical3&&(provider=canonical3,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 record10={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?(record10.argumentsBytes=bytes,this.complete=!1):(record10.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record10),this.startedAt.set(record10,performance.now()),record10}finish(record10,isError,errorText6){record10&&(record10.status=isError?"error":"ok",record10.durationMs=Math.round(performance.now()-(this.startedAt.get(record10)??performance.now())),this.startedAt.delete(record10),isError&&errorText6&&(record10.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(`
|
|
172
172
|
`)}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??{}},record10=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(resolve55=>{release4=resolve55}),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(record10,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 createHash6,randomUUID as randomUUID4}from"node:crypto";import{open}from"node:fs/promises";import{dirname as dirname18}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 record10 of await options.journal.read()){for(let input of[record10.input,...record10.batch??[]])store.inputs.set(input.clientMessageId,input);store.cursor=Math.max(store.cursor,record10.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 record10={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(entry2=>entry2.next)}};try{await this.options.journal.append(record10)}catch(error2){throw isUncertainAppend(error2)&&(this.unavailable=error2),error2}this.cursor=record10.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,record10.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,openFile=open){return{syncFile:path14=>syncPath(openFile,path14,"r+"),syncDirectory:path14=>platform5==="win32"?Promise.resolve():syncPath(openFile,path14,"r")}}var SessionPendingInputJournal=class{constructor(session,durability=fsJournalDurability()){this.directorySynced=!1,this.session=session,this.durability=durability}async append(record10){if(!this.session.isPersisted()){this.session.appendCustomEntry(PENDING_INPUT_TRANSITION,record10);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,record10);try{await this.durability.syncFile(file),this.directorySynced||(await this.durability.syncDirectory(dirname18(file)),this.directorySynced=!0)}catch(error2){throw new PendingInputAppendUncertainError(record10.cursor,file,error2)}}async read(){let records=(await this.transitionEntries()).map(entry2=>parseRecord(entry2.data,entry2.id));return records.sort((a,b)=>a.cursor-b.cursor),records.forEach((record10,index)=>{if(record10.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(entry2=>entry2.type==="custom"&&entry2.customType===PENDING_INPUT_TRANSITION?[{data:entry2.data,id:entry2.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(`
|
|
173
173
|
`,start);for(;newline!==-1;){lineNumber+=1;let entry2=transitionOf(pending.slice(start,newline),lineNumber);entry2!==void 0&&entries.push(entry2),start=newline+1,newline=pending.indexOf(`
|
|
174
174
|
`,start)}pending=pending.slice(start)}let tail=finalSegmentTransition(pending,lineNumber+1);return tail!==void 0&&entries.push(tail),entries}finally{await handle.close()}}function finalSegmentTransition(segment,lineNumber){if(segment.includes(PENDING_INPUT_TRANSITION)){try{JSON.parse(segment)}catch{return}return transitionOf(segment,lineNumber)}}function transitionOf(line,lineNumber){if(!line.includes(PENDING_INPUT_TRANSITION))return;let parsed;try{parsed=JSON.parse(line)}catch{throw new PendingInputJournalCorruptError(lineNumber)}if(!(typeof parsed!="object"||parsed===null||!("type"in parsed&&parsed.type==="custom")||!("customType"in parsed&&parsed.customType===PENDING_INPUT_TRANSITION)))return{data:"data"in parsed?parsed.data:void 0,id:"id"in parsed?String(parsed.id):""}}var PendingInputJournalCorruptError=class extends Error{constructor(lineNumber){super(`Pending input journal line ${lineNumber} is corrupt; the session cannot recover its queued input safely.`),this.code="pending_input_journal_corrupt",this.name="PendingInputJournalCorruptError"}},PendingInputAppendUncertainError=class extends Error{constructor(cursor,file,cause){let reason=cause instanceof Error?cause.message:String(cause);super(`Pending input transition ${cursor} was written to ${file} but could not be synced (${reason}). This is a local file error, not a model error; reopen the session to recover.`,{cause}),this.code="pending_input_append_uncertain",this.name="PendingInputAppendUncertainError"}},PendingInputNotDurableError=class extends Error{constructor(){super("The session file is not on disk yet, so a pending input cannot be saved; try again."),this.code="pending_input_journal_not_durable",this.name="PendingInputNotDurableError"}},PendingInputJournalGapError=class extends Error{constructor(missingCursor){super(`Pending input journal is missing transition ${missingCursor}; the session cannot recover its queued input safely.`),this.code="pending_input_journal_gap",this.name="PendingInputJournalGapError"}};async function syncPath(openFile,path14,flags2){let handle=await openFile(path14,flags2);try{await handle.sync()}finally{await handle.close()}}var PendingInputJournalError=class extends Error{constructor(entryId){super(`Pending input journal entry ${entryId} is malformed; the session cannot recover its queued input safely.`),this.code="pending_input_journal_invalid",this.name="PendingInputJournalError"}};function parseRecord(data,entryId){if(typeof data!="object"||data===null||!("type"in data&&data.type===PENDING_INPUT_TRANSITION)||!("cursor"in data&&typeof data.cursor=="number")||!("input"in data&&isPendingInput(data.input)))throw new PendingInputJournalError(entryId);let result3="result"in data?data.result:void 0;if(result3!==void 0&&!isOperationResult(result3))throw new PendingInputJournalError(entryId);let batch="batch"in data?data.batch:void 0;if(batch!==void 0&&!(Array.isArray(batch)&&batch.every(isPendingInput)))throw new PendingInputJournalError(entryId);return{type:PENDING_INPUT_TRANSITION,cursor:data.cursor,input:data.input,...result3===void 0?{}:{result:result3},...batch===void 0?{}:{batch}}}function isOperationResult(value){return typeof value=="object"&&value!==null&&"outcome"in value&&typeof value.outcome=="string"&&"clientMessageId"in value&&typeof value.clientMessageId=="string"}function isPendingInput(value){return typeof value=="object"&&value!==null&&"clientMessageId"in value&&typeof value.clientMessageId=="string"&&"phase"in value&&typeof value.phase=="string"&&"handle"in value&&typeof value.handle=="object"&&"revision"in value&&typeof value.revision=="number"}function createSessionQueuedInputPort(options){let attempts=new Map,reserve=async(tx,message)=>{let clientMessageId=clientMessageIdOf(message),input=clientMessageId===void 0?void 0:tx.current(clientMessageId);if(clientMessageId===void 0||input===void 0)return!0;let token={ownerId:options.ownerId,writerGeneration:options.writerGeneration,lifetimeId:input.handle.lifetimeId,attemptId:options.nextAttemptId(),clientMessageId};return await tx.apply(clientMessageId,{type:"reserve",token}),tx.current(clientMessageId)?.attempt?.attemptId!==token.attemptId?!1:(attempts.set(message,token),!0)},settle2=async(tx,messages,type2)=>{let tokens=messages.flatMap(message=>{let token=attempts.get(message);return token===void 0?[]:[token]});if(tokens.length===0)return tokens;await tx.applyAll(tokens.map(token=>({clientMessageId:token.clientMessageId,event:{type:type2,token}})));for(let message of messages)attempts.delete(message);return tokens},cancelOf=clientMessageId=>({clientMessageId,event:{type:"cancel",cause:"stop",consumerFenced:!0}}),cancelClaims=async(tx,messages)=>{let ids=messages.flatMap(message=>{let token=attempts.get(message);return attempts.delete(message),token===void 0?[]:[token.clientMessageId]});ids.length>0&&await tx.applyAll(ids.map(cancelOf))},cancelReleased=async(tx,messages)=>{let ids=messages.flatMap(message=>{let clientMessageId=clientMessageIdOf(message);return clientMessageId===void 0||tx.current(clientMessageId)===void 0?[]:[clientMessageId]});ids.length>0&&await tx.applyAll(ids.map(cancelOf))};return{claim:(_queue,drain)=>options.store.transaction(async tx=>{let claimed=[];for(let message of drain())await reserve(tx,message)&&claimed.push(message);return claimed}),commitConsumption:(_queue,messages)=>options.store.transaction(async tx=>{await settle2(tx,messages,"consumed")}),release:(_queue,messages,giveBack)=>options.store.transaction(async tx=>{if(!giveBack.restorable()){await cancelClaims(tx,messages);return}await settle2(tx,messages,"release"),giveBack.restore()||await cancelReleased(tx,messages)})}}function clientMessageIdOf(message){if(!(message.role!=="user"||!("clientMessageId"in message)))return typeof message.clientMessageId=="string"?message.clientMessageId:void 0}var ClientMessageIdConflictError=class extends Error{constructor(clientMessageId){super(`Client message id ${clientMessageId} was already used for a different message.`),this.code="client_message_id_conflict",this.name="ClientMessageIdConflictError",this.clientMessageId=clientMessageId}},holdsPendingInputTransition={initial:()=>!1,add:(held,entry2)=>held||entry2.type==="custom"&&entry2.customType===PENDING_INPUT_TRANSITION},SessionPendingInputs=class{constructor(options){this.lifetimeId=randomUUID4(),this.attempts=0,this.clears=0,this.options=options,options.sessionManager.reduceHistory(holdsPendingInputTransition)&&this.store().catch(()=>{})}async restoreHandle(clientMessageId){if(this.storeOpening===void 0)return;let input=(await this.storeOpening).current(clientMessageId);if(input!==void 0)return input.phase==="queued"?{queuedId:input.handle.queuedId}:"retired"}async admit(input,enqueue){return(await this.store()).transaction(async tx=>{let result3=await tx.submit({clientMessageId:input.clientMessageId,fingerprint:admissionFingerprint(input),text:input.text,attachments:(input.images??[]).map(attachmentFingerprint),requestedMode:input.mode});if(result3?.outcome==="client_message_id_conflict")throw new ClientMessageIdConflictError(input.clientMessageId);let admitted=tx.current(input.clientMessageId);return result3?.outcome==="admitted"&&admitted!==void 0&&enqueue(admitted.handle.queuedId),result3})}async change(request2,applyNative){if(this.storeOpening===void 0)return;let clearsAtStart=this.clears;return(await this.storeOpening).transaction(async tx=>{let current=tx.current(request2.clientMessageId);if(current===void 0)return;let target={effectId:request2.effectId??randomUUID4(),handle:current.handle,expectedRevision:request2.expectedRevision??current.revision},result3=request2.text===void 0?await tx.apply(request2.clientMessageId,{type:"remove",...target}):await tx.apply(request2.clientMessageId,{type:"edit",...target,text:request2.text,attachments:current.attachments}),outcome=legacyOutcome(result3?.outcome);if(outcome!=="edited"&&outcome!=="removed")return outcome;let native=applyNative();if(native==="not_found"&&this.clears!==clearsAtStart)return"not_found";if(native!==outcome)throw new PendingInputDivergenceError(request2.clientMessageId,outcome,native);return outcome})}async recordCleared(clientMessageIds){if(this.clears+=1,this.storeOpening===void 0||clientMessageIds.length===0)return;await(await this.storeOpening).transaction(async tx=>{let queued=clientMessageIds.filter(clientMessageId=>tx.current(clientMessageId)?.phase==="queued");queued.length!==0&&await tx.applyAll(queued.map(clientMessageId=>({clientMessageId,event:{type:"cancel",cause:"stop",consumerFenced:!0}})))})}async snapshot(knownClientMessageIds=[]){let store=this.storeOpening===void 0?void 0:await this.storeOpening,inputs=(store?.snapshot()??[]).filter(input=>input.state!=="delivered"&&input.state!=="removed"),outcomes2=knownClientMessageIds.map(clientMessageId=>{let read2=store?.read(clientMessageId);return read2?.status==="admitted"?{clientMessageId,status:"admitted",projection:read2.projection}:{clientMessageId,status:"not_admitted"}});return{lifetimeId:this.lifetimeId,throughCursor:store?.throughCursor??0,inputs,outcomes:outcomes2}}queuedInputPort(){return{claim:async(queue,drain)=>(await this.openPort())?.claim(queue,drain)??drain(),commitConsumption:async(queue,messages)=>(await this.openPort())?.commitConsumption(queue,messages),release:async(queue,messages,giveBack)=>{let port=await this.openPort();port===void 0?giveBack.restore():await port.release(queue,messages,giveBack)}}}store(){return this.storeOpening??=PendingInputStore.open({journal:this.options.journal??new SessionPendingInputJournal(this.options.sessionManager),lifetimeId:this.lifetimeId,nextQueuedId:this.options.nextQueuedId,uncommittedAttemptsAreUnsent:!0}).then(store=>{let onChange=this.options.onChange;return onChange!==void 0&&store.subscribe((projections,cursor)=>onChange({lifetimeId:this.lifetimeId,cursor,changes:projections})),store}),this.storeOpening}async openPort(){if(this.storeOpening===void 0)return;let store=await this.storeOpening;return this.port??=createSessionQueuedInputPort({store,ownerId:`${process.pid}:${this.lifetimeId}`,writerGeneration:1,nextAttemptId:()=>`${this.lifetimeId}:${++this.attempts}`}),this.port}};function admissionFingerprint(input){let images=(input.images??[]).map(attachmentFingerprint);return sha256(JSON.stringify([input.mode,input.text,images]))}function attachmentFingerprint(image){return`${image.mimeType}:${sha256(image.data)}`}function sha256(value){return createHash6("sha256").update(value).digest("hex")}var PendingInputDivergenceError=class extends Error{constructor(clientMessageId,recorded,native){super(`Queued input ${clientMessageId} was ${recorded} in its record but ${native} in the queue.`),this.code="pending_input_divergence",this.name="PendingInputDivergenceError"}};function legacyOutcome(outcome){switch(outcome){case"edited":case"removed":case"conflict":case"already_delivered":return outcome;case"sending":return"already_delivered";default:return"not_found"}}var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv(env){let resolved={};for(let[key,value]of Object.entries(env))value!==void 0&&(resolved[key]=value);return resolved}function resolveBufferSeconds(configured){return configured===void 0||!Number.isFinite(configured)||configured<0?DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS:Math.trunc(configured)}function resolvePromptCacheSafeWaitSeconds(model,settings,env){if(settings?.cacheAwareTimeouts===!1||!model)return;let ttlSeconds=resolvePromptCacheTtlSeconds(model,toProviderEnv(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}import{createHash as createHash7}from"node:crypto";import{basename as basename8,dirname as dirname19}from"node:path";function promptSizeExtensionNames(paths,packageNameOf=()=>{}){let names=new Map;for(let path14 of paths){let stem=basename8(path14).replace(/\.[^.]+$/,""),name=path14.startsWith("<")?path14.replace(/^<[^:]+:|>$/g,""):packageNameOf(path14)??(stem==="index"||stem==="main"?basename8(dirname19(path14)):stem);names.set(path14,name)}let counts=new Map;for(let name of names.values())counts.set(name,(counts.get(name)??0)+1);for(let[path14,name]of names)(counts.get(name)??0)>1&&names.set(path14,`${name}:${createHash7("sha256").update(path14).digest("hex").slice(0,8)}`);return names}import{realpathSync as realpathSync5}from"node:fs";import{homedir as homedir5}from"node:os";function entry(part){let source2=part.source??part.name,home=[homedir5(),realpathSync5(homedir5())].find(path14=>source2===path14||source2.startsWith(`${path14}/`));return{name:part.name,source:home===void 0?source2:source2===home?"~":`~/${source2.slice(home.length+1)}`,bytes:Buffer.byteLength(part.text,"utf8"),estimatedTokens:estimateTextTokens(part.text),boundingSettings:part.name==="project_context"?["contextFiles.maxBytesPerFile","contextFiles.maxTotalBytes"]:null}}var PromptSizeAccounting=class{#entries;#skillCount;#extensionNames;#presetPartsMismatch=[];constructor(input){let{base,options,parts}=input;this.#extensionNames=input.extensionNames;let rendered=parts.map(part=>part.text).join("");this.#entries=parts.length>0&&base.startsWith(rendered)?[...parts,...base===rendered?[]:[{name:"session_policy",text:base.slice(rendered.length)}]].map(entry):[entry({name:"core",source:"session",text:base})],this.#skillCount=(options.skills??[]).filter(skill=>!skill.disableModelInvocation).length}observe(contribution){let{path:path14,before,after:after2,parts}=contribution,name=this.#extensionNames.get(path14)??path14.replace(/^<[^:]+:|>$/g,"");if(parts!==void 0){if(parts.map(part=>part.text).join("")===after2){this.#entries.splice(0,this.#entries.length,...parts.map(entry));return}this.#presetPartsMismatch.push(name)}if(before===after2)return;let added=after2.startsWith(before)?after2.slice(before.length):after2.endsWith(before)?after2.slice(0,after2.length-before.length):void 0;this.#entries.push({name:`extension:${name}`,source:name,bytes:Buffer.byteLength(after2)-Buffer.byteLength(before),estimatedTokens:added===void 0?estimateTextTokens(after2)-estimateTextTokens(before):estimateTextTokens(added),boundingSettings:null,...added===void 0?{rewritten:!0}:{}})}report(tools){let sections=[],project2=this.#entries.filter(part=>part.name==="project_context");for(let part of this.#entries)part.name!=="project_context"&§ions.push(part.name==="skills"?{...part,count:this.#skillCount,boundingSettings:[`MAX_SKILL_CATALOG_BYTES (${49152})`,`COMPACT_SKILL_CATALOG_COUNT (${100})`,`COMPACT_SKILL_CATALOG_DESCRIPTION_BYTES (${65536})`]}:part);project2.length>0&§ions.push({name:"project_context",source:project2[0]?.source.startsWith("prompt-preset:")?project2[0].source:"context files",bytes:project2.reduce((sum,part)=>sum+part.bytes,0),estimatedTokens:project2.reduce((sum,part)=>sum+part.estimatedTokens,0),boundingSettings:["contextFiles.maxBytesPerFile","contextFiles.maxTotalBytes"],files:project2.filter(part=>part.source!=="dynamic-prompt"&&!part.source.startsWith("prompt-preset:")).sort((a,b)=>b.bytes-a.bytes)});let serializedTools=JSON.stringify(tools);return sections.push({...entry({name:"tools",source:"provider declarations",text:serializedTools}),count:tools.length,topTools:tools.map(tool=>({name:tool.name,bytes:Buffer.byteLength(JSON.stringify(tool))})).sort((a,b)=>b.bytes-a.bytes).slice(0,10)}),sections.sort((a,b)=>b.bytes-a.bytes),{sections,total:{bytes:sections.reduce((sum,part)=>sum+part.bytes,0),estimatedTokens:sections.reduce((sum,part)=>sum+part.estimatedTokens,0)},...this.#presetPartsMismatch.length===0?{}:{presetPartsMismatch:{names:[...this.#presetPartsMismatch],note:"replacement parts did not join to its prompt; its row is the net delta"}}}}};function promptSizeStartupNotes(input){let thirdPartySessionStart={names:input.runner.getThirdPartySessionStartPaths().map(path14=>input.extensionNames.get(path14)??"extension"),note:"these third-party session_start hooks ran during startup and may have used the network"};if(!input.sizesOnlyStartup||input.inventory===void 0)return{thirdPartySessionStart};let servers=[...input.inventory.mcpServerNames({cwd:input.cwd,runner:input.runner})].sort();return{mcp:{count:servers.length,names:servers,note:"not attached; tool sizes exclude them"},thirdPartySessionStart}}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal,options)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal,requestOptions={}){if(await untilAborted(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let composed=await untilAborted(composeTurnSystemPrompt(sources,signal,requestOptions.sizesOnly===!0),signal);if(composed===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state3=agent.state,model=state3.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state3.reasoningBaseline,state3.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state3.thinkingSelection!==void 0&&(options.thinkingSelection=state3.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=requestOptions.sizesOnly?{model,options}:await untilAborted(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt:composed.systemPrompt,messages:[],tools:state3.tools.slice(),...state3.declaredTools!==void 0?{declaredTools:state3.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options,...composed.accounting===void 0?{}:{sizeReport:{...composed.accounting.report(getCurrentTools(transcript.messages)),...promptSizeStartupNotes({cwd:sources.getBaseSystemPromptOptions().cwd,runner,extensionNames:composed.extensionNames,inventory:sources.promptSizeInventory,sizesOnlyStartup:sources.sizesOnlyStartup===!0})}}}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal,sizesOnly){let systemPrompt=sources.getBaseSystemPrompt(),accounting,extensionNames=sizesOnly?promptSizeExtensionNames(sources.runner.getExtensionPaths(),path14=>sources.promptSizeInventory?.packageNameOf(path14)):new Map;for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();accounting=sizesOnly?new PromptSizeAccounting({base,options:sources.getBaseSystemPromptOptions(),parts:sources.getBaseSystemPromptParts?.()??[],extensionNames}):void 0;let currentAccounting=accounting;if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal,...currentAccounting===void 0?{}:{observePrompt:contribution=>currentAccounting.observe(contribution)}}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return{systemPrompt,accounting,extensionNames}}async function untilAborted(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve55=>{onAbort=()=>resolve55(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}import{existsSync as existsSync7,readdirSync as readdirSync2,readFileSync as readFileSync9,statSync as statSync7}from"fs";import{basename as basename9,dirname as dirname20,join as join22,resolve as resolve7,sep as sep4}from"path";function parseCommandArgs(argsString){let args=[],current="",inQuote=null;for(let i=0;i<argsString.length;i++){let char=argsString[i];inQuote?char===inQuote?inQuote=null:current+=char:char==='"'||char==="'"?inQuote=char:/\s/.test(char)?current&&(args.push(current),current=""):current+=char}return current&&args.push(current),args}function substituteArgs(content,args){let allArgs=args.join(" ");return content.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(_match,defaultTarget,defaultValue,sliceStart,sliceLength,simple)=>{if(defaultTarget){let value=defaultTarget==="@"||defaultTarget==="ARGUMENTS"?allArgs:args[parseInt(defaultTarget,10)-1];return value||defaultValue}if(sliceStart){let start=parseInt(sliceStart,10)-1;if(start<0&&(start=0),sliceLength){let length=parseInt(sliceLength,10);return args.slice(start,start+length).join(" ")}return args.slice(start).join(" ")}if(simple==="ARGUMENTS"||simple==="@")return allArgs;let index=parseInt(simple,10)-1;return args[index]??""})}function loadTemplateFromFile(filePath,sourceInfo){let diagnostics=[],rawContent;try{rawContent=readFileSync9(filePath,"utf-8")}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read prompt template file";return diagnostics.push({type:"warning",message,path:filePath}),{template:null,diagnostics}}let frontmatter,body;try{({frontmatter,body}=parseFrontmatter(rawContent))}catch(error2){let message=error2 instanceof Error?error2.message:"failed to parse prompt template file";return diagnostics.push({type:"warning",message,path:filePath}),{template:null,diagnostics}}let name=basename9(filePath).replace(/\.md$/,""),description=typeof frontmatter.description=="string"?frontmatter.description:"";if(!description){let firstLine2=body.split(`
|
|
175
175
|
`).find(line=>line.trim());firstLine2&&(description=firstLine2.slice(0,60),firstLine2.length>60&&(description+="..."))}let argumentHint=typeof frontmatter["argument-hint"]=="string"?frontmatter["argument-hint"]:void 0,requiresArguments=frontmatter["requires-arguments"];return{template:{name,description,...argumentHint&&{argumentHint},requiresArguments:typeof requiresArguments=="boolean"?requiresArguments:!!argumentHint,content:body,sourceInfo,filePath},diagnostics}}function loadTemplatesFromDir(dir,getSourceInfo){let templates=[],diagnostics=[];if(!existsSync7(dir))return{templates,diagnostics};try{let entries=readdirSync2(dir,{withFileTypes:!0});for(let entry2 of entries){let fullPath=join22(dir,entry2.name),isFile=entry2.isFile();if(entry2.isSymbolicLink())try{isFile=statSync7(fullPath).isFile()}catch{continue}if(isFile&&entry2.name.endsWith(".md")){let result3=loadTemplateFromFile(fullPath,getSourceInfo(fullPath));result3.template&&templates.push(result3.template),diagnostics.push(...result3.diagnostics)}}}catch{return{templates,diagnostics}}return{templates,diagnostics}}function loadPromptTemplates(options){let resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(options.agentDir),promptPaths=options.promptPaths,includeDefaults=options.includeDefaults,templates=[],diagnostics=[],addResult=result3=>{templates.push(...result3.templates),diagnostics.push(...result3.diagnostics)},globalPromptsDir=join22(resolvedAgentDir,"prompts"),projectPromptsDir=resolve7(resolvedCwd,CONFIG_DIR_NAME,"prompts"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve7(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep4)?normalizedRoot:`${normalizedRoot}${sep4}`;return target.startsWith(prefix)},getSourceInfo=resolvedPath=>isUnderPath2(resolvedPath,globalPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"user",baseDir:globalPromptsDir}):isUnderPath2(resolvedPath,projectPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"project",baseDir:projectPromptsDir}):createSyntheticSourceInfo(resolvedPath,{source:"local",baseDir:statSync7(resolvedPath).isDirectory()?resolvedPath:dirname20(resolvedPath)});includeDefaults&&(addResult(loadTemplatesFromDir(globalPromptsDir,getSourceInfo)),addResult(loadTemplatesFromDir(projectPromptsDir,getSourceInfo)));for(let rawPath of promptPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(existsSync7(resolvedPath))try{let stats=statSync7(resolvedPath);if(stats.isDirectory())addResult(loadTemplatesFromDir(resolvedPath,getSourceInfo));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadTemplateFromFile(resolvedPath,getSourceInfo(resolvedPath));result3.template&&templates.push(result3.template),diagnostics.push(...result3.diagnostics)}}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read prompt template path";diagnostics.push({type:"warning",message,path:resolvedPath})}}return{templates,diagnostics}}function expandPromptTemplateWithMetadata(text3,templates){if(!text3.startsWith("/"))return{text:text3};let match=text3.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!match)return{text:text3};let templateName=match[1],argsString=match[2]??"",template=templates.find(t=>t.name===templateName);if(template){let args=parseCommandArgs(argsString);return{text:substituteArgs(template.content,args),template}}return{text:text3}}var ACTIONS={auth:{reason:"the provider rejected the credentials",action:"re-authenticate the provider"},rate_limit:{reason:"the provider is rate limiting requests",action:"retry later or set a fallback model"},quota:{reason:"the provider account is out of quota",action:"check the plan or credits"},context_limit:{reason:"the conversation is larger than the model's context",action:"compact or shorten the conversation"},invalid_request:{reason:"the provider rejected the request as invalid",action:"report it with the code"},provider_unavailable:{reason:"the provider is unavailable",action:"retry or switch provider"},network:{reason:"the connection to the provider failed",action:"check connectivity"}};function identifier(diagnostic2){return diagnostic2?.code!==void 0?`code ${diagnostic2.code}`:diagnostic2?.httpStatus!==void 0?`status ${diagnostic2.httpStatus}`:"no code"}function describeProviderFailure(diagnostic2,provider){let category=diagnostic2?.category??"unknown",detail=category==="unknown"?{reason:`the provider returned an error that could not be classified (${provider}, ${identifier(diagnostic2)})`,action:"retry once; if it repeats, switch the model or report the code"}:ACTIONS[category],resetsAt=diagnostic2?.resetsAt;return{category,provider,...diagnostic2?.httpStatus===void 0?{}:{httpStatus:diagnostic2.httpStatus},...diagnostic2?.code===void 0?{}:{code:diagnostic2.code},...resetsAt===void 0?{}:{resetsAt},...detail,...resetsAt===void 0?{}:{reason:`${detail.reason} until ${new Date(resetsAt).toISOString()}`}}}function providerFailureOf(messages){let last=messages.findLast(message=>message.role==="assistant");if(!(last===void 0||last.role!=="assistant"||last.stopReason!=="error"))return describeProviderFailure(sanitizeProviderDiagnostic(last.providerDiagnostic),last.provider)}function formatProviderFailure(failure2){return`${failure2.reason[0]?.toUpperCase()??""}${failure2.reason.slice(1)}. Action: ${failure2.action}.`}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs,onStreamStarted}){let streamStarted=!1,timer,unsubscribe=timeoutMs===void 0?void 0:onStreamStarted?.(()=>{streamStarted=!0,clearTimeout(timer)});try{let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0||streamStarted){await continuation;return}timer=setTimeout(()=>{!streamStarted&&getActiveSignal()===ownedSignal&&abortActive()},timeoutMs),await continuation}finally{clearTimeout(timer),unsubscribe?.()}}var QueuedInputAges=class{#runsStarted=0;#queuedAt=new Map;#reported=new Set;noteRunStarted(){this.#runsStarted+=1}noteQueued(queuedId,nowMs){this.#queuedAt.set(queuedId,{runsStarted:this.#runsStarted,atMs:nowMs})}takeOutlived(stillQueued,nowMs){let live=new Set(stillQueued);for(let queuedId of this.#queuedAt.keys())live.has(queuedId)||(this.#queuedAt.delete(queuedId),this.#reported.delete(queuedId));let outlived=[];for(let queuedId of stillQueued){let queuedAt=this.#queuedAt.get(queuedId);queuedAt===void 0||this.#reported.has(queuedId)||queuedAt.runsStarted>=this.#runsStarted||(this.#reported.add(queuedId),outlived.push({queuedId,ageMs:nowMs-queuedAt.atMs}))}return outlived}};async function checkSessionReloadVeto(runner,isPromptStartPending,isSessionStartDispatching=()=>!1){if(isPromptStartPending())return{cancelled:!0,reason:"A prompt is being admitted."};if(isSessionStartDispatching())return{cancelled:!0,reason:"A session is starting."};let result3=runner.hasHandlers("session_before_reload")?await runner.emit({type:"session_before_reload"}):void 0;return isPromptStartPending()?{cancelled:!0,reason:"A prompt is being admitted."}:isSessionStartDispatching()?{cancelled:!0,reason:"A session is starting."}:result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images","opengateway","vercel-ai-gateway"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||!matchesFamily(model,family)||tiers.isFallbackEligible?.(model)===!1)continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?memoizedEligibility(registry):void 0}}function memoizedEligibility(registry){let known=new Map;return model=>{let cached=known.get(model.provider);if(cached!==void 0)return cached;let eligible=registry.isFallbackEligible?.(model)!==!1;return known.set(model.provider,eligible),eligible}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function rungSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical3={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry2=>{let bare=parseBareSelector(entry2);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry2,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical3[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical3[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical3))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical3[key];return canonical3}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){return rungSelector(selector)}function explicitThinkingLevel(selector){let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");if(lastColon===-1)return;let suffix=normalized2.slice(lastColon+1);return isValidThinkingLevel(suffix)?suffix:void 0}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase();return explicitThinkingLevel(normalized2)===void 0?normalized2:normalized2.slice(0,normalized2.lastIndexOf(":"))}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries.findIndex(entry2=>entry2.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries.findIndex(entry2=>normalizedBase(entry2)===base&&explicitThinkingLevel(entry2)===void 0);return baseIndex===-1?chainEntries:chainEntries.slice(baseIndex+1)}function firstUsableCandidate(entries,current,filters){return scanCandidates(entries,current,filters,provider=>filters.isProviderSpent?.(provider)??!1)}function isCurrentRung(selector,current){return selector.provider!==current.model.provider||selector.id!==current.model.id?!1:selector.thinkingLevel===void 0||selector.thinkingLevel===current.thinkingLevel}function scanCandidates(entries,current,filters,avoidProvider){let probe;for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,filters.registry);if(!selector){filters.skip(raw,"unknown");continue}if(isCurrentRung(selector,current)){filters.skip(raw,"self");continue}if(avoidProvider(selector.provider)){filters.skip(raw,"account-limit");continue}let base=baseSelector(selector);if(filters.isModelSkipped?.(base)){filters.skip(raw,"network-blip");continue}if(filters.tried.has(rungSelector(selector))){filters.skip(raw,"tried");continue}if(filters.isSuppressed(base)){filters.skip(raw,"suppressed");continue}if(!filters.isAuthAvailable(selector.provider)){filters.skip(raw,"unauthenticated");continue}let model=filters.registry.find(selector.provider,selector.id);if(!model){filters.skip(raw,"unknown");continue}let level=clampThinkingLevel(model,selector.thinkingLevel??current.thinkingLevel??"off");if(base===formatSelector(current.model)&&level===(current.thinkingLevel??"off")){filters.skip(raw,"self");continue}if(filters.isSuppressed(rungSelector({...selector,thinkingLevel:level}))){filters.skip(raw,"suppressed");continue}if(filters.isCircuitOpen(base)){filters.skip(raw,"circuit-open"),probe??={selector,model,circuitOpen:!0};continue}return{selector,model,circuitOpen:!1}}return probe}function pinAfterSwitch(prior,switch_){let originalSelector=prior?.originalSelector??switch_.from,billingHitsOriginal=switch_.reason==="billing"&&(switch_.from===originalSelector||switch_.limit==="account"&&originalSelector.startsWith(`${switch_.fromProvider}/`)),pinnedByRefusal=prior?.pinnedByRefusal===!0||switch_.reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||billingHitsOriginal;return{originalSelector,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling}}var TRANSPORT_FAILURE=/timed? out|timeout|econnreset|econnrefused|etimedout|socket hang up|socket connection was closed|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|getaddrinfo|enotfound|eai_again|upstream.?connect|reset before headers|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|stream ended before a terminal response event|http2 request did not get a response|\btls\b|\bssl\b|econnaborted|epipe/,PROVIDER_VERDICT=/usage[- ]limit|quota|billing|credits|rate[ -]?limit|\b429\b|too many requests|overloaded|capacity|forbidden|resets? (?:at|in)\b|\b5\d\d\b|server|unavailable|high demand|overflow/;function normalize(errorMessage6){return stripProviderRequestIds(errorMessage6).toLowerCase()}function isTransportFailureText(normalizedMessage){return TRANSPORT_FAILURE.test(normalizedMessage)}function isPureNetworkTransient(errorMessage6){if(errorMessage6===void 0)return!1;let message=normalize(errorMessage6);return isTransportFailureText(message)&&!PROVIDER_VERDICT.test(message)}var UnusableEntries=class{constructor(cooldowns){this.accountErrors=new Map,this.cooldowns=cooldowns}note(model,failure2){let scope=usageLimitScope(failure2.errorMessage);scope==="account"?(this.cooldowns.note(accountKey(model.provider),failure2),failure2.errorMessage&&this.accountErrors.set(model.provider,failure2.errorMessage)):(scope==="model"||isHealthExhaustionFailure(failure2.errorMessage))&&this.cooldowns.note(entryKey(model),failure2)}isProviderSpent(provider){return this.cooldowns.isSuppressed(accountKey(provider))}accountError(provider){return this.isProviderSpent(provider)?this.accountErrors.get(provider):void 0}isUnusable(model){return this.isProviderSpent(model.provider)||this.cooldowns.isSuppressed(entryKey(model))}clear(model){this.cooldowns.clear(entryKey(model)),this.cooldowns.clear(accountKey(model.provider)),this.accountErrors.delete(model.provider)}};function accountKey(provider){return`account:${provider}`}function entryKey(model){return`exhausted:${formatSelector(model)}`}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.heldForNetworkBlip=!1,this.ownFailures=new Set,this.deps=deps,this.probes=new CircuitProbes(deps.circuits),this.unusable=new UnusableEntries(deps.cooldowns)}get activeState(){return this.state}get exhaustedChainKey(){return this.lastExhaustedChainKey}isProviderSpent(provider){return this.unusable.isProviderSpent(provider)}accountError(provider){return this.unusable.accountError(provider)}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.heldForNetworkBlip=!1,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical3=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical3},canonical3}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy,boundary="turn"){let heldForNetworkBlip=this.heldForNetworkBlip&&boundary==="continuation";boundary==="turn"&&(this.heldForNetworkBlip=!1);let state3=this.state,current=this.deps.getCurrentSelector();if(!state3||state3.pinned||!current)return!1;let selector=parseFallbackSelector(state3.originalSelector,this.deps.registry);if(!selector||!this.deps.isAuthAvailable(selector.provider))return!1;let model=this.deps.registry.find(selector.provider,selector.id);if(!model)return!1;let stranded=this.unusable.isUnusable(current.model)&&!this.unusable.isUnusable(model);if(!stranded&&(heldForNetworkBlip||!this.originalRecovered(state3,revertPolicy)))return!1;let thinking=current.thinkingLevel===state3.lastAppliedThinkingLevel?state3.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.switchOrRelease(model,thinking,"fallback-revert");let from=formatSelector(current.model);this.state=void 0;let cause=stranded?{cause:"fallback-unusable"}:{},trigger=stranded?{trigger:"fallback-unusable"}:{};return this.deps.logger.info("fallback_reverted",{from,to:state3.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state3.originalSelector,...cause}),!0}originalRecovered(state3,revertPolicy){if(revertPolicy!=="cooldown-expiry")return!1;let originalSelector=state3.originalSelector,original=parseFallbackSelector(originalSelector,this.deps.registry);return original&&state3.originalThinkingLevel!==void 0&&this.deps.cooldowns.isSuppressed(rungSelector({...original,thinkingLevel:state3.originalThinkingLevel}))?!1:!(this.probes.governs(originalSelector)?this.probes.isOpen(originalSelector):this.deps.cooldowns.isSuppressed(originalSelector))&&this.probes.admit(originalSelector)!=="open"}noteManualThinkingLevel(){this.state&&(this.state.lastAppliedThinkingLevel=void 0)}notifyCompactionApplied(){let state3=this.state;if(!state3)return!1;state3.pinnedByRefusal=!1;let wasPinned=state3.pinned;return state3.pinned=state3.pinnedByBilling,!wasPinned||state3.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state3.chainKey,originalSelector:state3.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.heldForNetworkBlip=!1,this.ownFailures.delete(formatSelector(model)),this.deps.cooldowns.clearModel(formatSelector(model)),this.unusable.clear(model),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteServed(selector){this.ownFailures.delete(selector),this.probes.accept(selector)}noteHealthFailure(model,thinkingLevel,failure2){this.unusable.note(model,failure2),this.managedChainKey({model,thinkingLevel})&&(isPureNetworkTransient(failure2.errorMessage)||(this.ownFailures.add(formatSelector(model)),this.probes.noteFailure(formatSelector(model),failure2)))}async rerouteAroundOpenCircuit(){let current=this.deps.getCurrentSelector();if(!this.deps.circuits||!current)return!1;let currentBase=formatSelector(current.model);if(this.probes.admit(currentBase)!=="open"||!this.ownFailures.has(currentBase)&&!this.probes.isExhausted(currentBase))return!1;let candidate=this.nextCandidate(!1,!0);return!candidate||candidate.circuitOpen?!1:(this.deps.logger.info("circuit_open_skip",{selector:currentBase}),await this.applyCandidate(current,candidate,"transient"),!0)}async tryFallback(reason,failure2,failureObserved=!0){let current=this.deps.getCurrentSelector(),blip=reason==="transient"&&isPureNetworkTransient(failure2.errorMessage);this.blipModel=blip&¤t?formatSelector(current.model):void 0;try{return await this.walkFallback(reason,failure2,failureObserved)}finally{this.blipModel=void 0}}async walkFallback(reason,failure2,failureObserved){let current=this.deps.getCurrentSelector(),networkBlip=reason==="transient"&&isPureNetworkTransient(failure2.errorMessage);failureObserved&¤t&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let limit=usageLimitScope(failure2.errorMessage);failureObserved&¤t&&this.unusable.note(current.model,failure2);let modelWidePark=!networkBlip&&failureObserved&&(reason==="transient"||reason==="billing"),candidate=this.nextCandidate(!1,!modelWidePark);if(!current||!candidate)return modelWidePark&&this.nextCandidate(!1,!0),!1;let currentBase=formatSelector(current.model);if(!networkBlip&&failureObserved&&(reason==="transient"||reason==="hard-error"||reason==="billing")){let parked=reason==="hard-error"?rungSelector({provider:current.model.provider,id:current.model.id,thinkingLevel:current.thinkingLevel}):currentBase;this.deps.cooldowns.note(parked,failure2),this.deps.logger.info("cooldown_noted",{selector:parked,errorMessage:failure2.errorMessage})}for(modelWidePark&&(candidate=this.nextCandidate(!1,!0));candidate;){try{return await this.applyCandidate(current,candidate,reason,limit),this.heldForNetworkBlip||=networkBlip,!0}catch(error2){if(!this.deps.isCandidateRefusal?.(error2))throw error2;this.triedSelectors.add(rungSelector(candidate.selector)),this.skip(formatSelector(candidate.model),"refused")}candidate=this.nextCandidate(!1,!0)}return!1}async applyCandidate(current,candidate,reason,limit){let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);this.probes.admit(baseSelector(candidate.selector)),await this.switchOrRelease(candidate.model,thinking,"fallback"),this.triedSelectors.add(rungSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state;this.state={chainKey:candidate.chainKey,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,...pinAfterSwitch(prior,{from,fromProvider:current.model.provider,reason,limit})};let scope=limit===void 0?{}:{limit};this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason,...scope}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason,...scope})}managedChainKey(current){if(!this.deps.getSettings().modelFallback)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey;return chainKey&&chains[chainKey]?chainKey:void 0}nextCandidate(reserve=!0,logDecision=reserve){let current=this.deps.getCurrentSelector();if(!this.deps.getSettings().modelFallback||!current)return;let chainKey=this.managedChainKey(current),entries=chainKey?this.canonicalChains()[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}let candidate=firstUsableCandidate(entries,current,{registry:this.deps.registry,tried:this.triedSelectors,isSuppressed:base=>this.deps.cooldowns.isSuppressed(base),isAuthAvailable:provider=>this.deps.isAuthAvailable(provider),isCircuitOpen:base=>this.deps.circuits?.isOpen(base)??!1,isProviderSpent:provider=>this.unusable.isProviderSpent(provider),isModelSkipped:base=>base===this.blipModel,skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(rungSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited2){let requested=selector.thinkingLevel??inherited2??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random,wallNow=now2){this.expiresAtBySelector=new Map,this.now=now2,this.random=random,this.wallNow=wallNow}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearModel(baseSelector2){for(let key of this.expiresAtBySelector.keys()){let rung=key.startsWith(`${baseSelector2}:`)&&isValidThinkingLevel(key.slice(baseSelector2.length+1));(key===baseSelector2||rung)&&this.expiresAtBySelector.delete(key)}}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs4,errorMessage:errorMessage6}){let resetMs=errorMessage6===void 0?void 0:usageLimitResetMs(errorMessage6,this.wallNow()),message=stripProviderRequestIds(errorMessage6??"").toLowerCase(),defaultMs=/usage[- ]limit|quota|insufficient_quota|billing|credits[-_ ]required|credits are required/.test(message)?30*6e4:/rate[ -]?limit|429|too many requests/.test(message)?3e4:/overloaded|capacity/.test(message)?45e3+this.capacityJitterMs():/5xx|\b5\d\d\b|server|internal error/.test(message)?2e4:void 0,retryMs=retryAfterMs4!==void 0&&Number.isFinite(retryAfterMs4)&&retryAfterMs4>0?retryAfterMs4:void 0,hintedMs=Math.max(resetMs??0,retryMs??0);return hintedMs>0?Math.min(MAX_SLOT_BLOCK_MS,hintedMs):defaultMs!==void 0?defaultMs:/"type"\s*:\s*"forbidden"[^}]*request not allowed|request not allowed[^}]*"type"\s*:\s*"forbidden"/.test(message)||isTransportFailureText(message)?6e4:5*6e4}capacityJitterMs(){return Math.round(Math.min(1,Math.max(0,this.random()))*3e4)}};function classifyRateLimitedWait(hintMs,settings){return hintMs===void 0?"no-hint-fast-fallback":hintMs<=settings.hintedWaitCapMs?"tier1-in-turn":hintMs<settings.probeBackMaxMs?"tier2-fallback-probe-back":"tier3-fallback-only"}function probeBackSchedule(hintMs,nowMs){return{firstAtMs:nowMs+Math.ceil(hintMs/2),deadlineMs:nowMs+hintMs}}function nextInTurnDelayMs(state3,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state3.attempt-1);if(state3.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state3.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state3.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state3.probePhase==="idle"&&hintMs!==void 0){let delay5=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state3.cumulativeHintedWaitMs+delay5;return{delayMs:delay5,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state3.hintDeadlineMs,cumulativeHintedWaitMs:state3.cumulativeHintedWaitMs,demoteToProbeBack:!1}}function degradeWithoutFallback(tier,hintMs,attempt2,baseDelayMs,hintedWaitCapMs){return tier==="tier3-fallback-only"?{kind:"fail",hintMs:hintMs??0}:tier==="tier2-fallback-probe-back"?{kind:"in-turn",delayMs:Math.max(Math.min(hintMs??hintedWaitCapMs,hintedWaitCapMs),baseDelayMs*2**(attempt2-1))}:{kind:"in-turn",delayMs:baseDelayMs*2**(attempt2-1)}}import{closeSync as closeSync2,fchmodSync as fchmodSync2,mkdirSync as mkdirSync5,openSync as openSync2,writeSync as writeSync2}from"node:fs";import{dirname as dirname21,join as join23}from"node:path";var DEFAULT_MAX_BYTES4=5*1024*1024,MAX_STRING_LENGTH2=200,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT2=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join23(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes2(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine2(level,event,data);writeLine2(filePath,line,maxBytes)}catch(error2){reportedWriteFailure2||(reportedWriteFailure2=!0,console.error("Unable to write retry fallback debug log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data),warn:(event,data)=>log("warn",event,data)}}function validMaxBytes2(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?Math.floor(value):DEFAULT_MAX_BYTES4}function formatLine2(level,event,data){let entry2={ts:new Date().toISOString(),level,event:safeText2(event)};if(data!==void 0){for(let[key,value]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value,new WeakSet);safeValue!==void 0&&(entry2[key]=safeValue)}}return JSON.stringify(entry2)}function writeLine2(filePath,line,maxBytes){mkdirSync5(dirname21(filePath),{recursive:!0,mode:448});let text3=`${line}
|
|
176
176
|
`;rotateLogIfNeeded(filePath,Buffer.byteLength(text3),maxBytes);let descriptor=openSync2(filePath,"a",384);try{writeSync2(descriptor,text3),fchmodSync2(descriptor,384)}finally{closeSync2(descriptor)}}function serializeValue2(value,seen){if(typeof value=="string")return safeText2(value);if(typeof value=="bigint")return value.toString();if(typeof value=="number"||typeof value=="boolean"||value===null)return value;if(typeof value>"u")return;if(typeof value=="function"||typeof value=="symbol")return String(value);if(seen.has(value))return"[Circular]";if(seen.add(value),Array.isArray(value))return value.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value){try{let entries=[];for(let key of Object.keys(value))try{let item=Reflect.get(value,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText2(value){let redacted=value.replace(SENSITIVE_TEXT2,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH2?redacted:`${redacted.slice(0,MAX_STRING_LENGTH2-3)}...`}var ProbeBackScheduler=class{constructor(opts){this._armed=!1,this._generation=0,this._secondProbeAnnounced=!1,this._now=opts.now,this._setTimeout=opts.setTimeout??((cb,d)=>setTimeout(cb,d)),this._clearTimeout=opts.clearTimeout??(h=>clearTimeout(h))}get active(){return this._armed}arm(input){let gen=++this._generation;if(this._armed&&(this._clearTimers(),this._abortInFlight("superseded"),this._disarm()),this._armed=!0,this._firstTimer={handle:void 0},this._deadlineTimer={handle:void 0},this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1,gen!==this._generation||(input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.firstAtMs,probeIndex:1}),gen!==this._generation))return;let firstDelay=Math.max(0,input.firstAtMs-this._now());this._firstTimer&&(this._firstTimer.handle=this._setTimeout(()=>{this._runProbe(input,1,gen)},firstDelay));let deadlineDelay=Math.max(0,input.deadlineMs-this._now());gen===this._generation&&this._deadlineTimer&&(this._deadlineTimer.handle=this._setTimeout(()=>{this._runDeadlineProbe(input,gen)},deadlineDelay))}cancel(reason){this._generation++,this._clearTimers(),this._abortInFlight(reason),this._disarm()}_clearTimers(){this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._deadlineTimer?.handle!==void 0&&(this._clearTimeout(this._deadlineTimer.handle),this._deadlineTimer.handle=void 0)}_abortInFlight(_reason){this._abortController&&(this._abortController.abort(),this._abortController=void 0),this._activeProbeIndex=void 0}_disarm(){this._armed=!1,this._firstTimer=void 0,this._deadlineTimer=void 0,this._abortController=void 0,this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1}_finish(){this._clearTimers(),this._disarm()}_announceSecondProbe(input,generation2){generation2!==this._generation||this._secondProbeAnnounced||(this._secondProbeAnnounced=!0,input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.deadlineMs,probeIndex:2}))}_runDeadlineProbe(input,generation2){generation2!==this._generation||!this._armed||(this._deadlineTimer&&(this._deadlineTimer.handle=void 0),this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._activeProbeIndex===1&&this._abortInFlight("superseded"),this._announceSecondProbe(input,generation2),generation2===this._generation&&this._runProbe(input,2,generation2))}async _runProbe(input,probeIndex,generation2){let gen=generation2;if(gen!==this._generation||!this._armed)return;if(probeIndex===1&&this._firstTimer?this._firstTimer.handle=void 0:this._deadlineTimer&&(this._deadlineTimer.handle=void 0),!input.authAvailable()){if(gen!==this._generation||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1,errorMessage:"auth-unavailable"}),gen!==this._generation))return;this._finish();return}if(gen!==this._generation||this._activeProbeIndex!==void 0)return;let abortController=new AbortController;this._abortController=abortController,this._activeProbeIndex=probeIndex;let success;try{success=await input.runProbe(abortController.signal)}catch{success=!1}if(!(gen!==this._generation||this._activeProbeIndex!==probeIndex||this._abortController!==abortController)){if(this._abortController=void 0,this._activeProbeIndex=void 0,success){if(gen!==this._generation||(input.onCleared(input.selector),gen!==this._generation)||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!0}),gen!==this._generation))return;this._finish();return}if(probeIndex===1){this._announceSecondProbe(input,gen);return}gen===this._generation&&(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1}),gen===this._generation&&this._finish())}}};var REQUEST_SHAPE_RECOVERY_ENTRY_TYPE="request-shape-recovery",REQUEST_SHAPE_RECOVERY_NOTE="Retried without web search replay data",REQUEST_SHAPE_FAILURE_TEXT="Anthropic rejected this conversation's request format, even after retrying without web search replay data. Run /compact or start a new session to continue, and report it if it happens again.",INVALID_REQUEST_PATTERN=/\binvalid_request_error\b/,ANTHROPIC_PROVIDER="anthropic";function isAnthropicRequestShapeRejection(message,contextWindow){return message.stopReason==="error"&&message.api==="anthropic-messages"&&message.provider===ANTHROPIC_PROVIDER&&INVALID_REQUEST_PATTERN.test(message.errorMessage??"")&&!isBillingErrorMessage(message.errorMessage)&&!isContextOverflow(message,contextWindow)}function stripProviderNativeReplay(messages,cutoff){let strippedBlocks=0;return{messages:messages.map(message=>{if(message.role!=="assistant"||message.timestamp>cutoff)return message;let content=message.content.filter(block=>block.type!=="providerNative");return content.length===message.content.length?message:(strippedBlocks+=message.content.length-content.length,{...message,content})}),strippedBlocks}}var RequestShapeRecovery=class{constructor(){this.attempted=!1}decide(message,contextWindow){return isAnthropicRequestShapeRejection(message,contextWindow)?this.attempted?"give-up":"recover":"not-request-shape"}begin(failedAt){this.attempted=!0,this.cutoff=failedAt}endStreak(){this.attempted=!1}apply(messages){return this.cutoff===void 0?messages:stripProviderNativeReplay(messages,this.cutoff).messages}};function isPlainObject3(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject2,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject2} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function isRungDuplicate(entry2,key){return baseSelector(entry2)!==baseSelector(key)?!1:(entry2.thinkingLevel??key.thinkingLevel)===key.thinkingLevel}function describeValue(value){return value===null?"null":Array.isArray(value)?"an array":`a ${typeof value}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry2=>typeof entry2!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry2 of entries){let bareEntry=parseBareSelector(entry2);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry2,key));continue}let parsedEntry=parseFallbackSelector(entry2,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry2,key));continue}parsedKey&&isRungDuplicate(parsedEntry,parsedKey)&&warnings.push(`Fallback chain entry "${entry2}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry2}"`,warnings)}}return warnings}var INHERITED_KEY="inherited_hold",fenceKey=runRef=>`run_fence:${runRef.kind}:${runRef.id}`;function isRunRef(value){if(typeof value!="object"||value===null)return!1;let ref=value;return typeof ref.kind=="string"&&typeof ref.id=="string"}function inheritedData(hold){let data=hold?.data;if(!(data===void 0||typeof data.parentSessionId!="string"||typeof data.highWater!="number"))return isRunRef(data.runRef)?{parentSessionId:data.parentSessionId,runRef:data.runRef,highWater:data.highWater}:void 0}function localSeq(hold){let seq=hold.data?.localSeq;return typeof seq=="number"?seq:void 0}var RunHolds=class{constructor(ledger){this.ledger=ledger}fence(runRef){this.ledger.addHold("run_fence",{key:fenceKey(runRef),data:{runRef}})}releaseFences(cause,runRefs){let keys=runRefs===void 0?this.ledger.fences.map(hold=>hold.key):runRefs.map(fenceKey);this.ledger.release(keys,cause)}holdsWake(details){let runRef=details?.runRef;return isRunRef(runRef)&&this.ledger.getHold(fenceKey(runRef))!==void 0}inheritedOwner(){return inheritedData(this.ledger.getHold(INHERITED_KEY))}stamp(){let localSeq2=this.ledger.currentPauseSeq+1;this.ledger.addHold("session_hold",{key:`session_hold:${localSeq2}`,data:{localSeq:localSeq2}})}releaseDirectStops(){let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold");this.ledger.release(direct.map(hold=>hold.key),"input")}inherit(owner){let current=this.inheritedOwner();if(current!==void 0&¤t.parentSessionId!==owner.parentSessionId)return{refused:"wrong_parent"};let highWater=Math.max(current?.highWater??0,owner.parentPauseSeq);return current!==void 0&&this.ledger.release([INHERITED_KEY],"run_resume"),this.ledger.addHold("inherited_hold",{key:INHERITED_KEY,data:{parentSessionId:owner.parentSessionId,runRef:owner.runRef,highWater}}),{childSeq:this.ledger.currentPauseSeq}}releaseInherited(request2){let owner=this.inheritedOwner();if(owner===void 0)return{released:!1,reason:"not_held"};if(owner.parentSessionId!==request2.parentSessionId)return{released:!1,reason:"wrong_parent"};if(request2.parentPauseSeq!==owner.highWater)return{released:!1,reason:"stale"};let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold"),observed=direct.filter(hold=>(localSeq(hold)??Number.POSITIVE_INFINITY)<=request2.childSeqCutoff);return this.ledger.release([INHERITED_KEY,...observed.map(hold=>hold.key)],"run_resume"),{released:!0,otherHoldLive:direct.length>observed.length}}};function partsOf(content){return typeof content=="string"?[{type:"text",text:content}]:[...content]}async function startRunResumeTurn(ports){let inputs=ports.heldInputs(),continues=ports.continueInputs(),wakes=ports.heldWakes(),directive=stopResumeDirective(ports.resumeCause),content=[...inputs.flatMap(input=>[{type:"text",text:`The user wrote while the run was paused:
|
|
177
|
-
${input.text}`},...input.images??[]]),...wakes.flatMap(wake=>partsOf(wake.message.content)),...partsOf(directive.content)],sendSettled=Promise.withResolvers(),started=ports.turnStarted(sendSettled.promise),sending=ports.send({...directive,content,display:inputs.length>0});sending.then(sendSettled.resolve,sendSettled.resolve);let turnId=await started,delivered=(async()=>{await ports.idle();try{await sending}catch(error2){return ports.sendFailed(error2),!1}return turnId===void 0||!ports.current()?!1:(ports.consume([...inputs.map(input=>input.inputId),...continues],wakes.map(wake=>wake.source)),!0)})();return{turnId,delivered}}function isSecurityNoticeState(value){return typeof value!="object"||value===null||!("generation"in value)||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0||!("notices"in value)||!Array.isArray(value.notices)?!1:value.notices.every(notice2=>typeof notice2=="object"&¬ice2!==null&&"category"in notice2&&(notice2.category==="skill-link-blocked"||notice2.category==="mcp-env-withheld")&&"message"in notice2&&typeof notice2.message=="string"&&(!("path"in notice2)||notice2.path===void 0||typeof notice2.path=="string"))}var SecurityNoticeSnapshot=class{#notices=new Map;#listeners=new Set;#generation=0;get snapshot(){return{generation:this.#generation,notices:[...this.#notices.values()]}}setResources(diagnostics){let before=JSON.stringify([...this.#notices]);for(let key of this.#notices.keys())key.startsWith("resource:")&&this.#notices.delete(key);for(let diagnostic2 of diagnostics)diagnostic2.category==="skill-link-blocked"&&this.#notices.set(`resource:${diagnostic2.path??diagnostic2.message}`,{category:"skill-link-blocked",message:diagnostic2.message,path:diagnostic2.path});before!==JSON.stringify([...this.#notices])&&this.#publish()}add(notice2){let key=`runtime:${notice2.category}:${notice2.path??notice2.message}`;JSON.stringify(this.#notices.get(key))!==JSON.stringify(notice2)&&(this.#notices.set(key,notice2),this.#publish())}accept(value){if(!(typeof value!="object"||value===null||!("message"in value)||typeof value.message!="string"||!("category"in value)||value.category!=="skill-link-blocked"&&value.category!=="mcp-env-withheld")){if("remove"in value&&value.remove===!0&&"path"in value&&typeof value.path=="string"){this.#notices.delete(`runtime:${value.category}:${value.path}`)&&this.#publish();return}this.add({category:value.category,message:value.message,..."path"in value&&typeof value.path=="string"?{path:value.path}:{}})}}subscribe(listener){return this.#listeners.add(listener),listener(this.snapshot),()=>this.#listeners.delete(listener)}dispose(){this.#listeners.clear()}#publish(){this.#generation++;let snapshot=this.snapshot;for(let listener of this.#listeners)listener(snapshot)}};var RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};function createSessionControlActions(deps){let owned=new Set,retired=!1;return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();if(host===void 0)return{status:"unsupported",reason:"unsupported_mode"};let registration=await host.register({...options,drain:async event=>retired?void 0:options.drain(event)});return registration.status!=="registered"?registration:retired?{status:"failed",reason:`stale extension generation after reload${await registration.dispose().then(()=>"",error2=>`; its teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`)}`}:(owned.add(registration),{...registration,dispose:async()=>{owned.delete(registration),await registration.dispose()}})},retire:async()=>{retired=!0;let registrations=[...owned];owned.clear(),await Promise.all(registrations.map(registration=>registration.dispose()))},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow(),relocationOffered:()=>deps.relocationHost()?.offered()??!1,relocationTargets:async signal=>await deps.relocationHost()?.targets(signal)??RELOCATION_NOT_OFFERED,requestRelocation:async(request2,signal)=>await deps.relocationHost()?.request(request2,signal)??RELOCATION_NOT_OFFERED}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized")),relocationOffered:notBound,relocationTargets:()=>Promise.reject(new Error("Extension runtime not initialized")),requestRelocation:()=>Promise.reject(new Error("Extension runtime not initialized"))}}function isAssistantEntry(entry2){return entry2.type==="message"&&entry2.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry2 of entries){if(entry2.type==="message"&&entry2.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry2))continue;let{message}=entry2;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry2.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var THINKING_LEVELS=new Set(["off","minimal","low","medium","high","xhigh","max"]);function isThinkingLevel(value){return typeof value=="string"&&THINKING_LEVELS.has(value)}function modelThinkingKey(model){return`${model.provider}/${model.id}`}function deriveSessionModelThinkingLevels(path14){let levels={};for(let entry2 of path14)entry2.type==="thinking_level_change"&&(typeof entry2.provider!="string"||typeof entry2.modelId!="string"||isThinkingLevel(entry2.thinkingLevel)&&(levels[modelThinkingKey({provider:entry2.provider,id:entry2.modelId})]=entry2.thinkingLevel));return levels}var SessionThinkingMemory=class{constructor(source2){this.source=source2}levels(){let leafId=this.source.getLeafId();return this.cached?.leafId!==leafId&&(this.cached={leafId,levels:deriveSessionModelThinkingLevels(this.source.getBranch())}),{...this.cached.levels}}levelFor(model){return this.levels()[modelThinkingKey(model)]}};import{randomBytes as randomBytes2}from"node:crypto";import{cp,mkdir as mkdir4,readdir as readdir2,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{basename as basename10,dirname as dirname22,join as join25}from"node:path";import{accessSync,constants}from"node:fs";import{access as access2}from"node:fs/promises";var NARROW_NO_BREAK_SPACE="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function unquotedPath(filePath){return/^@?(["'])(.+)\1$/.exec(filePath.trim())?.[2]}function fileExists(filePath){try{return accessSync(filePath,constants.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access2(filePath,constants.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPath(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPathAsync(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}import{createHash as createHash8}from"node:crypto";import{createReadStream}from"node:fs";import{readFile as readFile3}from"node:fs/promises";import{join as join24,posix,win32 as win322}from"node:path";var MOVE_BUNDLE_FORMAT=1,MANIFEST_FILE="manifest.json",SESSION_BUNDLE_PATH="files/session.jsonl",MoveBundleInvalidError=class extends Error{constructor(detail){super(`The moved session could not be verified (${detail}); it was not imported. The original device keeps it.`),this.code="move_bundle_invalid",this.name="MoveBundleInvalidError"}};async function sha256File(path14){let hash=createHash8("sha256");for await(let chunk of createReadStream(path14))hash.update(chunk);return hash.digest("hex")}var isString=value=>typeof value=="string";function leavesBundle(path14){return posix.isAbsolute(path14)||win322.isAbsolute(path14)||path14.split(/[\\/]/).includes("..")}function parseFile(value){let file=value;if(typeof file!="object"||file===null||!isString(file.path)||!isString(file.sha256))throw new MoveBundleInvalidError("a listed file is malformed");if(leavesBundle(file.path))throw new MoveBundleInvalidError(`a listed path leaves the bundle: ${file.path}`);return{path:file.path,sha256:file.sha256}}var PLAIN_ID=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function isPlainId(value){return typeof value=="string"&&PLAIN_ID.test(value)}function isMoveId(value){return isPlainId(value)}function parsePlainId(value,what){if(typeof value!="string"||!PLAIN_ID.test(value))throw new MoveBundleInvalidError(`the ${what} is not a plain id: ${JSON.stringify(value)}`);return value}function parseMoveId(value){return parsePlainId(value,"move id")}var SESSION_FILE_NAME=/^[A-Za-z0-9][A-Za-z0-9._-]*\.jsonl$/;function parseSessionFileName(value){if(!SESSION_FILE_NAME.test(value)||value.includes(".."))throw new MoveBundleInvalidError(`the session file name is not a plain file name: ${value}`);return value}var KNOWN_PAYLOAD_KINDS=new Set(["extension-state"]),EXTENSION_STATE_PREFIX="state/";function parsePayload(value){let payload=value;if(typeof payload!="object"||payload===null||!isString(payload.kind)||!Array.isArray(payload.files))throw new MoveBundleInvalidError("a payload is malformed");if(!KNOWN_PAYLOAD_KINDS.has(payload.kind))throw new MoveBundleInvalidError("it carries a payload this version cannot import");let files=payload.files.map(parseFile),outside=files.find(file=>!file.path.startsWith(EXTENSION_STATE_PREFIX));if(outside!==void 0)throw new MoveBundleInvalidError(`an extension-state file is listed outside state/: ${outside.path}`);return{kind:payload.kind,files}}async function readManifest(bundleDir){let raw;try{raw=JSON.parse(await readFile3(join24(bundleDir,MANIFEST_FILE),"utf8"))}catch(error2){throw new MoveBundleInvalidError(`manifest unreadable: ${error2 instanceof Error?error2.message:String(error2)}`)}let m=raw;if(m.format!==MOVE_BUNDLE_FORMAT)throw new MoveBundleInvalidError(`unknown bundle format ${String(m.format)}`);for(let key of["moveId","sessionId","sessionFileName","sourceCwd"])if(!isString(m[key]))throw new MoveBundleInvalidError(`missing ${key}`);let payloads=(Array.isArray(m.payloads)?m.payloads:[]).map(parsePayload),dropped=Array.isArray(m.droppedUserMessages)?m.droppedUserMessages:[];if(!dropped.every(isString))throw new MoveBundleInvalidError("malformed queued input");return{format:MOVE_BUNDLE_FORMAT,moveId:parseMoveId(m.moveId),sessionId:parsePlainId(m.sessionId,"session id"),sessionFileName:parseSessionFileName(m.sessionFileName),sourceCwd:m.sourceCwd,repository:parseRepositoryIdentity(m.repository),session:parseFile(m.session),sidecars:(Array.isArray(m.sidecars)?m.sidecars:[]).map(parseFile),droppedUserMessages:dropped,payloads}}async function verifyBundle(bundleDir,manifest){for(let file of[manifest.session,...manifest.sidecars,...manifest.payloads.flatMap(p=>p.files)]){let actual;try{actual=await sha256File(join24(bundleDir,file.path))}catch{throw new MoveBundleInvalidError(`missing ${file.path}`)}if(actual!==file.sha256)throw new MoveBundleInvalidError(`${file.path} changed in transit`)}let header2=(await readFile3(join24(bundleDir,manifest.session.path),"utf8")).split(`
|
|
177
|
+
${input.text}`},...input.images??[]]),...wakes.flatMap(wake=>partsOf(wake.message.content)),...partsOf(directive.content)],sendSettled=Promise.withResolvers(),started=ports.turnStarted(sendSettled.promise),sending=ports.send({...directive,content,display:inputs.length>0});sending.then(sendSettled.resolve,sendSettled.resolve);let turnId=await started,delivered=(async()=>{await ports.idle();try{await sending}catch(error2){return ports.sendFailed(error2),!1}return turnId===void 0||!ports.current()?!1:(ports.consume([...inputs.map(input=>input.inputId),...continues],wakes.map(wake=>wake.source)),!0)})();return{turnId,delivered}}function isSecurityNoticeState(value){return typeof value!="object"||value===null||!("generation"in value)||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0||!("notices"in value)||!Array.isArray(value.notices)?!1:value.notices.every(notice2=>typeof notice2=="object"&¬ice2!==null&&"category"in notice2&&(notice2.category==="skill-link-blocked"||notice2.category==="mcp-env-withheld")&&"message"in notice2&&typeof notice2.message=="string"&&(!("path"in notice2)||notice2.path===void 0||typeof notice2.path=="string"))}var SecurityNoticeSnapshot=class{#notices=new Map;#listeners=new Set;#generation=0;get snapshot(){return{generation:this.#generation,notices:[...this.#notices.values()]}}setResources(diagnostics){let before=JSON.stringify([...this.#notices]);for(let key of this.#notices.keys())key.startsWith("resource:")&&this.#notices.delete(key);for(let diagnostic2 of diagnostics)diagnostic2.category==="skill-link-blocked"&&this.#notices.set(`resource:${diagnostic2.path??diagnostic2.message}`,{category:"skill-link-blocked",message:diagnostic2.message,path:diagnostic2.path});before!==JSON.stringify([...this.#notices])&&this.#publish()}add(notice2){let key=`runtime:${notice2.category}:${notice2.path??notice2.message}`;JSON.stringify(this.#notices.get(key))!==JSON.stringify(notice2)&&(this.#notices.set(key,notice2),this.#publish())}accept(value){if(!(typeof value!="object"||value===null||!("message"in value)||typeof value.message!="string"||!("category"in value)||value.category!=="skill-link-blocked"&&value.category!=="mcp-env-withheld")){if("remove"in value&&value.remove===!0&&"path"in value&&typeof value.path=="string"){this.#notices.delete(`runtime:${value.category}:${value.path}`)&&this.#publish();return}this.add({category:value.category,message:value.message,..."path"in value&&typeof value.path=="string"?{path:value.path}:{}})}}subscribe(listener){return this.#listeners.add(listener),listener(this.snapshot),()=>this.#listeners.delete(listener)}dispose(){this.#listeners.clear()}#publish(){this.#generation++;let snapshot=this.snapshot;for(let listener of this.#listeners)listener(snapshot)}};var RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};function createSessionControlActions(deps){let owned=new Set,retired=!1;return{registerControlEndpoint:async options=>{let host=deps.host();if(host===void 0)return{status:"unsupported",reason:"unsupported_mode"};let registration=await host.register({...options,drain:async event=>retired?void 0:options.drain(event)});return registration.status!=="registered"?registration:retired?{status:"failed",reason:`stale extension generation after reload${await registration.dispose().then(()=>"",error2=>`; its teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`)}`}:(owned.add(registration),{...registration,dispose:async()=>{owned.delete(registration),await registration.dispose()}})},retire:async()=>{retired=!0;let registrations=[...owned];owned.clear(),await Promise.all(registrations.map(registration=>registration.dispose()))},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow(),relocationOffered:()=>deps.relocationHost()?.offered()??!1,relocationTargets:async signal=>await deps.relocationHost()?.targets(signal)??RELOCATION_NOT_OFFERED,requestRelocation:async(request2,signal)=>await deps.relocationHost()?.request(request2,signal)??RELOCATION_NOT_OFFERED}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized")),relocationOffered:notBound,relocationTargets:()=>Promise.reject(new Error("Extension runtime not initialized")),requestRelocation:()=>Promise.reject(new Error("Extension runtime not initialized"))}}function isAssistantEntry(entry2){return entry2.type==="message"&&entry2.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry2 of entries){if(entry2.type==="message"&&entry2.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry2))continue;let{message}=entry2;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry2.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var THINKING_LEVELS=new Set(["off","minimal","low","medium","high","xhigh","max"]);function isThinkingLevel(value){return typeof value=="string"&&THINKING_LEVELS.has(value)}function modelThinkingKey(model){return`${model.provider}/${model.id}`}function deriveSessionModelThinkingLevels(path14){let levels={};for(let entry2 of path14)entry2.type==="thinking_level_change"&&(typeof entry2.provider!="string"||typeof entry2.modelId!="string"||isThinkingLevel(entry2.thinkingLevel)&&(levels[modelThinkingKey({provider:entry2.provider,id:entry2.modelId})]=entry2.thinkingLevel));return levels}var SessionThinkingMemory=class{constructor(source2){this.source=source2}levels(){let leafId=this.source.getLeafId();return this.cached?.leafId!==leafId&&(this.cached={leafId,levels:deriveSessionModelThinkingLevels(this.source.getBranch())}),{...this.cached.levels}}levelFor(model){return this.levels()[modelThinkingKey(model)]}};import{randomBytes as randomBytes2}from"node:crypto";import{cp,mkdir as mkdir4,readdir as readdir2,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{basename as basename10,dirname as dirname22,join as join25}from"node:path";import{accessSync,constants}from"node:fs";import{access as access2}from"node:fs/promises";var NARROW_NO_BREAK_SPACE="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function unquotedPath(filePath){return/^@?(["'])(.+)\1$/.exec(filePath.trim())?.[2]}function fileExists(filePath){try{return accessSync(filePath,constants.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access2(filePath,constants.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPath(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPathAsync(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}import{createHash as createHash8}from"node:crypto";import{createReadStream}from"node:fs";import{readFile as readFile3}from"node:fs/promises";import{join as join24,posix,win32 as win322}from"node:path";var MOVE_BUNDLE_FORMAT=1,MANIFEST_FILE="manifest.json",SESSION_BUNDLE_PATH="files/session.jsonl",MoveBundleInvalidError=class extends Error{constructor(detail){super(`The moved session could not be verified (${detail}); it was not imported. The original device keeps it.`),this.code="move_bundle_invalid",this.name="MoveBundleInvalidError"}};async function sha256File(path14){let hash=createHash8("sha256");for await(let chunk of createReadStream(path14))hash.update(chunk);return hash.digest("hex")}var isString=value=>typeof value=="string";function leavesBundle(path14){return posix.isAbsolute(path14)||win322.isAbsolute(path14)||path14.split(/[\\/]/).includes("..")}function parseFile(value){let file=value;if(typeof file!="object"||file===null||!isString(file.path)||!isString(file.sha256))throw new MoveBundleInvalidError("a listed file is malformed");if(leavesBundle(file.path))throw new MoveBundleInvalidError(`a listed path leaves the bundle: ${file.path}`);return{path:file.path,sha256:file.sha256}}var PLAIN_ID=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function isPlainId(value){return typeof value=="string"&&PLAIN_ID.test(value)}function isMoveId(value){return isPlainId(value)}function parsePlainId(value,what){if(typeof value!="string"||!PLAIN_ID.test(value))throw new MoveBundleInvalidError(`the ${what} is not a plain id: ${JSON.stringify(value)}`);return value}function parseMoveId(value){return parsePlainId(value,"move id")}var SESSION_FILE_NAME=/^[A-Za-z0-9][A-Za-z0-9._-]*\.jsonl$/;function parseSessionFileName(value){if(!SESSION_FILE_NAME.test(value)||value.includes(".."))throw new MoveBundleInvalidError(`the session file name is not a plain file name: ${value}`);return value}var KNOWN_PAYLOAD_KINDS=new Set(["extension-state"]),EXTENSION_STATE_PREFIX="state/";function parsePayload(value){let payload=value;if(typeof payload!="object"||payload===null||!isString(payload.kind)||!Array.isArray(payload.files))throw new MoveBundleInvalidError("a payload is malformed");if(!KNOWN_PAYLOAD_KINDS.has(payload.kind))throw new MoveBundleInvalidError("it carries a payload this version cannot import");let files=payload.files.map(parseFile),outside=files.find(file=>!file.path.startsWith(EXTENSION_STATE_PREFIX));if(outside!==void 0)throw new MoveBundleInvalidError(`an extension-state file is listed outside state/: ${outside.path}`);return{kind:payload.kind,files}}async function readManifest(bundleDir){let raw;try{raw=JSON.parse(await readFile3(join24(bundleDir,MANIFEST_FILE),"utf8"))}catch(error2){throw new MoveBundleInvalidError(`manifest unreadable: ${error2 instanceof Error?error2.message:String(error2)}`)}let m=raw;if(m.format!==MOVE_BUNDLE_FORMAT)throw new MoveBundleInvalidError(`unknown bundle format ${String(m.format)}`);for(let key of["moveId","sessionId","sessionFileName","sourceCwd"])if(!isString(m[key]))throw new MoveBundleInvalidError(`missing ${key}`);let payloads=(Array.isArray(m.payloads)?m.payloads:[]).map(parsePayload),dropped=Array.isArray(m.droppedUserMessages)?m.droppedUserMessages:[];if(!dropped.every(isString))throw new MoveBundleInvalidError("malformed queued input");return{format:MOVE_BUNDLE_FORMAT,moveId:parseMoveId(m.moveId),sessionId:parsePlainId(m.sessionId,"session id"),sessionFileName:parseSessionFileName(m.sessionFileName),sourceCwd:m.sourceCwd,repository:parseRepositoryIdentity(m.repository),session:parseFile(m.session),sidecars:(Array.isArray(m.sidecars)?m.sidecars:[]).map(parseFile),droppedUserMessages:dropped,payloads}}async function verifyBundle(bundleDir,manifest){for(let file of[manifest.session,...manifest.sidecars,...manifest.payloads.flatMap(p=>p.files)]){let actual;try{actual=await sha256File(join24(bundleDir,file.path))}catch{throw new MoveBundleInvalidError(`missing ${file.path}`)}if(actual!==file.sha256)throw new MoveBundleInvalidError(`${file.path} changed in transit`)}let header2=(await readFile3(join24(bundleDir,manifest.session.path),"utf8")).split(`
|
|
178
178
|
`,1)[0]??"",id;try{id=JSON.parse(header2).id}catch{id=void 0}if(id!==manifest.sessionId)throw new MoveBundleInvalidError("the session file's own id does not match the bundle's session id")}var EXTENSION_STATE_PAYLOAD="extension-state",MOVED_STATE_RESTORED="session_move_state_restored",STATE_ATTEMPT_FIELD="state_attempt",MOVE_STATE=".move-state",DELIVERED_MARKER="delivered",DELIVERY_COPY="attempt-",newAttempt=()=>randomBytes2(8).toString("hex");function outgoingStateDir(sessionFile,moveId){return join25(dirname22(sessionFile),MOVE_STATE,"out",parseMoveId(moveId))}function movedStateDir(sessionFile,moveId){return join25(dirname22(sessionFile),MOVE_STATE,"in",`${basename10(sessionFile,".jsonl")}.${parseMoveId(moveId)}`)}var field=(entry2,name)=>{let{data}=entry2;if(typeof data!="object"||data===null||!(name in data))return;let value=Reflect.get(data,name);return typeof value=="string"?value:void 0},moveIdOf=entry2=>field(entry2,"move_id");function sealedAttempt(entries,moveId){let seal=entries.findLast(entry2=>entry2.type==="custom"&&entry2.customType===SESSION_RELEASED&&moveIdOf(entry2)===moveId),attempt2=seal===void 0?void 0:field(seal,STATE_ATTEMPT_FIELD);return isPlainId(attempt2)?attempt2:void 0}async function sealedOutgoingStateDir(sessionFile,moveId){let attempt2=sealedAttempt(await loadEntriesFromFileAsync(sessionFile),moveId);return attempt2===void 0?void 0:join25(outgoingStateDir(sessionFile,moveId),attempt2)}async function prepareOutgoingState(sessionFile,moveId){let root=outgoingStateDir(sessionFile,moveId),sealed=sealedAttempt(await loadEntriesFromFileAsync(sessionFile),moveId);if(await pathExists(root))for(let name of await readdir2(root))name!==sealed&&await rm3(join25(root,name),{recursive:!0,force:!0});let attempt2=newAttempt(),dir=join25(root,attempt2);return await mkdir4(dir,{recursive:!0}),{attempt:attempt2,dir}}async function pendingMovedState(sessionFile){if(!await pathExists(sessionFile))return;let entries=await loadEntriesFromFileAsync(sessionFile),movedIn=entries.findLast(entry2=>entry2.type==="custom"&&entry2.customType===SESSION_MOVED_IN),moveId=movedIn===void 0?void 0:moveIdOf(movedIn);if(moveId===void 0||entries.some(entry2=>entry2.type==="custom"&&entry2.customType===MOVED_STATE_RESTORED&&moveIdOf(entry2)===moveId))return;let id=parseMoveId(moveId),dir=movedStateDir(sessionFile,id);return await pathExists(dir)?{moveId:id,dir}:void 0}var deliveryDir=pendingDir=>join25(dirname22(dirname22(pendingDir)),"delivery",basename10(pendingDir));async function restoreMovedState(sessionManager,deliver3){let sessionFile=sessionManager.getSessionFile();if(sessionFile===void 0)return;let pending=await pendingMovedState(sessionFile);if(pending===void 0)return;let bookkeeping=deliveryDir(pending.dir),marker=join25(bookkeeping,DELIVERED_MARKER),redelivered=await pathExists(marker);if(await pathExists(bookkeeping))for(let name of await readdir2(bookkeeping))name.startsWith(DELIVERY_COPY)&&await rm3(join25(bookkeeping,name),{recursive:!0,force:!0});await mkdir4(bookkeeping,{recursive:!0}),await writeFile3(marker,"");let copy=join25(bookkeeping,`${DELIVERY_COPY}${newAttempt()}`);await cp(pending.dir,copy,{recursive:!0});let restored;try{restored=await deliver3({moveId:pending.moveId,dir:copy,redelivered})}finally{await rm3(copy,{recursive:!0,force:!0})}restored&&(sessionManager.appendCustomEntry(MOVED_STATE_RESTORED,{move_id:pending.moveId,restored_at:new Date().toISOString()}),await rm3(pending.dir,{recursive:!0,force:!0}),await rm3(bookkeeping,{recursive:!0,force:!0}))}var REASONING_MANDATORY_ERROR=/reasoning is mandatory/i;function initialTitleReasoning(model){if(!model.reasoning)return;let levels=getSupportedThinkingLevels(model);if(!levels.includes("off"))return asReasoningLevel(levels[0])}function mandatoryReasoningRetryLevel(model,sentReasoning,errorMessage6){if(!(sentReasoning!==void 0||errorMessage6===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage6))return asReasoningLevel(clampThinkingLevel(model,"low"))}function asReasoningLevel(level){return level===void 0||level==="off"?void 0:level}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
179
179
|
|
|
180
180
|
Rules:
|
|
@@ -755,7 +755,7 @@ ${diagnostic2}`;return new ConnectError(redactResolvedReferenceValues(message),{
|
|
|
755
755
|
${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(`
|
|
756
756
|
`))}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}
|
|
757
757
|
${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(resolve55=>{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)=>{resolve55({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(`
|
|
758
|
-
`)}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 errorMessage4=error2=>error2 instanceof Error?error2.message:String(error2);function mcpTransportSpec(options){return options.config.type==="stdio"?stdioSpec(options):httpSpec(options)}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",projectPolicy:options.projectPolicy,resolveBeforeStart:options.resolveProjectPolicy===void 0?void 0:async()=>{let current=await options.resolveProjectPolicy?.();if(current===void 0)throw new ConnectError("Project MCP policy is no longer available",{phase:"create",retriable:!0,serverName:options.serverName});return stdioSpec({...options,...current,resolveProjectPolicy:void 0})}}}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 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 SHUTDOWN_GRACE_MS=100,SHUTDOWN_TERM_WAIT_MS=400,SHUTDOWN_FINAL_WAIT_MS=500,SHUTDOWN_CLOSE_WAIT_MS=400;function createMcpTransport(options){let spec2=mcpTransportSpec(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 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()=>{let materializeWith=current=>import("./dispatch-NYAULNVW.js").then(({materializeNegotiatedTransport})=>materializeNegotiatedTransport({elicitationUiProvider:options.elicitationUiProvider,elicitationEnabled:options.elicitationEnabled,logger:options.logger,onStart:captureRootPid,sink:asyncErrorSink,spec:current},options.serverName,connectTimeoutMs,abort.signal)),{resolveConfig:resolveConfig2}=options;pending??=resolveConfig2===void 0?materializeWith(spec2):resolveConfig2().then(config=>materializeWith(mcpTransportSpec({...options,config}))),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}:{}}}var 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;#elicitationEnabled;#resolveConfig;#projectPolicy;#policyAbort;#requestLifetime=new AbortController;get requestLifetimeSignal(){return this.#requestLifetime.signal}#startedGrantNames=[];#state;#generation=0;#connection;#pendingConnection;#pendingConnect;#renegotiatingForms;#stopFormReadiness;#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.#elicitationEnabled=options.elicitationEnabled,this.#resolveConfig=options.resolveConfig,this.#projectPolicy=options.projectPolicy,this.#startedGrantNames=options.projectPolicy?.initial.grantedNames??[],this.#state=options.config.enabled?"idle":"disabled"}get state(){return this.#state}get declarationIdentity(){return this.#projectPolicy?.identity}get projectPolicy(){return this.#projectPolicy}get startedGrantNames(){return this.#startedGrantNames}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(){return this.#renegotiatingForms??this.#connect()}#legacyFormsChanged(client){return this.#elicitationUiProvider?.enforced?.()===!0&&!isModernMcpClient(client)&&legacyMcpFormsAdvertised(client)!==legacyMcpFormEligible(this.#elicitationUiProvider,this.#elicitationEnabled!==!1)}#refreshLegacyForms(){this.#state!=="connected"||this.#renegotiatingForms||!this.#legacyFormsChanged(this.client)||(this.#renegotiatingForms=Promise.resolve().then(()=>this.renew()).finally(()=>{this.#renegotiatingForms=void 0}),this.#renegotiatingForms.catch(error2=>{this.markDegraded(error2 instanceof Error?error2:new Error(String(error2)))}))}#connect(){if(this.#state==="disabled")return Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`,"connect"));if(this.#elicitationUiProvider?.enforced?.()&&(this.#stopFormReadiness??=this.#elicitationUiProvider.subscribe?.(()=>this.#refreshLegacyForms())),this.#state==="connected")return Promise.resolve(this.client);if(this.#pendingConnect)return this.#pendingConnect;let generation2=this.#generation,attempt2;if(this.#projectPolicy!==void 0)attempt2=this.#openProjectConnection(generation2);else try{attempt2=this.#openConnection(this.#createTransportConnection(),generation2)}catch(error2){return Promise.reject(error2)}return this.#pendingConnect=attempt2.finally(()=>{this.#pendingConnect!==void 0&&generation2===this.#generation&&(this.#pendingConnect=void 0)}),generation2===this.#generation&&this.#setState("connecting"),this.#pendingConnect}async#openProjectConnection(generation2){let policy=this.#projectPolicy;if(policy===void 0)throw this.#connectError("Missing project MCP policy","create");let abort=new AbortController;this.#policyAbort=abort;try{let resolved=await policy.resolve(abort.signal);if(abort.signal.aborted||generation2!==this.#generation)throw this.#connectError("Project MCP materialization was invalidated; retry","connect",!0);return this.#startedGrantNames=resolved.grantedNames,await this.#openConnection(this.#createTransportConnection(resolved),generation2)}catch(error2){throw abort.signal.aborted||generation2!==this.#generation?this.#connectError("Project MCP materialization was invalidated; retry","connect",!0):error2}}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.#policyAbort?.abort(),this.#requestLifetime.abort(),this.#requestLifetime=new AbortController,this.#generation++,this.#pendingConnect=void 0,this.#setState("idle"),await this.#disposeOwnedConnections(),this.#connect()}bumpGeneration(){return this.#requestLifetime.abort(),this.#requestLifetime=new AbortController,this.#policyAbort?.abort(),this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#state!=="disabled"&&this.#setState("idle"),this.#disposeOwnedConnections()}disable(){return this.#stopFormReadiness?.(),this.#stopFormReadiness=void 0,this.#requestLifetime.abort(),this.#policyAbort?.abort(),this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#setState("disabled"),this.#disposeOwnedConnections()}async dispose(){this.#stopFormReadiness?.(),this.#stopFormReadiness=void 0,this.#requestLifetime.abort(),this.#policyAbort?.abort(),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(resolved){let projectAbort=this.#policyAbort,authProvider=resolved===void 0?this.#authProvider:resolveServerAuth({agentDir:this.#projectPolicy===void 0?void 0:dirname46(this.#projectPolicy.storePath),config:resolved.config,env:resolved.env,logger:this.#logger,serverName:this.serverName}).provider;return createMcpTransport({authProvider,config:resolved?.config??this.#config,env:resolved?.env??this.#env,projectPolicy:resolved!==void 0,resolveProjectPolicy:resolved===void 0?void 0:async()=>{let policy=this.#projectPolicy,abort=projectAbort;if(policy===void 0||abort===void 0)throw this.#connectError("Project MCP policy is no longer available","create",!0);let current=await policy.resolve(abort.signal,!1);return abort.signal.throwIfAborted(),this.#startedGrantNames=current.grantedNames,current},elicitationUiProvider:this.#elicitationUiProvider,elicitationEnabled:this.#elicitationEnabled,logger:this.#logger,resolveConfig:this.#resolveConfig,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.#legacyFormsChanged(connection.client)?this.renew():(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(state3,error2){if(this.#state===state3)return;let previousState=this.#state;this.#state=state3,this.#emit(this.#stateListeners,{type:"state_changed",serverName:this.serverName,previousState,state:state3,generation:this.#generation,error:error2})}#emit(listeners3,event){for(let listener of listeners3)wrapAsync("connection.event",listener,this.#sink)(event)}#markFailure(state3,error2){this.#state!=="disabled"&&(this.#lastError=error2,this.#setState(state3,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;#requestLifetime=new AbortController;get requestLifetimeSignal(){return this.#requestLifetime.signal}#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}}),registerMcpClientAlias(this.#client,physical)}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.#requestLifetime.abort(),this.#requestLifetime=new AbortController,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.#released||this.shared.connection.markDegraded(error2)}markSuspended(error2){this.#released||this.shared.connection.markSuspended(error2)}markNeedsAuth(error2){this.#released||this.shared.connection.markNeedsAuth(error2)}markNeedsClientRegistration(error2){this.#released||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.#requestLifetime.abort(),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:entry2,pi}=options,claim2={cachedCatalog:entry2.cachedCatalog,ownsRegistration:()=>pi!==void 0&&options.shouldRefreshTools(),settled:()=>connect};entry2.startupCatalogClaim=claim2;let releaseClaim=()=>{entry2.startupCatalogClaim===claim2&&(entry2.startupCatalogClaim=void 0)},connect=ignoreStartupNeedsAuth(entry2,connectAndRefreshMcpCatalog(entry2,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(entry2,serverConfig){let pending=catalogRefreshes.get(entry2);if(pending!==void 0)return pending;let refresh=refreshConnectedMcpCatalog(entry2,serverConfig);catalogRefreshes.set(entry2,refresh);let finish=()=>{catalogRefreshes.get(entry2)===refresh&&catalogRefreshes.delete(entry2)};return refresh.then(finish,finish),refresh}async function refreshConnectedMcpCatalog(entry2,serverConfig){if(serverConfig===void 0||entry2.isCurrent?.()===!1)return;try{await entry2.authPlan?.refresh?.ensureFresh()}catch(error2){if(entry2.connection.state==="disabled")return;let authError=markMcpConnectionNeedsAuth(entry2.connection,error2);throw authError!==void 0?(entry2.logger.warn(authError.message),authError):error2}if(entry2.credentialsCurrent?.()===!1){await entry2.onCredentialsChanged?.();return}if(await connectMcpServer(entry2.connection,entry2.logger),entry2.connection.state!=="connected"||entry2.isCurrent?.()===!1)return;let generation2=entry2.connection.generation,ownsCatalog=()=>entry2.isCurrent?.()!==!1&&entry2.credentialsCurrent?.()!==!1&&entry2.connection.state==="connected"&&entry2.connection.generation===generation2;if(entry2.connection instanceof SharedMcpLease){let catalog=await entry2.connection.catalog();if(!ownsCatalog()){entry2.credentialsCurrent?.()===!1&&await entry2.onCredentialsChanged?.();return}entry2.cachedCatalog=catalog,entry2.catalogGeneration=generation2,entry2.cacheRefreshedAfterConnect=!0;return}if(!(entry2.cacheRefreshedAfterConnect&&entry2.catalogGeneration===generation2))try{let catalog=await collectServerCatalogForCache(entry2.connection,serverConfig,entry2.generationHash??entry2.configHash,entry2.credentialIdentity);if(!ownsCatalog()){entry2.credentialsCurrent?.()===!1&&await entry2.onCredentialsChanged?.();return}entry2.cachedCatalog=catalog,entry2.catalogGeneration=generation2,entry2.cacheRefreshedAfterConnect=!0,await writeMcpCachedServer(entry2.agentDir,entry2.name,catalog,ownsCatalog),ownsCatalog()&&await ensureMcpResourceSubscriptions(entry2.connection.client,catalog.resources??[])}catch(error2){entry2.logger.warn("Failed to refresh MCP catalog cache",{error:error2 instanceof Error?error2.message:String(error2)})}}async function connectMcpServer(connection,logger){let generation2=connection.generation;try{await connection.connect()}catch(error2){if(connection.state==="disabled"||connection.generation!==generation2)return;let failure2=error2 instanceof Error?error2:new Error(String(error2));connection.lastError===void 0&&connection.markDegraded(failure2),logger?.warn(failure2.message)}}async function ignoreStartupNeedsAuth(entry2,connect){try{await connect}catch(error2){if(entry2.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(resolve55=>{timeout=safeTimer("startup.race",deadlineMs,()=>resolve55("timeout"),{logger:createMcpLogger("startup")})})])}finally{timeout!==void 0&&clearTimeout(timeout)}}function shouldRaceMcpStartup(lifecycle){return lifecycle==="eager"||lifecycle==="keep-alive"}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 mcpServerReferences(name,server){let found=[],visit=(value,field3)=>{isConfigReference(value)&&found.push({field:`mcpServers.${name}.${field3}`,reference:value})};for(let[key,value]of Object.entries(server.headers??{}))visit(value,`headers.${key}`);for(let[key,value]of Object.entries(server.env??{}))visit(value,`env.${key}`);for(let[index,value]of(server.args??[]).entries())visit(value,`args.${index}`);return found}function rememberMcpReferenceOrigins(servers,origin){for(let[name,server]of Object.entries(servers??{}))for(let{field:field3,reference:reference3}of mcpServerReferences(name,server))rememberConfigReferenceOrigin(reference3,{origin,authority:"trusted",field:field3})}function refuseMcpReferences(name,server){let[first]=mcpServerReferences(name,server);if(first!==void 0)throw new ConfigReferenceError(first.field,first.reference,"forbidden")}var strings2=record10=>Object.fromEntries(Object.entries(record10).filter(entry2=>typeof entry2[1]=="string"));function plainMcpDeclaration(name,server){refuseMcpReferences(name,server);let{args,env,headers,...rest}=server;return{...rest,...args===void 0?{}:{args:args.filter(arg=>typeof arg=="string")},...env===void 0?{}:{env:strings2(env)},...headers===void 0?{}:{headers:strings2(headers)}}}function plainMcpServerConfig(name,server){refuseMcpReferences(name,server);let{args,env,headers,...rest}=server;return{...rest,args:args.filter(arg=>typeof arg=="string"),...env===void 0?{}:{env:strings2(env)},...headers===void 0?{}:{headers:strings2(headers)}}}var LogLevelSchema=typebox_exports.Union([typebox_exports.Literal("debug"),typebox_exports.Literal("info"),typebox_exports.Literal("notice"),typebox_exports.Literal("warning"),typebox_exports.Literal("error"),typebox_exports.Literal("critical"),typebox_exports.Literal("alert"),typebox_exports.Literal("emergency")]),OAuthSchema=typebox_exports.Object({clientId:typebox_exports.Optional(typebox_exports.String()),callbackPort:typebox_exports.Optional(typebox_exports.Integer({minimum:0,maximum:65535})),scopes:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),clientMetadataUrl:typebox_exports.Optional(typebox_exports.String()),flow:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("code"),typebox_exports.Literal("client_credentials")]))},{additionalProperties:!1}),ServerSchema=typebox_exports.Object({type:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("stdio"),typebox_exports.Literal("http")])),url:typebox_exports.Optional(typebox_exports.String()),command:typebox_exports.Optional(typebox_exports.String()),args:typebox_exports.Optional(typebox_exports.Array(ConfigValueSchema)),env:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),cwd:typebox_exports.Optional(typebox_exports.String()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),auth:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("bearer"),typebox_exports.Literal("oauth"),typebox_exports.Literal(!1)])),bearerTokenEnv:typebox_exports.Optional(typebox_exports.String()),oauth:typebox_exports.Optional(OAuthSchema),enabled:typebox_exports.Optional(typebox_exports.Boolean()),lifecycle:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("lazy"),typebox_exports.Literal("eager"),typebox_exports.Literal("keep-alive")])),idleTimeoutMin:typebox_exports.Optional(typebox_exports.Number()),requestTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),connectTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),startupTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),includeTools:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),excludeTools:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),directTools:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Boolean(),typebox_exports.Array(typebox_exports.String())])),exposure:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("direct"),typebox_exports.Literal("search"),typebox_exports.Literal("proxy")])),logLevel:typebox_exports.Optional(LogLevelSchema)},{additionalProperties:!1}),SettingsSchema=typebox_exports.Object({toolPrefix:typebox_exports.Optional(typebox_exports.String()),searchThreshold:typebox_exports.Optional(typebox_exports.Number()),outputGuard:typebox_exports.Optional(typebox_exports.Object({maxBytes:typebox_exports.Optional(typebox_exports.Number()),maxLines:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number())},{additionalProperties:!1})),importConfigs:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Literal("claude"))),oauthCallbackUrl:typebox_exports.Optional(typebox_exports.String()),stubSwap:typebox_exports.Optional(typebox_exports.Boolean()),nativeToolSearch:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Boolean()]))},{additionalProperties:!1}),ConfigSchema=typebox_exports.Object({settings:typebox_exports.Optional(SettingsSchema),mcpServers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ServerSchema))},{additionalProperties:!1});function getServerEndpointValidationError(config){for(let[name,server]of Object.entries(config.mcpServers??{})){if(server.enabled===!1)continue;let type2=server.type??(server.url?"http":"stdio");if(type2==="stdio"&&(server.command===void 0||server.command.trim().length===0))return`mcpServers.${name}.command: Required for enabled stdio server`;if(type2==="http"&&(server.url===void 0||server.url.trim().length===0))return`mcpServers.${name}.url: Required for enabled http server`}}var validateConfig=Compile(ConfigSchema),validateServer=Compile(ServerSchema);function validateMcpServerDeclaration(name,raw){if(!validateServer.Check(raw)){let error2=Array.from(validateServer.Errors(raw))[0],path14=error2.instancePath.replace(/^\//,"").split("/").map(p=>p.replace(/~1/g,"/").replace(/~0/g,"~")).join(".")||"$",message=error2.message==="must be array"?"Expected array":error2.message;return`Invalid MCP server declaration "${name}": ${path14}: ${message}`}let server=raw,endpointError=getServerEndpointValidationError({mcpServers:{[name]:server}});return endpointError?`Invalid MCP server declaration "${name}": ${endpointError}`:null}var defaultSettings={outputGuard:{maxBytes:50*1024,maxLines:2e3},searchThreshold:10,toolPrefix:"mcp"};import{createHash as createHash21}from"node:crypto";var sessionDependent=new WeakSet,sessionVariable=/(?:cwd|session|^PWD$|^OLDPWD$)/i,sessionTemplate=/\$\{[^}]*(?:cwd|session|PWD)[^}]*\}/i;function inheritMcpSharingScope(source2,target){(sessionDependent.has(source2)||hasSessionValues(source2))&&sessionDependent.add(target)}function hasSessionValues(config,cwd){let values=[config.command,...config.args??[],...Object.values(config.env??{})];return Object.keys(config.env??{}).some(key=>sessionVariable.test(key))||[...values,config.cwd].some(value=>typeof value=="string"&&sessionTemplate.test(value))||cwd!==void 0&&values.some(value=>typeof value=="string"&&value.includes(cwd))}function shareable(config,cwd){return config.type==="http"||!sessionDependent.has(config)&&!hasSessionValues(config,cwd)}function sharedMcpKey(options,agentDir){let{config,env}=options,bearer=config.bearerTokenEnv,identity={...options.projectPolicy===void 0?{}:{declarationDigest:options.projectPolicy.identity,policyDigest:options.projectPolicy.policyDigest,skillAuthorityDigest:options.projectPolicy.provenanceDigest},credentialIdentity:options.credentialIdentity,agentDir,name:options.serverName,type:config.type,url:config.type==="http"?config.url:void 0,command:config.type==="stdio"?config.command:void 0,args:config.type==="stdio"?config.args:void 0,cwd:config.type==="stdio"?config.cwd??process.cwd():void 0,env:config.type==="stdio"?{...env,...config.env}:void 0,headers:config.headers,auth:config.auth,oauth:config.oauth,bearer:bearer===void 0?void 0:env?.[bearer]??process.env[bearer],connectTimeoutMs:config.connectTimeoutMs,logLevel:config.logLevel};return createHash21("sha256").update(stableJson(identity)).digest("hex")}function stableJson(value){return Array.isArray(value)?`[${value.map(stableJson).join(",")}]`:value!==null&&typeof value=="object"?`{${Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,item])=>`${JSON.stringify(key)}:${stableJson(item)}`).join(",")}}`:JSON.stringify(value)??"null"}function resolveExtensionMcpServer(name,raw,sourcePath,registrationCwd){refuseMcpReferences(name,raw);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}.`);try{result3.servers[decl.name]=resolveExtensionMcpServer(decl.name,decl.config,decl.extensionPath,decl.registrationCwd)}catch(error2){if(!(error2 instanceof ConfigReferenceError))throw error2;result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped: ${error2.message}`)}}}var trustedEnv=process.env;function loadMcpConfig(options){let agentDir=options.agentDir??getAgentDir(),env=options.env??trustedEnv,globalPath=join57(agentDir,"mcp.json"),projectPath=join57(options.cwd,CONFIG_DIR_NAME,"mcp.json"),claudePath=join57(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,{source:item.source,sourcePath:item.path,agentDir});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 rememberMcpReferenceOrigins(config?.mcpServers,path14),config}function readConfigJson(path14,trusted){if(!existsSync27(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,origin){for(let[name,server]of Object.entries(servers)){let config=normalizeServer(server);inheritMcpSharingScope(server,config),result3.servers[name]={config,configHash:hashConfig(config,origin.agentDir),name,source:origin.source,sourcePath:origin.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 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 getGlobalMcpConfigPath(agentDir=getAgentDir()){return join58(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(!existsSync28(path14))return{};let raw=JSON.parse(readFileSync33(path14,"utf8"));return assertValidConfig(raw),raw}function writeValidatedConfig(path14,config){assertValidConfig(config),mkdirSync17(dirname47(path14),{recursive:!0}),writeFileSync17(path14,`${JSON.stringify(config,null,2)}
|
|
758
|
+
`)}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 errorMessage4=error2=>error2 instanceof Error?error2.message:String(error2);function mcpTransportSpec(options){return options.config.type==="stdio"?stdioSpec(options):httpSpec(options)}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",projectPolicy:options.projectPolicy,resolveBeforeStart:options.resolveProjectPolicy===void 0?void 0:async()=>{let current=await options.resolveProjectPolicy?.();if(current===void 0)throw new ConnectError("Project MCP policy is no longer available",{phase:"create",retriable:!0,serverName:options.serverName});return stdioSpec({...options,...current,resolveProjectPolicy:void 0})}}}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 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 SHUTDOWN_GRACE_MS=100,SHUTDOWN_TERM_WAIT_MS=400,SHUTDOWN_FINAL_WAIT_MS=500,SHUTDOWN_CLOSE_WAIT_MS=400;function createMcpTransport(options){let spec2=mcpTransportSpec(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 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()=>{let materializeWith=current=>import("./dispatch-MXG5YWLV.js").then(({materializeNegotiatedTransport})=>materializeNegotiatedTransport({elicitationUiProvider:options.elicitationUiProvider,elicitationEnabled:options.elicitationEnabled,logger:options.logger,onStart:captureRootPid,sink:asyncErrorSink,spec:current},options.serverName,connectTimeoutMs,abort.signal)),{resolveConfig:resolveConfig2}=options;pending??=resolveConfig2===void 0?materializeWith(spec2):resolveConfig2().then(config=>materializeWith(mcpTransportSpec({...options,config}))),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}:{}}}var 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;#elicitationEnabled;#resolveConfig;#projectPolicy;#policyAbort;#requestLifetime=new AbortController;get requestLifetimeSignal(){return this.#requestLifetime.signal}#startedGrantNames=[];#state;#generation=0;#connection;#pendingConnection;#pendingConnect;#renegotiatingForms;#stopFormReadiness;#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.#elicitationEnabled=options.elicitationEnabled,this.#resolveConfig=options.resolveConfig,this.#projectPolicy=options.projectPolicy,this.#startedGrantNames=options.projectPolicy?.initial.grantedNames??[],this.#state=options.config.enabled?"idle":"disabled"}get state(){return this.#state}get declarationIdentity(){return this.#projectPolicy?.identity}get projectPolicy(){return this.#projectPolicy}get startedGrantNames(){return this.#startedGrantNames}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(){return this.#renegotiatingForms??this.#connect()}#legacyFormsChanged(client){return this.#elicitationUiProvider?.enforced?.()===!0&&!isModernMcpClient(client)&&legacyMcpFormsAdvertised(client)!==legacyMcpFormEligible(this.#elicitationUiProvider,this.#elicitationEnabled!==!1)}#refreshLegacyForms(){this.#state!=="connected"||this.#renegotiatingForms||!this.#legacyFormsChanged(this.client)||(this.#renegotiatingForms=Promise.resolve().then(()=>this.renew()).finally(()=>{this.#renegotiatingForms=void 0}),this.#renegotiatingForms.catch(error2=>{this.markDegraded(error2 instanceof Error?error2:new Error(String(error2)))}))}#connect(){if(this.#state==="disabled")return Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`,"connect"));if(this.#elicitationUiProvider?.enforced?.()&&(this.#stopFormReadiness??=this.#elicitationUiProvider.subscribe?.(()=>this.#refreshLegacyForms())),this.#state==="connected")return Promise.resolve(this.client);if(this.#pendingConnect)return this.#pendingConnect;let generation2=this.#generation,attempt2;if(this.#projectPolicy!==void 0)attempt2=this.#openProjectConnection(generation2);else try{attempt2=this.#openConnection(this.#createTransportConnection(),generation2)}catch(error2){return Promise.reject(error2)}return this.#pendingConnect=attempt2.finally(()=>{this.#pendingConnect!==void 0&&generation2===this.#generation&&(this.#pendingConnect=void 0)}),generation2===this.#generation&&this.#setState("connecting"),this.#pendingConnect}async#openProjectConnection(generation2){let policy=this.#projectPolicy;if(policy===void 0)throw this.#connectError("Missing project MCP policy","create");let abort=new AbortController;this.#policyAbort=abort;try{let resolved=await policy.resolve(abort.signal);if(abort.signal.aborted||generation2!==this.#generation)throw this.#connectError("Project MCP materialization was invalidated; retry","connect",!0);return this.#startedGrantNames=resolved.grantedNames,await this.#openConnection(this.#createTransportConnection(resolved),generation2)}catch(error2){throw abort.signal.aborted||generation2!==this.#generation?this.#connectError("Project MCP materialization was invalidated; retry","connect",!0):error2}}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.#policyAbort?.abort(),this.#requestLifetime.abort(),this.#requestLifetime=new AbortController,this.#generation++,this.#pendingConnect=void 0,this.#setState("idle"),await this.#disposeOwnedConnections(),this.#connect()}bumpGeneration(){return this.#requestLifetime.abort(),this.#requestLifetime=new AbortController,this.#policyAbort?.abort(),this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#state!=="disabled"&&this.#setState("idle"),this.#disposeOwnedConnections()}disable(){return this.#stopFormReadiness?.(),this.#stopFormReadiness=void 0,this.#requestLifetime.abort(),this.#policyAbort?.abort(),this.#generation++,this.#pendingConnect=void 0,this.#lastError=void 0,this.#setState("disabled"),this.#disposeOwnedConnections()}async dispose(){this.#stopFormReadiness?.(),this.#stopFormReadiness=void 0,this.#requestLifetime.abort(),this.#policyAbort?.abort(),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(resolved){let projectAbort=this.#policyAbort,authProvider=resolved===void 0?this.#authProvider:resolveServerAuth({agentDir:this.#projectPolicy===void 0?void 0:dirname46(this.#projectPolicy.storePath),config:resolved.config,env:resolved.env,logger:this.#logger,serverName:this.serverName}).provider;return createMcpTransport({authProvider,config:resolved?.config??this.#config,env:resolved?.env??this.#env,projectPolicy:resolved!==void 0,resolveProjectPolicy:resolved===void 0?void 0:async()=>{let policy=this.#projectPolicy,abort=projectAbort;if(policy===void 0||abort===void 0)throw this.#connectError("Project MCP policy is no longer available","create",!0);let current=await policy.resolve(abort.signal,!1);return abort.signal.throwIfAborted(),this.#startedGrantNames=current.grantedNames,current},elicitationUiProvider:this.#elicitationUiProvider,elicitationEnabled:this.#elicitationEnabled,logger:this.#logger,resolveConfig:this.#resolveConfig,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.#legacyFormsChanged(connection.client)?this.renew():(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(state3,error2){if(this.#state===state3)return;let previousState=this.#state;this.#state=state3,this.#emit(this.#stateListeners,{type:"state_changed",serverName:this.serverName,previousState,state:state3,generation:this.#generation,error:error2})}#emit(listeners3,event){for(let listener of listeners3)wrapAsync("connection.event",listener,this.#sink)(event)}#markFailure(state3,error2){this.#state!=="disabled"&&(this.#lastError=error2,this.#setState(state3,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;#requestLifetime=new AbortController;get requestLifetimeSignal(){return this.#requestLifetime.signal}#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}}),registerMcpClientAlias(this.#client,physical)}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.#requestLifetime.abort(),this.#requestLifetime=new AbortController,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.#released||this.shared.connection.markDegraded(error2)}markSuspended(error2){this.#released||this.shared.connection.markSuspended(error2)}markNeedsAuth(error2){this.#released||this.shared.connection.markNeedsAuth(error2)}markNeedsClientRegistration(error2){this.#released||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.#requestLifetime.abort(),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:entry2,pi}=options,claim2={cachedCatalog:entry2.cachedCatalog,ownsRegistration:()=>pi!==void 0&&options.shouldRefreshTools(),settled:()=>connect};entry2.startupCatalogClaim=claim2;let releaseClaim=()=>{entry2.startupCatalogClaim===claim2&&(entry2.startupCatalogClaim=void 0)},connect=ignoreStartupNeedsAuth(entry2,connectAndRefreshMcpCatalog(entry2,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(entry2,serverConfig){let pending=catalogRefreshes.get(entry2);if(pending!==void 0)return pending;let refresh=refreshConnectedMcpCatalog(entry2,serverConfig);catalogRefreshes.set(entry2,refresh);let finish=()=>{catalogRefreshes.get(entry2)===refresh&&catalogRefreshes.delete(entry2)};return refresh.then(finish,finish),refresh}async function refreshConnectedMcpCatalog(entry2,serverConfig){if(serverConfig===void 0||entry2.isCurrent?.()===!1)return;try{await entry2.authPlan?.refresh?.ensureFresh()}catch(error2){if(entry2.connection.state==="disabled")return;let authError=markMcpConnectionNeedsAuth(entry2.connection,error2);throw authError!==void 0?(entry2.logger.warn(authError.message),authError):error2}if(entry2.credentialsCurrent?.()===!1){await entry2.onCredentialsChanged?.();return}if(await connectMcpServer(entry2.connection,entry2.logger),entry2.connection.state!=="connected"||entry2.isCurrent?.()===!1)return;let generation2=entry2.connection.generation,ownsCatalog=()=>entry2.isCurrent?.()!==!1&&entry2.credentialsCurrent?.()!==!1&&entry2.connection.state==="connected"&&entry2.connection.generation===generation2;if(entry2.connection instanceof SharedMcpLease){let catalog=await entry2.connection.catalog();if(!ownsCatalog()){entry2.credentialsCurrent?.()===!1&&await entry2.onCredentialsChanged?.();return}entry2.cachedCatalog=catalog,entry2.catalogGeneration=generation2,entry2.cacheRefreshedAfterConnect=!0;return}if(!(entry2.cacheRefreshedAfterConnect&&entry2.catalogGeneration===generation2))try{let catalog=await collectServerCatalogForCache(entry2.connection,serverConfig,entry2.generationHash??entry2.configHash,entry2.credentialIdentity);if(!ownsCatalog()){entry2.credentialsCurrent?.()===!1&&await entry2.onCredentialsChanged?.();return}entry2.cachedCatalog=catalog,entry2.catalogGeneration=generation2,entry2.cacheRefreshedAfterConnect=!0,await writeMcpCachedServer(entry2.agentDir,entry2.name,catalog,ownsCatalog),ownsCatalog()&&await ensureMcpResourceSubscriptions(entry2.connection.client,catalog.resources??[])}catch(error2){entry2.logger.warn("Failed to refresh MCP catalog cache",{error:error2 instanceof Error?error2.message:String(error2)})}}async function connectMcpServer(connection,logger){let generation2=connection.generation;try{await connection.connect()}catch(error2){if(connection.state==="disabled"||connection.generation!==generation2)return;let failure2=error2 instanceof Error?error2:new Error(String(error2));connection.lastError===void 0&&connection.markDegraded(failure2),logger?.warn(failure2.message)}}async function ignoreStartupNeedsAuth(entry2,connect){try{await connect}catch(error2){if(entry2.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(resolve55=>{timeout=safeTimer("startup.race",deadlineMs,()=>resolve55("timeout"),{logger:createMcpLogger("startup")})})])}finally{timeout!==void 0&&clearTimeout(timeout)}}function shouldRaceMcpStartup(lifecycle){return lifecycle==="eager"||lifecycle==="keep-alive"}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 mcpServerReferences(name,server){let found=[],visit=(value,field3)=>{isConfigReference(value)&&found.push({field:`mcpServers.${name}.${field3}`,reference:value})};for(let[key,value]of Object.entries(server.headers??{}))visit(value,`headers.${key}`);for(let[key,value]of Object.entries(server.env??{}))visit(value,`env.${key}`);for(let[index,value]of(server.args??[]).entries())visit(value,`args.${index}`);return found}function rememberMcpReferenceOrigins(servers,origin){for(let[name,server]of Object.entries(servers??{}))for(let{field:field3,reference:reference3}of mcpServerReferences(name,server))rememberConfigReferenceOrigin(reference3,{origin,authority:"trusted",field:field3})}function refuseMcpReferences(name,server){let[first]=mcpServerReferences(name,server);if(first!==void 0)throw new ConfigReferenceError(first.field,first.reference,"forbidden")}var strings2=record10=>Object.fromEntries(Object.entries(record10).filter(entry2=>typeof entry2[1]=="string"));function plainMcpDeclaration(name,server){refuseMcpReferences(name,server);let{args,env,headers,...rest}=server;return{...rest,...args===void 0?{}:{args:args.filter(arg=>typeof arg=="string")},...env===void 0?{}:{env:strings2(env)},...headers===void 0?{}:{headers:strings2(headers)}}}function plainMcpServerConfig(name,server){refuseMcpReferences(name,server);let{args,env,headers,...rest}=server;return{...rest,args:args.filter(arg=>typeof arg=="string"),...env===void 0?{}:{env:strings2(env)},...headers===void 0?{}:{headers:strings2(headers)}}}var LogLevelSchema=typebox_exports.Union([typebox_exports.Literal("debug"),typebox_exports.Literal("info"),typebox_exports.Literal("notice"),typebox_exports.Literal("warning"),typebox_exports.Literal("error"),typebox_exports.Literal("critical"),typebox_exports.Literal("alert"),typebox_exports.Literal("emergency")]),OAuthSchema=typebox_exports.Object({clientId:typebox_exports.Optional(typebox_exports.String()),callbackPort:typebox_exports.Optional(typebox_exports.Integer({minimum:0,maximum:65535})),scopes:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),clientMetadataUrl:typebox_exports.Optional(typebox_exports.String()),flow:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("code"),typebox_exports.Literal("client_credentials")]))},{additionalProperties:!1}),ServerSchema=typebox_exports.Object({type:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("stdio"),typebox_exports.Literal("http")])),url:typebox_exports.Optional(typebox_exports.String()),command:typebox_exports.Optional(typebox_exports.String()),args:typebox_exports.Optional(typebox_exports.Array(ConfigValueSchema)),env:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),cwd:typebox_exports.Optional(typebox_exports.String()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),auth:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("bearer"),typebox_exports.Literal("oauth"),typebox_exports.Literal(!1)])),bearerTokenEnv:typebox_exports.Optional(typebox_exports.String()),oauth:typebox_exports.Optional(OAuthSchema),enabled:typebox_exports.Optional(typebox_exports.Boolean()),lifecycle:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("lazy"),typebox_exports.Literal("eager"),typebox_exports.Literal("keep-alive")])),idleTimeoutMin:typebox_exports.Optional(typebox_exports.Number()),requestTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),connectTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),startupTimeoutMs:typebox_exports.Optional(typebox_exports.Number()),includeTools:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),excludeTools:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),directTools:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Boolean(),typebox_exports.Array(typebox_exports.String())])),exposure:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("direct"),typebox_exports.Literal("search"),typebox_exports.Literal("proxy")])),logLevel:typebox_exports.Optional(LogLevelSchema)},{additionalProperties:!1}),SettingsSchema=typebox_exports.Object({toolPrefix:typebox_exports.Optional(typebox_exports.String()),searchThreshold:typebox_exports.Optional(typebox_exports.Number()),outputGuard:typebox_exports.Optional(typebox_exports.Object({maxBytes:typebox_exports.Optional(typebox_exports.Number()),maxLines:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number())},{additionalProperties:!1})),importConfigs:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Literal("claude"))),oauthCallbackUrl:typebox_exports.Optional(typebox_exports.String()),stubSwap:typebox_exports.Optional(typebox_exports.Boolean()),nativeToolSearch:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Boolean()]))},{additionalProperties:!1}),ConfigSchema=typebox_exports.Object({settings:typebox_exports.Optional(SettingsSchema),mcpServers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ServerSchema))},{additionalProperties:!1});function getServerEndpointValidationError(config){for(let[name,server]of Object.entries(config.mcpServers??{})){if(server.enabled===!1)continue;let type2=server.type??(server.url?"http":"stdio");if(type2==="stdio"&&(server.command===void 0||server.command.trim().length===0))return`mcpServers.${name}.command: Required for enabled stdio server`;if(type2==="http"&&(server.url===void 0||server.url.trim().length===0))return`mcpServers.${name}.url: Required for enabled http server`}}var validateConfig=Compile(ConfigSchema),validateServer=Compile(ServerSchema);function validateMcpServerDeclaration(name,raw){if(!validateServer.Check(raw)){let error2=Array.from(validateServer.Errors(raw))[0],path14=error2.instancePath.replace(/^\//,"").split("/").map(p=>p.replace(/~1/g,"/").replace(/~0/g,"~")).join(".")||"$",message=error2.message==="must be array"?"Expected array":error2.message;return`Invalid MCP server declaration "${name}": ${path14}: ${message}`}let server=raw,endpointError=getServerEndpointValidationError({mcpServers:{[name]:server}});return endpointError?`Invalid MCP server declaration "${name}": ${endpointError}`:null}var defaultSettings={outputGuard:{maxBytes:50*1024,maxLines:2e3},searchThreshold:10,toolPrefix:"mcp"};import{createHash as createHash21}from"node:crypto";var sessionDependent=new WeakSet,sessionVariable=/(?:cwd|session|^PWD$|^OLDPWD$)/i,sessionTemplate=/\$\{[^}]*(?:cwd|session|PWD)[^}]*\}/i;function inheritMcpSharingScope(source2,target){(sessionDependent.has(source2)||hasSessionValues(source2))&&sessionDependent.add(target)}function hasSessionValues(config,cwd){let values=[config.command,...config.args??[],...Object.values(config.env??{})];return Object.keys(config.env??{}).some(key=>sessionVariable.test(key))||[...values,config.cwd].some(value=>typeof value=="string"&&sessionTemplate.test(value))||cwd!==void 0&&values.some(value=>typeof value=="string"&&value.includes(cwd))}function shareable(config,cwd){return config.type==="http"||!sessionDependent.has(config)&&!hasSessionValues(config,cwd)}function sharedMcpKey(options,agentDir){let{config,env}=options,bearer=config.bearerTokenEnv,identity={...options.projectPolicy===void 0?{}:{declarationDigest:options.projectPolicy.identity,policyDigest:options.projectPolicy.policyDigest,skillAuthorityDigest:options.projectPolicy.provenanceDigest},credentialIdentity:options.credentialIdentity,agentDir,name:options.serverName,type:config.type,url:config.type==="http"?config.url:void 0,command:config.type==="stdio"?config.command:void 0,args:config.type==="stdio"?config.args:void 0,cwd:config.type==="stdio"?config.cwd??process.cwd():void 0,env:config.type==="stdio"?{...env,...config.env}:void 0,headers:config.headers,auth:config.auth,oauth:config.oauth,bearer:bearer===void 0?void 0:env?.[bearer]??process.env[bearer],connectTimeoutMs:config.connectTimeoutMs,logLevel:config.logLevel};return createHash21("sha256").update(stableJson(identity)).digest("hex")}function stableJson(value){return Array.isArray(value)?`[${value.map(stableJson).join(",")}]`:value!==null&&typeof value=="object"?`{${Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,item])=>`${JSON.stringify(key)}:${stableJson(item)}`).join(",")}}`:JSON.stringify(value)??"null"}function resolveExtensionMcpServer(name,raw,sourcePath,registrationCwd){refuseMcpReferences(name,raw);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}.`);try{result3.servers[decl.name]=resolveExtensionMcpServer(decl.name,decl.config,decl.extensionPath,decl.registrationCwd)}catch(error2){if(!(error2 instanceof ConfigReferenceError))throw error2;result3.diagnostics.push(`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped: ${error2.message}`)}}}var trustedEnv=process.env;function loadMcpConfig(options){let agentDir=options.agentDir??getAgentDir(),env=options.env??trustedEnv,globalPath=join57(agentDir,"mcp.json"),projectPath=join57(options.cwd,CONFIG_DIR_NAME,"mcp.json"),claudePath=join57(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,{source:item.source,sourcePath:item.path,agentDir});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 rememberMcpReferenceOrigins(config?.mcpServers,path14),config}function readConfigJson(path14,trusted){if(!existsSync27(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,origin){for(let[name,server]of Object.entries(servers)){let config=normalizeServer(server);inheritMcpSharingScope(server,config),result3.servers[name]={config,configHash:hashConfig(config,origin.agentDir),name,source:origin.source,sourcePath:origin.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 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 getGlobalMcpConfigPath(agentDir=getAgentDir()){return join58(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(!existsSync28(path14))return{};let raw=JSON.parse(readFileSync33(path14,"utf8"));return assertValidConfig(raw),raw}function writeValidatedConfig(path14,config){assertValidConfig(config),mkdirSync17(dirname47(path14),{recursive:!0}),writeFileSync17(path14,`${JSON.stringify(config,null,2)}
|
|
759
759
|
`,{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((resolve55,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):resolve55(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(`
|
|
760
760
|
`).map(sanitizeTerminalLabel).join(`
|
|
761
761
|
`)),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(`
|
|
@@ -1806,7 +1806,7 @@ ${truncatedRules.map(formatRule).join(`
|
|
|
1806
1806
|
If this session is open in another senpi process when a job is due, the default runner waits until it closes. Limits: prompt ${16384} bytes, ${50} pending jobs per session.`,schedulePromptSchema=typebox_exports.Object({action:typebox_exports.Union([typebox_exports.Literal("create"),typebox_exports.Literal("list"),typebox_exports.Literal("cancel")],{description:"create a job, list this session's jobs, or cancel one by id."}),prompt:typebox_exports.Optional(typebox_exports.String({description:"create: the prompt delivered to this session when the job fires."})),delaySeconds:typebox_exports.Optional(typebox_exports.Integer({description:"create: fire this many seconds from now."})),at:typebox_exports.Optional(typebox_exports.String({description:"create: absolute ISO 8601 date-time with UTC offset to fire at."})),everySeconds:typebox_exports.Optional(typebox_exports.Integer({description:`create: repeat every N seconds (minimum ${60}).`})),id:typebox_exports.Optional(typebox_exports.String({description:"cancel: the job id (sch_...)."}))},{additionalProperties:!1});function describeJob(job,state3){let due=new Date(job.dueAt),every=job.everyMs===null?"":`, every ${Math.round(job.everyMs/1e3)}s`,error2=job.lastError===null?"":`, last error: ${job.lastError}`,prompt=job.prompt.length>120?`${job.prompt.slice(0,117)}...`:job.prompt;return`${job.id} [${state3}] due ${due.toISOString()} (${due.toString()})${every}${error2}: ${prompt}`}function resolveDueAt(delaySeconds,at,now2){let trimmedAt=at?.trim()??"";if(delaySeconds===void 0==(trimmedAt.length===0))throw new Error("create needs exactly one of delaySeconds or at.");if(delaySeconds!==void 0){if(!Number.isSafeInteger(delaySeconds)||delaySeconds<0)throw new Error("delaySeconds must be a non-negative integer.");return now2+delaySeconds*1e3}if(!ABSOLUTE_DATE_TIME.test(trimmedAt))throw new Error(`at must be an ISO 8601 date-time with Z or a UTC offset (e.g. 2026-09-28T09:00:00+09:00): ${trimmedAt}`);let dueAt=Date.parse(trimmedAt);if(!Number.isFinite(dueAt))throw new Error(`at is not a valid date-time: ${trimmedAt}`);if(dueAt<now2-PAST_TOLERANCE_MS)throw new Error(`at (${new Date(dueAt).toISOString()}) is in the past; now is ${new Date(now2).toISOString()}.`);return dueAt}function checkCapacity(jobs,sessionId){let pending=jobs.filter(record10=>record10.state==="pending");if(pending.length>=1e3)throw new Error(`the schedule already holds ${1e3} pending jobs; cancel some first.`);if(pending.filter(record10=>record10.job.sessionId===sessionId).length>=50)throw new Error(`this session already has ${50} pending jobs; cancel some first.`)}async function create(params,ctx,now2,liveDelivery){let prompt=params.prompt?.trim()??"";if(prompt.length===0)throw new Error("create needs a non-empty prompt.");if(Buffer.byteLength(prompt,"utf8")>16384)throw new Error(`prompt must be at most ${16384} bytes.`);let dueAt=resolveDueAt(params.delaySeconds,params.at,now2);if(dueAt-now2>316224e5)throw new Error("a job can be scheduled at most 366 days ahead.");let everyMs=null;if(params.everySeconds!==void 0){if(!Number.isSafeInteger(params.everySeconds)||params.everySeconds<60)throw new Error(`everySeconds must be an integer of at least ${60}.`);if(params.everySeconds*1e3>316224e5)throw new Error(`everySeconds must be at most ${316224e5/1e3} (366 days).`);everyMs=params.everySeconds*1e3}let dir=scheduleDir(ctx.agentDir),sessionId=ctx.sessionManager.getSessionId();checkCapacity((await listScheduledJobs(dir)).jobs,sessionId);let job=await createScheduledJob(dir,{sessionId,sessionFile:ctx.sessionManager.getSessionFile()??null,cwd:ctx.cwd,prompt,dueAt,everyMs},now2),runnerAvailable=await isWatchRunnerAvailable(dir,now2),lines=[`Scheduled ${describeJob(job,"pending")}`];return liveDelivery?.isLive()===!0?(await liveDelivery.replan(),lines.push("While this session stays open it delivers the prompt itself when due, steered into the current turn if one is running.",runnerAvailable?"After it closes, the active schedule runner delivers it.":"If it closes first, the job fires the next time a `senpi schedule run` runner runs.")):lines.push(runnerAvailable?"A schedule runner is active; it will deliver the prompt to this session when due.":"No `senpi schedule run --watch` runner is active right now; the job fires the next time a runner runs."),{content:[{type:"text",text:lines.join(`
|
|
1807
1807
|
`)}],details:{action:"create",jobs:[{state:"pending",job}],runnerAvailable}}}async function list(ctx){let sessionId=ctx.sessionManager.getSessionId(),{jobs}=await listScheduledJobs(scheduleDir(ctx.agentDir)),own=jobs.filter(({job})=>job.sessionId===sessionId);return{content:[{type:"text",text:own.length===0?"No scheduled jobs for this session.":own.map(({state:state3,job})=>describeJob(job,state3)).join(`
|
|
1808
1808
|
`)}],details:{action:"list",jobs:own}}}async function cancel2(params,ctx,liveDelivery){let id=params.id?.trim()??"";if(id.length===0)throw new Error("cancel needs the job id.");let removed=await cancelScheduledJob(scheduleDir(ctx.agentDir),id,{sessionId:ctx.sessionManager.getSessionId()});if(removed===void 0)throw new Error(`No scheduled job ${id} in this session.`);return await liveDelivery?.replan(),{content:[{type:"text",text:removed.inFlight?`Cancelled ${id}. One delivery had already started and may still arrive; nothing after it will run.`:`Cancelled ${describeJob(removed.job,"pending")}`}],details:{action:"cancel",jobs:[{state:"pending",job:removed.job}],inFlight:removed.inFlight}}}function registerScheduleTool(pi,deps){pi.registerTool({name:SCHEDULE_PROMPT_TOOL,label:"Schedule Prompt",description:SCHEDULE_PROMPT_DESCRIPTION,parameters:schedulePromptSchema,exposure:"search",searchKeywords:["reminder","remind","later","schedule","cron","timer","alarm","follow up","recurring"],executionMode:"sequential",async execute(_toolCallId,params,_signal,_onUpdate,ctx){switch(params.action){case"create":return create(params,ctx,deps.now(),deps.liveDelivery);case"list":return list(ctx);case"cancel":return cancel2(params,ctx,deps.liveDelivery)}}})}function createScheduleExtension(deps={}){let now2=deps.now??(()=>Date.now());return pi=>{let liveDelivery=registerLiveDelivery(pi,{now:now2,timer:deps.timer??createNodeLiveTimer});registerScheduleTool(pi,{now:now2,liveDelivery})}}var schedule_default=createScheduleExtension();import{join as join77}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
|
|
1809
|
-
`);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var CommandMonitorSource=class{#records=new Map;#host;constructor(host){this.#host=host}get(id){return this.#records.get(id)}values(){return this.#records.values()}keys(){return this.#records.keys()}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record10={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,runaway:void 0,wakesPerHour:options.wakesPerHour,unsubscribeOutput:void 0,unsubscribeExit:void 0,humanInput:options.humanInput===!0};return this.#records.set(record10.id,record10),this.#host.changed(),this.#consume(record10,record10.runtime.fullOutput()),record10.unsubscribeOutput=record10.runtime.onOutput(chunk=>this.#consume(record10,chunk)),record10.unsubscribeExit=record10.runtime.session.onExit(()=>this.#settle(record10)),record10.runtime.exited&&this.#settle(record10),record10.monitorId}adoptFireWindow(monitorId,fireWindow2){for(let record10 of this.#records.values())if(record10.monitorId===monitorId)return record10.fireWindow={...fireWindow2},!0;return!1}dispose(){for(let record10 of[...this.#records.values()])this.#disposeRecord(record10);this.#records.clear()}#consume(record10,chunk){if(!(record10.settled||chunk.length===0)){for(let line of record10.lineBuffer.append(chunk))if(!record10.filter||record10.filter.test(line)){if(record10.paused){record10.mutedDropped+=1;continue}if(this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line,...record10.humanInput?{humanInput:!0}:{}}),record10.fireWindow!==void 0){let now2=Date.now();if(now2-record10.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record10.fireWindow={startMs:now2,count:0}),record10.fireWindow.count+=1,this.#floodsRunaway(record10,now2)){let guard=this.#host.runawayGuard();record10.paused=!0,this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:runawayPauseSummary(record10.id,guard.linesPerMinute,guard.minutes)}),this.#host.changed()}}}}}#floodsRunaway(record10,now2){let guard=this.#host.runawayGuard(),previous=record10.runaway,current=previous;if(current===void 0||now2-current.minuteStartMs>=6e4){let elapsedMinutes=previous===void 0?0:Math.floor((now2-previous.minuteStartMs)/6e4),previousFlooded=previous!==void 0&&elapsedMinutes===1&&previous.count>guard.linesPerMinute;current={minuteStartMs:previous===void 0?now2:previous.minuteStartMs+elapsedMinutes*6e4,count:0,floodMinutes:previous!==void 0&&previousFlooded?previous.floodMinutes+1:0},record10.runaway=current}return current.count+=1,current.count>guard.linesPerMinute&¤t.floodMinutes+1>=guard.minutes}#settle(record10){if(record10.settled)return;record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.changed();let exit=record10.runtime.exitResult,status=describeExit(record10.runtime)??"exited",code=exit?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:exit?.timedOut?`watcher killed at deadline (${status})`:`watcher ${status}${codeText}`}),this.#host.ended(record10,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record10){record10.settled||(record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.ended(record10,"disposed",null))}};import{watch as watch3}from"node:fs";import{basename as basename29,join as join71}from"node:path";import{lstat as lstat3,open as open8,stat as stat10}from"node:fs/promises";import{dirname as dirname58}from"node:path";import{createHash as createHash27}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash27("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}async function checkFileOnce(record10,actions){if(record10.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname58(record10.path))!==record10.canonicalParent){actions.settle(`watcher error: monitored parent changed: ${dirname58(record10.path)}`);return}if((await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(realpathWithoutOpen(record10.canonicalPath)!==record10.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);handle=await open8(record10.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record10.path}`);if((opened.dev!==record10.device||opened.ino!==record10.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(current=opened,(await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);let reboundPath=await stat10(record10.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){actions.settle(`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await digestFileHandle(handle):"",present&&handle){let afterDigest=await stat10(record10.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}}finally{await handle?.close()}let changed=record10.event==="create"?!record10.present&&present:record10.present&&present&&(current.mtimeMs!==record10.mtimeMs||current.size!==record10.size||digest3!==record10.digest);record10.pendingChange||=changed,!record10.present&¤t&&(record10.device=current.dev,record10.inode=current.ino),record10.present=present,record10.mtimeMs=current?.mtimeMs??0,record10.size=current?.size??0,record10.digest=digest3,!(!record10.pendingChange||record10.paused||record10.settled)&&(record10.pendingChange=!1,!record10.settled&&actions.fire(`${record10.event} ${record10.path}`))}var RegistrationGuard=class{#pending=new Set;open(release4,timeoutMs){let pending={release:release4,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),timeoutMs),settled:!1};return this.#pending.add(pending),pending}finishAll(){for(let pending of[...this.#pending])this.finish(pending)}finish(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async await(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value=>lateCleanup?.(value),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value=>(aborted&&lateCleanup?.(value),value),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}};var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};function newFileRecord(input){let{id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4,digest:digest3,initial}=input,persistent=options.persistent??options.expiresAt!==void 0;return{id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent,deadlineMs:persistent?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path14,canonicalPath:canonicalPath2,canonicalParent:approvedParent,event:options.event,watcher,release:release4??(()=>{}),watch:new FileWatchLoop(input.check),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:persistent?void 0:setTimeout(input.timedOut,options.timeoutMs)}}import{access as access5,lstat as lstat4,open as open9,stat as stat11}from"node:fs/promises";import{basename as basename28,dirname as dirname59,join as join70,resolve as resolve42}from"node:path";async function proveWatchTarget(guard,pending,options,isDisposed){let path14=resolve42(options.cwd,options.path),parent=dirname59(path14),approvedParent;try{await guard.await(pending,access5(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(isDisposed())throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path14}`);if(initialHandle=await guard.await(pending,open9(path14,"r"),async handle=>{await handle.close()}),initial=await guard.await(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path14}`);if(realpathWithoutOpen(path14)!==join70(approvedParent,basename28(path14)))throw new Error(`Cannot watch file: target identity changed: ${path14}`);if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path14}`);let reboundStat=await guard.await(pending,stat11(path14));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path14}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw error2}return{path:path14,parent,approvedParent,initial,initialHandle}}var FileMonitorSource=class{#files=new Map;#guard=new RegistrationGuard;#host;#reserve;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#lifecycle=0;constructor(host,reserve){this.#host=host,this.#reserve=reserve}get(id){return this.#files.get(id)}values(){return this.#files.values()}keys(){return this.#files.keys()}setParked(parked){this.#parked=parked;for(let record10 of this.#files.values())parked?record10.watch.pause():record10.paused||record10.watch.resume()}get parked(){return this.#parked}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record10 of this.#files.values())this.#settleFile(record10,"watcher disposed");this.#guard.finishAll()}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release4=this.#reserve?.();if(this.#reserve&&!release4)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending=this.#guard.open(release4??void 0,options.timeoutMs),target;try{target=await proveWatchTarget(this.#guard,pending,options,()=>this.#disposed)}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,error2}let{path:path14,parent,approvedParent,initial}=target,initialHandle=target.initialHandle;if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#guard.await(pending,probeDirectoryOpenable(activationParent)),watcher=watch3(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename29(String(name))===basename29(path14))&&this.#checkFile(id)})}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path14}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record11=this.#files.get(id);record11&&this.#settleFile(record11,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#guard.finish(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath2=join71(approvedParent,basename29(path14)),digest3;try{digest3=initial&&initialHandle?await this.#guard.await(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record10=newFileRecord({id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4??void 0,digest:digest3,initial,check:()=>{this.#checkFile(id)},timedOut:()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")}});if(this.#files.set(id,record10),this.#parked&&record10.watch.pause(),finishRegistration(),this.#guard.finish(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record10,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#host.changed(),{id,monitorId:record10.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}async stopFile(id){let record10=this.#files.get(id);return record10?(this.#settleFile(record10,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record10 of records)this.#settleFile(record10,"watcher killed");return this.#guard.finishAll(),records.length}#settleFile(record10,summary){if(record10.settled)return;record10.settled=!0,record10.watch.stop(),clearTimeout(record10.deadline),record10.watcher.close(),record10.release(),this.#files.delete(record10.id),this.#host.changed(),this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#host.ended(record10,reason,null)}async#checkFile(id){let record10=this.#files.get(id);if(!(!record10||record10.settled||record10.paused||this.#parked)){if(record10.checking){record10.dirty=!0;return}return record10.checking=checkFileOnce(record10,{settle:summary=>this.#settleFile(record10,summary),fire:line=>{this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line}),this.#settleFile(record10,"watcher completed")}}).catch(error2=>{record10.settled||this.#settleFile(record10,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record10.checking=void 0;let now2=Date.now();now2-record10.dirtyWindowStartedAt>=1e3&&(record10.dirtyWindowStartedAt=now2,record10.dirtyPasses=0),record10.dirty&&!record10.settled&&record10.dirtyPasses<1?(record10.dirty=!1,record10.dirtyPasses+=1,this.#checkFile(id)):record10.dirty=!1}),record10.checking}}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}};function loadRpcMonitorSource(){return import("./rpc-monitor-source-FFEQS744.js")}var MonitorRegistry=class{#emit;#onChange;#onEnded;#onFire;#commands;#files;#host;#rpc;#parked=!1;#runawayGuard={linesPerMinute:DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,minutes:DEFAULT_MONITOR_RUNAWAY_MINUTES};constructor(emit2,options){this.#emit=emit2,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire;let host={emit:(record10,event)=>this.#emitForRecord(record10,event),emitRaw:event=>this.#emit(event),ended:(record10,reason,exitCode)=>this.#emitEnded(record10,reason,exitCode),changed:()=>this.#notifyChange(),runawayGuard:()=>this.#runawayGuard};this.#host=host,this.#commands=new CommandMonitorSource(host),this.#files=new FileMonitorSource(host,options?.reserve)}setRunawayGuard(guard){this.#runawayGuard=guard}wakePacing(id){let record10=this.#commands.get(id);if(!(record10===void 0||!record10.persistent))return{wakesPerHour:record10.wakesPerHour}}setParked(parked){this.#parked!==parked&&(this.#parked=parked,this.#files.setParked(parked))}snapshot(){return[...this.#commands.values(),...this.#files.values(),...this.#rpc?.values()??[]].map(record10=>({id:record10.id,monitorId:record10.monitorId,description:record10.description,paused:record10.paused,startedAtMs:record10.startedAtMs,command:record10.command,filter:record10.filter?.source??null,persistent:record10.persistent,deadlineMs:record10.deadlineMs,fireCount:record10.fireCount,lastFiredAtMs:record10.lastFiredAtMs,expiresAt:record10.expiresAt,fireWindow:"fireWindow"in record10?record10.fireWindow:void 0}))}registerFile(options){return this.#files.registerFile(options)}fileCheckpoint(id){return this.#files.fileCheckpoint(id)}emitFileLine(id,line){return this.#files.get(id)!==void 0&&this.emitLine(id,line)}emitLine(id,line){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return!record10||record10.settled?!1:(this.#emitForRecord(record10,{type:"line",id:record10.id,description:record10.description,line}),!0)}stopFile(id){return this.#files.stopFile(id)}stopAllFiles(){return this.#files.stopAllFiles()}register(options){return this.#commands.register(options)}async registerRpc(options){if(this.#rpc===void 0){let{RpcMonitorSource}=await loadRpcMonitorSource();this.#rpc??=new RpcMonitorSource(this.#host)}return this.#rpc.register(options)}stopRpc(id){return this.#rpc?.settle(id,"watcher killed")??!1}stopAllRpc(){return this.#rpc?.settleAll("watcher killed")??0}pause(ids){let paused=[];for(let id of ids){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);!record10||record10.paused||(record10.paused=!0,"watch"in record10&&record10.watch.pause(),paused.push(record10.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]])}resume(ids){let candidates=ids??[...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]],resumed=[];for(let id of candidates){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);if(!record10?.paused)continue;record10.paused=!1;let mutedDropped="mutedDropped"in record10?record10.mutedDropped:0;"mutedDropped"in record10&&(record10.mutedDropped=0),"fireWindow"in record10&&record10.fireWindow!==void 0&&(record10.fireWindow.count=0),"runaway"in record10&&(record10.runaway=void 0),resumed.push({id:record10.id,mutedDropped}),"watch"in record10&&!this.#files.parked&&record10.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#commands.get(id)?.mutedDropped??this.#rpc?.get(id)?.mutedDropped??0}rearm(id){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return record10?record10.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){return this.#commands.adoptFireWindow(monitorId,fireWindow2)}dispose(){this.#commands.dispose(),this.#files.dispose(),this.#rpc?.settleAll("watcher disposed"),this.#notifyChange()}#notifyChange(){this.#onChange?.(this.snapshot())}#emitForRecord(record10,event){record10.fireCount+=1,record10.lastFiredAtMs=Date.now(),this.#emit(event),record10.settled||this.#onFire?.(this.snapshot())}#emitEnded(record10,reason,exitCode){this.#onEnded?.({id:record10.id,description:record10.description,startedAtMs:record10.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record10.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function createBundle(state3){return new TerminalSessionBundle({maxSessions:state3.settings.maxSessions,scrollback:state3.settings.scrollback})}function bundleSinks(pi,state3){return{onMonitorEvent:event=>state3.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{if(pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),event.reason==="disposed")return;let dir=terminalStateDir(state3.ctx),monitorId=state3.bundle?.manager.monitorIdOf(event.id);dir===void 0||monitorId===void 0||removeMonitorStateDir(dir,monitorId).catch(error2=>{state3.ctx?.ui?.notify?.(`Could not remove the state dir of ${monitorId}: ${error2 instanceof Error?error2.message:String(error2)}`,"warning")})},onMonitorState:(snapshot,transition=!0)=>{state3.parked||state3.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,paused:entry2.paused,startedAtMs:entry2.startedAtMs,command:entry2.command,filter:entry2.filter,persistent:entry2.persistent,deadlineMs:entry2.deadlineMs,fireCount:entry2.fireCount,lastFiredAtMs:entry2.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,startedAtMs:entry2.startedAtMs}))}),state3.manifestWriter&&state3.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let record10=()=>{let writer=state3.manifestWriter;if(writer)for(let entry2 of snapshot){if(state3.recordedBackgroundIds.has(entry2.id))continue;state3.recordedBackgroundIds.add(entry2.id);let identity=state3.bundle?.manager.get(entry2.id)?.identity();writer.recordBackgroundStart(entry2.id,entry2.description??entry2.id,entry2.startedAtMs,identity)}};if(state3.manifestWriter===null&&state3.ensurePersistence!==null&&snapshot.length>0){state3.ensurePersistence().then(record10);return}record10()},onBackgroundExit:(id,runtime)=>{state3.recordedBackgroundIds.delete(id),state3.manifestWriter&&state3.manifestWriter.recordBackgroundExit(id),state3.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state3){let requireBundle=()=>(state3.bundle||(state3.bundle=createBundle(state3),state3.bundle.monitors.setParked(state3.parked),state3.bundle.bind(bundleSinks(pi,state3))),state3.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state3.ctx?.cwd??process.cwd()},get shellPath(){return state3.shellPath},get defaultCols(){return state3.settings.defaultCols},get defaultRows(){return state3.settings.defaultRows},get timeoutAction(){return state3.settings.timeoutAction},get maxDurableMonitors(){return state3.settings.maxDurableMonitors},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state3.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state3.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state3.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state3.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state3.monitorNotifier?.resume(ids),ensurePersistence:()=>state3.ensurePersistence?.()??Promise.resolve()}}import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir13}from"node:fs/promises";import{join as join72}from"node:path";var LEASE_RECORD_VERSION=2,generationTokens=new Map,liveTokens=new Set;function currentLeaseToken(encodedSessionId2){return generationTokens.get(encodedSessionId2)}function retireLeaseToken(token){liveTokens.delete(token)}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}var isFiniteNumber2=value=>typeof value=="number"&&Number.isFinite(value);function readLeaseRecord(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let candidate=parsed;return!isFiniteNumber2(candidate.pid)||!isFiniteNumber2(candidate.startedAtMs)?"unparseable":{pid:candidate.pid,startedAtMs:candidate.startedAtMs,...isFiniteNumber2(candidate.v)?{v:candidate.v}:{},...typeof candidate.token=="string"?{token:candidate.token}:{},...isFiniteNumber2(candidate.bootAtMs)?{bootAtMs:candidate.bootAtMs}:{},...isFiniteNumber2(candidate.processStartedAtMs)?{processStartedAtMs:candidate.processStartedAtMs}:{},...isFiniteNumber2(candidate.acquiredAtMs)?{acquiredAtMs:candidate.acquiredAtMs}:{}}}catch{return"unparseable"}}async function readLeaseFile(path14){let raw=await readLeaseText(path14);return raw===void 0?"missing":readLeaseRecord(raw)}async function classifyLease(existing2,self,probes){if(existing2.pid===self.pid)return existing2.token!==void 0&&(probes.liveTokens??liveTokens).has(existing2.token)?"live-foreign":"self";if(!probeAlive(existing2.pid,probes.isProcessAlive))return"dead";let observedStart;try{observedStart=await probes.readProcessStartMs(existing2.pid)}catch{observedStart=void 0}return observedStart===void 0?"live-foreign":existing2.processStartedAtMs===void 0?observedStart<=existing2.startedAtMs+PROCESS_START_TOLERANCE_MS?"live-foreign":"reused":sameProcessStartMs(existing2.processStartedAtMs,observedStart)?"live-foreign":"reused"}function holderOf(record10){return{pid:record10.pid,startedAtMs:record10.startedAtMs,...record10.bootAtMs!==void 0?{bootAtMs:record10.bootAtMs}:{}}}async function acquireTerminalLease(options){let now2=(options.now??Date.now)(),self=options.self??{pid:options.pid??process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs()},pid=options.pid??self.pid,path14=join72(options.dir,`${options.encodedSessionId}.lease`);await mkdir13(options.dir,{recursive:!0});let token=randomUUID12(),record10={v:LEASE_RECORD_VERSION,token,pid,startedAtMs:now2,bootAtMs:self.bootAtMs,processStartedAtMs:self.processStartedAtMs,acquiredAtMs:now2},acquired=()=>(generationTokens.set(options.encodedSessionId,token),liveTokens.add(token),{acquired:!0,path:path14,pid,token}),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},content=JSON.stringify(record10);for(let attempt2=0;attempt2<3;attempt2+=1){try{return await publishExclusive(path14,content),acquired()}catch(error2){if(errorCode(error2)!=="EEXIST")throw error2}let raw2=await readLeaseText(path14);if(raw2===void 0)continue;let existing2=readLeaseRecord(raw2),verdict=existing2==="unparseable"?"dead":await classifyLease(existing2,{...self,pid},probes);if(verdict==="self")return await publishReplace(path14,content),acquired();if(verdict==="live-foreign"&&existing2!=="unparseable")return{acquired:!1,holder:holderOf(existing2)};let reclaim=await reclaimInspected(path14,raw2,probes);if(reclaim.outcome==="busy"&&reclaim.holder!==void 0){let{pid:holderPid,processStartedAtMs,bootAtMs}=reclaim.holder;return{acquired:!1,holder:{pid:holderPid,startedAtMs:processStartedAtMs,bootAtMs}}}}let raw=await readLeaseText(path14),last=raw===void 0?"unparseable":readLeaseRecord(raw);if(last!=="unparseable"&&await classifyLease(last,{...self,pid},probes)==="live-foreign")return{acquired:!1,holder:holderOf(last)};throw new Error(`terminal lease ${path14} kept changing while it was being acquired`)}async function releaseTerminalLease(handle){let existing2=await readLeaseFile(handle.path);if(!(existing2==="missing"||existing2==="unparseable")&&existing2.pid===handle.pid&&!(handle.token!==void 0&&existing2.token!==void 0&&existing2.token!==handle.token)&&(await unlinkIfPresent(handle.path),existing2.token!==void 0)){liveTokens.delete(existing2.token);for(let[sessionId,token]of generationTokens)token===existing2.token&&generationTokens.delete(sessionId)}}function monitorDetails(events,ids,overflowBook){return[...ids].map(id=>{let own=events.filter(event=>event.id===id),overflow=overflowBook.get(id),kinds=new Set(own.map(event=>event.type));for(let kind of overflow?.kinds??[])kinds.add(kind);let humanInput=own.some(event=>event.type==="line"&&event.humanInput===!0)||overflow?.humanInput===!0;return{id,description:own[0]?.description??overflow?.description??id,eventCount:own.length+(overflow?.count??0),kinds:[...kinds],...humanInput?{humanInput:!0}:{}}})}var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",WAKE_BUDGET_PAUSE_NOTICE="Monitor paused after repeated updates. Completion still wakes this session; peek bash_output or re-arm only for intermediate events.";function eventBody(event){let value=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value).replace(/[\r\n]+/g," ").trimEnd()}function renderedLength(event){return`Monitor event(${event.description}): ${eventBody(event)}`.length}function groupHeader(description){return`Monitor event(${description}): `}function monitorShareChars(events,notice2){let first=events[0];return(first===void 0?0:groupHeader(first.description).length+events.reduce((total,event)=>total+eventBody(event).length+1,0))+(notice2.length>0?notice2.length+1:0)}function clip(text3,maxChars){return text3.length<=maxChars?text3:maxChars<=3?text3.slice(0,maxChars):`${text3.slice(0,maxChars-3)}...`}function formatEvents(events){let groups=new Map;for(let event of events){let group=groups.get(event.id)??{description:event.description,bodies:[]};group.bodies.push(eventBody(event)),groups.set(event.id,group)}return[...groups.values()].map(group=>`${groupHeader(group.description)}${group.bodies.join(`
|
|
1809
|
+
`);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var CommandMonitorSource=class{#records=new Map;#host;constructor(host){this.#host=host}get(id){return this.#records.get(id)}values(){return this.#records.values()}keys(){return this.#records.keys()}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record10={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,runaway:void 0,wakesPerHour:options.wakesPerHour,unsubscribeOutput:void 0,unsubscribeExit:void 0,humanInput:options.humanInput===!0};return this.#records.set(record10.id,record10),this.#host.changed(),this.#consume(record10,record10.runtime.fullOutput()),record10.unsubscribeOutput=record10.runtime.onOutput(chunk=>this.#consume(record10,chunk)),record10.unsubscribeExit=record10.runtime.session.onExit(()=>this.#settle(record10)),record10.runtime.exited&&this.#settle(record10),record10.monitorId}adoptFireWindow(monitorId,fireWindow2){for(let record10 of this.#records.values())if(record10.monitorId===monitorId)return record10.fireWindow={...fireWindow2},!0;return!1}dispose(){for(let record10 of[...this.#records.values()])this.#disposeRecord(record10);this.#records.clear()}#consume(record10,chunk){if(!(record10.settled||chunk.length===0)){for(let line of record10.lineBuffer.append(chunk))if(!record10.filter||record10.filter.test(line)){if(record10.paused){record10.mutedDropped+=1;continue}if(this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line,...record10.humanInput?{humanInput:!0}:{}}),record10.fireWindow!==void 0){let now2=Date.now();if(now2-record10.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record10.fireWindow={startMs:now2,count:0}),record10.fireWindow.count+=1,this.#floodsRunaway(record10,now2)){let guard=this.#host.runawayGuard();record10.paused=!0,this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:runawayPauseSummary(record10.id,guard.linesPerMinute,guard.minutes)}),this.#host.changed()}}}}}#floodsRunaway(record10,now2){let guard=this.#host.runawayGuard(),previous=record10.runaway,current=previous;if(current===void 0||now2-current.minuteStartMs>=6e4){let elapsedMinutes=previous===void 0?0:Math.floor((now2-previous.minuteStartMs)/6e4),previousFlooded=previous!==void 0&&elapsedMinutes===1&&previous.count>guard.linesPerMinute;current={minuteStartMs:previous===void 0?now2:previous.minuteStartMs+elapsedMinutes*6e4,count:0,floodMinutes:previous!==void 0&&previousFlooded?previous.floodMinutes+1:0},record10.runaway=current}return current.count+=1,current.count>guard.linesPerMinute&¤t.floodMinutes+1>=guard.minutes}#settle(record10){if(record10.settled)return;record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.changed();let exit=record10.runtime.exitResult,status=describeExit(record10.runtime)??"exited",code=exit?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:exit?.timedOut?`watcher killed at deadline (${status})`:`watcher ${status}${codeText}`}),this.#host.ended(record10,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record10){record10.settled||(record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.ended(record10,"disposed",null))}};import{watch as watch3}from"node:fs";import{basename as basename29,join as join71}from"node:path";import{lstat as lstat3,open as open8,stat as stat10}from"node:fs/promises";import{dirname as dirname58}from"node:path";import{createHash as createHash27}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash27("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}async function checkFileOnce(record10,actions){if(record10.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname58(record10.path))!==record10.canonicalParent){actions.settle(`watcher error: monitored parent changed: ${dirname58(record10.path)}`);return}if((await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(realpathWithoutOpen(record10.canonicalPath)!==record10.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);handle=await open8(record10.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record10.path}`);if((opened.dev!==record10.device||opened.ino!==record10.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(current=opened,(await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);let reboundPath=await stat10(record10.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){actions.settle(`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await digestFileHandle(handle):"",present&&handle){let afterDigest=await stat10(record10.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}}finally{await handle?.close()}let changed=record10.event==="create"?!record10.present&&present:record10.present&&present&&(current.mtimeMs!==record10.mtimeMs||current.size!==record10.size||digest3!==record10.digest);record10.pendingChange||=changed,!record10.present&¤t&&(record10.device=current.dev,record10.inode=current.ino),record10.present=present,record10.mtimeMs=current?.mtimeMs??0,record10.size=current?.size??0,record10.digest=digest3,!(!record10.pendingChange||record10.paused||record10.settled)&&(record10.pendingChange=!1,!record10.settled&&actions.fire(`${record10.event} ${record10.path}`))}var RegistrationGuard=class{#pending=new Set;open(release4,timeoutMs){let pending={release:release4,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),timeoutMs),settled:!1};return this.#pending.add(pending),pending}finishAll(){for(let pending of[...this.#pending])this.finish(pending)}finish(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async await(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value=>lateCleanup?.(value),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value=>(aborted&&lateCleanup?.(value),value),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}};var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};function newFileRecord(input){let{id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4,digest:digest3,initial}=input,persistent=options.persistent??options.expiresAt!==void 0;return{id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent,deadlineMs:persistent?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path14,canonicalPath:canonicalPath2,canonicalParent:approvedParent,event:options.event,watcher,release:release4??(()=>{}),watch:new FileWatchLoop(input.check),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:persistent?void 0:setTimeout(input.timedOut,options.timeoutMs)}}import{access as access5,lstat as lstat4,open as open9,stat as stat11}from"node:fs/promises";import{basename as basename28,dirname as dirname59,join as join70,resolve as resolve42}from"node:path";async function proveWatchTarget(guard,pending,options,isDisposed){let path14=resolve42(options.cwd,options.path),parent=dirname59(path14),approvedParent;try{await guard.await(pending,access5(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(isDisposed())throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path14}`);if(initialHandle=await guard.await(pending,open9(path14,"r"),async handle=>{await handle.close()}),initial=await guard.await(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path14}`);if(realpathWithoutOpen(path14)!==join70(approvedParent,basename28(path14)))throw new Error(`Cannot watch file: target identity changed: ${path14}`);if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path14}`);let reboundStat=await guard.await(pending,stat11(path14));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path14}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw error2}return{path:path14,parent,approvedParent,initial,initialHandle}}var FileMonitorSource=class{#files=new Map;#guard=new RegistrationGuard;#host;#reserve;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#lifecycle=0;constructor(host,reserve){this.#host=host,this.#reserve=reserve}get(id){return this.#files.get(id)}values(){return this.#files.values()}keys(){return this.#files.keys()}setParked(parked){this.#parked=parked;for(let record10 of this.#files.values())parked?record10.watch.pause():record10.paused||record10.watch.resume()}get parked(){return this.#parked}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record10 of this.#files.values())this.#settleFile(record10,"watcher disposed");this.#guard.finishAll()}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release4=this.#reserve?.();if(this.#reserve&&!release4)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending=this.#guard.open(release4??void 0,options.timeoutMs),target;try{target=await proveWatchTarget(this.#guard,pending,options,()=>this.#disposed)}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,error2}let{path:path14,parent,approvedParent,initial}=target,initialHandle=target.initialHandle;if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#guard.await(pending,probeDirectoryOpenable(activationParent)),watcher=watch3(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename29(String(name))===basename29(path14))&&this.#checkFile(id)})}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path14}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record11=this.#files.get(id);record11&&this.#settleFile(record11,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#guard.finish(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath2=join71(approvedParent,basename29(path14)),digest3;try{digest3=initial&&initialHandle?await this.#guard.await(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record10=newFileRecord({id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4??void 0,digest:digest3,initial,check:()=>{this.#checkFile(id)},timedOut:()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")}});if(this.#files.set(id,record10),this.#parked&&record10.watch.pause(),finishRegistration(),this.#guard.finish(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record10,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#host.changed(),{id,monitorId:record10.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}async stopFile(id){let record10=this.#files.get(id);return record10?(this.#settleFile(record10,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record10 of records)this.#settleFile(record10,"watcher killed");return this.#guard.finishAll(),records.length}#settleFile(record10,summary){if(record10.settled)return;record10.settled=!0,record10.watch.stop(),clearTimeout(record10.deadline),record10.watcher.close(),record10.release(),this.#files.delete(record10.id),this.#host.changed(),this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#host.ended(record10,reason,null)}async#checkFile(id){let record10=this.#files.get(id);if(!(!record10||record10.settled||record10.paused||this.#parked)){if(record10.checking){record10.dirty=!0;return}return record10.checking=checkFileOnce(record10,{settle:summary=>this.#settleFile(record10,summary),fire:line=>{this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line}),this.#settleFile(record10,"watcher completed")}}).catch(error2=>{record10.settled||this.#settleFile(record10,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record10.checking=void 0;let now2=Date.now();now2-record10.dirtyWindowStartedAt>=1e3&&(record10.dirtyWindowStartedAt=now2,record10.dirtyPasses=0),record10.dirty&&!record10.settled&&record10.dirtyPasses<1?(record10.dirty=!1,record10.dirtyPasses+=1,this.#checkFile(id)):record10.dirty=!1}),record10.checking}}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}};function loadRpcMonitorSource(){return import("./rpc-monitor-source-AE3C6EQV.js")}var MonitorRegistry=class{#emit;#onChange;#onEnded;#onFire;#commands;#files;#host;#rpc;#parked=!1;#runawayGuard={linesPerMinute:DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,minutes:DEFAULT_MONITOR_RUNAWAY_MINUTES};constructor(emit2,options){this.#emit=emit2,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire;let host={emit:(record10,event)=>this.#emitForRecord(record10,event),emitRaw:event=>this.#emit(event),ended:(record10,reason,exitCode)=>this.#emitEnded(record10,reason,exitCode),changed:()=>this.#notifyChange(),runawayGuard:()=>this.#runawayGuard};this.#host=host,this.#commands=new CommandMonitorSource(host),this.#files=new FileMonitorSource(host,options?.reserve)}setRunawayGuard(guard){this.#runawayGuard=guard}wakePacing(id){let record10=this.#commands.get(id);if(!(record10===void 0||!record10.persistent))return{wakesPerHour:record10.wakesPerHour}}setParked(parked){this.#parked!==parked&&(this.#parked=parked,this.#files.setParked(parked))}snapshot(){return[...this.#commands.values(),...this.#files.values(),...this.#rpc?.values()??[]].map(record10=>({id:record10.id,monitorId:record10.monitorId,description:record10.description,paused:record10.paused,startedAtMs:record10.startedAtMs,command:record10.command,filter:record10.filter?.source??null,persistent:record10.persistent,deadlineMs:record10.deadlineMs,fireCount:record10.fireCount,lastFiredAtMs:record10.lastFiredAtMs,expiresAt:record10.expiresAt,fireWindow:"fireWindow"in record10?record10.fireWindow:void 0}))}registerFile(options){return this.#files.registerFile(options)}fileCheckpoint(id){return this.#files.fileCheckpoint(id)}emitFileLine(id,line){return this.#files.get(id)!==void 0&&this.emitLine(id,line)}emitLine(id,line){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return!record10||record10.settled?!1:(this.#emitForRecord(record10,{type:"line",id:record10.id,description:record10.description,line}),!0)}stopFile(id){return this.#files.stopFile(id)}stopAllFiles(){return this.#files.stopAllFiles()}register(options){return this.#commands.register(options)}async registerRpc(options){if(this.#rpc===void 0){let{RpcMonitorSource}=await loadRpcMonitorSource();this.#rpc??=new RpcMonitorSource(this.#host)}return this.#rpc.register(options)}stopRpc(id){return this.#rpc?.settle(id,"watcher killed")??!1}stopAllRpc(){return this.#rpc?.settleAll("watcher killed")??0}pause(ids){let paused=[];for(let id of ids){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);!record10||record10.paused||(record10.paused=!0,"watch"in record10&&record10.watch.pause(),paused.push(record10.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]])}resume(ids){let candidates=ids??[...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]],resumed=[];for(let id of candidates){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);if(!record10?.paused)continue;record10.paused=!1;let mutedDropped="mutedDropped"in record10?record10.mutedDropped:0;"mutedDropped"in record10&&(record10.mutedDropped=0),"fireWindow"in record10&&record10.fireWindow!==void 0&&(record10.fireWindow.count=0),"runaway"in record10&&(record10.runaway=void 0),resumed.push({id:record10.id,mutedDropped}),"watch"in record10&&!this.#files.parked&&record10.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#commands.get(id)?.mutedDropped??this.#rpc?.get(id)?.mutedDropped??0}rearm(id){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return record10?record10.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){return this.#commands.adoptFireWindow(monitorId,fireWindow2)}dispose(){this.#commands.dispose(),this.#files.dispose(),this.#rpc?.settleAll("watcher disposed"),this.#notifyChange()}#notifyChange(){this.#onChange?.(this.snapshot())}#emitForRecord(record10,event){record10.fireCount+=1,record10.lastFiredAtMs=Date.now(),this.#emit(event),record10.settled||this.#onFire?.(this.snapshot())}#emitEnded(record10,reason,exitCode){this.#onEnded?.({id:record10.id,description:record10.description,startedAtMs:record10.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record10.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function createBundle(state3){return new TerminalSessionBundle({maxSessions:state3.settings.maxSessions,scrollback:state3.settings.scrollback})}function bundleSinks(pi,state3){return{onMonitorEvent:event=>state3.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{if(pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),event.reason==="disposed")return;let dir=terminalStateDir(state3.ctx),monitorId=state3.bundle?.manager.monitorIdOf(event.id);dir===void 0||monitorId===void 0||removeMonitorStateDir(dir,monitorId).catch(error2=>{state3.ctx?.ui?.notify?.(`Could not remove the state dir of ${monitorId}: ${error2 instanceof Error?error2.message:String(error2)}`,"warning")})},onMonitorState:(snapshot,transition=!0)=>{state3.parked||state3.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,paused:entry2.paused,startedAtMs:entry2.startedAtMs,command:entry2.command,filter:entry2.filter,persistent:entry2.persistent,deadlineMs:entry2.deadlineMs,fireCount:entry2.fireCount,lastFiredAtMs:entry2.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,startedAtMs:entry2.startedAtMs}))}),state3.manifestWriter&&state3.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let record10=()=>{let writer=state3.manifestWriter;if(writer)for(let entry2 of snapshot){if(state3.recordedBackgroundIds.has(entry2.id))continue;state3.recordedBackgroundIds.add(entry2.id);let identity=state3.bundle?.manager.get(entry2.id)?.identity();writer.recordBackgroundStart(entry2.id,entry2.description??entry2.id,entry2.startedAtMs,identity)}};if(state3.manifestWriter===null&&state3.ensurePersistence!==null&&snapshot.length>0){state3.ensurePersistence().then(record10);return}record10()},onBackgroundExit:(id,runtime)=>{state3.recordedBackgroundIds.delete(id),state3.manifestWriter&&state3.manifestWriter.recordBackgroundExit(id),state3.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state3){let requireBundle=()=>(state3.bundle||(state3.bundle=createBundle(state3),state3.bundle.monitors.setParked(state3.parked),state3.bundle.bind(bundleSinks(pi,state3))),state3.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state3.ctx?.cwd??process.cwd()},get shellPath(){return state3.shellPath},get defaultCols(){return state3.settings.defaultCols},get defaultRows(){return state3.settings.defaultRows},get timeoutAction(){return state3.settings.timeoutAction},get maxDurableMonitors(){return state3.settings.maxDurableMonitors},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state3.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state3.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state3.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state3.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state3.monitorNotifier?.resume(ids),ensurePersistence:()=>state3.ensurePersistence?.()??Promise.resolve()}}import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir13}from"node:fs/promises";import{join as join72}from"node:path";var LEASE_RECORD_VERSION=2,generationTokens=new Map,liveTokens=new Set;function currentLeaseToken(encodedSessionId2){return generationTokens.get(encodedSessionId2)}function retireLeaseToken(token){liveTokens.delete(token)}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}var isFiniteNumber2=value=>typeof value=="number"&&Number.isFinite(value);function readLeaseRecord(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let candidate=parsed;return!isFiniteNumber2(candidate.pid)||!isFiniteNumber2(candidate.startedAtMs)?"unparseable":{pid:candidate.pid,startedAtMs:candidate.startedAtMs,...isFiniteNumber2(candidate.v)?{v:candidate.v}:{},...typeof candidate.token=="string"?{token:candidate.token}:{},...isFiniteNumber2(candidate.bootAtMs)?{bootAtMs:candidate.bootAtMs}:{},...isFiniteNumber2(candidate.processStartedAtMs)?{processStartedAtMs:candidate.processStartedAtMs}:{},...isFiniteNumber2(candidate.acquiredAtMs)?{acquiredAtMs:candidate.acquiredAtMs}:{}}}catch{return"unparseable"}}async function readLeaseFile(path14){let raw=await readLeaseText(path14);return raw===void 0?"missing":readLeaseRecord(raw)}async function classifyLease(existing2,self,probes){if(existing2.pid===self.pid)return existing2.token!==void 0&&(probes.liveTokens??liveTokens).has(existing2.token)?"live-foreign":"self";if(!probeAlive(existing2.pid,probes.isProcessAlive))return"dead";let observedStart;try{observedStart=await probes.readProcessStartMs(existing2.pid)}catch{observedStart=void 0}return observedStart===void 0?"live-foreign":existing2.processStartedAtMs===void 0?observedStart<=existing2.startedAtMs+PROCESS_START_TOLERANCE_MS?"live-foreign":"reused":sameProcessStartMs(existing2.processStartedAtMs,observedStart)?"live-foreign":"reused"}function holderOf(record10){return{pid:record10.pid,startedAtMs:record10.startedAtMs,...record10.bootAtMs!==void 0?{bootAtMs:record10.bootAtMs}:{}}}async function acquireTerminalLease(options){let now2=(options.now??Date.now)(),self=options.self??{pid:options.pid??process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs()},pid=options.pid??self.pid,path14=join72(options.dir,`${options.encodedSessionId}.lease`);await mkdir13(options.dir,{recursive:!0});let token=randomUUID12(),record10={v:LEASE_RECORD_VERSION,token,pid,startedAtMs:now2,bootAtMs:self.bootAtMs,processStartedAtMs:self.processStartedAtMs,acquiredAtMs:now2},acquired=()=>(generationTokens.set(options.encodedSessionId,token),liveTokens.add(token),{acquired:!0,path:path14,pid,token}),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},content=JSON.stringify(record10);for(let attempt2=0;attempt2<3;attempt2+=1){try{return await publishExclusive(path14,content),acquired()}catch(error2){if(errorCode(error2)!=="EEXIST")throw error2}let raw2=await readLeaseText(path14);if(raw2===void 0)continue;let existing2=readLeaseRecord(raw2),verdict=existing2==="unparseable"?"dead":await classifyLease(existing2,{...self,pid},probes);if(verdict==="self")return await publishReplace(path14,content),acquired();if(verdict==="live-foreign"&&existing2!=="unparseable")return{acquired:!1,holder:holderOf(existing2)};let reclaim=await reclaimInspected(path14,raw2,probes);if(reclaim.outcome==="busy"&&reclaim.holder!==void 0){let{pid:holderPid,processStartedAtMs,bootAtMs}=reclaim.holder;return{acquired:!1,holder:{pid:holderPid,startedAtMs:processStartedAtMs,bootAtMs}}}}let raw=await readLeaseText(path14),last=raw===void 0?"unparseable":readLeaseRecord(raw);if(last!=="unparseable"&&await classifyLease(last,{...self,pid},probes)==="live-foreign")return{acquired:!1,holder:holderOf(last)};throw new Error(`terminal lease ${path14} kept changing while it was being acquired`)}async function releaseTerminalLease(handle){let existing2=await readLeaseFile(handle.path);if(!(existing2==="missing"||existing2==="unparseable")&&existing2.pid===handle.pid&&!(handle.token!==void 0&&existing2.token!==void 0&&existing2.token!==handle.token)&&(await unlinkIfPresent(handle.path),existing2.token!==void 0)){liveTokens.delete(existing2.token);for(let[sessionId,token]of generationTokens)token===existing2.token&&generationTokens.delete(sessionId)}}function monitorDetails(events,ids,overflowBook){return[...ids].map(id=>{let own=events.filter(event=>event.id===id),overflow=overflowBook.get(id),kinds=new Set(own.map(event=>event.type));for(let kind of overflow?.kinds??[])kinds.add(kind);let humanInput=own.some(event=>event.type==="line"&&event.humanInput===!0)||overflow?.humanInput===!0;return{id,description:own[0]?.description??overflow?.description??id,eventCount:own.length+(overflow?.count??0),kinds:[...kinds],...humanInput?{humanInput:!0}:{}}})}var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",WAKE_BUDGET_PAUSE_NOTICE="Monitor paused after repeated updates. Completion still wakes this session; peek bash_output or re-arm only for intermediate events.";function eventBody(event){let value=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value).replace(/[\r\n]+/g," ").trimEnd()}function renderedLength(event){return`Monitor event(${event.description}): ${eventBody(event)}`.length}function groupHeader(description){return`Monitor event(${description}): `}function monitorShareChars(events,notice2){let first=events[0];return(first===void 0?0:groupHeader(first.description).length+events.reduce((total,event)=>total+eventBody(event).length+1,0))+(notice2.length>0?notice2.length+1:0)}function clip(text3,maxChars){return text3.length<=maxChars?text3:maxChars<=3?text3.slice(0,maxChars):`${text3.slice(0,maxChars-3)}...`}function formatEvents(events){let groups=new Map;for(let event of events){let group=groups.get(event.id)??{description:event.description,bodies:[]};group.bodies.push(eventBody(event)),groups.set(event.id,group)}return[...groups.values()].map(group=>`${groupHeader(group.description)}${group.bodies.join(`
|
|
1810
1810
|
`)}`).join(`
|
|
1811
1811
|
`)}function buildWakeMessage(events,notices,pauseNotice,maxChars){let suffix=[...notices,pauseNotice].filter(Boolean).join(`
|
|
1812
1812
|
`),fixedChars=SYSTEM_REMINDER_OPEN.length+SYSTEM_REMINDER_CLOSE.length+(suffix?suffix.length+1:0),body=clip(formatEvents(events),Math.max(0,maxChars-fixedChars));return`${SYSTEM_REMINDER_OPEN}${body}${body&&suffix?`
|
|
@@ -2038,13 +2038,13 @@ Press any key to continue...`)),await new Promise(resolve55=>{process.stdin.setR
|
|
|
2038
2038
|
`)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});await session.waitForSettledSessionWork();let lastMessage=session.state.messages.findLast(message=>message.role==="assistant"),failed=lastMessage?.role==="assistant"&&(lastMessage.stopReason==="error"||lastMessage.stopReason==="aborted"),exitCode=failed?1:0;if(mode==="text"&&lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(failed){let described=assistantMsg.errorCause?.type==="usage_limit"&&assistantMsg.errorCause.scope==="account"?assistantMsg.errorMessage:describeProviderFailureForUser(assistantMsg.errorMessage,{model:`${assistantMsg.provider}/${assistantMsg.model}`,usageLimit:usageLimitScope(assistantMsg)});console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`))}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
|
|
2039
2039
|
`):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
|
|
2040
2040
|
`),writeRawStdout(`${formatProviderNativeBody(content,!1)}
|
|
2041
|
-
`))}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync15,readFileSync as readFileSync46}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry2 of readdirSync15("/proc")){let pid=Number(entry2);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat19=linuxStat(pid),tail=stat19?.slice(stat19.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat19=linuxStat(pid),open12=stat19?.indexOf("(")??-1,close=stat19?.lastIndexOf(")")??-1;return stat19===void 0||open12===-1||close<=open12?"":stat19.slice(open12+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS2=1e3,CHILD_REAPER_IDLE_TICK_MS=5e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS2,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)},get childCount(){return tracked.size}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count2])=>`${name} x${count2}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log});return scheduleChildReaper(reaper,config.tickMs)}function scheduleChildReaper(reaper,tickMs){let timer,arm=()=>{timer=setTimeout(()=>{reaper.tick(),timer!==void 0&&arm()},reaper.childCount>0?tickMs:Math.max(tickMs,CHILD_REAPER_IDLE_TICK_MS)),timer.unref()};return arm(),()=>{timer!==void 0&&clearTimeout(timer),timer=void 0}}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-ONQIMWMX.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID16}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync29,renameSync as renameSync17,rmSync as rmSync14}from"node:fs";import{basename as basename34,dirname as dirname67,join as join99,relative as relative21,resolve as resolve51,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve51(path14))}function getQuarantineRoot(packageDir){let current=resolve51(packageDir);for(;;){if(basename34(current).toLowerCase()==="node_modules")return join99(current,QUARANTINE_DIR_NAME);let parent=dirname67(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value of sharedObjects){if(typeof value!="string")continue;let filePath=normalizePath3(value),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join99(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID16()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join99(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync29(dirname67(quarantinePath),{recursive:!0}),renameSync17(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;function collectAuthDiagnostics(authStorage,context,options){return[...authStorage.drainErrors().map(error2=>error2.message),...authStorage.takePendingNotices(options).map(notice2=>notice2.message)].map(message=>({type:"warning",message:`(${context}, auth storage) ${message}`}))}function interactiveAuthNotices(authStorage){let pending=authStorage.takePendingNotices({persistSeen:!1});return{messages:[...authStorage.drainErrors().map(error2=>error2.message),...pending.map(notice2=>notice2.message)],markSeen:()=>authStorage.markNoticesSeen(pending.map(notice2=>notice2.id))}}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path14,error:error2})=>({type:"warning",message:`Failed to load extension "${path14}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value){return value?value==="1"||value.toLowerCase()==="true"||value.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2041
|
+
`))}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync15,readFileSync as readFileSync46}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry2 of readdirSync15("/proc")){let pid=Number(entry2);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat19=linuxStat(pid),tail=stat19?.slice(stat19.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat19=linuxStat(pid),open12=stat19?.indexOf("(")??-1,close=stat19?.lastIndexOf(")")??-1;return stat19===void 0||open12===-1||close<=open12?"":stat19.slice(open12+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS2=1e3,CHILD_REAPER_IDLE_TICK_MS=5e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS2,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)},get childCount(){return tracked.size}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count2])=>`${name} x${count2}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log});return scheduleChildReaper(reaper,config.tickMs)}function scheduleChildReaper(reaper,tickMs){let timer,arm=()=>{timer=setTimeout(()=>{reaper.tick(),timer!==void 0&&arm()},reaper.childCount>0?tickMs:Math.max(tickMs,CHILD_REAPER_IDLE_TICK_MS)),timer.unref()};return arm(),()=>{timer!==void 0&&clearTimeout(timer),timer=void 0}}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-3VHHIGDL.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID16}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync29,renameSync as renameSync17,rmSync as rmSync14}from"node:fs";import{basename as basename34,dirname as dirname67,join as join99,relative as relative21,resolve as resolve51,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve51(path14))}function getQuarantineRoot(packageDir){let current=resolve51(packageDir);for(;;){if(basename34(current).toLowerCase()==="node_modules")return join99(current,QUARANTINE_DIR_NAME);let parent=dirname67(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value of sharedObjects){if(typeof value!="string")continue;let filePath=normalizePath3(value),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join99(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID16()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join99(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync29(dirname67(quarantinePath),{recursive:!0}),renameSync17(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;function collectAuthDiagnostics(authStorage,context,options){return[...authStorage.drainErrors().map(error2=>error2.message),...authStorage.takePendingNotices(options).map(notice2=>notice2.message)].map(message=>({type:"warning",message:`(${context}, auth storage) ${message}`}))}function interactiveAuthNotices(authStorage){let pending=authStorage.takePendingNotices({persistSeen:!1});return{messages:[...authStorage.drainErrors().map(error2=>error2.message),...pending.map(notice2=>notice2.message)],markSeen:()=>authStorage.markNoticesSeen(pending.map(notice2=>notice2.id))}}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path14,error:error2})=>({type:"warning",message:`Failed to load extension "${path14}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value){return value?value==="1"||value.toLowerCase()==="true"||value.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2042
2042
|
`));if(command.kind!=="check"){let signal=AbortSignal.timeout(15e3),modelRuntime=await ModelRuntime.create({allowModelNetwork:!1,signal}),credential2=await resolveCredentialForPrint(parsed,modelRuntime,command.kind,command.minExpiryMs,signal);return process.stdout.write(`${credential2}
|
|
2043
2043
|
`),!0}let requestedAuth=validateAuthCommandArgs(parsed,command.kind),result3,credential;try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create(),modelRuntime=await createAuthCheckModelRuntime(credentials);result3=await checkProviderAuth(parsed,modelRuntime,{refresh:!command.noRefresh}),command.credentials&&result3.status==="ready"&&(credential=await getProviderCredential(result3.provider,modelRuntime,credentials,{refresh:!command.noRefresh}),credential||(result3={status:"not_ready",provider:result3.provider,reason:"credential_not_available"}))}catch{result3={status:"invalid",provider:requestedAuth.provider??requestedAuth.model,reason:"invalid_state"}}let accounts=[];if(command.json&&result3.status!=="invalid")try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create();accounts=await summarizeCredentialAccounts(result3.provider,await credentials.read(result3.provider))}catch{}let output=command.json?JSON.stringify({...result3,accounts,...credential?{credentials:credential}:{}}):credential??result3.status;process.stdout.write(`${output}
|
|
2044
|
-
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text3,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text3,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localSessions=sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd),localMatch=localSessions.find(s=>s.id===sessionId)??localSessions.find(s=>sessionFileNameId(s.path)===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}function findSessionByIdOrFileName(sessions2,arg){return sessions2.find(s=>s.id===arg)??sessions2.find(s=>sessionFileNameId(s.path)===arg)??sessions2.find(s=>s.id.startsWith(arg))}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=findSessionByIdOrFileName(localSessions,sessionArg);if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=findSessionByIdOrFileName(allSessions,sessionArg);return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve55=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve55(result3))};rl.question(`${message} [y/N] `,answer3=>{let normalized2=answer3.trim().toLowerCase();settle2(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle2(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path14,sessionDir){try{return SessionManager.open(path14,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function sessionCwdOrUndefined(sessionFile){try{return await readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.spawnedBy&&(parsed.session||parsed.resume||parsed.continue||parsed.fork||parsed.rebind)&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming or forking a session.")),parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy});if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:await sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{if(resolved.cwd!==""&&resolvePath(resolveMovedPath(resolved.cwd))===resolvePath(cwd))return openSessionOrExit(resolved.path,sessionDir);let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-25H5KNYP.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let movedHere=sessionDir===void 0?await movedHereSessionToContinue(cwd):void 0;if(movedHere!==void 0)return SessionManager.open(movedHere,sessionDir);let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let movedChoice=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return movedChoice===void 0?recent:rebindSessionOrExit(movedChoice,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return parsed.spawnedBy&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming an existing session.")),SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode,toolRuntime}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":appMode,resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),fullAccessTrust=presetTrustsProject(sessionExtensionFlagValues(parsed.unknownFlags,launchProfile).get("permission-preset"),startupSettingsManager.getGlobalSettings().permissionPreset)&&trustStore.get(cwd2)!==!1,shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&!fullAccessTrust&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(fullAccessTrust||!hasTrustRequiringResources||trustStore.get(cwd2)===!0),trustFromFullAccess=fullAccessTrust&&hasTrustRequiringResources&&cachedProjectTrust===void 0&&parsed.projectTrustOverride===void 0&&trustStore.get(cwd2)!==!0,runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted,trustFromFullAccess});return launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:appMode,settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path14,warning})=>({type:"warning",message:`Extension package "${path14}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine,...toolRuntime!==void 0?{toolRuntime}:{}});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--print-prompt-sizes")||args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories}))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}let toolRuntimeResolution=resolveToolRuntime(parsed);!toolRuntimeResolution.ok&&!parsed.version&&!parsed.help&&(console.error(source_default.red(`Error: ${toolRuntimeResolution.message}`)),process.exit(1));let toolRuntime=toolRuntimeResolution.ok?toolRuntimeResolution.value:"in-process";if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),0),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=parsed.printPromptSizes?"print":resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-CREX4IXZ.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing",{persistSeen:!0})]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let{presenterBootstrapFd,mcpPresenterEnforcement,...sessionArgs}=parsed,runtimeConfiguration={parsed:sessionArgs,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-YI2WZOET.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join100(agentDir,"auth.json")),authPath:join100(agentDir,"auth.json"),agentDir,modelsPath:join100(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
2044
|
+
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text3,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text3,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localSessions=sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd),localMatch=localSessions.find(s=>s.id===sessionId)??localSessions.find(s=>sessionFileNameId(s.path)===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}function findSessionByIdOrFileName(sessions2,arg){return sessions2.find(s=>s.id===arg)??sessions2.find(s=>sessionFileNameId(s.path)===arg)??sessions2.find(s=>s.id.startsWith(arg))}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=findSessionByIdOrFileName(localSessions,sessionArg);if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=findSessionByIdOrFileName(allSessions,sessionArg);return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve55=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve55(result3))};rl.question(`${message} [y/N] `,answer3=>{let normalized2=answer3.trim().toLowerCase();settle2(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle2(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path14,sessionDir){try{return SessionManager.open(path14,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function sessionCwdOrUndefined(sessionFile){try{return await readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.spawnedBy&&(parsed.session||parsed.resume||parsed.continue||parsed.fork||parsed.rebind)&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming or forking a session.")),parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy});if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:await sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{if(resolved.cwd!==""&&resolvePath(resolveMovedPath(resolved.cwd))===resolvePath(cwd))return openSessionOrExit(resolved.path,sessionDir);let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-E4KUJDLO.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let movedHere=sessionDir===void 0?await movedHereSessionToContinue(cwd):void 0;if(movedHere!==void 0)return SessionManager.open(movedHere,sessionDir);let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let movedChoice=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return movedChoice===void 0?recent:rebindSessionOrExit(movedChoice,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return parsed.spawnedBy&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming an existing session.")),SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode,toolRuntime}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":appMode,resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),fullAccessTrust=presetTrustsProject(sessionExtensionFlagValues(parsed.unknownFlags,launchProfile).get("permission-preset"),startupSettingsManager.getGlobalSettings().permissionPreset)&&trustStore.get(cwd2)!==!1,shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&!fullAccessTrust&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(fullAccessTrust||!hasTrustRequiringResources||trustStore.get(cwd2)===!0),trustFromFullAccess=fullAccessTrust&&hasTrustRequiringResources&&cachedProjectTrust===void 0&&parsed.projectTrustOverride===void 0&&trustStore.get(cwd2)!==!0,runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted,trustFromFullAccess});return launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:appMode,settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path14,warning})=>({type:"warning",message:`Extension package "${path14}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine,...toolRuntime!==void 0?{toolRuntime}:{}});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--print-prompt-sizes")||args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories}))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}let toolRuntimeResolution=resolveToolRuntime(parsed);!toolRuntimeResolution.ok&&!parsed.version&&!parsed.help&&(console.error(source_default.red(`Error: ${toolRuntimeResolution.message}`)),process.exit(1));let toolRuntime=toolRuntimeResolution.ok?toolRuntimeResolution.value:"in-process";if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),0),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=parsed.printPromptSizes?"print":resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-CREX4IXZ.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing",{persistSeen:!0})]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let{presenterBootstrapFd,mcpPresenterEnforcement,...sessionArgs}=parsed,runtimeConfiguration={parsed:sessionArgs,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-Z2CW4SDM.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join100(agentDir,"auth.json")),authPath:join100(agentDir,"auth.json"),agentDir,modelsPath:join100(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
2045
2045
|
`)}}),printTimings(),await runMultiSessionHost({presenterBootstrapFd,mcpPresenterEnforcement,agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen,toolRuntime})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode,toolRuntime},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).catch(error2=>{if(!(error2 instanceof ModelUsabilityBudgetError))throw error2;startupLoadingIndicator.stop(),console.error(source_default.red(error2.message)),process.exit(1)}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime"),parsed.printPromptSizes&&await printPromptSizes(runtime),await prepareSessionOpening(sessionManager,appMode);let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions2=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions2.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&await printThenExit(()=>printHelp(extensionFlags),0),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions2.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(pipedStdinOptions(parsed,process.stderr)),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),appMode!=="interactive"&&(reportDiagnostics([...resourceLoader.getAgentsFiles().diagnostics??[],...resourceLoader.getSkills().diagnostics].filter(diagnostic2=>diagnostic2.type==="warning"&&diagnostic2.category==="size-limit").map(diagnostic2=>({type:"warning",message:diagnostic2.path?`${diagnostic2.path}: ${diagnostic2.message}`:diagnostic2.message}))),reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation",{persistSeen:appMode!=="rpc"}))),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
2046
2046
|
`)});if(!offlineMode&&(appMode==="rpc"||appMode==="interactive")&&startSubscriptionUsagePolling({agentDir,report:appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
2047
|
-
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-
|
|
2047
|
+
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-ETXQWEB2.js");printTimings(),await runRpcMode2(runtime,toolRuntime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-OEPULLZK.js"),interactiveMode=new InteractiveMode2(runtime,{mcpPresenterEnforcement:parsed.mcpPresenterEnforcement,migratedProviders,authNotices:interactiveAuthNotices(services.authStorage),legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve55=>setTimeout(resolve55,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve55=>process.stdout.once("drain",resolve55)),process.stderr.writableLength>0&&await new Promise(resolve55=>process.stderr.once("drain",resolve55)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode",{persistSeen:!0})),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path12 from"node:path";import{spawn as spawn12}from"child_process";function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals2={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry2 of entries){if(entry2.type==="compaction"||entry2.type==="branch_summary"){prev=void 0;continue}if(entry2.type==="usage"&&entry2.kind==="cache_warm"){let promptTokens=entry2.usage.input+entry2.usage.cacheRead+entry2.usage.cacheWrite;promptTokens>0&&(prev={promptTokens,modelKey:`${entry2.provider}/${entry2.model}`,timestamp:Date.parse(entry2.timestamp),reportedCache:!0})}else if(entry2.type==="message"&&entry2.message.role==="assistant"){let miss=detectMiss(prev,entry2.message,models);miss&&(totals2.missedTokens+=miss.missedTokens,totals2.missedCost+=miss.missedCost,totals2.missCount+=1,misses.set(entry2.message,miss)),prev=asPreviousRequest(entry2.message,prev?.reportedCache??!1)??prev}}return{prev,totals:totals2,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}var MAX_AGE=10080*60*1e3;function normalizeStackPath(value){return value.replace(/\\/g,"/").replace(/\/+$/u,"")}function stackContainsPath(stack,targetPath,includeDescendants){let target=normalizeStackPath(targetPath);if(!target||isSyntheticPath(target))return!1;let caseInsensitive=/^[a-z]:\//iu.test(target),haystack=caseInsensitive?stack.toLowerCase():stack,needle=caseInsensitive?target.toLowerCase():target;if(includeDescendants)return haystack.includes(`${needle}/`);let index=haystack.indexOf(needle);for(;index!==-1;){let next=haystack[index+needle.length];if(next===void 0||next===":"||next===")"||/\s/u.test(next))return!0;index=haystack.indexOf(needle,index+needle.length)}return!1}function findExtensionStackMatches(stack,extensions){if(!stack)return[];let normalizedStack=stack.split(`
|
|
2048
2048
|
`).slice(1).filter(line=>/^\s+at\s/u.test(line)).map(line=>{try{return decodeURI(line)}catch{return line}}).join(`
|
|
2049
2049
|
`).replace(/\\/g,"/"),matches2=[],seen=new Set;for(let extension of extensions){let resolvedPath=normalizeStackPath(extension.resolvedPath),singleFilePackage=extension.sourceInfo.origin==="package"&&!/^(?:npm:|git:|https?:\/\/|ssh:\/\/)/u.test(extension.sourceInfo.source)&&/\.[cm]?[jt]s$/u.test(extension.sourceInfo.source),packageRoot=extension.sourceInfo.origin==="package"&&!singleFilePackage&&extension.sourceInfo.baseDir?extension.sourceInfo.baseDir:void 0,slashIndex=resolvedPath.lastIndexOf("/"),directoryEntry=/\/index\.[cm]?[jt]s$/u.test(resolvedPath);if(!(packageRoot?stackContainsPath(normalizedStack,packageRoot,!0):directoryEntry&&slashIndex!==-1?stackContainsPath(normalizedStack,resolvedPath.slice(0,slashIndex),!0):stackContainsPath(normalizedStack,resolvedPath,!1)))continue;let label3=extension.sourceInfo.origin==="package"&&extension.sourceInfo.source?extension.sourceInfo.source:extension.path;seen.has(label3)||(seen.add(label3),matches2.push(label3))}return matches2}function registerLocalMcpPresenter(ui,sessionId,lifetime,admit){let authority=new McpPresenterAuthority,binding=authority.bind(sessionId,sessionId,admit),activeInput,drafts=new Map,sender=authority.connect("local_tui",frame=>{if(frame.type!=="mcp_form_request")return drafts.get(frame.dialogId)?.abort(),drafts.delete(frame.dialogId),!0;let active=activeInput;if(!active)return!1;let{input}=active,draft=new AbortController;drafts.set(frame.dialogId,draft);let signal=AbortSignal.any([input.operationSignal,input.presentationSignal,lifetime,draft.signal]),{sessionId:sessionId2,bindingEpoch,attachmentEpoch,grantId,dialogId,dialogToken,formRevision}=frame,envelope2={sessionId:sessionId2,bindingEpoch,attachmentEpoch,grantId,dialogId,dialogToken,formRevision};return collectMrtrForm({ui,signal,presented:()=>authority.receive(sender,{...envelope2,type:"mcp_form_presented"})},`${frame.server.label} (${frame.server.source})`,{message:frame.message,requestedSchema:frame.schema},signal).then(result3=>{signal.aborted||authority.receive(sender,{...envelope2,type:"mcp_form_response",...result3})},()=>active.fail()).finally(()=>drafts.delete(frame.dialogId)),!0});authority.attach(sender,binding);let owner=authority.enroll();owner.acquire(owner.register(binding,sender,{kind:"local_tui"}));let dispose=()=>{authority.dispose();for(let draft of drafts.values())draft.abort();drafts.clear()};lifetime.addEventListener("abort",dispose,{once:!0});let privateForms={epoch:binding.epoch,signal:binding.signal,capture:()=>{let presentation=binding.capture();if(presentation)return{...presentation,present:async input=>{let deadline=performance.now()+input.deadlineMs,timeout=new AbortController,timer=setTimeout(()=>timeout.abort(),Math.max(0,input.deadlineMs)),signal=AbortSignal.any([input.operationSignal,input.presentationSignal,presentation.signal,lifetime,timeout.signal]);try{return await queuedForm(binding,signal,async()=>{let failure2=new AbortController,current={input:{...input,presentationSignal:AbortSignal.any([signal,failure2.signal]),deadlineMs:Math.max(0,deadline-performance.now())},fail:()=>failure2.abort()};activeInput=current;try{return await presentation.present(current.input)}finally{activeInput===current&&(activeInput=void 0)}})}catch{return{kind:input.operationSignal.aborted||binding.signal.aborted||input.operationCurrent?.()===!1?"operation_aborted":"processing_failure",source:"host_termination",humanAdmission:!1}}finally{clearTimeout(timer)}}}},dispose};return lifetime.aborted&&dispose(),privateForms}import{spawn as spawn10,spawnSync}from"node:child_process";function checkGhAuth(){let result3=spawnSync("gh",["auth","status"],{encoding:"utf-8"});return result3.error!==void 0?"missing":result3.status===0?"ok":"logged-out"}function uploadSecretGist(html,fileName,signal){return new Promise(resolve55=>{if(signal.aborted){resolve55({code:null,stdout:"",stderr:"",aborted:!0});return}let child=spawn10("gh",["gist","create","--filename",fileName,"-"],{stdio:["pipe","pipe","pipe"]}),stdout="",stderr="",onAbort=()=>signalSpawnedChild(child);signal.addEventListener("abort",onAbort,{once:!0}),child.stdout.on("data",data=>{stdout+=data.toString()}),child.stderr.on("data",data=>{stderr+=data.toString()}),child.on("error",error2=>{signal.removeEventListener("abort",onAbort),resolve55({code:null,stdout,stderr:error2.message,aborted:signal.aborted})}),child.on("close",code=>{signal.removeEventListener("abort",onAbort),resolve55({code,stdout,stderr,aborted:signal.aborted})}),child.stdin.on("error",()=>{}),child.stdin.end(html)})}import{homedir as homedir24,hostname,userInfo}from"node:os";var RUN_CHAR="[A-Za-z0-9+/_-]",PAD="={0,2}",GAP=String.raw`(?:\\?\r?\n[ \t]*|(?:\\r)?\\n[ \t]*|["'][ \t]*[+,]?[ \t]*(?:\r?\n[ \t]*)?["'])`,SINGLE_RUN=new RegExp(`(?<!${RUN_CHAR})${RUN_CHAR}{20,}${PAD}(?![A-Za-z0-9+/=_-])`,"g"),SPLIT_RUN=new RegExp(`(?<!${RUN_CHAR})(${RUN_CHAR}{8,})(${GAP})(${RUN_CHAR}{8,}${PAD})(?![A-Za-z0-9+/=_-])`,"g"),WRAPPED_TAIL=new RegExp(`(<redacted>)(${GAP})(${RUN_CHAR}{6,}${PAD})(?![A-Za-z0-9+/=_-])`,"g"),INTEGRITY_PREFIX=/sha(?:256|384|512)-$/,INTEGRITY_RUN=/^sha(?:256|384|512)-/;function shannonBitsPerChar(text3){let counts=new Map;for(let char of text3)counts.set(char,(counts.get(char)??0)+1);let bits=0;for(let n of counts.values())bits-=n/text3.length*Math.log2(n/text3.length);return bits}var WORD_PIECE=/[A-Z]?[a-z]{3,}|[0-9]+/g,CASE_PIECE=/[A-Z]?[a-z]+|[A-Z]+(?![a-z])|[0-9]+/g;function pronounceable(piece){return/^[0-9]+$/.test(piece)?piece.length<=3:/[aeiouy]/i.test(piece)&&!/[^aeiouy]{4,}/i.test(piece)}function readsAsWords(run2,coverage=.6){let letters=run2.replace(/[^A-Za-z]/g,""),vowels=letters.replace(/[^aeiouAEIOU]/g,"").length;if(letters.length===0||vowels/letters.length<.3)return!1;let covered=[...run2.matchAll(WORD_PIECE)].map(match=>match[0]).filter(pronounceable).reduce((sum,piece)=>sum+piece.length,0),pieces=run2.match(CASE_PIECE)??[];return covered>=run2.length*coverage&&pieces.length>0&&run2.length/pieces.length>=3}function readsAsPath(run2){let segments2=run2.split("/").filter(segment=>segment.length>0);return segments2.length>=2&&segments2.every(isPlainSegment)}function isPlainSegment(segment){return/^[a-z0-9._@-]+$/.test(segment)||/^[A-Z0-9_]+$/.test(segment)||readsAsWords(segment)}function looksGenerated(run2){let body=run2.replace(/=+$/,"");if(body.length<16)return!1;let upper=body.replace(/[^A-Z]/g,"").length,lower2=body.replace(/[^a-z]/g,"").length,digits=body.replace(/[^0-9]/g,"").length,symbols=body.replace(/[^+/]/g,"").length,classes=[upper,lower2,digits,symbols].filter(n=>n>0).length;return lower2<2||upper<2&&classes<3||shannonBitsPerChar(body)<Math.min(3.8,Math.log2(body.length)-1.2)?!1:!readsAsWords(body)&&!readsAsPath(body)}function plainHalf(half3){return/^[a-z0-9._@-]+$/.test(half3)||/^[A-Z0-9_]+$/.test(half3)||readsAsPath(half3)||readsAsWords(half3,.85)}function integrityAt(run2,offset,whole){return INTEGRITY_RUN.test(run2)||INTEGRITY_PREFIX.test(whole.slice(Math.max(0,offset-7),offset))}function joinedLooksGenerated(head,tail){return!plainHalf(head)&&!plainHalf(tail)&&looksGenerated(head+tail)}function redactGeneratedValues(text3,onRedact){let result3=text3.replace(SPLIT_RUN,(match,head,gap,tail,offset,whole)=>integrityAt(head,offset,whole)||!joinedLooksGenerated(head,tail)?match:(onRedact(),`<redacted>${gap}<redacted>`));return result3=result3.replace(SINGLE_RUN,(run2,offset,whole)=>integrityAt(run2,offset,whole)||run2.length<32&&!/[+/]|=$/.test(run2)||!looksGenerated(run2)?run2:(onRedact(),"<redacted>")),result3.replace(WRAPPED_TAIL,(match,redacted,gap,tail)=>!(/[A-Za-z]/.test(tail)&&(/[0-9]/.test(tail)||/[A-Z]/.test(tail)&&/[a-z]/.test(tail)))||/^[a-z0-9._@-]+$/.test(tail)||/^[A-Z0-9_]+$/.test(tail)||readsAsPath(tail)?match:(onRedact(),`${redacted}${gap}<redacted>`))}var EDGE_START=new RegExp(`^(${RUN_CHAR}{8,}${PAD})`),EDGE_END=new RegExp(`(?<!${RUN_CHAR})(${RUN_CHAR}{8,})$`);function redactAcrossBoundary(left,right,onRedact){let end=EDGE_END.exec(left)?.[1],start=EDGE_START.exec(right)?.[1];return end===void 0||start===void 0||!joinedLooksGenerated(end,start)?[left,right]:(onRedact(),[`${left.slice(0,-end.length)}<redacted>`,`<redacted>${right.slice(start.length)}`])}var SENSITIVE_WORDS=new Set(["key","keys","apikey","token","tokens","secret","secrets","pass","passwd","password","passwords","passphrase","pwd","auth","authorization","credential","credentials","cookie","cookies","session","sessionid","private","signature"]),ORDINARY_NAMES=new Set(["public_key","public_key_path","key_id","auth_mode","auth_type","max_tokens","max_output_tokens"]);function words3(name){return name.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(word=>word.length>0)}function isSensitiveKeyName(name){let parts=words3(name);return parts.some(word=>SENSITIVE_WORDS.has(word))?!ORDINARY_NAMES.has(parts.join("_")):!1}function currentShareRedactionContext(){let userName="";try{userName=userInfo().username}catch{userName=process.env.USER??process.env.USERNAME??""}return{homeDirectory:homedir24(),userName,hostName:hostname()}}var MIN_LITERAL_LENGTH=3,IDENTITY_CHAR="[\\p{L}\\p{N}\\p{M}_.-]",WORD_CHAR="[\\p{L}\\p{N}\\p{M}]",COMMON_NAMES=new Set(["admin","user","users","test","home","root","runner","guest","default","shared"]);function escapeRegExp4(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ANY_SEPARATOR="(?:/|\\\\{1,2}|%2[Ff]|%5[Cc])";function homePattern(homeDirectory){let segments2=homeDirectory.split(/[\\/]+/).filter(segment=>segment.length>0);if(segments2.length===0)return;let drive=/^[A-Za-z]:$/.test(segments2[0]??"")?segments2.shift():void 0,body=segments2.map(segment=>escapeRegExp4(segment).replace(/ /g,"(?: |%20|\\+)")).join(ANY_SEPARATOR),prefix=drive===void 0?ANY_SEPARATOR:`${escapeRegExp4(drive)}${ANY_SEPARATOR}`;return new RegExp(`(?:file:${ANY_SEPARATOR}{0,3})?${prefix}${body}(?!${IDENTITY_CHAR})`,"giu")}var OTHER_HOME=new RegExp(`(?:[A-Za-z]:)?${ANY_SEPARATOR}(?:Users|home)${ANY_SEPARATOR}[^\\s/\\\\'"%:)<>\\]]{1,64}`,"gi");function literalPattern(value){let trimmed=value.trim();if(!(trimmed.length<MIN_LITERAL_LENGTH||COMMON_NAMES.has(trimmed.toLowerCase())))return new RegExp(`(?<!${WORD_CHAR})${escapeRegExp4(trimmed)}(?!${WORD_CHAR})`,"giu")}var PRIVATE_KEY_BLOCK=/-----BEGIN [A-Z0-9 ]{0,40}PRIVATE KEY(?: BLOCK)?-----(?:[\s\S]*?-----END [A-Z0-9 ]{0,40}PRIVATE KEY(?: BLOCK)?-----|[\s\S]*$)/g,CREDENTIAL_REWRITES=[[/\b(Bearer|Basic|Token)(\s{1,5})(?:<redacted>)?(?=[A-Za-z]*[0-9._~+/=-])[A-Za-z0-9._~+/=-]{8,}/gi,(_m,scheme,gap)=>`${scheme}${gap}<redacted>`],[/\b([A-Za-z][A-Za-z0-9+.-]{0,20}:\/\/[^\s/:@]{1,64}:)[^\s/@]{1,256}@/g,(_m,prefix)=>`${prefix}<redacted>@`],[/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,()=>"<redacted>"],[/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}/g,()=>"<redacted>"],[/\bgh[pousr]_[A-Za-z0-9]{20,}/g,()=>"<redacted>"],[/\bgithub_pat_[A-Za-z0-9_]{20,}/g,()=>"<redacted>"],[/\bxox[abprs]-[A-Za-z0-9-]{10,}/g,()=>"<redacted>"],[/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,()=>"<redacted>"],[/\bAIza[0-9A-Za-z_-]{35}\b/g,()=>"<redacted>"],[/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{10,}/g,()=>"<redacted>"],[/\bhf_[A-Za-z0-9]{30,}/g,()=>"<redacted>"],[/\bnpm_[A-Za-z0-9]{36}\b/g,()=>"<redacted>"],[/\bglpat-[A-Za-z0-9_-]{20,}/g,()=>"<redacted>"],[/(?<![A-Za-z0-9-])((?:Set-)?Cookie)(\s{0,3}:\s{0,3})[^\n"]+/gi,(_m,name,sep21)=>`${name}${sep21}<redacted>`]],KEY_VALUE=/([A-Za-z0-9_.[\]-]{1,128})((?:\\?["'])?[ \t]{0,3}[:=][ \t]{0,3})(?:(\\?["'])((?:(?!\3)[^\n]){0,2000})\3|([^\s"'\\&,;}[{(=)][^\n"'\\&,;}()]{0,1999}))/g,KEY_COLLECTION=/((["']?)([A-Za-z0-9_.-]{1,128})\2[ \t]{0,3}[:=][ \t]{0,3})(\[[^\]\n]{0,2000}\]|\{[^}\n]{0,2000}\})/g,KEY_YAML_LIST=/^([ \t]*)([A-Za-z0-9_.-]{1,128}):[ \t]*\r?\n((?:\1[ \t]*-[ \t]+[^\n]*(?:\r?\n|$))+)/gm,ALREADY_REDACTED=/^(?:(?:Bearer|Basic|Token|Digest)\s+)?(?:<redacted>\s*)+$/i,QUOTED2=/"(?:[^"\\\n]|\\.)*"|'[^'\n]*'/g,DATA_URI=/data:[a-z]+\/[a-z0-9.+-]+;base64,[A-Za-z0-9+/=]+/gi,EMAIL=/(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]{1,64}(?:@|%40)[A-Za-z0-9-]{1,63}(?:\.[A-Za-z0-9-]{1,63}){1,5}/g,IPV4=/(?<!\d|\d\.)(?:\d{1,3}\.){3}\d{1,3}(?!\d|\.\d)/g;function keepsAddress(address){return address.startsWith("127.")||address==="0.0.0.0"}function count(tally,category){tally.set(category,(tally.get(category)??0)+1)}function redactQuoted(quoted2,tally){let quote=quoted2[0]??'"';if(quoted2.length<=2)return quoted2;let replaced=`${quote}<redacted>${quote}`;return replaced!==quoted2&&count(tally,"credential"),replaced}var PLACEHOLDER=/<(?:redacted(?: private key)?|email|ip|host|user)>|\[image omitted from share\]/g;function replaceOutsidePlaceholders(text3,pattern,replace){let out="",last=0;for(let match of text3.matchAll(PLACEHOLDER)){let at=match.index??0;out+=text3.slice(last,at).replace(pattern,replace)+match[0],last=at+match[0].length}return out+text3.slice(last).replace(pattern,replace)}function redactShareText(text3,context,tally){if(text3.length===0)return text3;let result3=text3,home=homePattern(context.homeDirectory);home&&(result3=result3.replace(home,()=>(count(tally,"home path"),"~"))),result3=result3.replace(OTHER_HOME,match=>(count(tally,"home path"),match.replace(/[^/\\%]+$/,"<user>"))),result3=result3.replace(DATA_URI,()=>(count(tally,"image"),"[image omitted from share]")),result3=result3.replace(PRIVATE_KEY_BLOCK,()=>(count(tally,"private key"),"<redacted private key>")),result3=result3.replace(KEY_COLLECTION,(match,prefix,_quote,key,collection)=>isSensitiveKeyName(key)?prefix+collection.replace(QUOTED2,quoted2=>redactQuoted(quoted2,tally)):match),result3=result3.replace(KEY_YAML_LIST,(match,indent,key,items)=>{if(!isSensitiveKeyName(key))return match;let redacted=items.replace(/^([ \t]*-[ \t]+)(\S[^\n]*)/gm,(_item,bullet,item)=>(item!=="<redacted>"&&count(tally,"credential"),`${bullet}<redacted>`));return`${indent}${key}:
|
|
2050
2050
|
${redacted}`});for(let[pattern,rewrite]of CREDENTIAL_REWRITES)result3=result3.replace(pattern,(...args)=>{let match=String(args[0]),groups=args.slice(1).filter(value=>typeof value=="string"),replaced=rewrite(match,...groups);return replaced!==match&&count(tally,"credential"),replaced});result3=result3.replace(KEY_VALUE,(match,key,separator,quote,quoted2,bare)=>{if(!isSensitiveKeyName(key)||quote===void 0&&bare==="<redacted>")return match;let replaced=quote===void 0?`${key}${separator}<redacted>${(bare??"").match(/\s*$/)?.[0]??""}`:`${key}${separator}${quote}<redacted>${quote}`,value=quote===void 0?bare??"":quoted2;return replaced!==match&&!ALREADY_REDACTED.test(value.trim())&&count(tally,"credential"),replaced}),result3=redactGeneratedValues(result3,()=>count(tally,"credential")),result3=result3.replace(EMAIL,()=>(count(tally,"email"),"<email>")),result3=result3.replace(IPV4,address=>keepsAddress(address)?address:(count(tally,"ip address"),"<ip>"));let shortHost=context.hostName.split(".")[0]??"";for(let[value,placeholder,category]of[[context.hostName,"<host>","host name"],[shortHost,"<host>","host name"],[context.userName,"<user>","user name"],...(context.extraLiterals??[]).map(value2=>[value2,"<user>","user name"])]){let pattern=literalPattern(value);pattern&&(result3=replaceOutsidePlaceholders(result3,pattern,()=>(count(tally,category),placeholder)))}return result3}import{createHash as createHash29}from"node:crypto";import{mkdtempSync,rmSync as rmSync15,writeFileSync as writeFileSync26}from"node:fs";import{tmpdir as tmpdir8}from"node:os";import{join as join101}from"node:path";function newOutputOmissions(){return{count:0}}var OMITTED_RESULT_HTML=["resultHtmlCollapsed","resultHtmlExpanded"];function note(label3){return{type:"text",text:`[output omitted: ${label3}]`}}function omit(omissions){omissions.count++}function projectRecord(record10,omissions){if(record10.role==="toolResult"){omit(omissions);let toolName=typeof record10.toolName=="string"?record10.toolName:"tool";return{...record10,content:[note(toolName)],details:void 0}}if(record10.role==="bashExecution")return omit(omissions),{...record10,output:"[output omitted: command]",fullOutputPath:void 0};if(record10.role==="custom"||record10.type==="custom_message"){omit(omissions);let customType=typeof record10.customType=="string"?record10.customType:"extension";return{...record10,content:[note(customType)],details:void 0}}if(record10.type==="custom")return{...record10,data:void 0};if(record10.type==="compaction")return{...record10,details:void 0,systemMessage:void 0};if(record10.type==="branch_summary")return{...record10,details:void 0};if(record10.type==="context_edit"&&record10.replacement!==null&&typeof record10.replacement=="object")return omit(omissions),{...record10,replacement:{content:[note("context edit")]}}}function projectRenderedTools(value){return value===null||typeof value!="object"?value:Object.fromEntries(Object.entries(value).map(([id,rendered])=>{if(rendered===null||typeof rendered!="object")return[id,rendered];let kept=Object.entries(rendered).filter(([key])=>!OMITTED_RESULT_HTML.some(omitted=>omitted===key));return[id,Object.fromEntries(kept)]}))}function omitToolOutputs(value,omissions){return project(value,omissions)}function project(value,omissions){if(Array.isArray(value))return value.map(item=>project(item,omissions));if(value===null||typeof value!="object")return value;let record10=value,projected=projectRecord(record10,omissions);if(projected)return projected;let out={};for(let[key,child]of Object.entries(record10))out[key]=key==="renderedTools"?projectRenderedTools(child):project(child,omissions);return out}function isImageBlock(value){if(typeof value.type=="string"&&/image/i.test(value.type))return!0;let source2=value.source;return typeof source2=="object"&&source2!==null&&Reflect.get(source2,"type")==="base64"}var SCHEMA_TYPES=new Set(["string","number","integer","boolean","object","array","null"]),SCHEMA_KEYWORDS=new Set(["type","description","title","format","enum","items","properties","required","minLength","maxLength","pattern","additionalProperties","nullable"]);function isSchemaNode(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let type2=Reflect.get(value,"type");return typeof type2!="string"||!SCHEMA_TYPES.has(type2)?!1:Object.keys(value).every(key=>SCHEMA_KEYWORDS.has(key))}function dropAllStrings(value,tally){return typeof value=="string"?value.length===0?value:(value!=="<redacted>"&&count(tally,"credential"),"<redacted>"):Array.isArray(value)?value.map(item=>dropAllStrings(item,tally)):value===null||typeof value!="object"?value:Object.fromEntries(Object.entries(value).map(([key,child])=>[key,dropAllStrings(child,tally)]))}function redactShareValue(value,context,tally){return redactNode(value,context,tally)}function redactNode(value,context,tally){if(typeof value=="string")return redactShareText(value,context,tally);if(Array.isArray(value))return joinAdjacentText(value.map(item=>redactNode(item,context,tally)),tally);if(value===null||typeof value!="object")return value;let record10=value;if(isImageBlock(record10))return count(tally,"image"),{type:"text",text:"[image omitted from share]"};let out={};for(let[key,child]of Object.entries(record10))out[key]=isSensitiveKeyName(key)&&!isSchemaNode(child)?dropAllStrings(child,tally):redactNode(child,context,tally);return out}function textOf3(item){if(typeof item=="string")return item;if(item===null||typeof item!="object"||Reflect.get(item,"type")!=="text")return;let text3=Reflect.get(item,"text");return typeof text3=="string"?text3:void 0}function withText(item,text3){return typeof item=="string"?text3:{...item,text:text3}}function joinAdjacentText(items,tally){for(let index=0;index+1<items.length;index++){let left=textOf3(items[index]),right=textOf3(items[index+1]);if(left===void 0||right===void 0)continue;let[nextLeft,nextRight]=redactAcrossBoundary(left,right,()=>count(tally,"credential"));nextLeft!==left&&(items[index]=withText(items[index],nextLeft),items[index+1]=withText(items[index+1],nextRight))}return items}function prepareShare(render2,context,includeOutputs=!1){let tally=new Map,omittedOutputs=0,html=render2(value=>{if(includeOutputs)return redactShareValue(value,context,tally);let omissions=newOutputOmissions(),projected=omitToolOutputs(value,omissions);return omittedOutputs=Math.max(omittedOutputs,omissions.count),redactShareValue(projected,context,tally)}),sha2563=createHash29("sha256").update(html).digest("hex");return{html,sha256:sha2563,tally,includesOutputs:includeOutputs,omittedOutputs}}var CATEGORY_ORDER2=["credential","private key","home path","user name","host name","email","ip address","image"];function describeTally(tally){let parts=CATEGORY_ORDER2.flatMap(category=>{let total=tally.get(category)??0;return total===0?[]:[`${total} ${category}${total===1?"":"s"}`]});return parts.length===0?"nothing matched the redaction rules":parts.join(", ")}function describeShare(prepared,viewerBase){let kilobytes=Math.max(1,Math.round(Buffer.byteLength(prepared.html)/1024)),viewer=viewerBase===void 0?"No viewer is configured, so you get the gist link only.":`The link opens in ${viewerBase}, a viewer set by SHARE_VIEWER_URL that receives the gist id.`;return["Share this session as a secret GitHub gist?","",prepared.includesOutputs?`Uploads: the conversation, tool calls AND their outputs, system prompt and tool list, as one HTML file (${kilobytes} KB, sha256 ${prepared.sha256.slice(0,12)}).`:`Uploads: your messages and the replies, tool names and arguments (including any file content the agent wrote or edited), system prompt and tool list, as one HTML file (${kilobytes} KB, sha256 ${prepared.sha256.slice(0,12)}).`,prepared.includesOutputs?"Tool outputs are included (file contents, command output, extension messages).":`Tool outputs are left out: ${prepared.omittedOutputs} replaced by "[output omitted]".`,`Removed first: ${describeTally(prepared.tally)}. Images are always left out.`,"Who can read it: anyone with the link. A secret gist is unlisted, not private, and stays until you delete it on GitHub.",viewer,"Redaction is pattern-based and can miss things; review the exact file if the session holds anything sensitive."].join(`
|
|
@@ -2120,7 +2120,7 @@ ${skill.content}`).join(`
|
|
|
2120
2120
|
`)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source2==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source2==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source2,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value){throw new Error(`Unexpected resource scope: ${String(value)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage5(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage5(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage5(error2){return error2 instanceof Error?error2.message:String(error2)}var DEFAULT_FLAG="--default";function parseModelCommandArgument(argument){let words5=(argument??"").trim().split(/\s+/).filter(word=>word.length>0),asDefault=words5.includes(DEFAULT_FLAG);return{searchTerm:words5.filter(word=>word!==DEFAULT_FLAG).join(" "),asDefault}}function isAnnouncedElsewhere(source2){return source2==="fallback"||source2==="fallback-revert"}function describeOrigin(origin){return origin.actor===void 0?origin.source:`${origin.source}: ${origin.actor}`}function modelChangeNoticeText(input){return`\u21C4 Model changed mid-turn \xB7 ${input.from===void 0?input.to:`${input.from} \u2192 ${input.to}`} (${describeOrigin(input.origin)})`}function liveModelChangeNotice(event){if(!(!event.duringTurn||isAnnouncedElsewhere(event.origin.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:event.previousModel?.id,to:event.model.id,origin:event.origin})}}function replayedModelChangeNotice(entry2){if(!(entry2.duringTurn!==!0||entry2.source===void 0||isAnnouncedElsewhere(entry2.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:entry2.originalModelId,to:entry2.modelId,origin:entry2.actor===void 0?{source:entry2.source}:{source:entry2.source,actor:entry2.actor}})}}var PAUSE_STATUS_KEY="session-pause";function pauseFooterText(view){if(!view.paused&&!view.runPaused)return;let held=view.pausedNoticeCount===1?"1 update held":`${view.pausedNoticeCount} updates held`;return view.pauseView?.records.some(record10=>record10.key==="interrupted-run")?`Interrupted \xB7 ${view.pausedNoticeCount>0?`${held} \xB7 `:""}type to continue, /resume to resume`:view.runPaused?`Run paused \xB7 ${held} \xB7 type to continue, /resume to resume the run`:`Paused \xB7 ${held} \xB7 type to continue, /resume to resume`}function resumeCommandTarget(view){return view.paused||view.runPaused?"resume_session":"session_picker"}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let count2=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count2}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage6=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage6}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source2){return source2.usesDefaultSessionDir()?{}:{sessionDir:source2.getSessionDir()}}function currentScopeSessions(source2,onProgress,signal){let cwd=source2.getCwd();return withMovedSessions(SessionManager.list(cwd,source2.getSessionDir(),onProgress,signal),cwd,sharedSessionDir(source2))}async function allScopeSessions(source2,onProgress,signal){let sessions2=source2.usesDefaultSessionDir()?await SessionManager.listAll(onProgress,signal):await SessionManager.listAll(source2.getSessionDir(),onProgress,signal);return markMovedSessions(sessions2,source2.getCwd())}async function chooseResumePath(sessionPath,source2,ui){let cwd=source2.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source2),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
|
|
2121
2121
|
This directory is the same git repository: ${cwd}
|
|
2122
2122
|
Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync48,mkdirSync as mkdirSync31,readFileSync as readFileSync52,realpathSync as realpathSync18,writeFileSync as writeFileSync28}from"node:fs";import{join as join104}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update2=brand.update;if(update2===void 0)return;let installSpec=update2.distTag==="latest"?update2.packageName:`${update2.packageName}@${update2.distTag}`;return{packageName:update2.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync52(join104(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync31(agentDir,{recursive:!0}),writeFileSync28(join104(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2123
|
-
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value!==void 0&&value!==""&&value!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync48,realpathSync18)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.registering=Promise.resolve(),this.context=context}register(options){let next=this.registering.then(()=>this.registerNow(options));return this.registering=next.catch(()=>{}),next}async registerNow(options){await this.disposeActive().catch(error2=>this.context().surface.notice(`control endpoint teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`));let{registerSessionControlEndpoint}=await import("./session-control-endpoint-
|
|
2123
|
+
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value!==void 0&&value!==""&&value!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync48,realpathSync18)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.registering=Promise.resolve(),this.context=context}register(options){let next=this.registering.then(()=>this.registerNow(options));return this.registering=next.catch(()=>{}),next}async registerNow(options){await this.disposeActive().catch(error2=>this.context().surface.notice(`control endpoint teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`));let{registerSessionControlEndpoint}=await import("./session-control-endpoint-4LEIDIVI.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);if(!("endpoint"in outcome))return outcome.registration;let endpoint=outcome.endpoint;return this.active=endpoint,{...outcome.registration,dispose:async()=>{await endpoint.dispose(),this.active===endpoint&&(this.active=void 0)}}}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text3=>{change?.(text3),this.editorChanged(hasDraft())};let submit2=editor.onSubmit;editor.onSubmit=(text3,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit2?.(text3,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text3=>theme.fg("dim",text3),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
|
|
2124
2124
|
${theme.bold("Failures")}
|
|
2125
2125
|
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2126
2126
|
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|
|
@@ -2244,8 +2244,8 @@ ${theme.fg("dim","Cache Re-billed:")} ${detail}`}}return info+=formatSessionFail
|
|
|
2244
2244
|
`}}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.chatContainer.addChild(new ThemedText(()=>theme.bold(theme.fg("accent","Keyboard Shortcuts")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(hotkeys.trim(),1,1,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new DynamicBorder),this.ui.requestRender()}async handleClearCommand(){this.clearStatusIndicator();try{if((await this.runtimeHost.newSession()).cancelled)return;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("accent","\u2713 New session started"),1,1)),this.ui.requestRender()}catch(error2){await this.handleFatalRuntimeError("Failed to create session",error2)}}handleDebugCommand(){let width=this.ui.terminal.columns,height=this.ui.terminal.rows,allLines=this.ui.render(width),debugLogPath=getDebugLogPath(),debugData=[`Debug output at ${new Date().toISOString()}`,`Terminal: ${width}x${height}`,`Total lines: ${allLines.length}`,"","=== All rendered lines with visible widths ===",...allLines.map((line,idx)=>{let vw=visibleWidth(line),escaped=JSON.stringify(line);return`[${idx}] (w=${vw}) ${escaped}`}),"","=== Agent messages (JSONL) ===",...this.session.messages.map(msg=>JSON.stringify(msg)),""].join(`
|
|
2245
2245
|
`);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let extensionRunner=this.session.extensionRunner,eventResult;try{eventResult=await extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()})}catch{return}if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};function parseDiffLine(line){let match=line.match(/^([+-\s])(\s*\d*)\s(.*)$/);return match?{prefix:match[1],lineNum:match[2],content:match[3]}:null}function replaceTabs2(text3){return text3.replace(/\t/g," ")}function renderIntraLineDiffWithDiffWords(oldContent,newContent){let wordDiff=diffWords(oldContent,newContent),removedLine="",addedLine="",isFirstRemoved=!0,isFirstAdded=!0;for(let part of wordDiff)if(part.removed){let value=part.value;if(isFirstRemoved){let leadingWs=value.match(/^(\s*)/)?.[1]||"";value=value.slice(leadingWs.length),removedLine+=leadingWs,isFirstRemoved=!1}value&&(removedLine+=theme.inverse(value))}else if(part.added){let value=part.value;if(isFirstAdded){let leadingWs=value.match(/^(\s*)/)?.[1]||"";value=value.slice(leadingWs.length),addedLine+=leadingWs,isFirstAdded=!1}value&&(addedLine+=theme.inverse(value))}else removedLine+=part.value,addedLine+=part.value;return{removedLine,addedLine}}function renderIntraLineDiff(oldContent,newContent){return renderIntraLineDiffFastPath(oldContent,newContent)??renderIntraLineDiffWithDiffWords(oldContent,newContent)}function renderIntraLineDiffFastPath(oldContent,newContent){return oldContent===newContent?{removedLine:oldContent,addedLine:newContent}:renderSingleSpanIntraLineDiff(oldContent,newContent)}function renderSingleSpanIntraLineDiff(oldContent,newContent){let span=findSingleDiffWordsReplacement(oldContent,newContent);return span?{removedLine:`${span.prefix}${theme.inverse(span.removed)}${span.suffix}`,addedLine:`${span.prefix}${theme.inverse(span.added)}${span.suffix}`}:null}function findSingleDiffWordsReplacement(oldContent,newContent){let start=0;for(;start<oldContent.length&&start<newContent.length&&oldContent[start]===newContent[start];)start++;let oldEnd=oldContent.length,newEnd=newContent.length;for(;oldEnd>start&&newEnd>start&&oldContent[oldEnd-1]===newContent[newEnd-1];)oldEnd--,newEnd--;for(;start>0&&(isAsciiWordCode(oldContent.charCodeAt(start-1))||isAsciiWordCode(newContent.charCodeAt(start-1)));)start--;for(;oldEnd<oldContent.length&&newEnd<newContent.length&&(isAsciiWordCode(oldContent.charCodeAt(oldEnd))||isAsciiWordCode(newContent.charCodeAt(newEnd)));)oldEnd++,newEnd++;let prefix=oldContent.slice(0,start),removed=oldContent.slice(start,oldEnd),added=newContent.slice(start,newEnd),oldSuffix=oldContent.slice(oldEnd),newSuffix=newContent.slice(newEnd);return oldSuffix!==newSuffix||!isSingleDiffWordsReplacement(removed,added)?null:{prefix,removed,added,suffix:oldSuffix}}function isSingleDiffWordsReplacement(removed,added){return removed.length>0&&added.length>0&&isSimpleDiffToken(removed)&&isSimpleDiffToken(added)}function isSimpleDiffToken(value){for(let i=0;i<value.length;i++){let code=value.charCodeAt(i);if(!isAsciiWordCode(code))return!1}return!0}function isAsciiWordCode(code){return code>=48&&code<=57||code>=65&&code<=90||code===95||code>=97&&code<=122}function renderDiff(diffText,_options={}){let lines=diffText.split(`
|
|
2246
2246
|
`),result3=[],i=0;for(;i<lines.length;){let line=lines[i],parsed=parseDiffLine(line);if(!parsed){result3.push(theme.fg("toolDiffContext",line)),i++;continue}if(parsed.prefix==="-"){let removedLines=[];for(;i<lines.length;){let p=parseDiffLine(lines[i]);if(p?.prefix!=="-")break;removedLines.push({lineNum:p.lineNum,content:p.content}),i++}let addedLines=[];for(;i<lines.length;){let p=parseDiffLine(lines[i]);if(p?.prefix!=="+")break;addedLines.push({lineNum:p.lineNum,content:p.content}),i++}if(removedLines.length===1&&addedLines.length===1){let removed=removedLines[0],added=addedLines[0],{removedLine,addedLine}=renderIntraLineDiff(replaceTabs2(removed.content),replaceTabs2(added.content));result3.push(theme.fg("toolDiffRemoved",`-${removed.lineNum} ${removedLine}`)),result3.push(theme.fg("toolDiffAdded",`+${added.lineNum} ${addedLine}`))}else{for(let removed of removedLines)result3.push(theme.fg("toolDiffRemoved",`-${removed.lineNum} ${replaceTabs2(removed.content)}`));for(let added of addedLines)result3.push(theme.fg("toolDiffAdded",`+${added.lineNum} ${replaceTabs2(added.content)}`))}}else parsed.prefix==="+"?(result3.push(theme.fg("toolDiffAdded",`+${parsed.lineNum} ${replaceTabs2(parsed.content)}`)),i++):(result3.push(theme.fg("toolDiffContext",` ${parsed.lineNum} ${replaceTabs2(parsed.content)}`)),i++)}return result3.join(`
|
|
2247
|
-
`)}var SHOW_IMAGES_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ShowImagesSelectorComponent=class extends Container{constructor(currentValue,onSelect,onCancel){super();let items=[{value:"yes",label:"Yes",description:"Show images inline in terminal"},{value:"no",label:"No",description:"Show text placeholder instead"}];this.addChild(new DynamicBorder),this.selectList=new SelectList(items,5,getSelectListTheme(),SHOW_IMAGES_SELECT_LIST_LAYOUT),this.selectList.setSelectedIndex(currentValue?0:1),this.selectList.onSelect=item=>{onSelect(item.value==="yes")},this.selectList.onCancel=()=>{onCancel()},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};var THEME_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ThemeSelectorComponent=class extends Container{constructor(currentTheme,onSelect,onCancel,onPreview){super(),this.onPreview=onPreview;let themes=getAvailableThemes(),themeItems2=themes.map(name=>({value:name,label:name,description:name===currentTheme?"(current)":void 0}));this.addChild(new DynamicBorder),this.selectList=new SelectList(themeItems2,10,getSelectListTheme(),THEME_SELECT_LIST_LAYOUT);let currentIndex=themes.indexOf(currentTheme);currentIndex!==-1&&this.selectList.setSelectedIndex(currentIndex),this.selectList.onSelect=item=>{onSelect(item.value)},this.selectList.onCancel=()=>{onCancel()},this.selectList.onSelectionChange=item=>{this.onPreview(item.value)},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};import{spawn as spawn13}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve55=>{let proc=spawn13(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{if(!killed){if(killed=!0,!signalSpawnedChild(proc,"SIGTERM")&&proc.pid===void 0)return;setTimeout(()=>{proc.killed||signalSpawnedChild(proc,"SIGKILL")},5e3)}};options?.signal&&(options.signal.aborted?killProcess():options.signal.addEventListener("abort",killProcess,{once:!0})),options?.timeout&&options.timeout>0&&(timeoutId=setTimeout(()=>{killProcess()},options.timeout)),proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),waitForChildProcess(proc).then(code=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve55({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve55({stdout,stderr,code:1,killed})})})}function redactForUpload(text3,options={}){let tally=new Map,context=currentShareRedactionContext(),extra=(options.extraLiterals??[]).filter(value=>value.trim().length>0);return{text:redactShareText(text3,extra.length===0?context:{...context,extraLiterals:extra},tally),counts:Object.fromEntries(tally)}}import{createHash as createHash31}from"node:crypto";import{readFileSync as readFileSync53}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{return createHash31("sha256").update(readFileSync53(file,"utf8")).digest("hex")}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.importer.compiledSources?.()??[])if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create2){return generation?generation.importer:(pendingImporter??=create2().then(importer=>(generation={importer,factories:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledSources!==void 0&&generation.factories.set(resolvedPath,factory)}var __rewriteRelativeImportExtension2=function(path14,preserveJsx){return typeof path14=="string"&&/^\.\.?\//.test(path14)?path14.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path14};function sessionProfile(options){return{sessionKind:options?.sessionKind??"interactive",sessionContext:options?.sessionContext??EMPTY_SESSION_CONTEXT}}var VIRTUAL_MODULES={typebox:build_exports,"typebox/compile":compile_exports,"typebox/value":value_exports2,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports2,"@earendil-works/pi-agent-core":dist_exports,"@earendil-works/pi-tui":dist_exports2,"@earendil-works/pi-ai":compat_exports,"@earendil-works/pi-ai/compat":compat_exports,"@earendil-works/pi-ai/oauth":oauth_exports,"@earendil-works/pi-ai/providers/all":all_exports,"@earendil-works/pi-coding-agent":dist_exports3,"@mariozechner/pi-agent-core":dist_exports,"@mariozechner/pi-tui":dist_exports2,"@mariozechner/pi-ai":compat_exports,"@mariozechner/pi-ai/compat":compat_exports,"@mariozechner/pi-ai/oauth":oauth_exports,"@mariozechner/pi-ai/providers/all":all_exports,"@mariozechner/pi-coding-agent":dist_exports3,"@code-yeongyu/senpi":dist_exports3},require3=createRequire3(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path13.extname(fileURLToPath7(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path13.dirname(fileURLToPath7(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path13.resolve(__dirname,"../../.."),packagesRoot=path13.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path13.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs7.existsSync(bundledPath))return bundledPath;let workspacePath=path13.join(packagesRoot,workspaceRelativePath);if(fs7.existsSync(workspacePath))return workspacePath;let sourcePath=path13.join(packagesRoot,sourceRelativePath);return fs7.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath7(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path13.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path13.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs7.existsSync(piCodingAgentDistEntry)?piCodingAgentDistEntry:piCodingAgentSourceEntry,piAgentCoreEntry=resolveWorkspaceOrBundled("@earendil-works/pi-agent-core","dist/index.js","agent/dist/index.js","agent/src/index.ts","@earendil-works/pi-agent-core"),piTuiEntry=resolveWorkspaceOrBundled("@earendil-works/pi-tui","dist/index.js","tui/dist/index.js","tui/src/index.ts","@earendil-works/pi-tui"),piAiCompatEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/compat.js","ai/dist/compat.js","ai/src/compat.ts","@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/oauth.js","ai/dist/oauth.js","ai/src/oauth.ts","@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/providers/all.js","ai/dist/providers/all.js","ai/src/providers/all.ts","@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@code-yeongyu/senpi":piCodingAgentEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var runtimeFactories=new WeakMap;function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state3={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,assertActive=()=>{if(state3.staleMessage)throw new StaleExtensionContextError(state3.staleMessage)},runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,executeTool:()=>Promise.reject(new Error("Extension runtime not initialized")),getActiveTools:notInitialized,getAllTools:notInitialized,getSettings:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},registerRemovedToolHint:()=>{},registerLazyToolActivator:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,setSessionModel:()=>Promise.reject(new Error("Extension runtime not initialized")),setSessionThinkingLevel:notInitialized,setSessionFastMode:notInitialized,sessionControl:unboundSessionControlActions(),flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],pendingVirtualModelRegistrations:[],createContext:notInitialized,assertActive,invalidate:message=>{if(!state3.staleMessage){state3.staleMessage=message??"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().";for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear(),runtime.evalHandleHost=void 0,runtimeFactories.delete(runtime)}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath,order:nextProviderRegistrationOrder++})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath,order:nextProviderRegistrationOrder++})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)},registerVirtualModel:(definition,extensionPath="<unknown>")=>{runtime.pendingVirtualModelRegistrations.push({definition,extensionPath})},unregisterVirtualModel:(provider,id)=>{runtime.pendingVirtualModelRegistrations=runtime.pendingVirtualModelRegistrations.filter(({definition})=>definition.provider!==provider||definition.id!==id)}};return runtime}var unboundSessionControl=unboundSessionControlActions();function sessionControlOf(runtime){return runtime.sessionControl??unboundSessionControl}function drainPendingProviderRegistrations(runtime){let drained=[...runtime.pendingProviderRegistrations.map(entry2=>({kind:"config",...entry2})),...runtime.pendingNativeProviderRegistrations.map(entry2=>({kind:"native",...entry2}))];return drained.sort((a,b)=>a.order-b.order),runtime.pendingProviderRegistrations=[],runtime.pendingNativeProviderRegistrations=[],drained}function createExtensionAPI(extension,runtime,cwd,eventBus,session){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state3="loading",assertActive=()=>{if(state3==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state3==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0},api={cwd,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler,options){assertActive();let registeredHandler=ownedBy(extension,(...args)=>handler(...args)),list3=extension.handlers.get(event)??[];return list3.push(registeredHandler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(registeredHandler)),(event==="context"||event==="context_with_system")&&options?.mutatesMessages===!1&&(extension.nonMutatingContextHandlers??=new WeakSet,extension.nonMutatingContextHandlers.add(registeredHandler)),()=>{let handlers=extension.handlers.get(event);if(!handlers)return;let handlerIndex=handlers.indexOf(registeredHandler);handlerIndex!==-1&&(handlers.splice(handlerIndex,1),handlers.length===0&&extension.handlers.delete(event))}},registerTool(tool){if(runtime.assertActive(),tool.name==="tool_search"&&extension.sourceInfo.source!=="builtin")throw new Error('Tool name "tool_search" is reserved for the builtin tool-search extension.');if(typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:Object.assign(Object.create(Object.getPrototypeOf(tool)),tool,{execute:ownedBy(extension,tool.execute)}),sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerLazyToolActivator(activator){runtime.assertActive();let activators=extension.lazyToolActivators??[];activators.push(activator),extension.lazyToolActivators=activators,runtime.registerLazyToolActivator(activator)},provideEvalHandleHost(host){runtime.assertActive(),runtime.evalHandleHost=host},registerRemovedToolHint(name,hint){runtime.assertActive();let hints=extension.removedToolHints;hints||(hints=new Map,extension.removedToolHints=hints),hints.set(name,hint),runtime.registerRemovedToolHint(name,hint)},registerChildModule(registration){runtime.assertActive(),validateChildModuleRegistration(registration);let modules=extension.childModules??new Map;modules.set(registration.id,{registration:{...registration},sourceInfo:extension.sourceInfo}),extension.childModules=modules},registerFilesystemPolicy(policy){runtime.assertActive();let policies2=extension.filesystemPolicies??[];policies2.push(policy),extension.filesystemPolicies=policies2},registerCommand(name,options){if(assertActive(),typeof name!="string"||name.length===0)throw new Error(`Command registered by extension "${extension.path}" must have a non-empty string name. Use pi.registerCommand("name", { description, handler }).`);if(typeof options?.handler!="function")throw new Error(`Command "/${name}" registered by extension "${extension.path}" must define handler().`);extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options,handler:ownedBy(extension,options.handler)})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options,handler:ownedBy(extension,options.handler)})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state3==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMemoryReporter(name,reporter){if(assertActive(),RESERVED_MEMORY_REPORT_KEYS.has(name))throw new Error(`Memory reporter name "${name}" is reserved by the memory report`);extension.memoryReporters??=new Map,extension.memoryReporters.set(name,reporter)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer,options){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer),extension.entryRendererOptions??=new Map,options===void 0?extension.entryRendererOptions.delete(customType):extension.entryRendererOptions.set(customType,options)},registerReadClassifier(classifier){assertActive();let unregister=runtime.trackEventBusSubscription(registerReadClassifier(classifier));return state3==="loading"&&loadingUnsubscribers.push(unregister),unregister},registerMcpServer(name,config){runtime.assertActive();let error2=validateMcpServerDeclaration(name,config);if(error2)throw new Error(error2);extension.mcpServers.set(name,{name,config,extensionPath:extension.path,registrationCwd:extension.registrationCwd})},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},getPermissionPreset(){assertActive();let sessionManager;try{sessionManager=runtime.createContext().sessionManager}catch{return}return readPermissionPreset(sessionManager)},getSubscriptionLimits(){return assertActive(),subscriptionLimits.snapshot()},onSubscriptionLimits(listener){return assertActive(),subscriptionLimits.subscribe(listener)},lifecycle:createLifecycleApi(()=>{if(assertActive(),!runtime.lifecycle)throw new Error("Extension lifecycle is not bound to a session");return runtime.lifecycle}),sendMessage:((message,options)=>{assertActive();let items=options?.items;if(items===void 0){runtime.sendMessage(message,options);return}let itemized=runtime.sendItemizedMessage;return itemized===void 0?(runtime.sendMessage(message,options),Promise.resolve(void 0)):itemized(message,{...options,items})}),sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data,options){assertActive(),runtime.appendEntry(customType,data,options)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label3){assertActive(),runtime.setLabel(entryId,label3)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},redactForUpload(text3,options){return assertActive(),redactForUpload(text3,options)},hostVersion:VERSION,executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},armToolBarrier(spec2){if(assertActive(),!runtime.armToolBarrier)throw new Error("This runtime has no tool barrier (senpi#3717).");runtime.armToolBarrier(spec2)},releaseToolBarrier(id){return assertActive(),runtime.releaseToolBarrier?.(id)??!1},getAllTools(){return assertActive(),runtime.getAllTools()},getSettings(){return assertActive(),runtime.getSettings()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model,{source:"extension",actor:extension.path})},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model,{source:"extension",actor:extension.path})},setSessionThinkingLevel(level){runtime.assertActive(),runtime.setSessionThinkingLevel(level)},setSessionFastMode(enabled){runtime.assertActive(),runtime.setSessionFastMode(enabled)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},session:{registerControlEndpoint(options){return runtime.assertActive(),sessionControlOf(runtime).registerControlEndpoint(options)},admissionGate(){return runtime.assertActive(),sessionControlOf(runtime).admissionGate()},admitExternalMessage(input){return runtime.assertActive(),sessionControlOf(runtime).admitExternalMessage(input)},listAdmittedDeliveries(){return runtime.assertActive(),sessionControlOf(runtime).listAdmittedDeliveries()},persistHeaderNow(){return runtime.assertActive(),sessionControlOf(runtime).persistHeaderNow()},relocationOffered(){return runtime.assertActive(),sessionControlOf(runtime).relocationOffered()},relocationTargets(signal){return runtime.assertActive(),sessionControlOf(runtime).relocationTargets(signal)},requestRelocation(request2,signal){return runtime.assertActive(),sessionControlOf(runtime).requestRelocation(request2,signal)}},rpc:{emit(name,data){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension event name must not be empty");eventBus.emit(EXTENSION_RPC_EVENT_CHANNEL,{name:normalizedName,data})},handle(name,handler){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension request name must not be empty");let handlers=extension.rpcHandlers??new Map;if(handlers.has(normalizedName))throw new Error(`RPC extension request handler already registered: ${normalizedName}`);handlers.set(normalizedName,ownedBy(extension,handler)),extension.rpcHandlers=handlers}},registerVirtualModel(model){assertActive();let definition={...model,route:request2=>model.route(request2,runtime.createContext())};applyRuntimeChange(()=>runtime.registerVirtualModel(definition,extension.path))},unregisterVirtualModel(provider,id){assertActive(),applyRuntimeChange(()=>runtime.unregisterVirtualModel(provider,id))},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state3==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}};return recordExtensionLoadKey(api,runtime),{api,commit:()=>{if(state3==="loading"){runtime.assertActive();for(let[name,value]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value);for(let apply of pendingRuntimeChanges)apply();state3="active",clearPending()}},discard:()=>{if(state3==="loading"){state3="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension2(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-MOOVT743.js");return createBunExtensionImporter(VIRTUAL_MODULES,{},{preparedCache:{dir:path13.join(getAgentDir(),"cache","extension-modules"),release:VERSION}})}let{createJiti}=await importNodeOnlyApi("jiti/static");return createJiti(import.meta.url,{moduleCache:!1,...isNodeSeaBinary||isBundledNode?{virtualModules:VIRTUAL_MODULES,tryNative:!1}:isTypeScriptSourceRuntime?{alias:getAliases(),virtualModules:VIRTUAL_MODULES,tsconfigPaths:!0}:{alias:getAliases()}})}async function loadExtensionModule(extensionPath,getImporter){let cachedFactory=cachedExtensionFactory(extensionPath);if(cachedFactory)return cachedFactory;let importer=await getImporter(),factory=await importer.import(extensionPath,{default:!0});if(typeof factory=="function")return rememberExtensionFactory(extensionPath,factory,importer),factory}function createExtension(extensionPath,resolvedPath,registrationCwd){let source2=getSyntheticPathSource(extensionPath)??"local",baseDir=isSyntheticPath(extensionPath)?void 0:path13.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source:source2,baseDir,scope:source2==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers:new Map,memoryReporters:new Map,entryRenderers:void 0,commands:new Map,rpcHandlers:new Map,flags:new Map,shortcuts:new Map,mcpServers:new Map,registrationCwd}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session){let extension=createExtension(extensionPath,resolvedPath,cwd),load2=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await runOwnedBy(extension,()=>factory(load2.api)),load2.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load2.discard(),error2}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,getImporter,factoryResolver,session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=factoryResolver?.(extensionPath,resolvedPath)??await loadExtensionModule(resolvedPath,getImporter);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err){return{extension:null,error:`Failed to load extension: ${err instanceof Error?err.message:String(err)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>",session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime,session)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,options){let session=sessionProfile(options),extensions=[],errors=[],warnings=[],resolvedCwd=resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime(),getImporter=()=>extensionModuleImporter(createExtensionModuleImporter);for(let extPath of paths){let{extension,error:error2}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,getImporter,options?.factoryResolver,session);if(error2){errors.push({path:extPath,error:error2});continue}extension&&extensions.push(extension)}return{extensions,errors,warnings,runtime:resolvedRuntime,eventBus:resolvedEventBus}}async function loadExtensions(paths,cwd,eventBus,runtime,options){return loadExtensionsInternal(paths,cwd,eventBus,runtime,options)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries(dir){let packageJsonPath=path13.join(dir,"package.json");if(fs7.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path13.resolve(dir,extPath);fs7.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path13.join(dir,"index.ts"),indexJs=path13.join(dir,"index.js");return fs7.existsSync(indexTs)?[indexTs]:fs7.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs7.existsSync(dir))return[];let discovered=[];try{let entries=fs7.readdirSync(dir,{withFileTypes:!0}).sort((a,b)=>a.name<b.name?-1:a.name>b.name?1:0);for(let entry2 of entries){let entryPath=path13.join(dir,entry2.name);if((entry2.isFile()||entry2.isSymbolicLink())&&isExtensionFile(entry2.name)){discovered.push(entryPath);continue}if(entry2.isDirectory()||entry2.isSymbolicLink()){let entries2=resolveExtensionEntries(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path13.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path13.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path13.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs7.existsSync(resolved)&&fs7.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function warnStall(event,budget,stall){if(stall.stage!=="warn")return;let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${stall.extensionPath} is still running its ${event} handler after ${stall.elapsedMs}ms${capNote}.`)}async function runSessionMoveHandlers(event,calls,budget){let failures=[];for(let{extensionPath,call}of calls){let outcome=await runBudgetedHandler({extensionPath,event,budget,run:call,onStall:stall=>warnStall(event,budget,stall)});switch(outcome.kind){case"settled":break;case"failed":{let{error:error2}=outcome;failures.push({extensionPath,error:error2 instanceof Error?error2.message:String(error2),...error2 instanceof Error&&error2.stack!==void 0?{stack:error2.stack}:{}});break}case"timed_out":failures.push({extensionPath,error:`handler timed out after ${budget.timeoutMs}ms`});break;case"released":failures.push({extensionPath,error:"handler released before it finished"});break}}return failures}var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}get holding(){return this.held!==void 0}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};var QuitDeadline=class{constructor(totalMs,now2,startedAt=now2()){this.now=now2,this.deadline=startedAt+totalMs}budgetFor(base){let remaining=Math.max(1,this.deadline-this.now());return base.timeoutMs>0&&base.timeoutMs<=remaining?{budget:base,endsAtQuitDeadline:!1}:{budget:{warnMs:base.warnMs<remaining?base.warnMs:0,timeoutMs:remaining},endsAtQuitDeadline:!0}}};var ExtensionRpcRequestNotFoundError=class extends Error{constructor(name){super(`Unknown extension RPC request: ${name}`),this.name="ExtensionRpcRequestNotFoundError"}},RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function isUserBashEventResult(value){if(typeof value!="object"||value===null)return!1;let candidate=value,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}var QUEUED_LIFECYCLE_EVENTS=new Set(["agent_start","agent_end","agent_settled","turn_start","message_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end"]),UNBOUNDED_HANDLER_BUDGET={warnMs:0,timeoutMs:0};async function emitSessionShutdownEvent(extensionRunner,event,options={}){options.processExit&&event.reason==="quit"&&extensionRunner.armProcessExitBudget();let emitted=extensionRunner.hasHandlers("session_shutdown");return emitted&&await extensionRunner.emit(event),reclaimRunnerHandles(extensionRunner),emitted}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function flattenHandlers(extensions,event){return snapshotEventHandlers(extensions,event).flatMap(({ext,handlers})=>handlers.map(handler=>({path:ext.path,handler})))}function entryAt(entries,index){let entry2=entries[index];if(entry2===void 0)throw new RangeError(`no extension handler at index ${index}`);return entry2}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setSubagentCost:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.eventHandlerBudget=()=>UNBOUNDED_HANDLER_BUDGET,this.handlerTurnScope=()=>0,this.reportedInvalidHandlerBudget=!1,this.heldHandlerWaits=new HeldHandlerWaits,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.engineTurnsHeldFn=()=>!1,this.noteHeldWakeFn=()=>{},this.pauseActions={},this.personAnswerPending=!1,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.hasQueuedPersonInputFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getBrowserEngineFn=()=>{},this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.getCallableToolsFn=()=>[],this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.#reportedChildModuleReplacements=new Set,this.extensions=extensions,registerRunnerExtensions(this,extensions),this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){actions.lifecycle&&(this.runtime.lifecycle=actions.lifecycle),this.runtime.sendMessage=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendItemizedMessage=(message,options)=>{let receipts=Promise.withResolvers(),send=()=>{let itemized=actions.sendItemizedMessage;itemized===void 0?(actions.sendMessage(message,options),receipts.resolve(void 0)):itemized(message,options).then(receipts.resolve,receipts.reject)};return options.triggerTurn===!0?this.sessionStartTurns.admit(send):send(),receipts.promise},this.runtime.sendUserMessage=(content,options)=>{let inputOrigin=this.personAnswerPending?"person":"extension";this.personAnswerPending=!1,this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options,inputOrigin))},this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.getSettings=actions.getSettings,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),actions.armToolBarrier&&(this.runtime.armToolBarrier=actions.armToolBarrier),actions.releaseToolBarrier&&(this.runtime.releaseToolBarrier=actions.releaseToolBarrier),this.runtime.createContext=()=>this.createContext(),this.offloadFn=contextActions.offload,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.engineTurnsHeldFn=contextActions.engineTurnsHeld??(()=>!1),this.noteHeldWakeFn=contextActions.noteHeldWake??(()=>{}),this.pauseActions={getPauseState:contextActions.getPauseState,fenceRun:contextActions.fenceRun,releaseRunFence:contextActions.releaseRunFence},this.questionInput=contextActions.questionInput,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.hasQueuedPersonInputFn=contextActions.hasQueuedPersonInput??(()=>!1),this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,this.getCompactionModelFn=contextActions.getCompactionModel,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest,this.onUserActivityFn=contextActions.onUserActivity,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err){this.emitError({extensionPath,event:"register_virtual_model",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}setLifecycleAttentionObserver(observer){this.lifecycleAttentionObserver=observer}getLifecycleHumanWait(){let prompt=this.activeUIPrompt;if(!(this.mode==="rpc"||!prompt))return{kind:prompt.kind==="confirm"?"approval":"question",requestId:prompt.requestId,revision:1,since:prompt.since}}wrapUIPromptContext(ui){let questionFn=ui.question;return inheritMcpMrtrPresentation(ui,{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts),request2.requestId)}:{}})}withUIPrompt(kind,title,run2,requestId=crypto.randomUUID()){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title,requestId,since:new Date().toISOString()},this.lifecycleAttentionObserver?.(),this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.lifecycleAttentionObserver?.(),this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run2().finally(finish)}catch(err){throw finish(),err}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}sessionStartTurnsHeld(){return this.sessionStartTurns.holding}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path14,resolvedPath})=>({path:path14,resolvedPath}))}#reportedChildModuleReplacements;getAllChildModules(){let modules=new Map;for(let ext of this.extensions)for(let[id,entry2]of ext.childModules??[]){let earlier=modules.get(id),replacement=`${id}\0${earlier?.sourceInfo.path}\0${entry2.sourceInfo.path}`;earlier!==void 0&&earlier.sourceInfo.path!==entry2.sourceInfo.path&&!this.#reportedChildModuleReplacements.has(replacement)&&(this.#reportedChildModuleReplacements.add(replacement),console.warn(`Child module "${id}" from ${entry2.sourceInfo.path} replaces the one from ${earlier.sourceInfo.path}`)),modules.set(id,entry2)}return modules}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing2=toolsByName.get(tool.definition.name);(!existing2||existing2.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}emitBusEvent(channel,data){this.eventBus.emit(channel,data)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing2=serversByName.get(decl.name);existing2===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing2.extensionPath} and ${ext.path}; keeping first declaration from ${existing2.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value){this.runtime.flagValues.set(name,value)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new StaleExtensionContextError(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}setEventHandlerBudget(budget,onStall,turnScope=()=>0){this.eventHandlerBudget=budget,this.handlerStallListener=onStall,this.handlerTurnScope=turnScope}releaseHeldHandlers(turn){return this.heldHandlerWaits.release(turn)}resolveEventHandlerBudget(){try{return this.eventHandlerBudget()}catch(err){return this.reportedInvalidHandlerBudget||(this.reportedInvalidHandlerBudget=!0,console.warn(`Using the default extension event handler budget (warn ${DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS}ms): ${err instanceof Error?err.message:String(err)}`)),{warnMs:DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,timeoutMs:DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS}}}walkHandlers(sequence2){return runBudgetedSequence(sequence2,{budget:this.resolveEventHandlerBudget(),held:{waits:this.heldHandlerWaits,scope:this.handlerTurnScope},onStall:stall=>this.handlerStallListener?.(stall)})}reportStoppedHandler(extensionPath,event,verdict,budget){let error2=verdict==="timed_out"?`handler timed out after ${budget.timeoutMs}ms`:"handler released by the turn deadline";this.emitError({extensionPath,event,error:error2})}reportHandlerFailure(extensionPath,event,err){this.emitError({extensionPath,event,error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}dispatchLifecycle(event){let entries=flattenHandlers(this.extensions,event.type);return this.walkHandlers({event:event.type,length:entries.length,extensionPath:index=>entryAt(entries,index).path,start:index=>{let{path:path14,handler}=entryAt(entries,index);return handler(event,this.createContext(path14))},settle:(index,outcome)=>{outcome.ok||this.reportHandlerFailure(entryAt(entries,index).path,event.type,outcome.error)},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(entries,index).path,event.type,verdict,budget),finish:()=>{}})}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename37(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update2=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update2),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage6)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage6!==void 0?{errorMessage:errorMessage6}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches2=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches2.length===0)throw new ExtensionRpcRequestNotFoundError(normalizedName);if(matches2.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches2[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal,context={offload:(id,args,options)=>(runner.assertActive(),runner.offloadFn===void 0?Promise.reject(new Error(`offload_unavailable: no session backs this context (offload ${id})`)):runner.offloadFn(id,args,options)),get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),engineTurnsHeld:()=>(runner.assertActive(),runner.engineTurnsHeldFn()),noteHeldWake:source2=>{runner.assertActive(),runner.noteHeldWakeFn(source2)},getPauseState:()=>(runner.assertActive(),runner.pauseActions.getPauseState?.()??{pauseSeq:0,holds:[]}),fenceRun:runRef=>{runner.assertActive(),runner.pauseActions.fenceRun?.(runRef)},releaseRunFence:runRef=>{runner.assertActive(),runner.pauseActions.releaseRunFence?.(runRef)},isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},get evalHandleHost(){return runner.assertActive(),runner.runtime.evalHandleHost},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),hasQueuedPersonInput:()=>(runner.assertActive(),runner.hasQueuedPersonInputFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),get getCompactionModel(){return runner.assertActive(),runner.getCompactionModelFn?()=>(runner.assertActive(),runner.getCompactionModelFn?.()):void 0},getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),onUserActivity:listener=>{runner.assertActive();let unsubscribe=runner.onUserActivityFn?.(kind=>{try{listener(kind)}catch(error2){runner.emitError({extensionPath:excludeBeforeProviderRequestExtensionPath??RUNTIME_EXTENSION_PATH,event:"user_activity",error:error2 instanceof Error?error2.message:String(error2)})}});return runner.runtime.trackEventBusSubscription(unsubscribe??(()=>{}))},getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async(messages,options)=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath,options)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())};return this.questionInput&&bindQuestionInput(context,()=>{runner.assertActive(),runner.personAnswerPending=!0,queueMicrotask(()=>{runner.personAnswerPending=!1}),runner.questionInput?.()}),context}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text3,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text3,options)),context.editUserMessage=(entryId,text3,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text3,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context={contextEntries:[],contextMessages:[],llmMessages:[],pendingMessages:[],canContinue:!1},retired=()=>({entries:[],continue:!1,context,valid:!1});try{context=await buildContext2(entries)}catch(err){if(!this.isActive)return retired();throw err}let valid2=!0,handlers=flattenHandlers(this.extensions,baseEvent.type);return this.walkHandlers({event:baseEvent.type,length:handlers.length,extensionPath:index=>entryAt(handlers,index).path,halted:()=>!this.isActive,start:index=>{let event={...baseEvent,entries,continue:shouldContinue,context};return entryAt(handlers,index).handler(event,ctx)},settle:async(index,outcome)=>{if(!this.isActive)return;let{path:path14}=entryAt(handlers,index);if(outcome.ok){let handlerResult=outcome.value;handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}else this.reportHandlerFailure(path14,baseEvent.type,outcome.error);try{context=await buildContext2(entries),valid2=!0}catch(err){if(!this.isActive)return;valid2=!1,this.emitError({extensionPath:path14,event:baseEvent.type,error:`Invalid boundary entries: ${err instanceof Error?err.message:String(err)}`,stack:err instanceof Error?err.stack:void 0})}},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(handlers,index).path,baseEvent.type,verdict,budget),finish:()=>valid2&&this.isActive?{entries,continue:shouldContinue,context,valid:!0}:retired()})}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}armProcessExitBudget(){this.processExitRequestedAt??=Date.now()}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{handler:{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()},quitMs:settings.getSessionShutdownQuitBudgetMs()}}catch(err){let message=err instanceof Error?err.message:String(err);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms, quit ${DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS}ms): ${message}`),{handler:{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS},quitMs:DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,{budget,endsAtQuitDeadline}){let startedAt=Date.now(),outcome=await runBudgetedHandler({extensionPath,event:"session_shutdown",budget,run:signal=>handler({...event,signal},this.createContext(extensionPath)),onStall:stall=>{if(stall.stage!=="warn")return;let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${stall.elapsedMs}ms${capNote}.`)}});if(outcome.kind==="failed")throw outcome.error;outcome.kind==="timed_out"&&endsAtQuitDeadline?console.warn(`Extension ${extensionPath} session_shutdown handler overran the quit budget after ${Date.now()-startedAt}ms; quitting without it.`):outcome.kind==="timed_out"&&this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`})}emitHeldWakesReleased(sources){return this.emit({type:"held_wakes_released",sources})}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):QUEUED_LIFECYCLE_EVENTS.has(event.type)?this.dispatchLifecycle(event):this.dispatchEmit(event)}async emitSessionMove(event){let calls=flattenHandlers(this.extensions,event.type).map(({path:path14,handler})=>({extensionPath:path14,call:signal=>handler({...event,signal},this.createContext(path14))})),failures=await runSessionMoveHandlers(event.type,calls,this.resolveSessionShutdownBudget().handler);for(let failure2 of failures)this.emitError({...failure2,event:event.type});return failures}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget,quitDeadline;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))for(let handler of handlers)try{if(isSessionShutdown){let shutdownEvent=event;shutdownBudget||(shutdownBudget=this.resolveSessionShutdownBudget(),shutdownEvent.reason==="quit"&&this.processExitRequestedAt!==void 0&&shutdownBudget.quitMs>0&&(quitDeadline=new QuitDeadline(shutdownBudget.quitMs,Date.now,this.processExitRequestedAt))),await this.runSessionShutdownHandler(ext.path,shutdownEvent,handler,quitDeadline?.budgetFor(shutdownBudget.handler)??{budget:shutdownBudget.handler,endsAtQuitDeadline:!1});continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}emitMessageEnd(event){let currentMessage=event.message,modified=!1,entries=flattenHandlers(this.extensions,"message_end");return this.walkHandlers({event:"message_end",length:entries.length,extensionPath:index=>entryAt(entries,index).path,start:index=>{let{path:path14,handler}=entryAt(entries,index),currentEvent={...event,message:currentMessage};return handler(currentEvent,this.createContext(path14))},settle:(index,outcome)=>{let{path:path14}=entryAt(entries,index);if(!outcome.ok){this.reportHandlerFailure(path14,"message_end",outcome.error);return}let handlerResult=outcome.value;if(handlerResult?.message){if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:path14,event:"message_end",error:"message_end handlers must return a message with the same role"});return}currentMessage=handlerResult.message,modified=!0}},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(entries,index).path,"message_end",verdict,budget),finish:()=>modified?currentMessage:void 0})}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage6;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;endStatus="failed",errorMessage6=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage6)}}if(modified)return{content:currentEvent.content,details:currentEvent.details,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage6;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err){throw endStatus="failed",errorMessage6=err instanceof Error?err.message:String(err),err}finally{hookRun.end(endStatus,errorMessage6)}}return result3}async emitUserBash(event){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err}}async emitContext(messages,excludeExtensionPath,source2="agent"){return dispatchContextMessages(messages,{contextHandlers:snapshotEventHandlers(this.extensions,"context"),contextWithSystemHandlers:snapshotEventHandlers(this.extensions,"context_with_system"),createContext:path14=>this.createContext(path14),emitError:error2=>this.emitError(error2),excludeExtensionPath,source:source2})}async prepareProviderRequest(messages,excludeExtensionPath,options){return{messages:await this.emitContext(messages,excludeExtensionPath,"projection"),transformPayload:async payload=>await this.emitBeforeProviderRequest(options?.allowServerSearch?payload:disableServerSearch(payload),excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}return currentPayload}async emitBeforeProviderHeaders(headers){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}return headers}getThirdPartySessionStartPaths(){return this.extensions.filter(ext=>ext.sourceInfo.source!=="builtin"&&(ext.handlers.get("session_start")?.length??0)>0).map(ext=>ext.path)}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},promptBefore=currentSystemPrompt,handlerResult=await handler(event,ctx),parts;if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0,parts=result3.systemPromptParts)}options.preview===!0&&options.observePrompt?.({path:ext.path,before:promptBefore,after:currentSystemPrompt,...parts===void 0?{}:{parts}})}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry2,extensionPath)=>typeof entry2=="string"?{path:entry2,extensionPath}:entry2.scope===void 0?{path:entry2.path,extensionPath}:{path:entry2.path,extensionPath,scope:entry2.scope};for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry2=>toEntry(entry2,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry2=>toEntry(entry2,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry2=>toEntry(entry2,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry2=>toEntry(entry2,ext.path)))}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text3,images,source2,streamingBehavior,inputId="input"){let currentText=text3,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err){this.emitError({extensionPath:ext.path,event:"input",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}return currentText!==text3||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};var trimSlash=value=>value.replace(/\/+$/,""),UNCHECKABLE_CONTROL_KEY="senpi-verify-control-not-a-real-key",AUTH_HEADERS=new Set(["authorization","x-api-key","x-goog-api-key"]);function probeFor(model,key){let base=trimSlash(model.baseUrl),extra=Object.fromEntries(Object.entries(model.headers??{}).filter(([name])=>!AUTH_HEADERS.has(name.toLowerCase())));switch(model.api){case"openai-completions":case"openai-responses":return{url:`${base}/models`,headers:{...extra,authorization:`Bearer ${key}`}};case"mistral-conversations":return{url:`${base.replace(/\/v1$/,"")}/v1/models`,headers:{...extra,authorization:`Bearer ${key}`}};case"anthropic-messages":return{url:`${base.replace(/\/v1$/,"")}/v1/models`,headers:{...extra,"x-api-key":key,"anthropic-version":"2023-06-01"}};case"google-generative-ai":return{url:`${base}/models`,headers:{...extra,"x-goog-api-key":key}};default:return}}async function verifyApiKey(input){let model=input.models.find(candidate=>candidate.provider===input.provider);if(model===void 0)return{ok:!1,reason:"unknown-provider"};if(probeFor(model,input.key)===void 0)return{ok:!1,reason:"unsupported"};let ask=async candidate=>{let target=probeFor(model,candidate);if(target===void 0)return"no-answer";try{let response=await(input.fetch??globalThis.fetch)(target.url,{method:"GET",headers:target.headers,redirect:"manual",signal:input.signal});return await response.body?.cancel().catch(()=>{}),response.status}catch{return"no-answer"}},temporary=status2=>status2==="no-answer"?{ok:!1,reason:"unreachable"}:status2===429||status2>=500?{ok:!1,reason:"unreachable",status:status2}:void 0,status=await ask(input.key);if(status==="no-answer")return{ok:!1,reason:"unreachable"};let failedFirst=temporary(status);if(failedFirst!==void 0)return failedFirst;if(status===401||status===403)return{ok:!1,reason:"rejected",status};if(status<200||status>=300)return{ok:!1,reason:"unsupported",status};let control=await ask(UNCHECKABLE_CONTROL_KEY);if(control===401||control===403)return{ok:!0};let failedControl=temporary(control);return failedControl!==void 0?failedControl:{ok:!1,reason:"unsupported"}}function storedKeyHint(modelRegistry,info){if(info.authType!=="api_key")return{};let credential=modelRegistry.authStorage.get(info.id);if(credential?.type!=="api_key"||credential.key===void 0)return{};let key=credential.key;return isCommandConfigValue(key)||getConfigValueEnvVarNames(key).length>0||key.length<12?{}:{keyHint:key.slice(-4)}}function holdAutomaticInput(session,command,interactiveUser){return interactiveUser?!1:session.noteAutomaticInput(command.message)}async function handleClientInput(session,command,io){try{let admissions=ClientAdmissions.forSession(session),disposition,responded=!1,respond=admission2=>{responded=!0;let finalDisposition=admission2?.disposition??disposition;io.output({id:command.id,type:"response",command:command.type,success:!0,data:{disposition:finalDisposition,...clientMessageIdentity(command),...admission2?{admission:admission2}:{},...command.type==="prompt"&&command.toolBarrier!==void 0?{toolBarrier:finalDisposition==="started"?"armed":"ignored"}:{}}})},admission=await clientInputContext.run(clientMessageIdentity(command),()=>admissions.admit(command,async hooks=>{let promptPath=options=>{let accepted=Promise.withResolvers(),preflightSucceeded=!1,acceptedAdmission,call=session.prompt(command.message,{...clientMessageIdentity(command),images:command.images,...options,source:"rpc",onQueuedInput:hooks.queued,promptDisposition:next=>{disposition=next,acceptedAdmission=hooks.accepted(next)},preflightResult:succeeded=>{succeeded&&disposition!==void 0&&(preflightSucceeded=!0,accepted.resolve(disposition),respond(acceptedAdmission))}}).catch(error2=>{preflightSucceeded||accepted.reject(error2)});return io.promptCalls.add(call),call.finally(()=>io.promptCalls.delete(call)),accepted.promise};switch(command.type){case"prompt":{if(command.thinkingLevel!==void 0&&session.isStreaming&&command.streamingBehavior!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");return promptPath({streamingBehavior:command.streamingBehavior,thinkingLevel:command.thinkingLevel,sessionTitlePrompt:command.sessionTitlePrompt,expandPromptTemplates:command.expandPromptTemplates,unknownCommandAsText:command.unknownCommandAsText,toolBarrier:command.toolBarrier})}case"steer":case"follow_up":{if(command.whenIdle==="start")return promptPath({streamingBehavior:command.type==="steer"?"steer":"followUp",enqueueOrder:command.enqueueOrder});let options={...clientMessageIdentity(hooks.identity),enqueueOrder:command.enqueueOrder,source:"rpc",onQueuedInput:hooks.queued};return disposition=command.type==="steer"?await session.steer(command.message,command.images,options):await session.followUp(command.message,command.images,options),hooks.accepted(disposition),disposition}}}));responded||respond(admission)}catch(error2){let unknownCommand=error2 instanceof UnknownCommandError;io.output({id:command.id,type:"response",command:command.type,success:!1,error:unknownCommand?`${error2.message} ${UNKNOWN_COMMAND_CONFIRM_HINT}`:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ClientMessageIdConflict||error2 instanceof AgentBusyError?{errorCode:error2.code}:{},...unknownCommand?{errorCode:RPC_ERROR_UNKNOWN_COMMAND,errorData:{command:error2.command,suggestions:error2.suggestions,reason:error2.reason}}:{}})}}var CONNECTION_ROLE_CAPABILITIES=[INTERACTIVE_USER_CAPABILITY,TASK_PARENT_CAPABILITY],SOLE_CONNECTION="sole-connection";function roleConnection(connectionId){return connectionId??SOLE_CONNECTION}var CONNECTION_ROLE_FIXED="connection_role_fixed: interactive_user and task_parent cannot change after they are declared",ConnectionRoles=class{constructor(){this.declared=new Map}declare(connectionId,capabilities){let roles=CONNECTION_ROLE_CAPABILITIES.filter(role=>capabilities.includes(role)),prior=this.declared.get(connectionId);return prior!==void 0?prior.length===roles.length&&prior.every(role=>roles.includes(role)):(this.declared.set(connectionId,roles),!0)}rolesOf(connectionId){return this.declared.get(roleConnection(connectionId))}adopt(connectionId,roles){this.declared.has(connectionId)||this.declared.set(connectionId,[...roles])}has(connectionId,role){return this.declared.get(roleConnection(connectionId))?.includes(role)??!1}release(connectionId){this.declared.delete(connectionId)}clear(){this.declared.clear()}};function createRpcEventOutputBuffer(writeRaw,scheduleFlush=queueMicrotask){let pendingEventLines=[],flushScheduled=!1,flushEvents=()=>{flushScheduled=!1,pendingEventLines.length!==0&&(writeRaw(pendingEventLines.join("")),pendingEventLines=[])};return{enqueueEvent(event){pendingEventLines.push(serializeJsonLine(event)),!flushScheduled&&(flushScheduled=!0,scheduleFlush(flushEvents))},writeImmediate(value){flushEvents(),writeRaw(serializeJsonLine(value))},flushEvents}}var responseByteBudget=50331648;function currentResponseByteBudget(){return responseByteBudget}function entryPageBounds(request2){let{limit,maxBytes}=request2;return limit!==void 0&&!(Number.isInteger(limit)&&limit>0)?{ok:!1,message:"limit must be a positive integer"}:maxBytes!==void 0&&!(Number.isInteger(maxBytes)&&maxBytes>0)?{ok:!1,message:"maxBytes must be a positive integer"}:limit===void 0&&maxBytes===void 0?{ok:!0,paged:!1,maxBytes:responseByteBudget}:{ok:!0,paged:!0,...limit===void 0?{}:{limit},maxBytes:Math.min(maxBytes??8388608,responseByteBudget)}}function pageEntries(entries,project2,bounds){let page=[],bytes=0,taken=0,firstEntryBytes=0;for(let entry2 of entries){if(bounds.limit!==void 0&&taken>=bounds.limit)break;let projected=project2(entry2),size=Buffer.byteLength(JSON.stringify(projected))+1;if(taken>0&&bytes+size>bounds.maxBytes)break;taken===0&&(firstEntryBytes=size),page.push(projected),bytes+=size,taken++}let last=entries[taken-1],hasMore=taken<entries.length;return{entries:page,hasMore,...hasMore&&last!==void 0?{nextSince:last.id}:{},firstEntryBytes}}var heldWalks=new WeakMap;function holdEntryWalk(owner,release4){endEntryWalk(owner);let timer=setTimeout(()=>{heldWalks.delete(owner),release4()},3e4);timer.unref?.(),heldWalks.set(owner,timer)}function endEntryWalk(owner){let timer=heldWalks.get(owner);timer!==void 0&&(clearTimeout(timer),heldWalks.delete(owner))}function runHoldInput(session,command,roles){if(!roles.interactiveUser){if(!roles.taskParent)return{ok:!1,error:"hold_input_requires_interactive_client"};if(!session.pauseView.records.some(record10=>record10.kind==="inherited_hold"&&record10.parentSessionId===command.parentSessionId))return{ok:!1,error:"wrong_parent: this child is not paused for that parent session's run"}}let result3=session.holdInput({inputId:command.inputId,revision:command.revision,text:command.text});switch(result3.kind){case"held":return{ok:!0,data:{entryId:result3.entryId,duplicate:result3.duplicate}};case"already_delivered":return{ok:!0,data:{alreadyDelivered:!0}};case"input_id_conflict":return{ok:!1,error:`input_id_conflict: input ${command.inputId} is held at revision ${result3.heldRevision}`}}}var HostSessionControl=class{constructor(session,socket,report){this.disposed=!1,this.session=session,this.socket=socket,this.report=report}async register(options){if(this.releaseActive(),this.disposed||this.socket===void 0)return{status:"unsupported",reason:"unsupported_mode"};let{session}=this,failing,scheduler=new WakeScheduler(async event=>{await session.extensionRunner.emit(event);let result3=await options.drain(event)??{admitted:[]};return failing=void 0,result3},error2=>{let reason=errorText5(error2);reason!==failing&&(failing=reason,this.report(`control drain failed: ${reason}`))}),wake=reason=>{scheduler.request(reason)},unsubscribeIdle=session.subscribe(event=>{event.type==="agent_idle"&&wake("idle")}),unsubscribeEmitted=session.externalAdmission.onEmitted(()=>wake("emitted")),inbox,registration={scheduler,release:()=>{unsubscribeIdle(),unsubscribeEmitted(),inbox?.stop(),scheduler.dispose()}};try{inbox=await watchInbox(options.inboxDir,()=>wake("inbox"),error2=>this.report(`control inbox watch failed: ${errorText5(error2)}`))}catch(error2){return registration.release(),{status:"failed",reason:errorText5(error2)}}return this.disposed?(registration.release(),{status:"unsupported",reason:"unsupported_mode"}):(this.releaseActive(),this.active=registration,wake("inbox"),inbox.armed.then(()=>wake("inbox")),{status:"registered",socket:this.socket,dispose:async()=>{this.active===registration&&this.releaseActive()}})}async wake(deliveryIds){let active=this.active;if(active!==void 0)return active.scheduler.request("command",deliveryIds);let ids=deliveryIds===void 0||deliveryIds.length===0?{}:{delivery_ids:deliveryIds};return await this.session.extensionRunner.emit({type:"session_control_wake",reason:"command",reasons:["command"],...ids}),{admitted:[]}}dispose(){this.disposed=!0,this.releaseActive()}releaseActive(){let active=this.active;this.active=void 0,active?.release()}};function errorText5(error2){return error2 instanceof Error?error2.message:String(error2)}function createRpcLoginPromptCallbacks(ui,signal){let dialogSignalFor=promptSignal=>promptSignal?AbortSignal.any([signal,promptSignal]):signal;return{async onPrompt(prompt){let dialogSignal2=dialogSignalFor(prompt.signal);if(dialogSignal2.aborted)throw new Error("Login cancelled");let value=await ui.input(prompt.message,prompt.placeholder,{signal:dialogSignal2});if(dialogSignal2.aborted||value===void 0)throw new Error("Login cancelled");return value},async onSelect(prompt){let dialogSignal2=dialogSignalFor(prompt.signal);if(dialogSignal2.aborted)throw new Error("Login cancelled");let value=await ui.select(prompt.message,prompt.options.map(option=>option.label),{signal:dialogSignal2});if(dialogSignal2.aborted)throw new Error("Login cancelled");if(value!==void 0)return prompt.options.find(option=>option.label===value)?.id}}}async function answerMemoryReport(session){let source2=memoryReportSessionFor(session);if(source2===void 0)return{ok:!1,error:"memory_report_disabled: start the host with SENPI_MEMORY_REPORT=1"};let[outcome]=await writeMemoryReports([source2]);return outcome===void 0||!outcome.ok?{ok:!1,error:`memory_report_failed: ${outcome?.ok===!1?outcome.error:"no report written"}`}:{ok:!0,data:{path:outcome.path,...outcome.heapSnapshot===void 0?{}:{heapSnapshot:outcome.heapSnapshot}}}}function buildRpcCommands(input){return[...input.extensionCommands.map(command=>({...command,source:"extension",syntax:"slash"})),...input.promptTemplates.map(template=>({...template,source:"prompt",syntax:"slash"})),...input.skills.map(skill=>({...skill,name:`skill:${skill.name}`,source:"skill",syntax:"dollar"}))]}function buildRpcCommandsForSession(session){return buildRpcCommands({extensionCommands:session.extensionRunner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,sourceInfo:command.sourceInfo})),promptTemplates:session.promptTemplates,skills:session.resourceLoader.getSkills().skills})}function rpcCommandListDigest(commands){return JSON.stringify(commands)}function createCommandsChangedEvent(previousDigest,commands){if(!(previousDigest===void 0||previousDigest===rpcCommandListDigest(commands)))return{type:"commands_changed",commands}}var NOT_TASK_PARENT="task_parent_required: only the connection that owns this task child may pause or resume it for a run";async function runPauseForRun(session,command,taskParent){if(!taskParent)return{ok:!1,error:NOT_TASK_PARENT};let result3=await session.pauseForRun(command);return"refused"in result3?{ok:!1,error:"wrong_parent: this child is paused for another parent session"}:{ok:!0,data:{held:!0,childSeq:result3.childSeq}}}async function runResumeForRun(session,command,taskParent){if(!taskParent)return{ok:!1,error:NOT_TASK_PARENT};let result3=await session.resumeForRun(command);return result3.released?{ok:!0,data:{released:!0,otherHoldLive:result3.otherHoldLive,...result3.turnId===void 0?{}:{turnId:result3.turnId}}}:result3.reason==="wrong_parent"?{ok:!1,error:"wrong_parent: this child is paused for another parent session"}:{ok:!0,data:{released:!1,reason:result3.reason}}}var HOST_ANSWER_TIMEOUT_MS=6e4,refused=(reason,detail)=>({status:"refused",reason,detail}),record9=value=>typeof value=="object"&&value!==null&&!Array.isArray(value)?{...value}:void 0;function parseTarget2(value){let fields=record9(value);if(!(typeof fields?.name!="string"||fields.name===""||typeof fields.online!="boolean"))return{name:fields.name,online:fields.online,...typeof fields.capacity=="string"?{capacity:fields.capacity}:{},...typeof fields.aboutToSleep=="boolean"?{aboutToSleep:fields.aboutToSleep}:{}}}var RpcSessionRelocation=class{constructor(deps){this.pending=new Map,this.requesting=!1,this.deps=deps,this.unsubscribe=deps.session.subscribe(event=>{event.type==="agent_end"&&deps.session.currentAbortSource==="user"&&this.scheduled!==void 0&&(this.scheduled={...this.scheduled,dropReason:"aborted"}),event.type==="agent_settled"&&this.scheduled!==void 0&&(this.scheduled.dropReason!==void 0?this.dropScheduled(this.scheduled.dropReason):this.announceWhenReleasable())})}offered(){return this.deps.channel.offerer()!==void 0}async targets(signal){let connection=this.deps.channel.offerer();if(connection===void 0)return RELOCATION_NOT_OFFERED;let answer3=await this.ask({method:"list_relocation_targets"},connection,signal);if("status"in answer3)return answer3;let raw=record9(answer3.data)?.targets,targets2=Array.isArray(raw)?raw.map(parseTarget2):void 0;return targets2===void 0||targets2.some(target=>target===void 0)?refused("invalid_host_answer","the app sent a list of computers this session cannot read"):{status:"listed",targets:targets2.filter(target=>target!==void 0)}}async request(request2,signal){let connection=this.deps.channel.offerer();if(connection===void 0)return RELOCATION_NOT_OFFERED;if(this.deps.session.sessionFile===void 0)return{status:"unavailable",reason:"not_releasable",detail:"this session is not saved to a file"};if(this.scheduled!==void 0||this.requesting)return refused("already_scheduled",`a move to ${this.scheduled?.target??"another computer"} is already set for the end of this turn`);this.requesting=!0;try{let ask={method:"relocate_session",target:request2.target,reason:request2.reason},answer3=await this.ask(ask,connection,signal);return"status"in answer3?answer3:this.settleRequest(request2,record9(answer3.data),connection)}finally{this.requesting=!1}}respond(frame){let pending=this.pending.get(frame.id);return pending===void 0?"unknown":this.deps.channel.current()!==pending.connection?"not_offering_connection":(pending.finish(typeof frame.error=="string"?refused("host_error",frame.error):{data:frame.data}),"answered")}connectionDetached(connectionId){this.scheduled?.connection===connectionId&&this.scheduled.dropReason===void 0&&this.dropScheduled("disconnected");for(let pending of[...this.pending.values()])pending.connection===connectionId&&pending.finish(refused("app_disconnected","the app that was asked left this session"))}dispose(){this.unsubscribe(),this.scheduled=void 0;for(let{finish}of[...this.pending.values()])finish(refused("session_closed","this session was closed"))}dropScheduled(reason){let scheduled=this.scheduled;if(scheduled===void 0)return;this.scheduled=void 0;let{moveId,target}=scheduled;this.deps.session.sendCustomMessage({customType:"session_relocation",content:`The session will not continue on ${target} (${reason}). The session stays on this computer; keep working here.`,display:!1,details:{status:"dropped",reason,moveId,target}},{triggerTurn:!1})}settleRequest(request2,data,connection){if(data?.accepted===!1)return refused(typeof data.reason=="string"&&data.reason!==""?data.reason:"declined",typeof data.detail=="string"&&data.detail!==""?data.detail:"the app declined the move");if(data?.accepted!==!0||!isPlainId(data.moveId))return refused("invalid_host_answer","the app accepted the move without a usable move id");let target=typeof data.target=="string"&&data.target!==""?data.target:request2.target;return this.scheduled={moveId:data.moveId,target,reason:request2.reason,connection},{status:"scheduled",target,moveId:data.moveId}}async announceWhenReleasable(){for(let calls=this.deps.pendingPrompts();calls.length>0;calls=this.deps.pendingPrompts())await Promise.allSettled(calls);let due=this.scheduled;if(due===void 0||this.deps.session.isStreaming)return;if(this.deps.channel.offerer()!==due.connection){this.dropScheduled("withdrawn");return}this.scheduled=void 0;let{connection,moveId,target,reason}=due;this.deps.channel.send(connection,{type:"relocation_due",moveId,target,reason},"event")}ask(fields,connection,signal){if(signal?.aborted)return Promise.resolve(refused("cancelled","the request was cancelled"));let id=`hr_${crypto.randomUUID()}`;return new Promise(resolve55=>{let finish=answer3=>{clearTimeout(timer),signal?.removeEventListener("abort",onAbort),this.pending.delete(id),resolve55(answer3)},onAbort=()=>finish(refused("cancelled","the request was cancelled")),timer=setTimeout(()=>finish(refused("no_answer","the app did not answer in time")),HOST_ANSWER_TIMEOUT_MS);this.pending.set(id,{connection,finish}),signal?.addEventListener("abort",onAbort,{once:!0}),this.deps.channel.send(connection,{type:"host_request",id,...fields},"request")})}};var SOLE_CONNECTION2="sole";function relocationChannel(options){let{clientInfo}=options;if(clientInfo===void 0)return{offerer:()=>options.capabilities()?.includes(SESSION_RELOCATION_CAPABILITY)?SOLE_CONNECTION2:void 0,current:()=>SOLE_CONNECTION2,send:(_connection,record10,kind)=>kind==="event"?options.outputEvent(record10):options.output(record10)};let{relocationConnection,deliverTo}=clientInfo;return{offerer:()=>deliverTo===void 0?void 0:relocationConnection?.(),current:()=>clientInfo.connectionId(),send:(connection,record10)=>deliverTo?.(connection,()=>options.output(record10))}}function answerHostResponse(frame,respond){let reply={id:frame.id,type:"response",command:"host_response"};if(typeof frame.id!="string"||frame.id==="")return{...reply,success:!1,error:"invalid_host_response"};let outcome=respond?.(frame)??"unknown";return outcome==="answered"?{...reply,success:!0}:{...reply,success:!1,error:outcome==="unknown"?"unknown_host_request":outcome}}function isHostResponse(value){return typeof value=="object"&&value!==null&&"type"in value&&value.type==="host_response"}function dialogCall(opts){return opts?.toolCallId===void 0?{}:{toolCallId:opts.toolCallId,...opts.parentToolCallId===void 0?{}:{parentToolCallId:opts.parentToolCallId}}}function loadedExtensionName(path14){let synthetic=/^<(?:builtin|inline):([^>]+)>$/.exec(path14);if(synthetic)return synthetic[1];let withoutExtension=basename38(path14,extname6(path14));if(withoutExtension!=="index")return withoutExtension;let parent=dirname71(path14),parentName=basename38(parent);return parentName==="src"||parentName==="dist"?basename38(dirname71(parent)):parentName}function loadedExtensions(session){return session.resourceLoader.getExtensions().extensions.map(extension=>({name:loadedExtensionName(extension.path),path:extension.path,sourceInfo:extension.sourceInfo,enabled:!0}))}function loadedMcpStatus(server){return server.status!==void 0?server.status:server.serverInfo!==null?"connected":server.authStatus==="notLoggedIn"?"needs_auth":"enabled"}function loadedMcpServers(snapshot){return snapshot.servers.map(server=>({name:server.name,toolCount:server.tools.length,status:loadedMcpStatus(server),authStatus:server.authStatus,...server.lastError===void 0?{}:{lastError:server.lastError}}))}function loadedSurfacesFingerprint(session,extensions,mcpServers){return JSON.stringify({skills:session.resourceLoader.getSkills().skills.map(skill=>({name:skill.name,path:skill.filePath,sourceInfo:skill.sourceInfo,enabled:!skill.disableModelInvocation})),extensions,mcpServers})}function findToolResultMedia(session,toolCallId,contentIndex){let fromContent=content=>{if(!Array.isArray(content))return;let block=content[contentIndex];return block?.type==="image"?block:void 0},matches2=message=>{let candidate=message;return candidate?.role==="toolResult"&&candidate.toolCallId===toolCallId};for(let entry2 of session.sessionManager.getEntries()){if(entry2.type!=="message"||!matches2(entry2.message))continue;let found=fromContent(entry2.message.content);if(found)return found}for(let message of session.messages){if(!matches2(message))continue;let found=fromContent(message.content);if(found)return found}}function createRpcConnectionHandler(runtimeHost,sink,options={}){let clientCapabilities=options.capabilities,unsubscribeSecurityNotices,detachGrantPresentation,grantPresentationAbort=new AbortController,securityBoundByHost=!1,connectionRoles=options.connectionRoles??new ConnectionRoles,currentConnectionId=()=>roleConnection(options.clientInfo?.connectionId()),hasRole=role=>connectionRoles.has(currentConnectionId(),role),routingSessionId=options.sessionId,replacementIssuedHere=!1,session=runtimeHost.session,sessionControl,relocation,promptCalls=new Set,turnRequested=!1,unsubscribe,unsubscribeBackpressure,unsubscribeLoadedSurfaces,unsubscribeExtensionEvents,mcpWireStatus={servers:[]},lastAbortSource,loadedSurfacesDigest,rpcCommandsDigest,suppressLoadedSurfaceEvents=!1,eventOutput=createRpcEventOutputBuffer(sink.writeRaw,options.eventFlushScheduler),effectContext=()=>({session,by:{connectionId:options.clientInfo?.connectionId()??"local"},...routingSessionId===void 0?{}:{sessionId:routingSessionId}}),tagSessionRecord=value=>routingSessionId===void 0?value:{...value,sessionId:routingSessionId},output=obj=>{eventOutput.writeImmediate(tagSessionRecord(obj))},outputEvent=event=>{eventOutput.enqueueEvent(tagSessionRecord(event))},currentLoadedSurfaces=()=>{let extensions=loadedExtensions(session),mcpServers=loadedMcpServers(mcpWireStatus);return{data:{extensions,mcpServers},digest:loadedSurfacesFingerprint(session,extensions,mcpServers)}},recordLoadedSurfaces=emitChange=>{let current=currentLoadedSurfaces(),previous=loadedSurfacesDigest,changed=previous!==void 0&&previous!==current.digest;return loadedSurfacesDigest=current.digest,emitChange&&changed&&!suppressLoadedSurfaceEvents&&emitLoadedSurfacesChanged(previous,current.digest),current},emitLoadedSurfacesChanged=(previous,digest3)=>{options.publishLoadedSurfacesChanged?options.publishLoadedSurfacesChanged(previous,digest3):outputEvent({type:"loaded_surfaces_changed"})},requestMcpWireStatus=async()=>{let response,request2={sessionId:session.sessionId,respond(snapshot){response??=snapshot}};session.resourceLoader.emitExtensionEvent?.(MCP_CONTROL_INVENTORY_REQUEST_EVENT,request2),mcpWireStatus=response===void 0?{servers:[]}:await response},subscribeLoadedSurfaceEvents=()=>{unsubscribeLoadedSurfaces?.(),unsubscribeLoadedSurfaces=session.resourceLoader.onExtensionEvent?.(MCP_CONTROL_INVENTORY_CHANGED_EVENT,data=>{!isMcpControlInventoryChanged(data)||data.sessionId!==session.sessionId||(mcpWireStatus=data.snapshot,suppressLoadedSurfaceEvents||recordLoadedSurfaces(!0))})},unsubscribeProviderAccountEvents=subscribeProviderAccountEvents(event=>{if(event.type==="accounts_changed"){outputEvent({type:"auth_accounts_changed",provider:event.provider});return}outputEvent({type:"account_failover",provider:event.provider,from:event.from,to:event.to,reason:event.reason})}),waitForRpcBackpressure=async()=>{eventOutput.flushEvents(),await sink.waitForBackpressure()},success=(id,command,data)=>data===void 0?{id,type:"response",command,success:!0}:{id,type:"response",command,success:!0,data},error2=(id,command,message,errorCode4,errorData)=>{let details=errorData===void 0&&(command==="edit_user_message"||command==="navigate_tree")?{leafId:session.sessionManager.getLeafId()}:errorData;return{id,type:"response",command,success:!1,error:message,...errorCode4?{errorCode:errorCode4}:{},...details===void 0?{}:{errorData:details}}},pendingExtensionRequests=new SessionExtensionUiRequests(()=>session.refreshLifecycle()),grantRequests=new Map;sessionDialogRequests.set(session,pendingExtensionRequests);let questions=new ConnectionQuestionBridge(output,()=>session.refreshLifecycle()),shutdownRequested=!1,activeLogins=new Map;function createDialogPromise(opts,defaultValue,request2,parseResponse){if(opts?.signal?.aborted)return Promise.resolve(defaultValue);let id=crypto2.randomUUID();return new Promise((resolve55,reject)=>{let timeoutId,cleanup=()=>{timeoutId&&clearTimeout(timeoutId),opts?.signal?.removeEventListener("abort",onAbort),pendingExtensionRequests.delete(id),grantRequests.delete(id)&&options.grantDialogSettled?.(id)},onAbort=()=>{cleanup(),resolve55(defaultValue)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),opts?.timeout&&(timeoutId=setTimeout(()=>{cleanup(),resolve55(defaultValue)},opts.timeout)),pendingExtensionRequests.set(id,{frame:{type:"extension_ui_request",id,...request2},resolve:response=>{cleanup(),resolve55(parseResponse(response))},reject}),request2.grantSelect===!0&&grantRequests.set(id,options.clientInfo?.connectionId()),output({type:"extension_ui_request",id,...request2})})}let selectGrantDialog=(title,choices,opts)=>createDialogPromise(opts,void 0,{method:"select",title,options:choices,timeout:opts?.timeout,grantSelect:!0},response=>"cancelled"in response&&response.cancelled?void 0:"value"in response?response.value:void 0),createExtensionUIContext=()=>({question:(request2,opts)=>clientCapabilities?.includes(QUESTION_CAPABILITY)?questions.ask(request2,opts):degradeQuestion(createExtensionUIContext(),request2,opts),select:(title,options2,opts)=>createDialogPromise(opts,void 0,{method:"select",title,options:options2,timeout:opts?.timeout,...dialogCall(opts)},r=>"cancelled"in r&&r.cancelled?void 0:"value"in r?r.value:void 0),confirm:(title,message,opts)=>createDialogPromise(opts,!1,{method:"confirm",title,message,timeout:opts?.timeout},r=>"cancelled"in r&&r.cancelled?!1:"confirmed"in r?r.confirmed:!1),input:(title,placeholder,opts)=>createDialogPromise(opts,void 0,{method:"input",title,placeholder,timeout:opts?.timeout,...dialogCall(opts)},r=>"cancelled"in r&&r.cancelled?void 0:"value"in r?r.value:void 0),notify(message,type2){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"notify",message,notifyType:type2})},onTerminalInput(){return()=>{}},setStatus(key,text3){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setStatus",statusKey:key,statusText:text3})},setSubagentCost(costUsd){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setSubagentCost",costUsd:costUsd!==void 0&&Number.isFinite(costUsd)&&costUsd>=0?costUsd:void 0})},setWorkingMessage(_message){},setWorkingVisible(_visible){},setWorkingIndicator(_options){},setHiddenThinkingLabel(_label){},setWidget(key,content,options2){(content===void 0||Array.isArray(content))&&output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setWidget",widgetKey:key,widgetLines:content,widgetPlacement:options2?.placement,...content!==void 0&&options2?.actions!==void 0&&options2.actions.length>0?{widgetActions:options2.actions.map(({label:label3,command})=>({label:label3,command}))}:{}})},setFooter(_factory){},setHeader(_factory){},setTitle(title){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setTitle",title})},async custom(){let request2=buildCustomUnsupportedRequest(clientCapabilities,DEFAULT_CUSTOM_EXTENSION_LABEL);request2&&output(request2)},pasteToEditor(text3){this.setEditorText(text3)},setEditorText(text3){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"set_editor_text",text:text3})},getEditorText(){return""},async editor(title,prefill){let id=crypto2.randomUUID();return new Promise((resolve55,reject)=>{pendingExtensionRequests.set(id,{frame:{type:"extension_ui_request",id,method:"editor",title,prefill},resolve:response=>{"cancelled"in response&&response.cancelled?resolve55(void 0):"value"in response?resolve55(response.value):resolve55(void 0)},reject}),output({type:"extension_ui_request",id,method:"editor",title,prefill})})},addAutocompleteProvider(){},setEditorComponent(){},getEditorComponent(){},get theme(){return theme},getAllThemes(){return[]},getTheme(_name){},setTheme(_theme){return{success:!1,error:"Theme switching not supported in RPC mode"}},getToolsExpanded(){return!1},setToolsExpanded(_expanded){}}),refreshLoadedSurfacesAfter=async(operation,resetMcp)=>{let previousDigest=loadedSurfacesDigest,wasSuppressed=suppressLoadedSurfaceEvents;suppressLoadedSurfaceEvents=!0,resetMcp&&(mcpWireStatus={servers:[]});let commandsChanged;try{await operation(),await requestMcpWireStatus(),loadedSurfacesDigest=currentLoadedSurfaces().digest;let commands=buildRpcCommandsForSession(session);commandsChanged=createCommandsChangedEvent(rpcCommandsDigest,commands),rpcCommandsDigest=rpcCommandListDigest(commands)}finally{suppressLoadedSurfaceEvents=wasSuppressed}!wasSuppressed&&commandsChanged&&outputEvent(commandsChanged),!wasSuppressed&&previousDigest!==void 0&&previousDigest!==loadedSurfacesDigest&&emitLoadedSurfacesChanged(previousDigest,loadedSurfacesDigest)};runtimeHost.setRebindSession(async()=>{await rebindSession(!0)});let rebindAfterLocalReplacement=async()=>{replacementIssuedHere=!0;try{await rebindSession()}finally{replacementIssuedHere=!1}},refreshGrantPresentation=()=>{if(grantPresentationAbort.abort(),detachGrantPresentation?.(),detachGrantPresentation=void 0,grantPresentationAbort=new AbortController,securityBoundByHost||!clientCapabilities?.includes("grant_select"))return;let signal=grantPresentationAbort.signal;detachGrantPresentation=attachMcpGrantPresentation(session.sessionId,(title,choices,opts)=>selectGrantDialog(title,choices,{...opts,signal:opts?.signal===void 0?signal:AbortSignal.any([opts.signal,signal])}))},subscribeExtensionEvents=()=>{unsubscribeExtensionEvents=clientCapabilities?.includes(EXTENSION_EVENTS_CAPABILITY)?session.extensionRunner.onRpcEvent(({name,data})=>{outputEvent({type:"extension_event",name,data})}):void 0},replaceClientCapabilities=next=>{let hadEvents=clientCapabilities?.includes(EXTENSION_EVENTS_CAPABILITY)??!1,hadQuestion=clientCapabilities?.includes(QUESTION_CAPABILITY)??!1;clientCapabilities=next,hadQuestion&&!next.includes(QUESTION_CAPABILITY)&&questions.cancelAll(),hadEvents!==next.includes(EXTENSION_EVENTS_CAPABILITY)&&(unsubscribeExtensionEvents?.(),subscribeExtensionEvents())},rebindSession=async(deferRefresh=!1)=>{unbindMcpForms?.(),unbindMcpForms=void 0,unsubscribeSecurityNotices?.(),unsubscribeLoadedSurfaces?.(),unsubscribeExtensionEvents?.();let replacedSession=session!==runtimeHost.session;session=runtimeHost.session;let hostedSecurity=options.bindSecurityPresentation?.(session,{...createExtensionUIContext(),select:selectGrantDialog});securityBoundByHost=hostedSecurity!==void 0,refreshGrantPresentation(),unsubscribeSecurityNotices=hostedSecurity??session.securityNotices?.subscribe(snapshot=>{for(let notice2 of snapshot.notices)output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"notify",notifyType:"warning",message:notice2.message})}),sessionQuestionBridges.set(session,questions),sessionDialogRequests.set(session,pendingExtensionRequests),sessionControl?.dispose(),sessionControl=new HostSessionControl(session,runtimeHost.launchProfile?.sessionContext?.host_socket,line=>{process.stderr.write(`senpi rpc session ${routingSessionId??"classic"}: ${line}
|
|
2248
|
-
`)}),session.setControlEndpointHost?.(sessionControl),relocation?.dispose(),relocation=routingSessionId===void 0?void 0:new RpcSessionRelocation({session,pendingPrompts:()=>[...promptCalls],channel:relocationChannel({capabilities:()=>clientCapabilities,clientInfo:options.clientInfo,output,outputEvent})}),session.setRelocationHost?.(relocation),replacedSession&&(lastAbortSource=void 0,(routingSessionId!==void 0||!replacementIssuedHere)&&outputEvent({type:"session_replaced",durableSessionId:session.sessionId,sessionFile:session.sessionFile,cwd:session.sessionManager.getCwd(),sessionName:session.sessionName})),subscribeExtensionEvents(),subscribeLoadedSurfaceEvents(),installSessionSubscriptions();let extensionUi=createExtensionUIContext();unbindMcpForms=await options.bindMcpForms?.(session,extensionUi);let refresh=refreshLoadedSurfacesAfter(()=>session.bindExtensions({uiContext:extensionUi,mode:"rpc",commandContextActions:{waitForIdle:()=>session.agent.waitForIdle(),newSession:async options2=>runtimeHost.newSession(options2),fork:async(entryId,forkOptions)=>({cancelled:(await runtimeHost.fork(entryId,forkOptions)).cancelled}),navigateTree:async(targetId,options2)=>({cancelled:(await session.navigateTree(targetId,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,replaceInstructions:options2?.replaceInstructions,label:options2?.label,expectedLeafId:options2?.expectedLeafId})).cancelled}),editAssistantMessage:async(entryId,text3,options2)=>{let result3=await session.editAssistantMessage(entryId,text3,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,expectedLeafId:options2?.expectedLeafId});return{cancelled:result3.cancelled,unchanged:result3.unchanged,entryId:result3.entryId}},editUserMessage:async(entryId,text3,options2)=>{let result3=await session.editUserMessage(entryId,text3,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,expectedLeafId:options2?.expectedLeafId});return{cancelled:result3.cancelled,unchanged:result3.unchanged,entryId:result3.entryId}},switchSession:async(sessionPath,options2)=>runtimeHost.switchSession(sessionPath,options2),reload:async()=>{await refreshLoadedSurfacesAfter(async()=>{await session.reload()},!1)}},shutdownHandler:()=>{options.shutdownHandler?options.shutdownHandler():shutdownRequested=!0},onError:err=>{output({type:"extension_error",extensionPath:err.extensionPath,event:err.event,error:err.error})}}),!0);function installSessionSubscriptions(){unsubscribe?.(),unsubscribeBackpressure?.(),unsubscribe=subscribeSessionRecords(session,outputEvent,abortSource=>{lastAbortSource=abortSource}),unsubscribeBackpressure=session.agent.subscribe(async()=>{await waitForRpcBackpressure()})}if(EffectLedger.forSession(session),deferRefresh){refresh.then(()=>session.releaseSettledSessionMemory(),cause=>{outputEvent({type:"rpc_error",error:String(cause)})});return}await refresh,await ClientAdmissions.forSession(session).ready,session.releaseSettledSessionMemory()},startLogin=async provider=>{activeLogins.get(provider)?.abort();let controller=new AbortController,settled2=new AbortController,loginSignal=AbortSignal.any([controller.signal,settled2.signal]);activeLogins.set(provider,controller);let authStorage=session.modelRegistry.authStorage;authStorage.takeReplacement(provider);try{await authStorage.login(provider,{onAuth:info=>{outputEvent({type:"auth_login_url",provider,url:info.url})},onDeviceCode:info=>{outputEvent({type:"auth_login_url",provider,url:info.verificationUri})},...createRpcLoginPromptCallbacks(createExtensionUIContext(),loginSignal),onProgress:()=>{},signal:controller.signal}),session.modelRegistry.refresh(),provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&emitProviderAccountsChanged(provider);let replacement=authStorage.takeReplacement(provider);outputEvent({type:"auth_login_end",provider,success:!0,...replacement})}catch(loginError){let message=loginError instanceof Error?loginError.message:String(loginError);outputEvent({type:"auth_login_end",provider,success:!1,error:message})}finally{settled2.abort(),activeLogins.get(provider)===controller&&activeLogins.delete(provider)}},fastModeContext=()=>({cwd:session.cwd,agentDir:session.agentDir,model:session.model,modelRegistry:session.modelRegistry,serviceTier:session.serviceTier,isProjectTrusted:()=>session.settingsManager.isProjectTrusted(),notify:()=>{},setSessionModel:async model=>session.modelRuntime.hasConfiguredAuth(model.provider)?(await session.setSessionModel(model,{source:"rpc",actor:"set_fast_mode"}),!0):!1,setSessionFastMode:enabled=>session.setSessionFastMode(enabled)}),handleCommand=async command=>{let id=command.id;switch(command.type){case"get_protocol_info":return{id,type:"response",command:"get_protocol_info",success:!0,data:{protocolVersion:1,serverVersion:VERSION,capabilities:[...new Set(["multi_session","session_lifecycle",AUTO_TITLE_SESSIONS_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,STEER_WHEN_IDLE_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,EVAL_CELLS_CAPABILITY,AUTH_KEY_VERIFY_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,TOOL_BARRIER_CAPABILITY,USER_ACTIVITY_CAPABILITY,RESUME_SESSION_CAPABILITY,...options.retryFallbackCommand?[RETRY_FALLBACK_COMMAND_CAPABILITY]:[],...options.toolRuntime?toolRuntimeCapabilities(options.toolRuntime):[],...(options.capabilities??[]).filter(capability=>capability!==SESSION_HELD_CAPABILITY&&!isHostOwnedToolRuntimeCapability(capability))])],mode:"classic",...protocolIdentity()}};case"open_session":return error2(id,"open_session","multi_session_disabled");case"prompt":{if(holdAutomaticInput(session,command,hasRole(INTERACTIVE_USER_CAPABILITY)))return success(id,"prompt",{disposition:"handled",heldAsNotice:!0});turnRequested=!0;let admission=handleClientInput(session,command,{output,promptCalls});promptCalls.add(admission),admission.finally(()=>promptCalls.delete(admission));return}case"append_user_message":{let content=command.content,message=typeof content=="string"?{role:"user",content,timestamp:Date.now()}:{role:"user",content,timestamp:Date.now()};return session.sessionManager.appendMessage(message),session.agent.state.messages=session.sessionManager.buildSessionContext().messages,success(id,"append_user_message")}case"append_session_entry":return session.appendSessionEntry(command.entry),success(id,"append_session_entry");case"continue_from_leaf":{turnRequested=!0;try{return await session.continueFromLeaf(),success(id,"continue_from_leaf")}catch(err){if(err instanceof ContinueFromLeafError)return error2(id,command.type,err.message,err.code);throw err}}case"resume_session":{turnRequested=!0;let{answer:answer3,settled:settled2}=await session.beginResume({expectedSeq:command.expectedSeq,mode:command.mode,message:command.message,effectId:command.effectId});return promptCalls.add(settled2),settled2.then(()=>promptCalls.delete(settled2),err=>{promptCalls.delete(settled2),output({type:"extension_error",extensionPath:"runtime",event:"resume_session",error:err instanceof Error?err.message:String(err)})}),success(id,"resume_session",answer3)}case"send_custom_message":return command.triggerTurn===!0&&(turnRequested=!0),await session.sendCustomMessage({customType:command.customType,content:command.content,display:command.display,details:command.details},{triggerTurn:command.triggerTurn,deliverAs:command.deliverAs}),success(id,"send_custom_message");case"steer":case"follow_up":{if(holdAutomaticInput(session,command,hasRole(INTERACTIVE_USER_CAPABILITY)))return success(id,command.type,{disposition:"handled",heldAsNotice:!0});turnRequested=!0,await handleClientInput(session,command,{output,promptCalls});return}case"abort":return command.intent==="stop"&&!hasRole(INTERACTIVE_USER_CAPABILITY)?error2(id,"abort","stop_requires_interactive_client: declare interactive_user with set_client_info first"):runAbort(effectContext(),command,()=>(command.intent==="stop"?session.stop():session.abort()).catch(cause=>{outputEvent({type:"rpc_error",error:String(cause)})}));case"interrupt":if(command.intent==="stop"&&!hasRole(INTERACTIVE_USER_CAPABILITY))return error2(id,"interrupt","stop_requires_interactive_client: declare interactive_user with set_client_info first");if(command.intent==="stop"){let stopped=await interruptRunningTurn(session,void 0,()=>(ClientAdmissions.forSession(session).noteAbort(effectContext().by),session.stop()));return stopped.interrupted||await session.stop(),success(id,"interrupt",stopped)}return success(id,"interrupt",await interruptRunningTurn(session,command.turnId,()=>(ClientAdmissions.forSession(session).noteAbort(effectContext().by),session.abort())));case"hold_input":{let answer3=runHoldInput(session,command,{interactiveUser:hasRole(INTERACTIVE_USER_CAPABILITY),taskParent:hasRole(TASK_PARENT_CAPABILITY)});return answer3.ok?success(id,"hold_input",answer3.data):error2(id,"hold_input",answer3.error)}case"pause_for_run":{let answer3=await runPauseForRun(session,command,hasRole(TASK_PARENT_CAPABILITY));return answer3.ok?success(id,"pause_for_run",answer3.data):error2(id,"pause_for_run",answer3.error)}case"resume_for_run":{let answer3=await runResumeForRun(session,command,hasRole(TASK_PARENT_CAPABILITY));return answer3.ok?success(id,"resume_for_run",answer3.data):error2(id,"resume_for_run",answer3.error)}case"withdraw_held_input":return hasRole(INTERACTIVE_USER_CAPABILITY)?success(id,"withdraw_held_input",{withdrawn:session.withdrawHeldInput(command.inputId)}):error2(id,"withdraw_held_input","hold_input_requires_interactive_client");case"abort_compaction":return session.abortCompaction(),success(id,"abort_compaction");case"reload":{let result3=await session.reload();return success(id,"reload",result3)}case"check_reload_veto":return success(id,"check_reload_veto",await session.checkReloadVeto());case"dequeue_message":case"edit_queued_message":return runQueuedInputChange(effectContext(),command);case"clear_queue":{ClientAdmissions.clearQueuedFor(session);let cleared=session.clearQueue({abortWillFollow:command.abortWillFollow??!1});return await session.whenQueueClearRecorded(),success(id,"clear_queue",{steering:cleared.steering,followUp:cleared.followUp,ordered:[...cleared.ordered]})}case"get_steering_messages":return success(id,"get_steering_messages",{messages:[...session.getSteeringMessages()],ordered:session.getQueuedInputs().filter(input=>input.mode==="steer").map(clientFacingIdentity)});case"get_follow_up_messages":return success(id,"get_follow_up_messages",{messages:[...session.getFollowUpMessages()],ordered:session.getQueuedInputs().filter(input=>input.mode==="followUp").map(clientFacingIdentity)});case"abort_branch_summary":return session.abortBranchSummary(),success(id,"abort_branch_summary");case"wake":{let deliveryIds=Array.isArray(command.delivery_ids)?command.delivery_ids.filter(entry2=>typeof entry2=="string"):void 0,result3=await sessionControl?.wake(deliveryIds)??{};return success(id,"wake",{admitted:result3.admitted??[]})}case"new_session":{let options2=command.parentSession?{parentSession:command.parentSession}:void 0,result3=await runtimeHost.newSession(options2);return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"new_session",result3)}case"set_client_info":{let wasGrantCapable=clientCapabilities?.includes("grant_select")===!0;if(command.capabilities!==void 0){if(!connectionRoles.declare(currentConnectionId(),command.capabilities))return error2(id,"set_client_info",CONNECTION_ROLE_FIXED);options.clientInfo?(clientCapabilities=command.capabilities,options.clientInfo.setCapabilities(options.clientInfo.connectionId(),command.capabilities)):replaceClientCapabilities(command.capabilities)}return wasGrantCapable!==(clientCapabilities?.includes("grant_select")===!0)&&refreshGrantPresentation(),success(id,"set_client_info")}case"get_state":return success(id,"get_state",buildRpcSessionState(session,lastAbortSource));case"request_self_settle":return success(id,"request_self_settle",session.requestSelfSettle());case"get_effect_status":return runGetEffectStatus(effectContext(),command);case"get_pending_inputs":return success(id,"get_pending_inputs",await session.getPendingInputs(command.knownClientMessageIds));case"set_model":return runSetModel(effectContext(),command);case"set_favorite_models":return session.setFavoriteModels(command.models),success(id,"set_favorite_models");case"set_scoped_models":return session.setScopedModels(command.models),success(id,"set_scoped_models");case"cycle_model":{let result3=await session.cycleModel(command.direction,{origin:{source:"rpc",actor:"cycle_model"}});return result3?success(id,"cycle_model",result3):success(id,"cycle_model",null)}case"get_available_models":return success(id,"get_available_models",await availableModelsData(session));case"set_thinking_level":return runSetThinkingLevel(effectContext(),command);case"cycle_thinking_level":{let level=session.cycleThinkingLevel();return level?success(id,"cycle_thinking_level",{level}):success(id,"cycle_thinking_level",null)}case"get_available_thinking_levels":return success(id,"get_available_thinking_levels",{levels:session.getAvailableThinkingLevels()});case"get_model_thinking_level":{if(typeof command.provider!="string"||typeof command.modelId!="string")return error2(id,"get_model_thinking_level","get_model_thinking_level requires 'provider' and 'modelId'.",RPC_ERROR_INVALID_ARGUMENT);let model=(await session.modelRegistry.getAvailable()).find(m=>m.provider===command.provider&&m.id===command.modelId);return model?success(id,"get_model_thinking_level",session.getThinkingLevelForModel(model)):error2(id,"get_model_thinking_level",`Model not found: ${command.provider}/${command.modelId}`,RPC_ERROR_MODEL_NOT_FOUND)}case"set_fast_mode":{if(typeof command.enabled!="boolean")return error2(id,"set_fast_mode","set_fast_mode requires a boolean 'enabled' field.");let model=session.model;if(!model)return error2(id,"set_fast_mode","No active model.");let result3=await applyFastMode(fastModeContext(),command.enabled);if(!result3.applied)return error2(id,"set_fast_mode",result3.message);let memoryModel=resolveServiceTierMemoryModel(session.modelRegistry,session.model??model);return success(id,"set_fast_mode",{enabled:result3.enabled,serviceTier:result3.recordedTier,provider:memoryModel.provider,modelId:memoryModel.id})}case"get_fast_mode":return success(id,"get_fast_mode",{enabled:session.isFastModeActive(),serviceTier:session.effectiveServiceTier??null});case"set_steering_mode":return session.setSteeringMode(command.mode),success(id,"set_steering_mode");case"set_follow_up_mode":return session.setFollowUpMode(command.mode),success(id,"set_follow_up_mode");case"compact":{let result3=await session.compact(command.customInstructions);return success(id,"compact",result3)}case"set_auto_compaction":return session.setAutoCompactionEnabled(command.enabled),success(id,"set_auto_compaction");case"set_auto_retry":return session.setAutoRetryEnabled(command.enabled),success(id,"set_auto_retry");case"abort_retry":return session.abortRetry(),success(id,"abort_retry");case"set_retry_fallback":{if(!options.retryFallbackCommand)return error2(id,"set_retry_fallback","set_retry_fallback is for a single-session rpc process; a host session takes open_session.retryFallback.");let profileError=sessionRetryFallbackError(command.retryFallback);return profileError!==void 0||command.retryFallback===void 0?error2(id,"set_retry_fallback",profileError??"set_retry_fallback needs retryFallback."):turnRequested||session.isStreaming||session.messages.some(message=>message.role!=="custom")?error2(id,"set_retry_fallback","set_retry_fallback must arrive before the session's first turn."):(runtimeHost.setRetryFallback(command.retryFallback),success(id,"set_retry_fallback"))}case"navigate_tree":{if(command.entryId!==void 0&&command.targetId!==void 0)return error2(id,"navigate_tree","navigate_tree takes either entryId or targetId, not both");if(command.entryId===void 0&&command.targetId===void 0)return error2(id,"navigate_tree","navigate_tree requires entryId or targetId");let targetId=command.entryId??command.targetId;if(typeof targetId!="string"||targetId.length===0)return error2(id,command.type,"navigate_tree requires a non-empty entryId or targetId");if(command.intent!==void 0&&command.intent!=="select"&&command.intent!=="resume")return error2(id,command.type,"navigate_tree intent must be select or resume");try{let result3=await session.navigateTree(targetId,{...command.intent!==void 0?{intent:command.intent}:{},summarize:command.summarize,customInstructions:command.customInstructions,replaceInstructions:command.replaceInstructions,label:command.label,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();return command.targetId!==void 0?success(id,command.type,{...result3,leafId}):result3.cancelled?success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}}):success(id,command.type,{outcome:"navigated",leafId,...result3.editorText!==void 0?{editorText:result3.editorText}:{},...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"record_bash_result":return session.recordBashResult(command.command,command.result,{excludeFromContext:command.excludeFromContext}),success(id,"record_bash_result");case"release_tool_barrier":return success(id,"release_tool_barrier",{released:session.releaseToolBarrier(command.barrierId)});case"set_label":return session.sessionManager.appendLabelChange(command.entryId,command.label),success(id,"set_label");case"bash":{routingSessionId!==void 0&&outputEvent({type:"bash_start"});try{let eventResult=await session.extensionRunner.emitUserBash({type:"user_bash",command:command.command,excludeFromContext:command.excludeFromContext??!1,cwd:session.sessionManager.getCwd()});if(eventResult?.result)return session.recordBashResult(command.command,eventResult.result,{excludeFromContext:command.excludeFromContext}),success(id,"bash",eventResult.result);let result3=await session.executeBash(command.command,void 0,{excludeFromContext:command.excludeFromContext,id:command.executionId,operations:eventResult?.operations});return success(id,"bash",result3)}finally{routingSessionId!==void 0&&outputEvent({type:"bash_end"})}}case"abort_bash":return session.abortBash(),success(id,"abort_bash");case"cleanup_bash_output":return await session.cleanupBashOutput(command.path),success(id,"cleanup_bash_output");case"get_session_stats":{let stats=session.getSessionStats();return success(id,"get_session_stats",stats)}case"resolve_path":return success(id,"resolve_path",resolveMessagePath({path:command.path,cwd:session.cwd,projectRoot:messagePathProjectRoot(session.cwd)}));case"memory_report":{let answer3=await answerMemoryReport(session);return answer3.ok?success(id,"memory_report",answer3.data):error2(id,"memory_report",answer3.error)}case"export_html":{let path14=await session.exportToHtml(command.outputPath,{themeName:command.themeName});return success(id,"export_html",{path:path14})}case"export_jsonl":return success(id,"export_jsonl",{path:session.exportToJsonl(command.outputPath)});case"switch_session":{let result3=await runtimeHost.switchSession(command.sessionPath,{cwdOverride:command.cwdOverride});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"switch_session",result3)}case"fork":{let result3=await runtimeHost.fork(command.entryId,{position:command.position});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"fork",{text:result3.selectedText,cancelled:result3.cancelled})}case"edit_assistant_message":{if(typeof command.entryId!="string"||command.entryId.length===0||typeof command.text!="string")return error2(id,command.type,"edit_assistant_message requires a non-empty entryId and a text string");try{let result3=await session.editAssistantMessage(command.entryId,command.text,{summarize:command.summarize,customInstructions:command.customInstructions,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();if(result3.unchanged)return success(id,command.type,{outcome:"unchanged",leafId});if(result3.cancelled)return success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}});let entry2=result3.entryId?session.sessionManager.getEntry(result3.entryId):void 0;return entry2?.type!=="message"||leafId===null?error2(id,command.type,"Edited assistant entry was not persisted"):success(id,command.type,{outcome:"edited",entry:entry2,leafId,...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"edit_user_message":{if(typeof command.entryId!="string"||command.entryId.length===0||typeof command.text!="string")return error2(id,command.type,"edit_user_message requires a non-empty entryId and a text string");try{let result3=await session.editUserMessage(command.entryId,command.text,{summarize:command.summarize,customInstructions:command.customInstructions,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();if(result3.unchanged)return success(id,command.type,{outcome:"unchanged",leafId});if(result3.cancelled)return success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}});let entry2=result3.entryId?session.sessionManager.getEntry(result3.entryId):void 0;return entry2?.type!=="message"||leafId===null?error2(id,command.type,"Edited user entry was not persisted"):success(id,command.type,{outcome:"edited",entry:entry2,leafId,...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof UserEditError||err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"clone":{let leafId=session.sessionManager.getLeafId();if(!leafId)return error2(id,"clone","Cannot clone session: no current entry selected");let result3=await runtimeHost.fork(leafId,{position:"at"});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"clone",{cancelled:result3.cancelled})}case"get_fork_messages":{let messages=session.getUserMessagesForForking();return success(id,"get_fork_messages",{messages})}case"get_entries":{let sessionManager=session.sessionManager,entries=sessionManager.getEntries();if(command.since!==void 0){let sinceIndex=entries.findIndex(e=>e.id===command.since);if(sinceIndex===-1)return error2(id,"get_entries",`Entry not found: ${command.since}`,RPC_ERROR_ENTRY_NOT_FOUND);entries=entries.slice(sinceIndex+1)}let bounds=entryPageBounds(command);if(!bounds.ok)return error2(id,"get_entries",bounds.message,RPC_ERROR_INVALID_ARGUMENT);let page=pageEntries(entries,describeUsageLimitEntry,bounds);bounds.paged&&page.hasMore?holdEntryWalk(session,()=>session.releaseFullHistoryView()):(endEntryWalk(session),session.releaseFullHistoryView());let budget=currentResponseByteBudget();return page.firstEntryBytes>budget?error2(id,"get_entries",`Entry ${entries[0]?.id??""} alone is larger than one answer can carry (${budget} bytes), so it cannot be sent over RPC.`,RPC_ERROR_RESPONSE_TOO_LARGE):!bounds.paged&&page.hasMore?error2(id,"get_entries",`The session history is larger than one answer can carry (${budget} bytes). Read it in pages: pass limit or maxBytes, then since: nextSince until hasMore is false.`,RPC_ERROR_RESPONSE_TOO_LARGE):success(id,"get_entries",{entries:page.entries,leafId:sessionManager.getLeafId(),...bounds.paged?{hasMore:page.hasMore}:{},...page.nextSince===void 0?{}:{nextSince:page.nextSince}})}case"get_tree":{let sessionManager=session.sessionManager,tree=sessionManager.getTree(),nodes=[...tree];for(let node of nodes){node.entry=describeUsageLimitEntry(node.entry);for(let child of node.children)nodes.push(child)}return session.releaseFullHistoryView(),success(id,"get_tree",{tree,leafId:sessionManager.getLeafId()})}case"get_last_assistant_text":{let text3=session.getLastAssistantText();return success(id,"get_last_assistant_text",{text:text3})}case"import_jsonl":{let result3=await runtimeHost.importFromJsonl(command.inputPath,command.cwdOverride);return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"import_jsonl",result3)}case"set_session_name":{let name=command.name.trim();return name?(session.setSessionName(name),success(id,"set_session_name")):error2(id,"set_session_name","Session name cannot be empty")}case"record_user_activity":return command.kind!=="draft"?error2(id,"record_user_activity",'record_user_activity: kind must be "draft"',RPC_ERROR_INVALID_ARGUMENT):(session.recordUserActivity("draft"),success(id,"record_user_activity"));case"get_subscription_limits":return success(id,"get_subscription_limits",{accounts:subscriptionLimits.snapshot()});case"get_messages":return success(id,"get_messages",{messages:session.messages.map(message=>message.role==="assistant"?describeUsageLimitMessage(message):message)});case"get_media":{let{toolCallId,contentIndex}=command,content=findToolResultMedia(session,toolCallId,contentIndex);return content?success(id,"get_media",{toolCallId,contentIndex,content}):error2(id,"get_media",RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MEDIA_NOT_FOUND)}case"get_commands":return success(id,"get_commands",{commands:buildRpcCommandsForSession(session)});case"get_loaded_surfaces":{await requestMcpWireStatus();let inventory=recordLoadedSurfaces(!0);return success(id,"get_loaded_surfaces",inventory.data)}case"extension_request":case"eval_cells.list":case"eval_cells.peek":case"eval_cells.stop":{let name=command.type==="extension_request"?command.name.trim():command.type;if(name.length===0)return error2(id,command.type,"Extension RPC request name cannot be empty");try{let data=await session.extensionRunner.requestRpc(name,command.type==="extension_request"?command.data:command);return success(id,command.type,data)}catch(cause){if(cause instanceof ExtensionRpcRequestNotFoundError&&(name==="eval_cells.list"||name==="eval_cells.peek"||name==="eval_cells.stop"))return error2(id,command.type,"Eval cell controls are unavailable in this session",RPC_ERROR_EVAL_CELLS_UNAVAILABLE);if(cause instanceof Error&&"code"in cause&&(cause.code===RPC_ERROR_EVAL_CELL_NOT_FOUND||cause.code===RPC_ERROR_INVALID_EVAL_CELL_REQUEST))return error2(id,command.type,cause.message,cause.code);throw cause}}case"get_auth_providers":{let modelRegistry=session.modelRegistry,oauthInfos=buildLoginProviderInfos(modelRegistry,"oauth"),apiKeyInfos=buildLoginProviderInfos(modelRegistry,"api_key"),providers=[...oauthInfos,...apiKeyInfos].map(info=>({id:info.id,name:info.name,authType:info.authType,status:authMethodStatus(modelRegistry,info),...storedKeyHint(modelRegistry,info)}));return success(id,"get_auth_providers",{providers})}case"login_start":return startLogin(command.provider),success(id,"login_start");case"login_cancel":return activeLogins.get(command.provider)?.abort(),success(id,"login_cancel");case"login_api_key":{let replacement=session.modelRegistry.authStorage.set(command.provider,{type:"api_key",key:command.key});return session.modelRegistry.authStorage.takeReplacement(command.provider),await session.modelRegistry.refresh(),success(id,"login_api_key",replacement)}case"verify_api_key":{let verification=await verifyApiKey({models:session.modelRegistry.getAll(),provider:command.provider,key:command.key,signal:AbortSignal.timeout(15e3)});return success(id,"verify_api_key",verification)}case"logout":return session.modelRegistry.authStorage.logout(command.provider),await session.modelRegistry.refresh(),success(id,"logout");case"get_provider_accounts":{let listing=await listCredentialAccounts(session.modelRegistry.authStorage,command.provider);return success(id,"get_provider_accounts",{accounts:listing.accounts,ordered:listing.ordered})}case"account_pin":return await pinCredentialAccount(session.modelRegistry.authStorage,command.provider,command.name),success(id,"account_pin");case"account_remove":return await removeCredentialAccount(session.modelRegistry.authStorage,command.provider,command.name),success(id,"account_remove");case"account_order":{let names=command.names;if(names!==null&&!(Array.isArray(names)&&names.every(name=>typeof name=="string")))throw new Error("account_order names must be an array of account names, or null to clear the order");return await orderCredentialAccounts(session.modelRegistry.authStorage,command.provider,command.names),success(id,"account_order")}default:{let unknownCommand=command;return error2(id,unknownCommand.type,`Unknown command: ${unknownCommand.type}`)}}},handleInputLine=async line=>{let parsed;try{parsed=JSON.parse(line)}catch(parseError){output(error2(void 0,"parse",`Failed to parse command: ${parseError instanceof Error?parseError.message:String(parseError)}`)),await waitForRpcBackpressure();return}let shapeError=rpcCommandShapeError(parsed);if(shapeError){output(error2(void 0,"parse",shapeError)),await waitForRpcBackpressure();return}if(typeof parsed=="object"&&parsed!==null&&"type"in parsed&&parsed.type==="extension_ui_progress"){questions.progress(parsed);return}if(isHostResponse(parsed)){output(answerHostResponse(parsed,frame=>relocation?.respond(frame)??"unknown"));return}if(typeof parsed=="object"&&parsed!==null&&"type"in parsed&&parsed.type==="extension_ui_response"){if(!options.workerSecurityBridge&&"id"in parsed&&typeof parsed.id=="string"&&grantRequests.has(parsed.id)){let sender=options.clientInfo?.connectionId(),capable=sender===void 0?clientCapabilities?.includes("grant_select")===!0:options.clientInfo?.hasCapability?.(sender,"grant_select")===!0;if(grantRequests.get(parsed.id)!==sender||!capable)return}let reply=settleExtensionUiResponse(parsed,{questions,dialogs:pendingExtensionRequests,routed:routingSessionId!==void 0,beforeAnswer:()=>session.admitHumanAnswer()});reply&&output(reply);return}let command=parsed,payloadError=rpcCommandPayloadError(command),messageLengthError=rpcMessageLengthError(command);if(payloadError||messageLengthError){output(error2(command.id,command.type,payloadError??messageLengthError)),await waitForRpcBackpressure();return}try{let response=await handleCommand(command);response&&(output(response),await waitForRpcBackpressure())}catch(commandError){let missingCwd=commandError instanceof Error&&commandError.name==="MissingSessionCwdError"&&"issue"in commandError;output(error2(command.id,command.type,commandError instanceof Error?commandError.message:String(commandError),missingCwd?"missing_session_cwd":void 0,missingCwd?commandError.issue:void 0)),await waitForRpcBackpressure()}},stopLimitEvents=options.sessionId===void 0?subscriptionLimits.subscribe(limits=>eventOutput.enqueueEvent({type:"subscription_limits",...limits})):()=>{},dispose=async(disposeOptions={})=>{unbindMcpForms?.(),grantPresentationAbort.abort(),detachGrantPresentation?.(),unsubscribeSecurityNotices?.(),stopLimitEvents(),sessionControl?.dispose(),sessionControl=void 0,relocation?.dispose(),relocation=void 0,questions.cancelAll(),pendingExtensionRequests.close(),unsubscribeProviderAccountEvents(),unsubscribe?.(),unsubscribeBackpressure?.(),unsubscribeLoadedSurfaces?.(),unsubscribeExtensionEvents?.(),unsubscribe=void 0,unsubscribeBackpressure=void 0,unsubscribeLoadedSurfaces=void 0,unsubscribeExtensionEvents=void 0,options.disposeRuntime!==!1&&await runtimeHost.dispose(disposeOptions)},unbindMcpForms,ready=rebindSession();return{ready,async handleInputLine(line){await ready,await handleInputLine(line)},pendingPrompts(){return[...promptCalls]},isShutdownRequested(){return shutdownRequested},cancelPendingExtensionUiRequests(){questions.cancelAll(),pendingExtensionRequests.cancelAll()},connectionDetached(connectionId){relocation?.connectionDetached(connectionId)},async dispose(disposeOptions){await ready,await dispose(disposeOptions)}}}function createRpcShutdown(dispose,exit){let pending,code=0;return(exitCode=0,signal)=>(code===0&&(code=exitCode),pending||(pending=(async()=>(await dispose(signal),exit(code)))(),pending))}async function runRpcMode(runtimeHost,toolRuntime){takeOverStdout();let sink={writeRaw:chunk=>{let linearized=chunk.split(`
|
|
2247
|
+
`)}var SHOW_IMAGES_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ShowImagesSelectorComponent=class extends Container{constructor(currentValue,onSelect,onCancel){super();let items=[{value:"yes",label:"Yes",description:"Show images inline in terminal"},{value:"no",label:"No",description:"Show text placeholder instead"}];this.addChild(new DynamicBorder),this.selectList=new SelectList(items,5,getSelectListTheme(),SHOW_IMAGES_SELECT_LIST_LAYOUT),this.selectList.setSelectedIndex(currentValue?0:1),this.selectList.onSelect=item=>{onSelect(item.value==="yes")},this.selectList.onCancel=()=>{onCancel()},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};var THEME_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ThemeSelectorComponent=class extends Container{constructor(currentTheme,onSelect,onCancel,onPreview){super(),this.onPreview=onPreview;let themes=getAvailableThemes(),themeItems2=themes.map(name=>({value:name,label:name,description:name===currentTheme?"(current)":void 0}));this.addChild(new DynamicBorder),this.selectList=new SelectList(themeItems2,10,getSelectListTheme(),THEME_SELECT_LIST_LAYOUT);let currentIndex=themes.indexOf(currentTheme);currentIndex!==-1&&this.selectList.setSelectedIndex(currentIndex),this.selectList.onSelect=item=>{onSelect(item.value)},this.selectList.onCancel=()=>{onCancel()},this.selectList.onSelectionChange=item=>{this.onPreview(item.value)},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};import{spawn as spawn13}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve55=>{let proc=spawn13(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{if(!killed){if(killed=!0,!signalSpawnedChild(proc,"SIGTERM")&&proc.pid===void 0)return;setTimeout(()=>{proc.killed||signalSpawnedChild(proc,"SIGKILL")},5e3)}};options?.signal&&(options.signal.aborted?killProcess():options.signal.addEventListener("abort",killProcess,{once:!0})),options?.timeout&&options.timeout>0&&(timeoutId=setTimeout(()=>{killProcess()},options.timeout)),proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),waitForChildProcess(proc).then(code=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve55({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve55({stdout,stderr,code:1,killed})})})}function redactForUpload(text3,options={}){let tally=new Map,context=currentShareRedactionContext(),extra=(options.extraLiterals??[]).filter(value=>value.trim().length>0);return{text:redactShareText(text3,extra.length===0?context:{...context,extraLiterals:extra},tally),counts:Object.fromEntries(tally)}}import{createHash as createHash31}from"node:crypto";import{readFileSync as readFileSync53}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{return createHash31("sha256").update(readFileSync53(file,"utf8")).digest("hex")}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.importer.compiledSources?.()??[])if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create2){return generation?generation.importer:(pendingImporter??=create2().then(importer=>(generation={importer,factories:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledSources!==void 0&&generation.factories.set(resolvedPath,factory)}var __rewriteRelativeImportExtension2=function(path14,preserveJsx){return typeof path14=="string"&&/^\.\.?\//.test(path14)?path14.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path14};function sessionProfile(options){return{sessionKind:options?.sessionKind??"interactive",sessionContext:options?.sessionContext??EMPTY_SESSION_CONTEXT}}var VIRTUAL_MODULES={typebox:build_exports,"typebox/compile":compile_exports,"typebox/value":value_exports2,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports2,"@earendil-works/pi-agent-core":dist_exports,"@earendil-works/pi-tui":dist_exports2,"@earendil-works/pi-ai":compat_exports,"@earendil-works/pi-ai/compat":compat_exports,"@earendil-works/pi-ai/oauth":oauth_exports,"@earendil-works/pi-ai/providers/all":all_exports,"@earendil-works/pi-coding-agent":dist_exports3,"@mariozechner/pi-agent-core":dist_exports,"@mariozechner/pi-tui":dist_exports2,"@mariozechner/pi-ai":compat_exports,"@mariozechner/pi-ai/compat":compat_exports,"@mariozechner/pi-ai/oauth":oauth_exports,"@mariozechner/pi-ai/providers/all":all_exports,"@mariozechner/pi-coding-agent":dist_exports3,"@code-yeongyu/senpi":dist_exports3},require3=createRequire3(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path13.extname(fileURLToPath7(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path13.dirname(fileURLToPath7(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path13.resolve(__dirname,"../../.."),packagesRoot=path13.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path13.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs7.existsSync(bundledPath))return bundledPath;let workspacePath=path13.join(packagesRoot,workspaceRelativePath);if(fs7.existsSync(workspacePath))return workspacePath;let sourcePath=path13.join(packagesRoot,sourceRelativePath);return fs7.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath7(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path13.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path13.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs7.existsSync(piCodingAgentDistEntry)?piCodingAgentDistEntry:piCodingAgentSourceEntry,piAgentCoreEntry=resolveWorkspaceOrBundled("@earendil-works/pi-agent-core","dist/index.js","agent/dist/index.js","agent/src/index.ts","@earendil-works/pi-agent-core"),piTuiEntry=resolveWorkspaceOrBundled("@earendil-works/pi-tui","dist/index.js","tui/dist/index.js","tui/src/index.ts","@earendil-works/pi-tui"),piAiCompatEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/compat.js","ai/dist/compat.js","ai/src/compat.ts","@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/oauth.js","ai/dist/oauth.js","ai/src/oauth.ts","@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/providers/all.js","ai/dist/providers/all.js","ai/src/providers/all.ts","@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@code-yeongyu/senpi":piCodingAgentEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var runtimeFactories=new WeakMap;function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state3={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,assertActive=()=>{if(state3.staleMessage)throw new StaleExtensionContextError(state3.staleMessage)},runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,executeTool:()=>Promise.reject(new Error("Extension runtime not initialized")),getActiveTools:notInitialized,getAllTools:notInitialized,getSettings:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},registerRemovedToolHint:()=>{},registerLazyToolActivator:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,setSessionModel:()=>Promise.reject(new Error("Extension runtime not initialized")),setSessionThinkingLevel:notInitialized,setSessionFastMode:notInitialized,sessionControl:unboundSessionControlActions(),flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],pendingVirtualModelRegistrations:[],createContext:notInitialized,assertActive,invalidate:message=>{if(!state3.staleMessage){state3.staleMessage=message??"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().";for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear(),runtime.evalHandleHost=void 0,runtimeFactories.delete(runtime)}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath,order:nextProviderRegistrationOrder++})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath,order:nextProviderRegistrationOrder++})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)},registerVirtualModel:(definition,extensionPath="<unknown>")=>{runtime.pendingVirtualModelRegistrations.push({definition,extensionPath})},unregisterVirtualModel:(provider,id)=>{runtime.pendingVirtualModelRegistrations=runtime.pendingVirtualModelRegistrations.filter(({definition})=>definition.provider!==provider||definition.id!==id)}};return runtime}var unboundSessionControl=unboundSessionControlActions();function sessionControlOf(runtime){return runtime.sessionControl??unboundSessionControl}function drainPendingProviderRegistrations(runtime){let drained=[...runtime.pendingProviderRegistrations.map(entry2=>({kind:"config",...entry2})),...runtime.pendingNativeProviderRegistrations.map(entry2=>({kind:"native",...entry2}))];return drained.sort((a,b)=>a.order-b.order),runtime.pendingProviderRegistrations=[],runtime.pendingNativeProviderRegistrations=[],drained}function createExtensionAPI(extension,runtime,cwd,eventBus,session){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state3="loading",assertActive=()=>{if(state3==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state3==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0},api={cwd,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler,options){assertActive();let registeredHandler=ownedBy(extension,(...args)=>handler(...args)),list3=extension.handlers.get(event)??[];return list3.push(registeredHandler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(registeredHandler)),(event==="context"||event==="context_with_system")&&options?.mutatesMessages===!1&&(extension.nonMutatingContextHandlers??=new WeakSet,extension.nonMutatingContextHandlers.add(registeredHandler)),()=>{let handlers=extension.handlers.get(event);if(!handlers)return;let handlerIndex=handlers.indexOf(registeredHandler);handlerIndex!==-1&&(handlers.splice(handlerIndex,1),handlers.length===0&&extension.handlers.delete(event))}},registerTool(tool){if(runtime.assertActive(),tool.name==="tool_search"&&extension.sourceInfo.source!=="builtin")throw new Error('Tool name "tool_search" is reserved for the builtin tool-search extension.');if(typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:Object.assign(Object.create(Object.getPrototypeOf(tool)),tool,{execute:ownedBy(extension,tool.execute)}),sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerLazyToolActivator(activator){runtime.assertActive();let activators=extension.lazyToolActivators??[];activators.push(activator),extension.lazyToolActivators=activators,runtime.registerLazyToolActivator(activator)},provideEvalHandleHost(host){runtime.assertActive(),runtime.evalHandleHost=host},registerRemovedToolHint(name,hint){runtime.assertActive();let hints=extension.removedToolHints;hints||(hints=new Map,extension.removedToolHints=hints),hints.set(name,hint),runtime.registerRemovedToolHint(name,hint)},registerChildModule(registration){runtime.assertActive(),validateChildModuleRegistration(registration);let modules=extension.childModules??new Map;modules.set(registration.id,{registration:{...registration},sourceInfo:extension.sourceInfo}),extension.childModules=modules},registerFilesystemPolicy(policy){runtime.assertActive();let policies2=extension.filesystemPolicies??[];policies2.push(policy),extension.filesystemPolicies=policies2},registerCommand(name,options){if(assertActive(),typeof name!="string"||name.length===0)throw new Error(`Command registered by extension "${extension.path}" must have a non-empty string name. Use pi.registerCommand("name", { description, handler }).`);if(typeof options?.handler!="function")throw new Error(`Command "/${name}" registered by extension "${extension.path}" must define handler().`);extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options,handler:ownedBy(extension,options.handler)})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options,handler:ownedBy(extension,options.handler)})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state3==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMemoryReporter(name,reporter){if(assertActive(),RESERVED_MEMORY_REPORT_KEYS.has(name))throw new Error(`Memory reporter name "${name}" is reserved by the memory report`);extension.memoryReporters??=new Map,extension.memoryReporters.set(name,reporter)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer,options){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer),extension.entryRendererOptions??=new Map,options===void 0?extension.entryRendererOptions.delete(customType):extension.entryRendererOptions.set(customType,options)},registerReadClassifier(classifier){assertActive();let unregister=runtime.trackEventBusSubscription(registerReadClassifier(classifier));return state3==="loading"&&loadingUnsubscribers.push(unregister),unregister},registerMcpServer(name,config){runtime.assertActive();let error2=validateMcpServerDeclaration(name,config);if(error2)throw new Error(error2);extension.mcpServers.set(name,{name,config,extensionPath:extension.path,registrationCwd:extension.registrationCwd})},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},getPermissionPreset(){assertActive();let sessionManager;try{sessionManager=runtime.createContext().sessionManager}catch{return}return readPermissionPreset(sessionManager)},getSubscriptionLimits(){return assertActive(),subscriptionLimits.snapshot()},onSubscriptionLimits(listener){return assertActive(),subscriptionLimits.subscribe(listener)},lifecycle:createLifecycleApi(()=>{if(assertActive(),!runtime.lifecycle)throw new Error("Extension lifecycle is not bound to a session");return runtime.lifecycle}),sendMessage:((message,options)=>{assertActive();let items=options?.items;if(items===void 0){runtime.sendMessage(message,options);return}let itemized=runtime.sendItemizedMessage;return itemized===void 0?(runtime.sendMessage(message,options),Promise.resolve(void 0)):itemized(message,{...options,items})}),sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data,options){assertActive(),runtime.appendEntry(customType,data,options)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label3){assertActive(),runtime.setLabel(entryId,label3)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},redactForUpload(text3,options){return assertActive(),redactForUpload(text3,options)},hostVersion:VERSION,executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},armToolBarrier(spec2){if(assertActive(),!runtime.armToolBarrier)throw new Error("This runtime has no tool barrier (senpi#3717).");runtime.armToolBarrier(spec2)},releaseToolBarrier(id){return assertActive(),runtime.releaseToolBarrier?.(id)??!1},getAllTools(){return assertActive(),runtime.getAllTools()},getSettings(){return assertActive(),runtime.getSettings()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model,{source:"extension",actor:extension.path})},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model,{source:"extension",actor:extension.path})},setSessionThinkingLevel(level){runtime.assertActive(),runtime.setSessionThinkingLevel(level)},setSessionFastMode(enabled){runtime.assertActive(),runtime.setSessionFastMode(enabled)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},session:{registerControlEndpoint(options){return runtime.assertActive(),sessionControlOf(runtime).registerControlEndpoint(options)},admissionGate(){return runtime.assertActive(),sessionControlOf(runtime).admissionGate()},admitExternalMessage(input){return runtime.assertActive(),sessionControlOf(runtime).admitExternalMessage(input)},listAdmittedDeliveries(){return runtime.assertActive(),sessionControlOf(runtime).listAdmittedDeliveries()},persistHeaderNow(){return runtime.assertActive(),sessionControlOf(runtime).persistHeaderNow()},relocationOffered(){return runtime.assertActive(),sessionControlOf(runtime).relocationOffered()},relocationTargets(signal){return runtime.assertActive(),sessionControlOf(runtime).relocationTargets(signal)},requestRelocation(request2,signal){return runtime.assertActive(),sessionControlOf(runtime).requestRelocation(request2,signal)}},rpc:{emit(name,data){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension event name must not be empty");eventBus.emit(EXTENSION_RPC_EVENT_CHANNEL,{name:normalizedName,data})},handle(name,handler){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension request name must not be empty");let handlers=extension.rpcHandlers??new Map;if(handlers.has(normalizedName))throw new Error(`RPC extension request handler already registered: ${normalizedName}`);handlers.set(normalizedName,ownedBy(extension,handler)),extension.rpcHandlers=handlers}},registerVirtualModel(model){assertActive();let definition={...model,route:request2=>model.route(request2,runtime.createContext())};applyRuntimeChange(()=>runtime.registerVirtualModel(definition,extension.path))},unregisterVirtualModel(provider,id){assertActive(),applyRuntimeChange(()=>runtime.unregisterVirtualModel(provider,id))},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state3==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}};return recordExtensionLoadKey(api,runtime),{api,commit:()=>{if(state3==="loading"){runtime.assertActive();for(let[name,value]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value);for(let apply of pendingRuntimeChanges)apply();state3="active",clearPending()}},discard:()=>{if(state3==="loading"){state3="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension2(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-MOOVT743.js");return createBunExtensionImporter(VIRTUAL_MODULES,{},{preparedCache:{dir:path13.join(getAgentDir(),"cache","extension-modules"),release:VERSION}})}let{createJiti}=await importNodeOnlyApi("jiti/static");return createJiti(import.meta.url,{moduleCache:!1,...isNodeSeaBinary||isBundledNode?{virtualModules:VIRTUAL_MODULES,tryNative:!1}:isTypeScriptSourceRuntime?{alias:getAliases(),virtualModules:VIRTUAL_MODULES,tsconfigPaths:!0}:{alias:getAliases()}})}async function loadExtensionModule(extensionPath,getImporter){let cachedFactory=cachedExtensionFactory(extensionPath);if(cachedFactory)return cachedFactory;let importer=await getImporter(),factory=await importer.import(extensionPath,{default:!0});if(typeof factory=="function")return rememberExtensionFactory(extensionPath,factory,importer),factory}function createExtension(extensionPath,resolvedPath,registrationCwd){let source2=getSyntheticPathSource(extensionPath)??"local",baseDir=isSyntheticPath(extensionPath)?void 0:path13.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source:source2,baseDir,scope:source2==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers:new Map,memoryReporters:new Map,entryRenderers:void 0,commands:new Map,rpcHandlers:new Map,flags:new Map,shortcuts:new Map,mcpServers:new Map,registrationCwd}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session){let extension=createExtension(extensionPath,resolvedPath,cwd),load2=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await runOwnedBy(extension,()=>factory(load2.api)),load2.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load2.discard(),error2}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,getImporter,factoryResolver,session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=factoryResolver?.(extensionPath,resolvedPath)??await loadExtensionModule(resolvedPath,getImporter);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err){return{extension:null,error:`Failed to load extension: ${err instanceof Error?err.message:String(err)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>",session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime,session)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,options){let session=sessionProfile(options),extensions=[],errors=[],warnings=[],resolvedCwd=resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime(),getImporter=()=>extensionModuleImporter(createExtensionModuleImporter);for(let extPath of paths){let{extension,error:error2}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,getImporter,options?.factoryResolver,session);if(error2){errors.push({path:extPath,error:error2});continue}extension&&extensions.push(extension)}return{extensions,errors,warnings,runtime:resolvedRuntime,eventBus:resolvedEventBus}}async function loadExtensions(paths,cwd,eventBus,runtime,options){return loadExtensionsInternal(paths,cwd,eventBus,runtime,options)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries(dir){let packageJsonPath=path13.join(dir,"package.json");if(fs7.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path13.resolve(dir,extPath);fs7.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path13.join(dir,"index.ts"),indexJs=path13.join(dir,"index.js");return fs7.existsSync(indexTs)?[indexTs]:fs7.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs7.existsSync(dir))return[];let discovered=[];try{let entries=fs7.readdirSync(dir,{withFileTypes:!0}).sort((a,b)=>a.name<b.name?-1:a.name>b.name?1:0);for(let entry2 of entries){let entryPath=path13.join(dir,entry2.name);if((entry2.isFile()||entry2.isSymbolicLink())&&isExtensionFile(entry2.name)){discovered.push(entryPath);continue}if(entry2.isDirectory()||entry2.isSymbolicLink()){let entries2=resolveExtensionEntries(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path13.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path13.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path13.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs7.existsSync(resolved)&&fs7.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function warnStall(event,budget,stall){if(stall.stage!=="warn")return;let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${stall.extensionPath} is still running its ${event} handler after ${stall.elapsedMs}ms${capNote}.`)}async function runSessionMoveHandlers(event,calls,budget){let failures=[];for(let{extensionPath,call}of calls){let outcome=await runBudgetedHandler({extensionPath,event,budget,run:call,onStall:stall=>warnStall(event,budget,stall)});switch(outcome.kind){case"settled":break;case"failed":{let{error:error2}=outcome;failures.push({extensionPath,error:error2 instanceof Error?error2.message:String(error2),...error2 instanceof Error&&error2.stack!==void 0?{stack:error2.stack}:{}});break}case"timed_out":failures.push({extensionPath,error:`handler timed out after ${budget.timeoutMs}ms`});break;case"released":failures.push({extensionPath,error:"handler released before it finished"});break}}return failures}var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}get holding(){return this.held!==void 0}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};var QuitDeadline=class{constructor(totalMs,now2,startedAt=now2()){this.now=now2,this.deadline=startedAt+totalMs}budgetFor(base){let remaining=Math.max(1,this.deadline-this.now());return base.timeoutMs>0&&base.timeoutMs<=remaining?{budget:base,endsAtQuitDeadline:!1}:{budget:{warnMs:base.warnMs<remaining?base.warnMs:0,timeoutMs:remaining},endsAtQuitDeadline:!0}}};var ExtensionRpcRequestNotFoundError=class extends Error{constructor(name){super(`Unknown extension RPC request: ${name}`),this.name="ExtensionRpcRequestNotFoundError"}},RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function isUserBashEventResult(value){if(typeof value!="object"||value===null)return!1;let candidate=value,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}var QUEUED_LIFECYCLE_EVENTS=new Set(["agent_start","agent_end","agent_settled","turn_start","message_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end"]),UNBOUNDED_HANDLER_BUDGET={warnMs:0,timeoutMs:0};async function emitSessionShutdownEvent(extensionRunner,event,options={}){options.processExit&&event.reason==="quit"&&extensionRunner.armProcessExitBudget();let emitted=extensionRunner.hasHandlers("session_shutdown");return emitted&&await extensionRunner.emit(event),reclaimRunnerHandles(extensionRunner),emitted}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function flattenHandlers(extensions,event){return snapshotEventHandlers(extensions,event).flatMap(({ext,handlers})=>handlers.map(handler=>({path:ext.path,handler})))}function entryAt(entries,index){let entry2=entries[index];if(entry2===void 0)throw new RangeError(`no extension handler at index ${index}`);return entry2}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setSubagentCost:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.eventHandlerBudget=()=>UNBOUNDED_HANDLER_BUDGET,this.handlerTurnScope=()=>0,this.reportedInvalidHandlerBudget=!1,this.heldHandlerWaits=new HeldHandlerWaits,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.engineTurnsHeldFn=()=>!1,this.noteHeldWakeFn=()=>{},this.pauseActions={},this.personAnswerPending=!1,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.hasQueuedPersonInputFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getBrowserEngineFn=()=>{},this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.getCallableToolsFn=()=>[],this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.#reportedChildModuleReplacements=new Set,this.extensions=extensions,registerRunnerExtensions(this,extensions),this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){actions.lifecycle&&(this.runtime.lifecycle=actions.lifecycle),this.runtime.sendMessage=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendItemizedMessage=(message,options)=>{let receipts=Promise.withResolvers(),send=()=>{let itemized=actions.sendItemizedMessage;itemized===void 0?(actions.sendMessage(message,options),receipts.resolve(void 0)):itemized(message,options).then(receipts.resolve,receipts.reject)};return options.triggerTurn===!0?this.sessionStartTurns.admit(send):send(),receipts.promise},this.runtime.sendUserMessage=(content,options)=>{let inputOrigin=this.personAnswerPending?"person":"extension";this.personAnswerPending=!1,this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options,inputOrigin))},this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.getSettings=actions.getSettings,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),actions.armToolBarrier&&(this.runtime.armToolBarrier=actions.armToolBarrier),actions.releaseToolBarrier&&(this.runtime.releaseToolBarrier=actions.releaseToolBarrier),this.runtime.createContext=()=>this.createContext(),this.offloadFn=contextActions.offload,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.engineTurnsHeldFn=contextActions.engineTurnsHeld??(()=>!1),this.noteHeldWakeFn=contextActions.noteHeldWake??(()=>{}),this.pauseActions={getPauseState:contextActions.getPauseState,fenceRun:contextActions.fenceRun,releaseRunFence:contextActions.releaseRunFence},this.questionInput=contextActions.questionInput,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.hasQueuedPersonInputFn=contextActions.hasQueuedPersonInput??(()=>!1),this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,this.getCompactionModelFn=contextActions.getCompactionModel,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest,this.onUserActivityFn=contextActions.onUserActivity,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err){this.emitError({extensionPath,event:"register_virtual_model",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}setLifecycleAttentionObserver(observer){this.lifecycleAttentionObserver=observer}getLifecycleHumanWait(){let prompt=this.activeUIPrompt;if(!(this.mode==="rpc"||!prompt))return{kind:prompt.kind==="confirm"?"approval":"question",requestId:prompt.requestId,revision:1,since:prompt.since}}wrapUIPromptContext(ui){let questionFn=ui.question;return inheritMcpMrtrPresentation(ui,{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts),request2.requestId)}:{}})}withUIPrompt(kind,title,run2,requestId=crypto.randomUUID()){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title,requestId,since:new Date().toISOString()},this.lifecycleAttentionObserver?.(),this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.lifecycleAttentionObserver?.(),this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run2().finally(finish)}catch(err){throw finish(),err}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}sessionStartTurnsHeld(){return this.sessionStartTurns.holding}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path14,resolvedPath})=>({path:path14,resolvedPath}))}#reportedChildModuleReplacements;getAllChildModules(){let modules=new Map;for(let ext of this.extensions)for(let[id,entry2]of ext.childModules??[]){let earlier=modules.get(id),replacement=`${id}\0${earlier?.sourceInfo.path}\0${entry2.sourceInfo.path}`;earlier!==void 0&&earlier.sourceInfo.path!==entry2.sourceInfo.path&&!this.#reportedChildModuleReplacements.has(replacement)&&(this.#reportedChildModuleReplacements.add(replacement),console.warn(`Child module "${id}" from ${entry2.sourceInfo.path} replaces the one from ${earlier.sourceInfo.path}`)),modules.set(id,entry2)}return modules}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing2=toolsByName.get(tool.definition.name);(!existing2||existing2.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}emitBusEvent(channel,data){this.eventBus.emit(channel,data)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing2=serversByName.get(decl.name);existing2===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing2.extensionPath} and ${ext.path}; keeping first declaration from ${existing2.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value){this.runtime.flagValues.set(name,value)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new StaleExtensionContextError(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}setEventHandlerBudget(budget,onStall,turnScope=()=>0){this.eventHandlerBudget=budget,this.handlerStallListener=onStall,this.handlerTurnScope=turnScope}releaseHeldHandlers(turn){return this.heldHandlerWaits.release(turn)}resolveEventHandlerBudget(){try{return this.eventHandlerBudget()}catch(err){return this.reportedInvalidHandlerBudget||(this.reportedInvalidHandlerBudget=!0,console.warn(`Using the default extension event handler budget (warn ${DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS}ms): ${err instanceof Error?err.message:String(err)}`)),{warnMs:DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,timeoutMs:DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS}}}walkHandlers(sequence2){return runBudgetedSequence(sequence2,{budget:this.resolveEventHandlerBudget(),held:{waits:this.heldHandlerWaits,scope:this.handlerTurnScope},onStall:stall=>this.handlerStallListener?.(stall)})}reportStoppedHandler(extensionPath,event,verdict,budget){let error2=verdict==="timed_out"?`handler timed out after ${budget.timeoutMs}ms`:"handler released by the turn deadline";this.emitError({extensionPath,event,error:error2})}reportHandlerFailure(extensionPath,event,err){this.emitError({extensionPath,event,error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}dispatchLifecycle(event){let entries=flattenHandlers(this.extensions,event.type);return this.walkHandlers({event:event.type,length:entries.length,extensionPath:index=>entryAt(entries,index).path,start:index=>{let{path:path14,handler}=entryAt(entries,index);return handler(event,this.createContext(path14))},settle:(index,outcome)=>{outcome.ok||this.reportHandlerFailure(entryAt(entries,index).path,event.type,outcome.error)},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(entries,index).path,event.type,verdict,budget),finish:()=>{}})}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename37(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update2=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update2),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage6)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage6!==void 0?{errorMessage:errorMessage6}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches2=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches2.length===0)throw new ExtensionRpcRequestNotFoundError(normalizedName);if(matches2.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches2[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal,context={offload:(id,args,options)=>(runner.assertActive(),runner.offloadFn===void 0?Promise.reject(new Error(`offload_unavailable: no session backs this context (offload ${id})`)):runner.offloadFn(id,args,options)),get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),engineTurnsHeld:()=>(runner.assertActive(),runner.engineTurnsHeldFn()),noteHeldWake:source2=>{runner.assertActive(),runner.noteHeldWakeFn(source2)},getPauseState:()=>(runner.assertActive(),runner.pauseActions.getPauseState?.()??{pauseSeq:0,holds:[]}),fenceRun:runRef=>{runner.assertActive(),runner.pauseActions.fenceRun?.(runRef)},releaseRunFence:runRef=>{runner.assertActive(),runner.pauseActions.releaseRunFence?.(runRef)},isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},get evalHandleHost(){return runner.assertActive(),runner.runtime.evalHandleHost},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),hasQueuedPersonInput:()=>(runner.assertActive(),runner.hasQueuedPersonInputFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),get getCompactionModel(){return runner.assertActive(),runner.getCompactionModelFn?()=>(runner.assertActive(),runner.getCompactionModelFn?.()):void 0},getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),onUserActivity:listener=>{runner.assertActive();let unsubscribe=runner.onUserActivityFn?.(kind=>{try{listener(kind)}catch(error2){runner.emitError({extensionPath:excludeBeforeProviderRequestExtensionPath??RUNTIME_EXTENSION_PATH,event:"user_activity",error:error2 instanceof Error?error2.message:String(error2)})}});return runner.runtime.trackEventBusSubscription(unsubscribe??(()=>{}))},getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async(messages,options)=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath,options)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())};return this.questionInput&&bindQuestionInput(context,()=>{runner.assertActive(),runner.personAnswerPending=!0,queueMicrotask(()=>{runner.personAnswerPending=!1}),runner.questionInput?.()}),context}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text3,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text3,options)),context.editUserMessage=(entryId,text3,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text3,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context={contextEntries:[],contextMessages:[],llmMessages:[],pendingMessages:[],canContinue:!1},retired=()=>({entries:[],continue:!1,context,valid:!1});try{context=await buildContext2(entries)}catch(err){if(!this.isActive)return retired();throw err}let valid2=!0,handlers=flattenHandlers(this.extensions,baseEvent.type);return this.walkHandlers({event:baseEvent.type,length:handlers.length,extensionPath:index=>entryAt(handlers,index).path,halted:()=>!this.isActive,start:index=>{let event={...baseEvent,entries,continue:shouldContinue,context};return entryAt(handlers,index).handler(event,ctx)},settle:async(index,outcome)=>{if(!this.isActive)return;let{path:path14}=entryAt(handlers,index);if(outcome.ok){let handlerResult=outcome.value;handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}else this.reportHandlerFailure(path14,baseEvent.type,outcome.error);try{context=await buildContext2(entries),valid2=!0}catch(err){if(!this.isActive)return;valid2=!1,this.emitError({extensionPath:path14,event:baseEvent.type,error:`Invalid boundary entries: ${err instanceof Error?err.message:String(err)}`,stack:err instanceof Error?err.stack:void 0})}},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(handlers,index).path,baseEvent.type,verdict,budget),finish:()=>valid2&&this.isActive?{entries,continue:shouldContinue,context,valid:!0}:retired()})}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}armProcessExitBudget(){this.processExitRequestedAt??=Date.now()}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{handler:{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()},quitMs:settings.getSessionShutdownQuitBudgetMs()}}catch(err){let message=err instanceof Error?err.message:String(err);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms, quit ${DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS}ms): ${message}`),{handler:{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS},quitMs:DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,{budget,endsAtQuitDeadline}){let startedAt=Date.now(),outcome=await runBudgetedHandler({extensionPath,event:"session_shutdown",budget,run:signal=>handler({...event,signal},this.createContext(extensionPath)),onStall:stall=>{if(stall.stage!=="warn")return;let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${stall.elapsedMs}ms${capNote}.`)}});if(outcome.kind==="failed")throw outcome.error;outcome.kind==="timed_out"&&endsAtQuitDeadline?console.warn(`Extension ${extensionPath} session_shutdown handler overran the quit budget after ${Date.now()-startedAt}ms; quitting without it.`):outcome.kind==="timed_out"&&this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`})}emitHeldWakesReleased(sources){return this.emit({type:"held_wakes_released",sources})}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):QUEUED_LIFECYCLE_EVENTS.has(event.type)?this.dispatchLifecycle(event):this.dispatchEmit(event)}async emitSessionMove(event){let calls=flattenHandlers(this.extensions,event.type).map(({path:path14,handler})=>({extensionPath:path14,call:signal=>handler({...event,signal},this.createContext(path14))})),failures=await runSessionMoveHandlers(event.type,calls,this.resolveSessionShutdownBudget().handler);for(let failure2 of failures)this.emitError({...failure2,event:event.type});return failures}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget,quitDeadline;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))for(let handler of handlers)try{if(isSessionShutdown){let shutdownEvent=event;shutdownBudget||(shutdownBudget=this.resolveSessionShutdownBudget(),shutdownEvent.reason==="quit"&&this.processExitRequestedAt!==void 0&&shutdownBudget.quitMs>0&&(quitDeadline=new QuitDeadline(shutdownBudget.quitMs,Date.now,this.processExitRequestedAt))),await this.runSessionShutdownHandler(ext.path,shutdownEvent,handler,quitDeadline?.budgetFor(shutdownBudget.handler)??{budget:shutdownBudget.handler,endsAtQuitDeadline:!1});continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}emitMessageEnd(event){let currentMessage=event.message,modified=!1,entries=flattenHandlers(this.extensions,"message_end");return this.walkHandlers({event:"message_end",length:entries.length,extensionPath:index=>entryAt(entries,index).path,start:index=>{let{path:path14,handler}=entryAt(entries,index),currentEvent={...event,message:currentMessage};return handler(currentEvent,this.createContext(path14))},settle:(index,outcome)=>{let{path:path14}=entryAt(entries,index);if(!outcome.ok){this.reportHandlerFailure(path14,"message_end",outcome.error);return}let handlerResult=outcome.value;if(handlerResult?.message){if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:path14,event:"message_end",error:"message_end handlers must return a message with the same role"});return}currentMessage=handlerResult.message,modified=!0}},skip:(index,verdict,budget)=>this.reportStoppedHandler(entryAt(entries,index).path,"message_end",verdict,budget),finish:()=>modified?currentMessage:void 0})}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage6;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;endStatus="failed",errorMessage6=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage6)}}if(modified)return{content:currentEvent.content,details:currentEvent.details,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage6;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err){throw endStatus="failed",errorMessage6=err instanceof Error?err.message:String(err),err}finally{hookRun.end(endStatus,errorMessage6)}}return result3}async emitUserBash(event){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err}}async emitContext(messages,excludeExtensionPath,source2="agent"){return dispatchContextMessages(messages,{contextHandlers:snapshotEventHandlers(this.extensions,"context"),contextWithSystemHandlers:snapshotEventHandlers(this.extensions,"context_with_system"),createContext:path14=>this.createContext(path14),emitError:error2=>this.emitError(error2),excludeExtensionPath,source:source2})}async prepareProviderRequest(messages,excludeExtensionPath,options){return{messages:await this.emitContext(messages,excludeExtensionPath,"projection"),transformPayload:async payload=>await this.emitBeforeProviderRequest(options?.allowServerSearch?payload:disableServerSearch(payload),excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}return currentPayload}async emitBeforeProviderHeaders(headers){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}return headers}getThirdPartySessionStartPaths(){return this.extensions.filter(ext=>ext.sourceInfo.source!=="builtin"&&(ext.handlers.get("session_start")?.length??0)>0).map(ext=>ext.path)}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},promptBefore=currentSystemPrompt,handlerResult=await handler(event,ctx),parts;if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0,parts=result3.systemPromptParts)}options.preview===!0&&options.observePrompt?.({path:ext.path,before:promptBefore,after:currentSystemPrompt,...parts===void 0?{}:{parts}})}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry2,extensionPath)=>typeof entry2=="string"?{path:entry2,extensionPath}:entry2.scope===void 0?{path:entry2.path,extensionPath}:{path:entry2.path,extensionPath,scope:entry2.scope};for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry2=>toEntry(entry2,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry2=>toEntry(entry2,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry2=>toEntry(entry2,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry2=>toEntry(entry2,ext.path)))}catch(err){let message=err instanceof Error?err.message:String(err),stack=err instanceof Error?err.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text3,images,source2,streamingBehavior,inputId="input"){let currentText=text3,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err){this.emitError({extensionPath:ext.path,event:"input",error:err instanceof Error?err.message:String(err),stack:err instanceof Error?err.stack:void 0})}return currentText!==text3||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};var trimSlash=value=>value.replace(/\/+$/,""),UNCHECKABLE_CONTROL_KEY="senpi-verify-control-not-a-real-key",AUTH_HEADERS=new Set(["authorization","x-api-key","x-goog-api-key"]);function probeFor(model,key){let base=trimSlash(model.baseUrl),extra=Object.fromEntries(Object.entries(model.headers??{}).filter(([name])=>!AUTH_HEADERS.has(name.toLowerCase())));switch(model.api){case"openai-completions":case"openai-responses":return{url:`${base}/models`,headers:{...extra,authorization:`Bearer ${key}`}};case"mistral-conversations":return{url:`${base.replace(/\/v1$/,"")}/v1/models`,headers:{...extra,authorization:`Bearer ${key}`}};case"anthropic-messages":return{url:`${base.replace(/\/v1$/,"")}/v1/models`,headers:{...extra,"x-api-key":key,"anthropic-version":"2023-06-01"}};case"google-generative-ai":return{url:`${base}/models`,headers:{...extra,"x-goog-api-key":key}};default:return}}async function verifyApiKey(input){let model=input.models.find(candidate=>candidate.provider===input.provider);if(model===void 0)return{ok:!1,reason:"unknown-provider"};if(probeFor(model,input.key)===void 0)return{ok:!1,reason:"unsupported"};let ask=async candidate=>{let target=probeFor(model,candidate);if(target===void 0)return"no-answer";try{let response=await(input.fetch??globalThis.fetch)(target.url,{method:"GET",headers:target.headers,redirect:"manual",signal:input.signal});return await response.body?.cancel().catch(()=>{}),response.status}catch{return"no-answer"}},temporary=status2=>status2==="no-answer"?{ok:!1,reason:"unreachable"}:status2===429||status2>=500?{ok:!1,reason:"unreachable",status:status2}:void 0,status=await ask(input.key);if(status==="no-answer")return{ok:!1,reason:"unreachable"};let failedFirst=temporary(status);if(failedFirst!==void 0)return failedFirst;if(status===401||status===403)return{ok:!1,reason:"rejected",status};if(status<200||status>=300)return{ok:!1,reason:"unsupported",status};let control=await ask(UNCHECKABLE_CONTROL_KEY);if(control===401||control===403)return{ok:!0};let failedControl=temporary(control);return failedControl!==void 0?failedControl:{ok:!1,reason:"unsupported"}}function storedKeyHint(modelRegistry,info){if(info.authType!=="api_key")return{};let credential=modelRegistry.authStorage.get(info.id);if(credential?.type!=="api_key"||credential.key===void 0)return{};let key=credential.key;return isCommandConfigValue(key)||getConfigValueEnvVarNames(key).length>0||key.length<12?{}:{keyHint:key.slice(-4)}}function holdAutomaticInput(session,command,interactiveUser){return interactiveUser?!1:session.noteAutomaticInput(command.message)}async function handleClientInput(session,command,io){try{let admissions=ClientAdmissions.forSession(session),disposition,responded=!1,respond=admission2=>{responded=!0;let finalDisposition=admission2?.disposition??disposition;io.output({id:command.id,type:"response",command:command.type,success:!0,data:{disposition:finalDisposition,...clientMessageIdentity(command),...admission2?{admission:admission2}:{},...command.type==="prompt"&&command.toolBarrier!==void 0?{toolBarrier:finalDisposition==="started"?"armed":"ignored"}:{}}})},admission=await clientInputContext.run(clientMessageIdentity(command),()=>admissions.admit(command,async hooks=>{let promptPath=options=>{let accepted=Promise.withResolvers(),preflightSucceeded=!1,acceptedAdmission,call=session.prompt(command.message,{...clientMessageIdentity(command),images:command.images,...options,source:"rpc",onQueuedInput:hooks.queued,promptDisposition:next=>{disposition=next,acceptedAdmission=hooks.accepted(next)},preflightResult:succeeded=>{succeeded&&disposition!==void 0&&(preflightSucceeded=!0,accepted.resolve(disposition),respond(acceptedAdmission))}}).catch(error2=>{preflightSucceeded||accepted.reject(error2)});return io.promptCalls.add(call),call.finally(()=>io.promptCalls.delete(call)),accepted.promise};switch(command.type){case"prompt":{if(command.thinkingLevel!==void 0&&session.isStreaming&&command.streamingBehavior!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");return promptPath({streamingBehavior:command.streamingBehavior,thinkingLevel:command.thinkingLevel,sessionTitlePrompt:command.sessionTitlePrompt,expandPromptTemplates:command.expandPromptTemplates,unknownCommandAsText:command.unknownCommandAsText,toolBarrier:command.toolBarrier})}case"steer":case"follow_up":{if(command.whenIdle==="start")return promptPath({streamingBehavior:command.type==="steer"?"steer":"followUp",enqueueOrder:command.enqueueOrder});let options={...clientMessageIdentity(hooks.identity),enqueueOrder:command.enqueueOrder,source:"rpc",onQueuedInput:hooks.queued};return disposition=command.type==="steer"?await session.steer(command.message,command.images,options):await session.followUp(command.message,command.images,options),hooks.accepted(disposition),disposition}}}));responded||respond(admission)}catch(error2){let unknownCommand=error2 instanceof UnknownCommandError;io.output({id:command.id,type:"response",command:command.type,success:!1,error:unknownCommand?`${error2.message} ${UNKNOWN_COMMAND_CONFIRM_HINT}`:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ClientMessageIdConflict||error2 instanceof AgentBusyError?{errorCode:error2.code}:{},...unknownCommand?{errorCode:RPC_ERROR_UNKNOWN_COMMAND,errorData:{command:error2.command,suggestions:error2.suggestions,reason:error2.reason}}:{}})}}function createRpcEventOutputBuffer(writeRaw,scheduleFlush=queueMicrotask){let pendingEventLines=[],flushScheduled=!1,flushEvents=()=>{flushScheduled=!1,pendingEventLines.length!==0&&(writeRaw(pendingEventLines.join("")),pendingEventLines=[])};return{enqueueEvent(event){pendingEventLines.push(serializeJsonLine(event)),!flushScheduled&&(flushScheduled=!0,scheduleFlush(flushEvents))},writeImmediate(value){flushEvents(),writeRaw(serializeJsonLine(value))},flushEvents}}function runHoldInput(session,command,roles){if(!roles.interactiveUser){if(!roles.taskParent)return{ok:!1,error:"hold_input_requires_interactive_client"};if(!session.pauseView.records.some(record10=>record10.kind==="inherited_hold"&&record10.parentSessionId===command.parentSessionId))return{ok:!1,error:"wrong_parent: this child is not paused for that parent session's run"}}let result3=session.holdInput({inputId:command.inputId,revision:command.revision,text:command.text});switch(result3.kind){case"held":return{ok:!0,data:{entryId:result3.entryId,duplicate:result3.duplicate}};case"already_delivered":return{ok:!0,data:{alreadyDelivered:!0}};case"input_id_conflict":return{ok:!1,error:`input_id_conflict: input ${command.inputId} is held at revision ${result3.heldRevision}`}}}var HostSessionControl=class{constructor(session,socket,report){this.disposed=!1,this.session=session,this.socket=socket,this.report=report}async register(options){if(this.releaseActive(),this.disposed||this.socket===void 0)return{status:"unsupported",reason:"unsupported_mode"};let{session}=this,failing,scheduler=new WakeScheduler(async event=>{await session.extensionRunner.emit(event);let result3=await options.drain(event)??{admitted:[]};return failing=void 0,result3},error2=>{let reason=errorText5(error2);reason!==failing&&(failing=reason,this.report(`control drain failed: ${reason}`))}),wake=reason=>{scheduler.request(reason)},unsubscribeIdle=session.subscribe(event=>{event.type==="agent_idle"&&wake("idle")}),unsubscribeEmitted=session.externalAdmission.onEmitted(()=>wake("emitted")),inbox,registration={scheduler,release:()=>{unsubscribeIdle(),unsubscribeEmitted(),inbox?.stop(),scheduler.dispose()}};try{inbox=await watchInbox(options.inboxDir,()=>wake("inbox"),error2=>this.report(`control inbox watch failed: ${errorText5(error2)}`))}catch(error2){return registration.release(),{status:"failed",reason:errorText5(error2)}}return this.disposed?(registration.release(),{status:"unsupported",reason:"unsupported_mode"}):(this.releaseActive(),this.active=registration,wake("inbox"),inbox.armed.then(()=>wake("inbox")),{status:"registered",socket:this.socket,dispose:async()=>{this.active===registration&&this.releaseActive()}})}async wake(deliveryIds){let active=this.active;if(active!==void 0)return active.scheduler.request("command",deliveryIds);let ids=deliveryIds===void 0||deliveryIds.length===0?{}:{delivery_ids:deliveryIds};return await this.session.extensionRunner.emit({type:"session_control_wake",reason:"command",reasons:["command"],...ids}),{admitted:[]}}dispose(){this.disposed=!0,this.releaseActive()}releaseActive(){let active=this.active;this.active=void 0,active?.release()}};function errorText5(error2){return error2 instanceof Error?error2.message:String(error2)}function createRpcLoginPromptCallbacks(ui,signal){let dialogSignalFor=promptSignal=>promptSignal?AbortSignal.any([signal,promptSignal]):signal;return{async onPrompt(prompt){let dialogSignal2=dialogSignalFor(prompt.signal);if(dialogSignal2.aborted)throw new Error("Login cancelled");let value=await ui.input(prompt.message,prompt.placeholder,{signal:dialogSignal2});if(dialogSignal2.aborted||value===void 0)throw new Error("Login cancelled");return value},async onSelect(prompt){let dialogSignal2=dialogSignalFor(prompt.signal);if(dialogSignal2.aborted)throw new Error("Login cancelled");let value=await ui.select(prompt.message,prompt.options.map(option=>option.label),{signal:dialogSignal2});if(dialogSignal2.aborted)throw new Error("Login cancelled");if(value!==void 0)return prompt.options.find(option=>option.label===value)?.id}}}async function answerMemoryReport(session){let source2=memoryReportSessionFor(session);if(source2===void 0)return{ok:!1,error:"memory_report_disabled: start the host with SENPI_MEMORY_REPORT=1"};let[outcome]=await writeMemoryReports([source2]);return outcome===void 0||!outcome.ok?{ok:!1,error:`memory_report_failed: ${outcome?.ok===!1?outcome.error:"no report written"}`}:{ok:!0,data:{path:outcome.path,...outcome.heapSnapshot===void 0?{}:{heapSnapshot:outcome.heapSnapshot}}}}function buildRpcCommands(input){return[...input.extensionCommands.map(command=>({...command,source:"extension",syntax:"slash"})),...input.promptTemplates.map(template=>({...template,source:"prompt",syntax:"slash"})),...input.skills.map(skill=>({...skill,name:`skill:${skill.name}`,source:"skill",syntax:"dollar"}))]}function buildRpcCommandsForSession(session){return buildRpcCommands({extensionCommands:session.extensionRunner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,sourceInfo:command.sourceInfo})),promptTemplates:session.promptTemplates,skills:session.resourceLoader.getSkills().skills})}function rpcCommandListDigest(commands){return JSON.stringify(commands)}function createCommandsChangedEvent(previousDigest,commands){if(!(previousDigest===void 0||previousDigest===rpcCommandListDigest(commands)))return{type:"commands_changed",commands}}var NOT_TASK_PARENT="task_parent_required: only the connection that owns this task child may pause or resume it for a run";async function runPauseForRun(session,command,taskParent){if(!taskParent)return{ok:!1,error:NOT_TASK_PARENT};let result3=await session.pauseForRun(command);return"refused"in result3?{ok:!1,error:"wrong_parent: this child is paused for another parent session"}:{ok:!0,data:{held:!0,childSeq:result3.childSeq}}}async function runResumeForRun(session,command,taskParent){if(!taskParent)return{ok:!1,error:NOT_TASK_PARENT};let result3=await session.resumeForRun(command);return result3.released?{ok:!0,data:{released:!0,otherHoldLive:result3.otherHoldLive,...result3.turnId===void 0?{}:{turnId:result3.turnId}}}:result3.reason==="wrong_parent"?{ok:!1,error:"wrong_parent: this child is paused for another parent session"}:{ok:!0,data:{released:!1,reason:result3.reason}}}var HOST_ANSWER_TIMEOUT_MS=6e4,refused=(reason,detail)=>({status:"refused",reason,detail}),record9=value=>typeof value=="object"&&value!==null&&!Array.isArray(value)?{...value}:void 0;function parseTarget2(value){let fields=record9(value);if(!(typeof fields?.name!="string"||fields.name===""||typeof fields.online!="boolean"))return{name:fields.name,online:fields.online,...typeof fields.capacity=="string"?{capacity:fields.capacity}:{},...typeof fields.aboutToSleep=="boolean"?{aboutToSleep:fields.aboutToSleep}:{}}}var RpcSessionRelocation=class{constructor(deps){this.pending=new Map,this.requesting=!1,this.deps=deps,this.unsubscribe=deps.session.subscribe(event=>{event.type==="agent_end"&&deps.session.currentAbortSource==="user"&&this.scheduled!==void 0&&(this.scheduled={...this.scheduled,dropReason:"aborted"}),event.type==="agent_settled"&&this.scheduled!==void 0&&(this.scheduled.dropReason!==void 0?this.dropScheduled(this.scheduled.dropReason):this.announceWhenReleasable())})}offered(){return this.deps.channel.offerer()!==void 0}async targets(signal){let connection=this.deps.channel.offerer();if(connection===void 0)return RELOCATION_NOT_OFFERED;let answer3=await this.ask({method:"list_relocation_targets"},connection,signal);if("status"in answer3)return answer3;let raw=record9(answer3.data)?.targets,targets2=Array.isArray(raw)?raw.map(parseTarget2):void 0;return targets2===void 0||targets2.some(target=>target===void 0)?refused("invalid_host_answer","the app sent a list of computers this session cannot read"):{status:"listed",targets:targets2.filter(target=>target!==void 0)}}async request(request2,signal){let connection=this.deps.channel.offerer();if(connection===void 0)return RELOCATION_NOT_OFFERED;if(this.deps.session.sessionFile===void 0)return{status:"unavailable",reason:"not_releasable",detail:"this session is not saved to a file"};if(this.scheduled!==void 0||this.requesting)return refused("already_scheduled",`a move to ${this.scheduled?.target??"another computer"} is already set for the end of this turn`);this.requesting=!0;try{let ask={method:"relocate_session",target:request2.target,reason:request2.reason},answer3=await this.ask(ask,connection,signal);return"status"in answer3?answer3:this.settleRequest(request2,record9(answer3.data),connection)}finally{this.requesting=!1}}respond(frame){let pending=this.pending.get(frame.id);return pending===void 0?"unknown":this.deps.channel.current()!==pending.connection?"not_offering_connection":(pending.finish(typeof frame.error=="string"?refused("host_error",frame.error):{data:frame.data}),"answered")}connectionDetached(connectionId){this.scheduled?.connection===connectionId&&this.scheduled.dropReason===void 0&&this.dropScheduled("disconnected");for(let pending of[...this.pending.values()])pending.connection===connectionId&&pending.finish(refused("app_disconnected","the app that was asked left this session"))}dispose(){this.unsubscribe(),this.scheduled=void 0;for(let{finish}of[...this.pending.values()])finish(refused("session_closed","this session was closed"))}dropScheduled(reason){let scheduled=this.scheduled;if(scheduled===void 0)return;this.scheduled=void 0;let{moveId,target}=scheduled;this.deps.session.sendCustomMessage({customType:"session_relocation",content:`The session will not continue on ${target} (${reason}). The session stays on this computer; keep working here.`,display:!1,details:{status:"dropped",reason,moveId,target}},{triggerTurn:!1})}settleRequest(request2,data,connection){if(data?.accepted===!1)return refused(typeof data.reason=="string"&&data.reason!==""?data.reason:"declined",typeof data.detail=="string"&&data.detail!==""?data.detail:"the app declined the move");if(data?.accepted!==!0||!isPlainId(data.moveId))return refused("invalid_host_answer","the app accepted the move without a usable move id");let target=typeof data.target=="string"&&data.target!==""?data.target:request2.target;return this.scheduled={moveId:data.moveId,target,reason:request2.reason,connection},{status:"scheduled",target,moveId:data.moveId}}async announceWhenReleasable(){for(let calls=this.deps.pendingPrompts();calls.length>0;calls=this.deps.pendingPrompts())await Promise.allSettled(calls);let due=this.scheduled;if(due===void 0||this.deps.session.isStreaming)return;if(this.deps.channel.offerer()!==due.connection){this.dropScheduled("withdrawn");return}this.scheduled=void 0;let{connection,moveId,target,reason}=due;this.deps.channel.send(connection,{type:"relocation_due",moveId,target,reason},"event")}ask(fields,connection,signal){if(signal?.aborted)return Promise.resolve(refused("cancelled","the request was cancelled"));let id=`hr_${crypto.randomUUID()}`;return new Promise(resolve55=>{let finish=answer3=>{clearTimeout(timer),signal?.removeEventListener("abort",onAbort),this.pending.delete(id),resolve55(answer3)},onAbort=()=>finish(refused("cancelled","the request was cancelled")),timer=setTimeout(()=>finish(refused("no_answer","the app did not answer in time")),HOST_ANSWER_TIMEOUT_MS);this.pending.set(id,{connection,finish}),signal?.addEventListener("abort",onAbort,{once:!0}),this.deps.channel.send(connection,{type:"host_request",id,...fields},"request")})}};var SOLE_CONNECTION="sole";function relocationChannel(options){let{clientInfo}=options;if(clientInfo===void 0)return{offerer:()=>options.capabilities()?.includes(SESSION_RELOCATION_CAPABILITY)?SOLE_CONNECTION:void 0,current:()=>SOLE_CONNECTION,send:(_connection,record10,kind)=>kind==="event"?options.outputEvent(record10):options.output(record10)};let{relocationConnection,deliverTo}=clientInfo;return{offerer:()=>deliverTo===void 0?void 0:relocationConnection?.(),current:()=>clientInfo.connectionId(),send:(connection,record10)=>deliverTo?.(connection,()=>options.output(record10))}}function answerHostResponse(frame,respond){let reply={id:frame.id,type:"response",command:"host_response"};if(typeof frame.id!="string"||frame.id==="")return{...reply,success:!1,error:"invalid_host_response"};let outcome=respond?.(frame)??"unknown";return outcome==="answered"?{...reply,success:!0}:{...reply,success:!1,error:outcome==="unknown"?"unknown_host_request":outcome}}function isHostResponse(value){return typeof value=="object"&&value!==null&&"type"in value&&value.type==="host_response"}function dialogCall(opts){return opts?.toolCallId===void 0?{}:{toolCallId:opts.toolCallId,...opts.parentToolCallId===void 0?{}:{parentToolCallId:opts.parentToolCallId}}}function loadedExtensionName(path14){let synthetic=/^<(?:builtin|inline):([^>]+)>$/.exec(path14);if(synthetic)return synthetic[1];let withoutExtension=basename38(path14,extname6(path14));if(withoutExtension!=="index")return withoutExtension;let parent=dirname71(path14),parentName=basename38(parent);return parentName==="src"||parentName==="dist"?basename38(dirname71(parent)):parentName}function loadedExtensions(session){return session.resourceLoader.getExtensions().extensions.map(extension=>({name:loadedExtensionName(extension.path),path:extension.path,sourceInfo:extension.sourceInfo,enabled:!0}))}function loadedMcpStatus(server){return server.status!==void 0?server.status:server.serverInfo!==null?"connected":server.authStatus==="notLoggedIn"?"needs_auth":"enabled"}function loadedMcpServers(snapshot){return snapshot.servers.map(server=>({name:server.name,toolCount:server.tools.length,status:loadedMcpStatus(server),authStatus:server.authStatus,...server.lastError===void 0?{}:{lastError:server.lastError}}))}function loadedSurfacesFingerprint(session,extensions,mcpServers){return JSON.stringify({skills:session.resourceLoader.getSkills().skills.map(skill=>({name:skill.name,path:skill.filePath,sourceInfo:skill.sourceInfo,enabled:!skill.disableModelInvocation})),extensions,mcpServers})}function findToolResultMedia(session,toolCallId,contentIndex){let fromContent=content=>{if(!Array.isArray(content))return;let block=content[contentIndex];return block?.type==="image"?block:void 0},matches2=message=>{let candidate=message;return candidate?.role==="toolResult"&&candidate.toolCallId===toolCallId};for(let entry2 of session.sessionManager.getEntries()){if(entry2.type!=="message"||!matches2(entry2.message))continue;let found=fromContent(entry2.message.content);if(found)return found}for(let message of session.messages){if(!matches2(message))continue;let found=fromContent(message.content);if(found)return found}}function createRpcConnectionHandler(runtimeHost,sink,options={}){let clientCapabilities=options.capabilities,unsubscribeSecurityNotices,detachGrantPresentation,grantPresentationAbort=new AbortController,securityBoundByHost=!1,connectionRoles=options.connectionRoles??new ConnectionRoles,currentConnectionId=()=>roleConnection(options.clientInfo?.connectionId()),hasRole=role=>connectionRoles.has(currentConnectionId(),role),routingSessionId=options.sessionId,replacementIssuedHere=!1,session=runtimeHost.session,sessionControl,relocation,promptCalls=new Set,turnRequested=!1,unsubscribe,unsubscribeBackpressure,unsubscribeLoadedSurfaces,unsubscribeExtensionEvents,mcpWireStatus={servers:[]},lastAbortSource,loadedSurfacesDigest,rpcCommandsDigest,suppressLoadedSurfaceEvents=!1,eventOutput=createRpcEventOutputBuffer(sink.writeRaw,options.eventFlushScheduler),effectContext=()=>({session,by:{connectionId:options.clientInfo?.connectionId()??"local"},...routingSessionId===void 0?{}:{sessionId:routingSessionId}}),tagSessionRecord=value=>routingSessionId===void 0?value:{...value,sessionId:routingSessionId},output=obj=>{eventOutput.writeImmediate(tagSessionRecord(obj))},outputEvent=event=>{eventOutput.enqueueEvent(tagSessionRecord(event))},currentLoadedSurfaces=()=>{let extensions=loadedExtensions(session),mcpServers=loadedMcpServers(mcpWireStatus);return{data:{extensions,mcpServers},digest:loadedSurfacesFingerprint(session,extensions,mcpServers)}},recordLoadedSurfaces=emitChange=>{let current=currentLoadedSurfaces(),previous=loadedSurfacesDigest,changed=previous!==void 0&&previous!==current.digest;return loadedSurfacesDigest=current.digest,emitChange&&changed&&!suppressLoadedSurfaceEvents&&emitLoadedSurfacesChanged(previous,current.digest),current},emitLoadedSurfacesChanged=(previous,digest3)=>{options.publishLoadedSurfacesChanged?options.publishLoadedSurfacesChanged(previous,digest3):outputEvent({type:"loaded_surfaces_changed"})},requestMcpWireStatus=async()=>{let response,request2={sessionId:session.sessionId,respond(snapshot){response??=snapshot}};session.resourceLoader.emitExtensionEvent?.(MCP_CONTROL_INVENTORY_REQUEST_EVENT,request2),mcpWireStatus=response===void 0?{servers:[]}:await response},subscribeLoadedSurfaceEvents=()=>{unsubscribeLoadedSurfaces?.(),unsubscribeLoadedSurfaces=session.resourceLoader.onExtensionEvent?.(MCP_CONTROL_INVENTORY_CHANGED_EVENT,data=>{!isMcpControlInventoryChanged(data)||data.sessionId!==session.sessionId||(mcpWireStatus=data.snapshot,suppressLoadedSurfaceEvents||recordLoadedSurfaces(!0))})},unsubscribeProviderAccountEvents=subscribeProviderAccountEvents(event=>{if(event.type==="accounts_changed"){outputEvent({type:"auth_accounts_changed",provider:event.provider});return}outputEvent({type:"account_failover",provider:event.provider,from:event.from,to:event.to,reason:event.reason})}),waitForRpcBackpressure=async()=>{eventOutput.flushEvents(),await sink.waitForBackpressure()},success=(id,command,data)=>data===void 0?{id,type:"response",command,success:!0}:{id,type:"response",command,success:!0,data},error2=(id,command,message,errorCode4,errorData)=>{let details=errorData===void 0&&(command==="edit_user_message"||command==="navigate_tree")?{leafId:session.sessionManager.getLeafId()}:errorData;return{id,type:"response",command,success:!1,error:message,...errorCode4?{errorCode:errorCode4}:{},...details===void 0?{}:{errorData:details}}},pendingExtensionRequests=new SessionExtensionUiRequests(()=>session.refreshLifecycle()),grantRequests=new Map;sessionDialogRequests.set(session,pendingExtensionRequests);let questions=new ConnectionQuestionBridge(output,()=>session.refreshLifecycle()),shutdownRequested=!1,activeLogins=new Map;function createDialogPromise(opts,defaultValue,request2,parseResponse){if(opts?.signal?.aborted)return Promise.resolve(defaultValue);let id=crypto2.randomUUID();return new Promise((resolve55,reject)=>{let timeoutId,cleanup=()=>{timeoutId&&clearTimeout(timeoutId),opts?.signal?.removeEventListener("abort",onAbort),pendingExtensionRequests.delete(id),grantRequests.delete(id)&&options.grantDialogSettled?.(id)},onAbort=()=>{cleanup(),resolve55(defaultValue)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),opts?.timeout&&(timeoutId=setTimeout(()=>{cleanup(),resolve55(defaultValue)},opts.timeout)),pendingExtensionRequests.set(id,{frame:{type:"extension_ui_request",id,...request2},resolve:response=>{cleanup(),resolve55(parseResponse(response))},reject}),request2.grantSelect===!0&&grantRequests.set(id,options.clientInfo?.connectionId()),output({type:"extension_ui_request",id,...request2})})}let selectGrantDialog=(title,choices,opts)=>createDialogPromise(opts,void 0,{method:"select",title,options:choices,timeout:opts?.timeout,grantSelect:!0},response=>"cancelled"in response&&response.cancelled?void 0:"value"in response?response.value:void 0),createExtensionUIContext=()=>({question:(request2,opts)=>clientCapabilities?.includes(QUESTION_CAPABILITY)?questions.ask(request2,opts):degradeQuestion(createExtensionUIContext(),request2,opts),select:(title,options2,opts)=>createDialogPromise(opts,void 0,{method:"select",title,options:options2,timeout:opts?.timeout,...dialogCall(opts)},r=>"cancelled"in r&&r.cancelled?void 0:"value"in r?r.value:void 0),confirm:(title,message,opts)=>createDialogPromise(opts,!1,{method:"confirm",title,message,timeout:opts?.timeout},r=>"cancelled"in r&&r.cancelled?!1:"confirmed"in r?r.confirmed:!1),input:(title,placeholder,opts)=>createDialogPromise(opts,void 0,{method:"input",title,placeholder,timeout:opts?.timeout,...dialogCall(opts)},r=>"cancelled"in r&&r.cancelled?void 0:"value"in r?r.value:void 0),notify(message,type2){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"notify",message,notifyType:type2})},onTerminalInput(){return()=>{}},setStatus(key,text3){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setStatus",statusKey:key,statusText:text3})},setSubagentCost(costUsd){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setSubagentCost",costUsd:costUsd!==void 0&&Number.isFinite(costUsd)&&costUsd>=0?costUsd:void 0})},setWorkingMessage(_message){},setWorkingVisible(_visible){},setWorkingIndicator(_options){},setHiddenThinkingLabel(_label){},setWidget(key,content,options2){(content===void 0||Array.isArray(content))&&output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setWidget",widgetKey:key,widgetLines:content,widgetPlacement:options2?.placement,...content!==void 0&&options2?.actions!==void 0&&options2.actions.length>0?{widgetActions:options2.actions.map(({label:label3,command})=>({label:label3,command}))}:{}})},setFooter(_factory){},setHeader(_factory){},setTitle(title){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"setTitle",title})},async custom(){let request2=buildCustomUnsupportedRequest(clientCapabilities,DEFAULT_CUSTOM_EXTENSION_LABEL);request2&&output(request2)},pasteToEditor(text3){this.setEditorText(text3)},setEditorText(text3){output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"set_editor_text",text:text3})},getEditorText(){return""},async editor(title,prefill){let id=crypto2.randomUUID();return new Promise((resolve55,reject)=>{pendingExtensionRequests.set(id,{frame:{type:"extension_ui_request",id,method:"editor",title,prefill},resolve:response=>{"cancelled"in response&&response.cancelled?resolve55(void 0):"value"in response?resolve55(response.value):resolve55(void 0)},reject}),output({type:"extension_ui_request",id,method:"editor",title,prefill})})},addAutocompleteProvider(){},setEditorComponent(){},getEditorComponent(){},get theme(){return theme},getAllThemes(){return[]},getTheme(_name){},setTheme(_theme){return{success:!1,error:"Theme switching not supported in RPC mode"}},getToolsExpanded(){return!1},setToolsExpanded(_expanded){}}),refreshLoadedSurfacesAfter=async(operation,resetMcp)=>{let previousDigest=loadedSurfacesDigest,wasSuppressed=suppressLoadedSurfaceEvents;suppressLoadedSurfaceEvents=!0,resetMcp&&(mcpWireStatus={servers:[]});let commandsChanged;try{await operation(),await requestMcpWireStatus(),loadedSurfacesDigest=currentLoadedSurfaces().digest;let commands=buildRpcCommandsForSession(session);commandsChanged=createCommandsChangedEvent(rpcCommandsDigest,commands),rpcCommandsDigest=rpcCommandListDigest(commands)}finally{suppressLoadedSurfaceEvents=wasSuppressed}!wasSuppressed&&commandsChanged&&outputEvent(commandsChanged),!wasSuppressed&&previousDigest!==void 0&&previousDigest!==loadedSurfacesDigest&&emitLoadedSurfacesChanged(previousDigest,loadedSurfacesDigest)};runtimeHost.setRebindSession(async()=>{await rebindSession(!0)});let rebindAfterLocalReplacement=async()=>{replacementIssuedHere=!0;try{await rebindSession()}finally{replacementIssuedHere=!1}},refreshGrantPresentation=()=>{if(grantPresentationAbort.abort(),detachGrantPresentation?.(),detachGrantPresentation=void 0,grantPresentationAbort=new AbortController,securityBoundByHost||!clientCapabilities?.includes("grant_select"))return;let signal=grantPresentationAbort.signal;detachGrantPresentation=attachMcpGrantPresentation(session.sessionId,(title,choices,opts)=>selectGrantDialog(title,choices,{...opts,signal:opts?.signal===void 0?signal:AbortSignal.any([opts.signal,signal])}))},subscribeExtensionEvents=()=>{unsubscribeExtensionEvents=clientCapabilities?.includes(EXTENSION_EVENTS_CAPABILITY)?session.extensionRunner.onRpcEvent(({name,data})=>{outputEvent({type:"extension_event",name,data})}):void 0},replaceClientCapabilities=next=>{let hadEvents=clientCapabilities?.includes(EXTENSION_EVENTS_CAPABILITY)??!1,hadQuestion=clientCapabilities?.includes(QUESTION_CAPABILITY)??!1;clientCapabilities=next,hadQuestion&&!next.includes(QUESTION_CAPABILITY)&&questions.cancelAll(),hadEvents!==next.includes(EXTENSION_EVENTS_CAPABILITY)&&(unsubscribeExtensionEvents?.(),subscribeExtensionEvents())},rebindSession=async(deferRefresh=!1)=>{unbindMcpForms?.(),unbindMcpForms=void 0,unsubscribeSecurityNotices?.(),unsubscribeLoadedSurfaces?.(),unsubscribeExtensionEvents?.();let replacedSession=session!==runtimeHost.session;session=runtimeHost.session;let hostedSecurity=options.bindSecurityPresentation?.(session,{...createExtensionUIContext(),select:selectGrantDialog});securityBoundByHost=hostedSecurity!==void 0,refreshGrantPresentation(),unsubscribeSecurityNotices=hostedSecurity??session.securityNotices?.subscribe(snapshot=>{for(let notice2 of snapshot.notices)output({type:"extension_ui_request",id:crypto2.randomUUID(),method:"notify",notifyType:"warning",message:notice2.message})}),sessionQuestionBridges.set(session,questions),sessionDialogRequests.set(session,pendingExtensionRequests),sessionControl?.dispose(),sessionControl=new HostSessionControl(session,runtimeHost.launchProfile?.sessionContext?.host_socket,line=>{process.stderr.write(`senpi rpc session ${routingSessionId??"classic"}: ${line}
|
|
2248
|
+
`)}),session.setControlEndpointHost?.(sessionControl),relocation?.dispose(),relocation=routingSessionId===void 0?void 0:new RpcSessionRelocation({session,pendingPrompts:()=>[...promptCalls],channel:relocationChannel({capabilities:()=>clientCapabilities,clientInfo:options.clientInfo,output,outputEvent})}),session.setRelocationHost?.(relocation),replacedSession&&(lastAbortSource=void 0,(routingSessionId!==void 0||!replacementIssuedHere)&&outputEvent({type:"session_replaced",durableSessionId:session.sessionId,sessionFile:session.sessionFile,cwd:session.sessionManager.getCwd(),sessionName:session.sessionName})),subscribeExtensionEvents(),subscribeLoadedSurfaceEvents(),installSessionSubscriptions();let extensionUi=createExtensionUIContext();unbindMcpForms=await options.bindMcpForms?.(session,extensionUi);let refresh=refreshLoadedSurfacesAfter(()=>session.bindExtensions({uiContext:extensionUi,mode:"rpc",commandContextActions:{waitForIdle:()=>session.agent.waitForIdle(),newSession:async options2=>runtimeHost.newSession(options2),fork:async(entryId,forkOptions)=>({cancelled:(await runtimeHost.fork(entryId,forkOptions)).cancelled}),navigateTree:async(targetId,options2)=>({cancelled:(await session.navigateTree(targetId,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,replaceInstructions:options2?.replaceInstructions,label:options2?.label,expectedLeafId:options2?.expectedLeafId})).cancelled}),editAssistantMessage:async(entryId,text3,options2)=>{let result3=await session.editAssistantMessage(entryId,text3,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,expectedLeafId:options2?.expectedLeafId});return{cancelled:result3.cancelled,unchanged:result3.unchanged,entryId:result3.entryId}},editUserMessage:async(entryId,text3,options2)=>{let result3=await session.editUserMessage(entryId,text3,{summarize:options2?.summarize,customInstructions:options2?.customInstructions,expectedLeafId:options2?.expectedLeafId});return{cancelled:result3.cancelled,unchanged:result3.unchanged,entryId:result3.entryId}},switchSession:async(sessionPath,options2)=>runtimeHost.switchSession(sessionPath,options2),reload:async()=>{await refreshLoadedSurfacesAfter(async()=>{await session.reload()},!1)}},shutdownHandler:()=>{options.shutdownHandler?options.shutdownHandler():shutdownRequested=!0},onError:err=>{output({type:"extension_error",extensionPath:err.extensionPath,event:err.event,error:err.error})}}),!0);function installSessionSubscriptions(){unsubscribe?.(),unsubscribeBackpressure?.(),unsubscribe=subscribeSessionRecords(session,outputEvent,abortSource=>{lastAbortSource=abortSource}),unsubscribeBackpressure=session.agent.subscribe(async()=>{await waitForRpcBackpressure()})}if(EffectLedger.forSession(session),deferRefresh){refresh.then(()=>session.releaseSettledSessionMemory(),cause=>{outputEvent({type:"rpc_error",error:String(cause)})});return}await refresh,await ClientAdmissions.forSession(session).ready,session.releaseSettledSessionMemory()},startLogin=async provider=>{activeLogins.get(provider)?.abort();let controller=new AbortController,settled2=new AbortController,loginSignal=AbortSignal.any([controller.signal,settled2.signal]);activeLogins.set(provider,controller);let authStorage=session.modelRegistry.authStorage;authStorage.takeReplacement(provider);try{await authStorage.login(provider,{onAuth:info=>{outputEvent({type:"auth_login_url",provider,url:info.url})},onDeviceCode:info=>{outputEvent({type:"auth_login_url",provider,url:info.verificationUri})},...createRpcLoginPromptCallbacks(createExtensionUIContext(),loginSignal),onProgress:()=>{},signal:controller.signal}),session.modelRegistry.refresh(),provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&emitProviderAccountsChanged(provider);let replacement=authStorage.takeReplacement(provider);outputEvent({type:"auth_login_end",provider,success:!0,...replacement})}catch(loginError){let message=loginError instanceof Error?loginError.message:String(loginError);outputEvent({type:"auth_login_end",provider,success:!1,error:message})}finally{settled2.abort(),activeLogins.get(provider)===controller&&activeLogins.delete(provider)}},fastModeContext=()=>({cwd:session.cwd,agentDir:session.agentDir,model:session.model,modelRegistry:session.modelRegistry,serviceTier:session.serviceTier,isProjectTrusted:()=>session.settingsManager.isProjectTrusted(),notify:()=>{},setSessionModel:async model=>session.modelRuntime.hasConfiguredAuth(model.provider)?(await session.setSessionModel(model,{source:"rpc",actor:"set_fast_mode"}),!0):!1,setSessionFastMode:enabled=>session.setSessionFastMode(enabled)}),handleCommand=async command=>{let id=command.id;switch(command.type){case"get_protocol_info":return{id,type:"response",command:"get_protocol_info",success:!0,data:{protocolVersion:1,serverVersion:VERSION,capabilities:[...new Set(["multi_session","session_lifecycle",AUTO_TITLE_SESSIONS_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,STEER_WHEN_IDLE_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,EVAL_CELLS_CAPABILITY,AUTH_KEY_VERIFY_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,TOOL_BARRIER_CAPABILITY,USER_ACTIVITY_CAPABILITY,RESUME_SESSION_CAPABILITY,ENTRIES_TAIL_CAPABILITY,...options.retryFallbackCommand?[RETRY_FALLBACK_COMMAND_CAPABILITY]:[],...options.toolRuntime?toolRuntimeCapabilities(options.toolRuntime):[],...(options.capabilities??[]).filter(capability=>capability!==SESSION_HELD_CAPABILITY&&!isHostOwnedToolRuntimeCapability(capability))])],mode:"classic",...protocolIdentity()}};case"open_session":return error2(id,"open_session","multi_session_disabled");case"prompt":{if(holdAutomaticInput(session,command,hasRole(INTERACTIVE_USER_CAPABILITY)))return success(id,"prompt",{disposition:"handled",heldAsNotice:!0});turnRequested=!0;let admission=handleClientInput(session,command,{output,promptCalls});promptCalls.add(admission),admission.finally(()=>promptCalls.delete(admission));return}case"append_user_message":{let content=command.content,message=typeof content=="string"?{role:"user",content,timestamp:Date.now()}:{role:"user",content,timestamp:Date.now()};return session.sessionManager.appendMessage(message),session.agent.state.messages=session.sessionManager.buildSessionContext().messages,success(id,"append_user_message")}case"append_session_entry":return session.appendSessionEntry(command.entry),success(id,"append_session_entry");case"continue_from_leaf":{turnRequested=!0;try{return await session.continueFromLeaf(),success(id,"continue_from_leaf")}catch(err){if(err instanceof ContinueFromLeafError)return error2(id,command.type,err.message,err.code);throw err}}case"resume_session":{turnRequested=!0;let{answer:answer3,settled:settled2}=await session.beginResume({expectedSeq:command.expectedSeq,mode:command.mode,message:command.message,effectId:command.effectId});return promptCalls.add(settled2),settled2.then(()=>promptCalls.delete(settled2),err=>{promptCalls.delete(settled2),output({type:"extension_error",extensionPath:"runtime",event:"resume_session",error:err instanceof Error?err.message:String(err)})}),success(id,"resume_session",answer3)}case"send_custom_message":return command.triggerTurn===!0&&(turnRequested=!0),await session.sendCustomMessage({customType:command.customType,content:command.content,display:command.display,details:command.details},{triggerTurn:command.triggerTurn,deliverAs:command.deliverAs}),success(id,"send_custom_message");case"steer":case"follow_up":{if(holdAutomaticInput(session,command,hasRole(INTERACTIVE_USER_CAPABILITY)))return success(id,command.type,{disposition:"handled",heldAsNotice:!0});turnRequested=!0,await handleClientInput(session,command,{output,promptCalls});return}case"abort":return command.intent==="stop"&&!hasRole(INTERACTIVE_USER_CAPABILITY)?error2(id,"abort","stop_requires_interactive_client: declare interactive_user with set_client_info first"):runAbort(effectContext(),command,()=>(command.intent==="stop"?session.stop():session.abort()).catch(cause=>{outputEvent({type:"rpc_error",error:String(cause)})}));case"interrupt":if(command.intent==="stop"&&!hasRole(INTERACTIVE_USER_CAPABILITY))return error2(id,"interrupt","stop_requires_interactive_client: declare interactive_user with set_client_info first");if(command.intent==="stop"){let stopped=await interruptRunningTurn(session,void 0,()=>(ClientAdmissions.forSession(session).noteAbort(effectContext().by),session.stop()));return stopped.interrupted||await session.stop(),success(id,"interrupt",stopped)}return success(id,"interrupt",await interruptRunningTurn(session,command.turnId,()=>(ClientAdmissions.forSession(session).noteAbort(effectContext().by),session.abort())));case"hold_input":{let answer3=runHoldInput(session,command,{interactiveUser:hasRole(INTERACTIVE_USER_CAPABILITY),taskParent:hasRole(TASK_PARENT_CAPABILITY)});return answer3.ok?success(id,"hold_input",answer3.data):error2(id,"hold_input",answer3.error)}case"pause_for_run":{let answer3=await runPauseForRun(session,command,hasRole(TASK_PARENT_CAPABILITY));return answer3.ok?success(id,"pause_for_run",answer3.data):error2(id,"pause_for_run",answer3.error)}case"resume_for_run":{let answer3=await runResumeForRun(session,command,hasRole(TASK_PARENT_CAPABILITY));return answer3.ok?success(id,"resume_for_run",answer3.data):error2(id,"resume_for_run",answer3.error)}case"withdraw_held_input":return hasRole(INTERACTIVE_USER_CAPABILITY)?success(id,"withdraw_held_input",{withdrawn:session.withdrawHeldInput(command.inputId)}):error2(id,"withdraw_held_input","hold_input_requires_interactive_client");case"abort_compaction":return session.abortCompaction(),success(id,"abort_compaction");case"reload":{let result3=await session.reload();return success(id,"reload",result3)}case"check_reload_veto":return success(id,"check_reload_veto",await session.checkReloadVeto());case"dequeue_message":case"edit_queued_message":return runQueuedInputChange(effectContext(),command);case"clear_queue":{ClientAdmissions.clearQueuedFor(session);let cleared=session.clearQueue({abortWillFollow:command.abortWillFollow??!1});return await session.whenQueueClearRecorded(),success(id,"clear_queue",{steering:cleared.steering,followUp:cleared.followUp,ordered:[...cleared.ordered]})}case"get_steering_messages":return success(id,"get_steering_messages",{messages:[...session.getSteeringMessages()],ordered:session.getQueuedInputs().filter(input=>input.mode==="steer").map(clientFacingIdentity)});case"get_follow_up_messages":return success(id,"get_follow_up_messages",{messages:[...session.getFollowUpMessages()],ordered:session.getQueuedInputs().filter(input=>input.mode==="followUp").map(clientFacingIdentity)});case"abort_branch_summary":return session.abortBranchSummary(),success(id,"abort_branch_summary");case"wake":{let deliveryIds=Array.isArray(command.delivery_ids)?command.delivery_ids.filter(entry2=>typeof entry2=="string"):void 0,result3=await sessionControl?.wake(deliveryIds)??{};return success(id,"wake",{admitted:result3.admitted??[]})}case"new_session":{let options2=command.parentSession?{parentSession:command.parentSession}:void 0,result3=await runtimeHost.newSession(options2);return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"new_session",result3)}case"set_client_info":{let wasGrantCapable=clientCapabilities?.includes("grant_select")===!0;if(command.capabilities!==void 0){if(!connectionRoles.declare(currentConnectionId(),command.capabilities))return error2(id,"set_client_info",CONNECTION_ROLE_FIXED);options.clientInfo?(clientCapabilities=command.capabilities,options.clientInfo.setCapabilities(options.clientInfo.connectionId(),command.capabilities)):replaceClientCapabilities(command.capabilities)}return wasGrantCapable!==(clientCapabilities?.includes("grant_select")===!0)&&refreshGrantPresentation(),success(id,"set_client_info")}case"get_state":return success(id,"get_state",buildRpcSessionState(session,lastAbortSource));case"request_self_settle":return success(id,"request_self_settle",session.requestSelfSettle());case"get_effect_status":return runGetEffectStatus(effectContext(),command);case"get_pending_inputs":return success(id,"get_pending_inputs",await session.getPendingInputs(command.knownClientMessageIds));case"set_model":return runSetModel(effectContext(),command);case"set_favorite_models":return session.setFavoriteModels(command.models),success(id,"set_favorite_models");case"set_scoped_models":return session.setScopedModels(command.models),success(id,"set_scoped_models");case"cycle_model":{let result3=await session.cycleModel(command.direction,{origin:{source:"rpc",actor:"cycle_model"}});return result3?success(id,"cycle_model",result3):success(id,"cycle_model",null)}case"get_available_models":return success(id,"get_available_models",await availableModelsData(session));case"set_thinking_level":return runSetThinkingLevel(effectContext(),command);case"cycle_thinking_level":{let level=session.cycleThinkingLevel();return level?success(id,"cycle_thinking_level",{level}):success(id,"cycle_thinking_level",null)}case"get_available_thinking_levels":return success(id,"get_available_thinking_levels",{levels:session.getAvailableThinkingLevels()});case"get_model_thinking_level":{if(typeof command.provider!="string"||typeof command.modelId!="string")return error2(id,"get_model_thinking_level","get_model_thinking_level requires 'provider' and 'modelId'.",RPC_ERROR_INVALID_ARGUMENT);let model=(await session.modelRegistry.getAvailable()).find(m=>m.provider===command.provider&&m.id===command.modelId);return model?success(id,"get_model_thinking_level",session.getThinkingLevelForModel(model)):error2(id,"get_model_thinking_level",`Model not found: ${command.provider}/${command.modelId}`,RPC_ERROR_MODEL_NOT_FOUND)}case"set_fast_mode":{if(typeof command.enabled!="boolean")return error2(id,"set_fast_mode","set_fast_mode requires a boolean 'enabled' field.");let model=session.model;if(!model)return error2(id,"set_fast_mode","No active model.");let result3=await applyFastMode(fastModeContext(),command.enabled);if(!result3.applied)return error2(id,"set_fast_mode",result3.message);let memoryModel=resolveServiceTierMemoryModel(session.modelRegistry,session.model??model);return success(id,"set_fast_mode",{enabled:result3.enabled,serviceTier:result3.recordedTier,provider:memoryModel.provider,modelId:memoryModel.id})}case"get_fast_mode":return success(id,"get_fast_mode",{enabled:session.isFastModeActive(),serviceTier:session.effectiveServiceTier??null});case"set_steering_mode":return session.setSteeringMode(command.mode),success(id,"set_steering_mode");case"set_follow_up_mode":return session.setFollowUpMode(command.mode),success(id,"set_follow_up_mode");case"compact":{let result3=await session.compact(command.customInstructions);return success(id,"compact",result3)}case"set_auto_compaction":return session.setAutoCompactionEnabled(command.enabled),success(id,"set_auto_compaction");case"set_auto_retry":return session.setAutoRetryEnabled(command.enabled),success(id,"set_auto_retry");case"abort_retry":return session.abortRetry(),success(id,"abort_retry");case"set_retry_fallback":{if(!options.retryFallbackCommand)return error2(id,"set_retry_fallback","set_retry_fallback is for a single-session rpc process; a host session takes open_session.retryFallback.");let profileError=sessionRetryFallbackError(command.retryFallback);return profileError!==void 0||command.retryFallback===void 0?error2(id,"set_retry_fallback",profileError??"set_retry_fallback needs retryFallback."):turnRequested||session.isStreaming||session.messages.some(message=>message.role!=="custom")?error2(id,"set_retry_fallback","set_retry_fallback must arrive before the session's first turn."):(runtimeHost.setRetryFallback(command.retryFallback),success(id,"set_retry_fallback"))}case"navigate_tree":{if(command.entryId!==void 0&&command.targetId!==void 0)return error2(id,"navigate_tree","navigate_tree takes either entryId or targetId, not both");if(command.entryId===void 0&&command.targetId===void 0)return error2(id,"navigate_tree","navigate_tree requires entryId or targetId");let targetId=command.entryId??command.targetId;if(typeof targetId!="string"||targetId.length===0)return error2(id,command.type,"navigate_tree requires a non-empty entryId or targetId");if(command.intent!==void 0&&command.intent!=="select"&&command.intent!=="resume")return error2(id,command.type,"navigate_tree intent must be select or resume");try{let result3=await session.navigateTree(targetId,{...command.intent!==void 0?{intent:command.intent}:{},summarize:command.summarize,customInstructions:command.customInstructions,replaceInstructions:command.replaceInstructions,label:command.label,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();return command.targetId!==void 0?success(id,command.type,{...result3,leafId}):result3.cancelled?success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}}):success(id,command.type,{outcome:"navigated",leafId,...result3.editorText!==void 0?{editorText:result3.editorText}:{},...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"record_bash_result":return session.recordBashResult(command.command,command.result,{excludeFromContext:command.excludeFromContext}),success(id,"record_bash_result");case"release_tool_barrier":return success(id,"release_tool_barrier",{released:session.releaseToolBarrier(command.barrierId)});case"set_label":return session.sessionManager.appendLabelChange(command.entryId,command.label),success(id,"set_label");case"bash":{routingSessionId!==void 0&&outputEvent({type:"bash_start"});try{let eventResult=await session.extensionRunner.emitUserBash({type:"user_bash",command:command.command,excludeFromContext:command.excludeFromContext??!1,cwd:session.sessionManager.getCwd()});if(eventResult?.result)return session.recordBashResult(command.command,eventResult.result,{excludeFromContext:command.excludeFromContext}),success(id,"bash",eventResult.result);let result3=await session.executeBash(command.command,void 0,{excludeFromContext:command.excludeFromContext,id:command.executionId,operations:eventResult?.operations});return success(id,"bash",result3)}finally{routingSessionId!==void 0&&outputEvent({type:"bash_end"})}}case"abort_bash":return session.abortBash(),success(id,"abort_bash");case"cleanup_bash_output":return await session.cleanupBashOutput(command.path),success(id,"cleanup_bash_output");case"get_session_stats":{let stats=session.getSessionStats();return success(id,"get_session_stats",stats)}case"resolve_path":return success(id,"resolve_path",resolveMessagePath({path:command.path,cwd:session.cwd,projectRoot:messagePathProjectRoot(session.cwd)}));case"memory_report":{let answer3=await answerMemoryReport(session);return answer3.ok?success(id,"memory_report",answer3.data):error2(id,"memory_report",answer3.error)}case"export_html":{let path14=await session.exportToHtml(command.outputPath,{themeName:command.themeName});return success(id,"export_html",{path:path14})}case"export_jsonl":return success(id,"export_jsonl",{path:session.exportToJsonl(command.outputPath)});case"switch_session":{let result3=await runtimeHost.switchSession(command.sessionPath,{cwdOverride:command.cwdOverride});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"switch_session",result3)}case"fork":{let result3=await runtimeHost.fork(command.entryId,{position:command.position});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"fork",{text:result3.selectedText,cancelled:result3.cancelled})}case"edit_assistant_message":{if(typeof command.entryId!="string"||command.entryId.length===0||typeof command.text!="string")return error2(id,command.type,"edit_assistant_message requires a non-empty entryId and a text string");try{let result3=await session.editAssistantMessage(command.entryId,command.text,{summarize:command.summarize,customInstructions:command.customInstructions,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();if(result3.unchanged)return success(id,command.type,{outcome:"unchanged",leafId});if(result3.cancelled)return success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}});let entry2=result3.entryId?session.sessionManager.getEntry(result3.entryId):void 0;return entry2?.type!=="message"||leafId===null?error2(id,command.type,"Edited assistant entry was not persisted"):success(id,command.type,{outcome:"edited",entry:entry2,leafId,...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"edit_user_message":{if(typeof command.entryId!="string"||command.entryId.length===0||typeof command.text!="string")return error2(id,command.type,"edit_user_message requires a non-empty entryId and a text string");try{let result3=await session.editUserMessage(command.entryId,command.text,{summarize:command.summarize,customInstructions:command.customInstructions,expectedLeafId:command.expectedLeafId}),leafId=session.sessionManager.getLeafId();if(result3.unchanged)return success(id,command.type,{outcome:"unchanged",leafId});if(result3.cancelled)return success(id,command.type,{outcome:"cancelled",leafId,...result3.aborted?{aborted:!0}:{}});let entry2=result3.entryId?session.sessionManager.getEntry(result3.entryId):void 0;return entry2?.type!=="message"||leafId===null?error2(id,command.type,"Edited user entry was not persisted"):success(id,command.type,{outcome:"edited",entry:entry2,leafId,...result3.summaryEntry?{summaryEntryId:result3.summaryEntry.id}:{}})}catch(err){if(err instanceof UserEditError||err instanceof AssistantEditError||err instanceof SessionStreamingError)return error2(id,command.type,err.message,err.code);throw err}}case"clone":{let leafId=session.sessionManager.getLeafId();if(!leafId)return error2(id,"clone","Cannot clone session: no current entry selected");let result3=await runtimeHost.fork(leafId,{position:"at"});return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"clone",{cancelled:result3.cancelled})}case"get_fork_messages":{let messages=session.getUserMessagesForForking();return success(id,"get_fork_messages",{messages})}case"get_entries":return answerGetEntries(session,command);case"get_tree":{let sessionManager=session.sessionManager,tree=sessionManager.getTree(),nodes=[...tree];for(let node of nodes){node.entry=describeUsageLimitEntry(node.entry);for(let child of node.children)nodes.push(child)}return session.releaseFullHistoryView(),success(id,"get_tree",{tree,leafId:sessionManager.getLeafId()})}case"get_last_assistant_text":{let text3=session.getLastAssistantText();return success(id,"get_last_assistant_text",{text:text3})}case"import_jsonl":{let result3=await runtimeHost.importFromJsonl(command.inputPath,command.cwdOverride);return routingSessionId===void 0&&!result3.cancelled&&session!==runtimeHost.session&&await rebindAfterLocalReplacement(),success(id,"import_jsonl",result3)}case"set_session_name":{let name=command.name.trim();return name?(session.setSessionName(name),success(id,"set_session_name")):error2(id,"set_session_name","Session name cannot be empty")}case"record_user_activity":return command.kind!=="draft"?error2(id,"record_user_activity",'record_user_activity: kind must be "draft"',RPC_ERROR_INVALID_ARGUMENT):(session.recordUserActivity("draft"),success(id,"record_user_activity"));case"get_subscription_limits":return success(id,"get_subscription_limits",{accounts:subscriptionLimits.snapshot()});case"get_messages":return success(id,"get_messages",{messages:session.messages.map(message=>message.role==="assistant"?describeUsageLimitMessage(message):message)});case"get_media":{let{toolCallId,contentIndex}=command,content=findToolResultMedia(session,toolCallId,contentIndex);return content?success(id,"get_media",{toolCallId,contentIndex,content}):error2(id,"get_media",RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MEDIA_NOT_FOUND)}case"get_commands":return success(id,"get_commands",{commands:buildRpcCommandsForSession(session)});case"get_loaded_surfaces":{await requestMcpWireStatus();let inventory=recordLoadedSurfaces(!0);return success(id,"get_loaded_surfaces",inventory.data)}case"extension_request":case"eval_cells.list":case"eval_cells.peek":case"eval_cells.stop":{let name=command.type==="extension_request"?command.name.trim():command.type;if(name.length===0)return error2(id,command.type,"Extension RPC request name cannot be empty");try{let data=await session.extensionRunner.requestRpc(name,command.type==="extension_request"?command.data:command);return success(id,command.type,data)}catch(cause){if(cause instanceof ExtensionRpcRequestNotFoundError&&(name==="eval_cells.list"||name==="eval_cells.peek"||name==="eval_cells.stop"))return error2(id,command.type,"Eval cell controls are unavailable in this session",RPC_ERROR_EVAL_CELLS_UNAVAILABLE);if(cause instanceof Error&&"code"in cause&&(cause.code===RPC_ERROR_EVAL_CELL_NOT_FOUND||cause.code===RPC_ERROR_INVALID_EVAL_CELL_REQUEST))return error2(id,command.type,cause.message,cause.code);throw cause}}case"get_auth_providers":{let modelRegistry=session.modelRegistry,oauthInfos=buildLoginProviderInfos(modelRegistry,"oauth"),apiKeyInfos=buildLoginProviderInfos(modelRegistry,"api_key"),providers=[...oauthInfos,...apiKeyInfos].map(info=>({id:info.id,name:info.name,authType:info.authType,status:authMethodStatus(modelRegistry,info),...storedKeyHint(modelRegistry,info)}));return success(id,"get_auth_providers",{providers})}case"login_start":return startLogin(command.provider),success(id,"login_start");case"login_cancel":return activeLogins.get(command.provider)?.abort(),success(id,"login_cancel");case"login_api_key":{let replacement=session.modelRegistry.authStorage.set(command.provider,{type:"api_key",key:command.key});return session.modelRegistry.authStorage.takeReplacement(command.provider),await session.modelRegistry.refresh(),success(id,"login_api_key",replacement)}case"verify_api_key":{let verification=await verifyApiKey({models:session.modelRegistry.getAll(),provider:command.provider,key:command.key,signal:AbortSignal.timeout(15e3)});return success(id,"verify_api_key",verification)}case"logout":return session.modelRegistry.authStorage.logout(command.provider),await session.modelRegistry.refresh(),success(id,"logout");case"get_provider_accounts":{let listing=await listCredentialAccounts(session.modelRegistry.authStorage,command.provider);return success(id,"get_provider_accounts",{accounts:listing.accounts,ordered:listing.ordered})}case"account_pin":return await pinCredentialAccount(session.modelRegistry.authStorage,command.provider,command.name),success(id,"account_pin");case"account_remove":return await removeCredentialAccount(session.modelRegistry.authStorage,command.provider,command.name),success(id,"account_remove");case"account_order":{let names=command.names;if(names!==null&&!(Array.isArray(names)&&names.every(name=>typeof name=="string")))throw new Error("account_order names must be an array of account names, or null to clear the order");return await orderCredentialAccounts(session.modelRegistry.authStorage,command.provider,command.names),success(id,"account_order")}default:{let unknownCommand=command;return error2(id,unknownCommand.type,`Unknown command: ${unknownCommand.type}`)}}},handleInputLine=async line=>{let parsed;try{parsed=JSON.parse(line)}catch(parseError){output(error2(void 0,"parse",`Failed to parse command: ${parseError instanceof Error?parseError.message:String(parseError)}`)),await waitForRpcBackpressure();return}let shapeError=rpcCommandShapeError(parsed);if(shapeError){output(error2(void 0,"parse",shapeError)),await waitForRpcBackpressure();return}if(typeof parsed=="object"&&parsed!==null&&"type"in parsed&&parsed.type==="extension_ui_progress"){questions.progress(parsed);return}if(isHostResponse(parsed)){output(answerHostResponse(parsed,frame=>relocation?.respond(frame)??"unknown"));return}if(typeof parsed=="object"&&parsed!==null&&"type"in parsed&&parsed.type==="extension_ui_response"){if(!options.workerSecurityBridge&&"id"in parsed&&typeof parsed.id=="string"&&grantRequests.has(parsed.id)){let sender=options.clientInfo?.connectionId(),capable=sender===void 0?clientCapabilities?.includes("grant_select")===!0:options.clientInfo?.hasCapability?.(sender,"grant_select")===!0;if(grantRequests.get(parsed.id)!==sender||!capable)return}let reply=settleExtensionUiResponse(parsed,{questions,dialogs:pendingExtensionRequests,routed:routingSessionId!==void 0,beforeAnswer:()=>session.admitHumanAnswer()});reply&&output(reply);return}let command=parsed,payloadError=rpcCommandPayloadError(command),messageLengthError=rpcMessageLengthError(command);if(payloadError||messageLengthError){output(error2(command.id,command.type,payloadError??messageLengthError)),await waitForRpcBackpressure();return}try{let response=await handleCommand(command);response&&(output(response),await waitForRpcBackpressure())}catch(commandError){let missingCwd=commandError instanceof Error&&commandError.name==="MissingSessionCwdError"&&"issue"in commandError;output(error2(command.id,command.type,commandError instanceof Error?commandError.message:String(commandError),missingCwd?"missing_session_cwd":void 0,missingCwd?commandError.issue:void 0)),await waitForRpcBackpressure()}},stopLimitEvents=options.sessionId===void 0?subscriptionLimits.subscribe(limits=>eventOutput.enqueueEvent({type:"subscription_limits",...limits})):()=>{},dispose=async(disposeOptions={})=>{unbindMcpForms?.(),grantPresentationAbort.abort(),detachGrantPresentation?.(),unsubscribeSecurityNotices?.(),stopLimitEvents(),sessionControl?.dispose(),sessionControl=void 0,relocation?.dispose(),relocation=void 0,questions.cancelAll(),pendingExtensionRequests.close(),unsubscribeProviderAccountEvents(),unsubscribe?.(),unsubscribeBackpressure?.(),unsubscribeLoadedSurfaces?.(),unsubscribeExtensionEvents?.(),unsubscribe=void 0,unsubscribeBackpressure=void 0,unsubscribeLoadedSurfaces=void 0,unsubscribeExtensionEvents=void 0,options.disposeRuntime!==!1&&await runtimeHost.dispose(disposeOptions)},unbindMcpForms,ready=rebindSession();return{ready,async handleInputLine(line){await ready,await handleInputLine(line)},pendingPrompts(){return[...promptCalls]},isShutdownRequested(){return shutdownRequested},cancelPendingExtensionUiRequests(){questions.cancelAll(),pendingExtensionRequests.cancelAll()},connectionDetached(connectionId){relocation?.connectionDetached(connectionId)},async dispose(disposeOptions){await ready,await dispose(disposeOptions)}}}function createRpcShutdown(dispose,exit){let pending,code=0;return(exitCode=0,signal)=>(code===0&&(code=exitCode),pending||(pending=(async()=>(await dispose(signal),exit(code)))(),pending))}async function runRpcMode(runtimeHost,toolRuntime){takeOverStdout();let sink={writeRaw:chunk=>{let linearized=chunk.split(`
|
|
2249
2249
|
`).filter(line=>line.length>0).map(line=>{let value=JSON.parse(line);return JSON.stringify(value.type==="message_update"?toJsonEvent(value):value)}).join(`
|
|
2250
2250
|
`);writeRawStdout(linearized.length>0?`${linearized}
|
|
2251
|
-
`:"")},waitForBackpressure:waitForRawStdoutBackpressure},capabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),handler=createRpcConnectionHandler(runtimeHost,sink,{capabilities,retryFallbackCommand:!0,...toolRuntime===void 0?{}:{toolRuntime}});ClientAdmissions.sealQueuedOnReplace(runtimeHost),EffectLedger.sealOnReplace(runtimeHost);let signalCleanupHandlers=[];(()=>{let signals=["SIGTERM"];process.platform!=="win32"&&signals.push("SIGHUP");for(let signal of signals){let handler2=()=>{killTrackedDetachedChildren(),shutdown(signal==="SIGHUP"?129:143,signal)};process.on(signal,handler2),signalCleanupHandlers.push(()=>process.off(signal,handler2))}})();let detachInput=()=>{},shutdown=createRpcShutdown(async signal=>{for(let cleanup of signalCleanupHandlers)cleanup();await handler.dispose({processExit:!0}),detachInput(),process.stdin.pause(),signal!=="SIGTERM"&&await flushRawStdout()},exitCode=>process.exit(exitCode)),handleInputLine=async line=>{await handler.handleInputLine(line),handler.isShutdownRequested()&&await shutdown()},onInputEnd=()=>{shutdown()};return process.stdin.on("end",onInputEnd),detachInput=(()=>{let detachJsonl=attachJsonlLineReader(process.stdin,line=>{handleInputLine(line)},{maxLineLength:MAX_RPC_LINE_CHARACTERS,onOversizedLine:()=>{writeRawStdout(serializeJsonLine({type:"response",command:"parse",success:!1,error:`RPC input line exceeds ${MAX_RPC_LINE_CHARACTERS} characters.`})),waitForRawStdoutBackpressure()}});return()=>{detachJsonl(),process.stdin.off("end",onInputEnd)}})(),new Promise(()=>{})}export{LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,subscriptionLimits,readStoredCredential,CredentialSynchronizationError,ModelRuntime,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,kernelToolsStorage,parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,formatSkillsForPrompt,loadSkillsFromDir,loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,resolveModelScopeWithDiagnostics,resolveCliModel,SessionPendingInputs,isSecurityNoticeState,pathExists,MOVE_BUNDLE_FORMAT,MANIFEST_FILE,SESSION_BUNDLE_PATH,MoveBundleInvalidError,sha256File,isPlainId,isMoveId,parsePlainId,parseMoveId,EXTENSION_STATE_PREFIX,readManifest,verifyBundle,EXTENSION_STATE_PAYLOAD,STATE_ATTEMPT_FIELD,outgoingStateDir,movedStateDir,sealedOutgoingStateDir,prepareOutgoingState,createLocalBashOperations,createBashToolDefinition,createBashTool,generateUnifiedPatch,generateDiffString,createEditToolDefinition,createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool,createWriteToolDefinition,createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,EVAL_HANDLE_ERROR_CODES,EvalHandleError,ReservedCustodyKey,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,loadProjectContextFiles,HostMcpRegistry,parsePermissionPresetName,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,AUTO_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,foreignSessionHolders,readCodemodeKernelRows,readMainThreadHeapBytes,readRecordedRepositoryIdentity,readSessionCwd,rebindSessionFile,runPrintMode,startHostChildReaper,collectOrphanedChildren,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,
|
|
2251
|
+
`:"")},waitForBackpressure:waitForRawStdoutBackpressure},capabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),handler=createRpcConnectionHandler(runtimeHost,sink,{capabilities,retryFallbackCommand:!0,...toolRuntime===void 0?{}:{toolRuntime}});ClientAdmissions.sealQueuedOnReplace(runtimeHost),EffectLedger.sealOnReplace(runtimeHost);let signalCleanupHandlers=[];(()=>{let signals=["SIGTERM"];process.platform!=="win32"&&signals.push("SIGHUP");for(let signal of signals){let handler2=()=>{killTrackedDetachedChildren(),shutdown(signal==="SIGHUP"?129:143,signal)};process.on(signal,handler2),signalCleanupHandlers.push(()=>process.off(signal,handler2))}})();let detachInput=()=>{},shutdown=createRpcShutdown(async signal=>{for(let cleanup of signalCleanupHandlers)cleanup();await handler.dispose({processExit:!0}),detachInput(),process.stdin.pause(),signal!=="SIGTERM"&&await flushRawStdout()},exitCode=>process.exit(exitCode)),handleInputLine=async line=>{await handler.handleInputLine(line),handler.isShutdownRequested()&&await shutdown()},onInputEnd=()=>{shutdown()};return process.stdin.on("end",onInputEnd),detachInput=(()=>{let detachJsonl=attachJsonlLineReader(process.stdin,line=>{handleInputLine(line)},{maxLineLength:MAX_RPC_LINE_CHARACTERS,onOversizedLine:()=>{writeRawStdout(serializeJsonLine({type:"response",command:"parse",success:!1,error:`RPC input line exceeds ${MAX_RPC_LINE_CHARACTERS} characters.`})),waitForRawStdoutBackpressure()}});return()=>{detachJsonl(),process.stdin.off("end",onInputEnd)}})(),new Promise(()=>{})}export{LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,subscriptionLimits,readStoredCredential,CredentialSynchronizationError,ModelRuntime,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,kernelToolsStorage,parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,formatSkillsForPrompt,loadSkillsFromDir,loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,resolveModelScopeWithDiagnostics,resolveCliModel,SessionPendingInputs,isSecurityNoticeState,pathExists,MOVE_BUNDLE_FORMAT,MANIFEST_FILE,SESSION_BUNDLE_PATH,MoveBundleInvalidError,sha256File,isPlainId,isMoveId,parsePlainId,parseMoveId,EXTENSION_STATE_PREFIX,readManifest,verifyBundle,EXTENSION_STATE_PAYLOAD,STATE_ATTEMPT_FIELD,outgoingStateDir,movedStateDir,sealedOutgoingStateDir,prepareOutgoingState,createLocalBashOperations,createBashToolDefinition,createBashTool,generateUnifiedPatch,generateDiffString,createEditToolDefinition,createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool,createWriteToolDefinition,createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,EVAL_HANDLE_ERROR_CODES,EvalHandleError,ReservedCustodyKey,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,loadProjectContextFiles,HostMcpRegistry,parsePermissionPresetName,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,AUTO_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,foreignSessionHolders,readCodemodeKernelRows,readMainThreadHeapBytes,readRecordedRepositoryIdentity,readSessionCwd,rebindSessionFile,runPrintMode,startHostChildReaper,collectOrphanedChildren,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,isApiKeyLoginProvider,createRpcConnectionHandler,runRpcMode,installStaleExtensionContainment,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatCrashExtensionHint,formatResumeCommand,showsStartupHeader,showsStartupDetails,OptimisticUserEchoController,InteractiveMode,main,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted};
|