@code-yeongyu/senpi 2026.10.6 → 2026.10.7
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/{app-server-command-GNTX4MZT.js → app-server-command-SO5RJ2N7.js} +1 -1
- package/dist/bundle/chunks/chunk-7SMFF2QJ.js +14 -0
- package/dist/bundle/chunks/{chunk-6JXPZACL.js → chunk-CM5QTRC2.js} +1 -1
- package/dist/bundle/chunks/{chunk-3EE6G4G7.js → chunk-EUU6W5B3.js} +10 -10
- package/dist/bundle/chunks/{chunk-HKG7XL4H.js → chunk-HY4AOLON.js} +1 -1
- package/dist/bundle/chunks/{chunk-4MJKBXI3.js → chunk-JJNIU2A2.js} +8 -4
- package/dist/bundle/chunks/{chunk-22DAHAHO.js → chunk-LUWWM7GA.js} +2 -2
- package/dist/bundle/chunks/{chunk-6KQGOVQG.js → chunk-VJJ53ORU.js} +1 -1
- package/dist/bundle/chunks/{chunk-XYDZ3LIE.js → chunk-YI7SPFDN.js} +2 -2
- package/dist/bundle/chunks/chunk-ZJHRDQCH.js +2 -0
- package/dist/bundle/chunks/cli-main-XBQN73O2.js +3 -0
- package/dist/bundle/chunks/host-command-YXQAXNKK.js +2 -0
- package/dist/bundle/chunks/{host-lifecycle-7OVWGVIZ.js → host-lifecycle-L4XQIATP.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +1 -1
- package/dist/bundle/chunks/interactive-mode-ROO5W56P.js +2 -0
- package/dist/bundle/chunks/{multi-session-host-QLLTPWIM.js → multi-session-host-5WTKAQJM.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-VRCAO7RV.js → package-manager-cli-NCD5FQGV.js} +1 -1
- package/dist/bundle/chunks/rpc-mode-MWURKCP2.js +2 -0
- package/dist/bundle/chunks/{schedule-command-QTYSUYO2.js → schedule-command-UTXB465F.js} +1 -1
- package/dist/bundle/chunks/session-control-endpoint-J6RHZXWB.js +3 -0
- package/dist/bundle/chunks/session-worker.js +16 -12
- package/dist/bundle/cli.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/eval-handle-host.d.ts +82 -0
- package/dist/core/extensions/eval-handle-host.js +28 -0
- package/dist/core/extensions/loader.js +5 -0
- package/dist/core/extensions/runner.js +4 -0
- package/dist/core/extensions/types.d.ts +15 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/modes/interactive/session-control-registry.js +2 -0
- package/dist/modes/rpc/host-daemon-registration.d.ts +9 -0
- package/dist/modes/rpc/host-daemon-registration.js +2 -4
- package/dist/modes/rpc/host-ensure-start.js +2 -0
- package/dist/modes/rpc/host-handoff-unregistered.d.ts +24 -0
- package/dist/modes/rpc/host-handoff-unregistered.js +50 -0
- package/dist/modes/rpc/host-handoff.d.ts +7 -2
- package/dist/modes/rpc/host-handoff.js +7 -3
- package/dist/modes/rpc/host-legacy.d.ts +3 -0
- package/dist/modes/rpc/host-legacy.js +10 -5
- package/dist/modes/rpc/host-probe.d.ts +12 -0
- package/dist/modes/rpc/host-probe.js +53 -5
- package/dist/modes/rpc/host-runner.js +1 -1
- package/dist/modes/rpc/host-successor.d.ts +5 -4
- package/dist/modes/rpc/host-successor.js +11 -4
- package/docs/rpc.md +10 -2
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-QLIW3YMI.js +0 -14
- package/dist/bundle/chunks/cli-main-2C3YPHRE.js +0 -3
- package/dist/bundle/chunks/host-command-N6XS5O67.js +0 -2
- package/dist/bundle/chunks/interactive-mode-CM4C4ZFY.js +0 -2
- package/dist/bundle/chunks/rpc-mode-2OPE6J7P.js +0 -2
- package/dist/bundle/chunks/session-control-endpoint-SOG4XFF7.js +0 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-QLIW3YMI.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-BE66QJ3Z.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-ESSQUSRC.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-V2VQ4BHG.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-K4AZKFRB.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-6EH7QXOG.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-4MJKBXI3.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-6KQGOVQG.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-6JXPZACL.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-7A3WRAKP.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-HKG7XL4H.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-22DAHAHO.js";import{attachJsonlLineReader,compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom,serializeJsonLine}from"./chunk-XYDZ3LIE.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-D2W3MXRF.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-YSPHACIN.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync48,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname51}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve46=>{let abortHandler=()=>resolve46(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve46,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve46(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve46,reject)=>{resolveCompletion=resolve46,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
2
|
+
import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-7SMFF2QJ.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-BE66QJ3Z.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-ESSQUSRC.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-V2VQ4BHG.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-K4AZKFRB.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-6EH7QXOG.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-JJNIU2A2.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-VJJ53ORU.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-CM5QTRC2.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-7A3WRAKP.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-HY4AOLON.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-LUWWM7GA.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-D2W3MXRF.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-YSPHACIN.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync48,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname51}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve46=>{let abortHandler=()=>resolve46(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve46,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve46(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve46,reject)=>{resolveCompletion=resolve46,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
3
3
|
|
|
4
4
|
<summary>
|
|
5
5
|
`,COMPACTION_SUMMARY_SUFFIX=`
|
|
@@ -705,7 +705,7 @@ ${bounded}`}function measureSlicedContext(entries,firstKeptEntryId,summary,token
|
|
|
705
705
|
`)return;if(character==="\\"){let escaped=blob[index+1];if(escaped===void 0)return;encoded+=character+escaped,index++;continue}encoded+=character}}function extractJsonArrayPrefix(text2){if(!text2.startsWith("["))return;let depth=0,inString=!1,escaped=!1;for(let index=0;index<text2.length;index++){let character=text2[index];if(inString){escaped?escaped=!1:character==="\\"?escaped=!0:character==='"'&&(inString=!1);continue}if(character==='"')inString=!0;else if(character==="[")depth++;else if(character==="]"){if(depth--,depth===0)return text2.slice(0,index+1);if(depth<0)return}}}function parseV2Payload(payload){try{let parsed=JSON.parse(payload);return Array.isArray(parsed)?parsed.filter(isToolActivationIdentity):[]}catch{return[]}}function isToolActivationIdentity(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2;return typeof candidate.name=="string"&&candidate.name.length>0&&typeof candidate.registrationId=="string"&&candidate.registrationId.length>0}function extractLegacyActivationSegments(blob){let segments=[],cursor=blob.indexOf(LEGACY_TOOL_SEARCH_ACTIVATION_MARKER);for(;cursor>=0;){let rest=blob.slice(cursor+LEGACY_TOOL_SEARCH_ACTIVATION_MARKER.length),end=rest.search(/["\\\n]/);segments.push(end<0?rest:rest.slice(0,end)),cursor=blob.indexOf(LEGACY_TOOL_SEARCH_ACTIVATION_MARKER,cursor+LEGACY_TOOL_SEARCH_ACTIVATION_MARKER.length)}return segments}import{AsyncLocalStorage}from"node:async_hooks";import{basename as basename4,extname}from"node:path";var loadKeys=new WeakMap;function recordExtensionLoadKey(api,load){loadKeys.set(api,load)}function extensionLoadKey(api){return loadKeys.get(api)}var DEFAULT_BM25_PRECISION={minCoverage:.5,minScoreRatio:.35},DEFAULT_LIMIT=25;function buildBm25Index(docs){let indexed=docs.map(indexDoc),docFreq=new Map;for(let entry of indexed)for(let term of entry.termFreq.keys())docFreq.set(term,(docFreq.get(term)??0)+1);let totalLength=indexed.reduce((sum,entry)=>sum+entry.length,0),avgLength=indexed.length===0?0:totalLength/indexed.length,docCount=indexed.length;return{search(query,limit=DEFAULT_LIMIT,options={}){let pool=indexed.filter(entry=>(options.source===void 0||entry.doc.source===options.source)&&(options.group===void 0||entry.doc.group===options.group)),queryTerms=tokenizeToolText(query).map(stemToken);if(queryTerms.length===0)return[];let contentTerms=contentTermsOf(queryTerms),useExact=options.exactMatch!==!1,normQuery=normalizeToolName(query),results=[];for(let entry of pool){let exact=useExact&&normQuery.length>0&&entry.exactNames.has(normQuery),score3=bm25Score(entry,queryTerms,docFreq,avgLength,docCount);!exact&&score3<=0||results.push({coverage:coverageOf(entry,contentTerms),doc:entry.doc,exact,name:entry.doc.name,score:score3})}return results.sort(compareResults),(options.precision===void 0?results:applyPrecision(results,options.precision)).slice(0,Math.max(0,limit))}}}function applyPrecision(results,precision){let floor=(results.find(result3=>!result3.exact)?.score??0)*precision.minScoreRatio;return results.filter(result3=>result3.exact||result3.coverage>=precision.minCoverage&&result3.score>=floor)}var STOPWORDS=new Set(["a","an","and","are","be","by","can","do","for","from","how","i","in","is","it","me","my","need","of","on","or","please","that","the","this","to","tool","use","using","via","want","we","with","you","your"]);function contentTermsOf(queryTerms){let content=new Set(queryTerms.filter(term=>!STOPWORDS.has(term)));return content.size>0?content:new Set(queryTerms)}function coverageOf(entry,contentTerms){if(contentTerms.size===0)return 0;let matched=0;for(let term of contentTerms)entry.termFreq.has(term)&&matched++;return matched/contentTerms.size}function indexDoc(doc){let termFreq=new Map;addField(termFreq,indexTokens(doc.name),3),addField(termFreq,indexTokens(doc.label),3);for(let alias of doc.aliases)addField(termFreq,indexTokens(alias),3);for(let keyword of doc.keywords)addField(termFreq,indexTokens(keyword),3);addField(termFreq,indexTokens(doc.group),2),addField(termFreq,indexTokens(doc.ownerLabel),2),addField(termFreq,indexTokens(doc.description??""),1),addField(termFreq,indexTokens(doc.searchText??""),1);let length=0;for(let count of termFreq.values())length+=count;return{doc,exactNames:new Set([doc.name,doc.label,...doc.aliases,...doc.keywords].map(normalizeToolName)),length,termFreq}}function addField(termFreq,tokens,weight){for(let token of tokens)termFreq.set(token,(termFreq.get(token)??0)+weight)}function bm25Score(entry,queryTerms,docFreq,avgLength,docCount){let score3=0,seen=new Set;for(let term of queryTerms){if(seen.has(term))continue;seen.add(term);let tf=entry.termFreq.get(term);if(tf===void 0)continue;let idf=inverseDocFreq(docFreq.get(term)??0,docCount),denom=tf+.9*(1-.4+.4*entry.length/(avgLength||1));score3+=idf*(tf*(.9+1)/(denom||1))}return score3}function inverseDocFreq(termDocFreq,docCount){let value2=Math.log(1+(docCount-termDocFreq+.5)/(termDocFreq+.5));return value2<0?0:value2}function compareResults(left,right){return left.exact!==right.exact?left.exact?-1:1:right.score!==left.score?right.score-left.score:left.name.localeCompare(right.name)}function indexTokens(text2){return tokenizeToolText(text2).map(stemToken)}function stemToken(token){return token.length<4||!token.endsWith("s")||token.endsWith("ss")||token.endsWith("us")?token:token.endsWith("ies")?`${token.slice(0,-3)}y`:token.slice(0,-1)}function tokenizeToolText(text2){if(text2.length===0)return[];let withBoundaries=text2.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2"),tokens=[];for(let raw of withBoundaries.split(/[^a-zA-Z0-9]+/))raw.length!==0&&tokens.push(raw.toLowerCase());return tokens}function normalizeToolName(name){return name.toLowerCase().replace(/[-_\s]+/g,"")}var TOOL_SEARCH_TOOL_NAME="tool_search",MAX_RESULTS=5,ParamsSchema=typebox_exports.Object({query:typebox_exports.String({description:"Natural-language description of the capability you need."}),source:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("mcp"),typebox_exports.Literal("extension")],{description:"Optional: restrict the search to MCP or extension tools."})),group:typebox_exports.Optional(typebox_exports.String({description:"Optional: restrict the search to one catalog group."}))});function createToolSearchTool(service2){return{name:TOOL_SEARCH_TOOL_NAME,label:"Tool search",description:"Search the catalog of deferred tools by capability. Returns matching tool names with their parameter schemas and never changes your active tool set; call a returned tool by name and it activates on that first call.",promptSnippet:"Search deferred tool catalogs by capability; call a returned tool by name to use it.",parameters:ParamsSchema,prepareArguments:prepareToolSearchArguments,executionMode:"parallel",async execute(_toolCallId,params){let options={...params.source===void 0?{}:{source:params.source},...params.group===void 0?{}:{group:params.group}},matches=service2.search(params.query,MAX_RESULTS,options);return{content:[{type:"text",text:buildToolSearchResultText({group:params.group,hiddenHints:service2.hiddenToolHints(params.query),matches,parametersOf:name=>service2.getToolParameters(name),query:params.query,source:params.source})}],details:{matched:matches.map(match=>match.name),query:params.query}}},renderCall(args,theme2){let source2=args.source===void 0?"":` source:${args.source}`,group=args.group===void 0?"":` @${args.group}`;return new Text(theme2.fg("toolTitle",theme2.bold(`${TOOL_SEARCH_TOOL_NAME} "${args.query}"${source2}${group}`)),0,0)},renderResult(result3,options,theme2){let count=result3.details?.matched.length??0,title=options.isPartial?`${TOOL_SEARCH_TOOL_NAME}: searching`:`${TOOL_SEARCH_TOOL_NAME}: ${count} tool(s) found`;return new Text(theme2.fg("toolOutput",title),0,0)}}}function prepareToolSearchArguments(args){if(!isRecord4(args))return args;let{server,...rest}=args;return{...rest,...rest.source===void 0&&server===void 0?{}:{source:rest.source??"mcp"},...rest.group===void 0&&server===void 0?{}:{group:rest.group??server}}}function buildToolSearchResultText(input){let{query,matches,hiddenHints,source:source2,group}=input,scope=[source2===void 0?void 0:`source "${source2}"`,group===void 0?void 0:`group "${group}"`].filter(part=>part!==void 0).join(" in "),scopeText=scope.length===0?"":` in ${scope}`,hintLines=hiddenHints.map(entry=>`- ${entry.name}: ${entry.hint}`);if(matches.length===0){let head=`No catalog tools matched "${query}"${scopeText}. Your active tool set is unchanged.`;return hintLines.length===0?`${head} Try different keywords or a broader query.`:[head,"","The query names a tool that is hidden in this session:",...hintLines].join(`
|
|
706
706
|
`)}let bullets=matches.map(match=>{let description=oneLine(match.doc.description)??"(no description)",parameters=compactParameters(input.parametersOf(match.name));return parameters===void 0?`- ${match.name} \u2014 ${description}`:`- ${match.name} \u2014 ${description}
|
|
707
707
|
parameters: ${parameters}`}),lines=[`Found ${matches.length} tool(s) matching "${query}"${scopeText}. Nothing was activated; call one by name and it activates on that first call:`,"",...bullets];return hintLines.length>0&&lines.push("","The query also names a tool that is hidden in this session:",...hintLines),lines.join(`
|
|
708
|
-
`)}function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneLine(text2){if(text2===void 0)return;let collapsed=text2.replace(/\s+/g," ").trim();if(collapsed.length!==0)return collapsed.length<=160?collapsed:`${collapsed.slice(0,157)}...`}function compactParameters(parameters){if(isRecord4(parameters))try{return JSON.stringify(parameters)}catch(error2){if(error2 instanceof TypeError)return;throw error2}}var ToolSearchService=class{#runtime;#feeds=new Map;#extensionDocs=[];#extensionFingerprint="";#registryGeneration=0;#historyScannedGeneration=-1;#registerToolSearch;#removedToolHints=()=>({});#disposed;constructor(runtime){this.#runtime=runtime,this.#feeds.set("extension",{docs:[],hooks:{activate:names=>this.#promoteExtensionTools(names)}})}#nativeInjectionFailure=null;get isDisposed(){return this.#disposed!==void 0}dispose(sessionId,reason){this.#disposed??={sessionId,reason},sessionServices.delete(this)}#assertLive(){if(this.#disposed===void 0)return;let{sessionId,reason}=this.#disposed;throw new Error(`The tool-search service of session ${sessionId} is disposed (${reason}). Resolve the live session's own tool-search service instead of a retained one.`)}noteNativeInjectionFailure(reason){this.#assertLive(),this.#nativeInjectionFailure=reason}takeNativeInjectionFailure(){this.#assertLive();let reason=this.#nativeInjectionFailure;return this.#nativeInjectionFailure=null,reason}bindRuntime(runtime){this.#runtime=runtime}bindActivationRuntime(runtime){this.#runtime={...this.#runtime,...runtime}}bindToolRegistrar(register){this.#registerToolSearch=register}bindRemovedToolHints(provider){this.#removedToolHints=provider}hiddenToolHints(query){this.#assertLive();let hints=this.#removedToolHints(),byNormalizedName=new Map(Object.entries(hints).map(([name,hint])=>[normalizeToolName(name),{hint,name}]));if(byNormalizedName.size===0)return[];let seen=new Set,matched=[];for(let candidate of[normalizeToolName(query),...tokenizeToolText(query)]){let entry=byNormalizedName.get(candidate);entry===void 0||seen.has(entry.name)||(seen.add(entry.name),matched.push(entry))}return matched}getToolParameters(name){return this.#assertLive(),this.#runtime.getAllTools().find(tool=>tool.name===name)?.parameters}beginSession(){this.#assertLive(),this.#feeds.delete("mcp"),this.#registryGeneration+=1,this.#historyScannedGeneration=-1,this.#refreshExtensionDocs(),this.#syncToolSearchLifecycle()}feed(source2,docs,hooks){this.#assertLive();let validDocs=docs.filter(doc=>isValidDocument(doc,source2));this.#feeds.set(source2,{docs:validDocs,hooks}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle()}getCatalog(){return this.#assertLive(),this.#refreshExtensionDocs(),[...this.#feeds.get("mcp")?.docs??[],...this.#extensionDocs]}search(query,limit=10,options={}){return buildBm25Index(this.getCatalog()).search(query,limit,{precision:DEFAULT_BM25_PRECISION,...options})}activate(matches){this.#assertLive();let namesBySource=new Map;for(let match of matches){let names=namesBySource.get(match.doc.source)??[];names.push(match.name),namesBySource.set(match.doc.source,names)}for(let[source2,names]of namesBySource)this.#feeds.get(source2)?.hooks.activate(names);let active=new Set(this.#runtime.getActiveTools());return matches.map(({name})=>name).filter(name=>active.has(name))}activateTool(name){let doc=this.getCatalog().find(candidate=>candidate.name===name);return doc===void 0?!1:(this.#feeds.get(doc.source)?.hooks.activate([name]),this.#runtime.getActiveTools().includes(name))}maybeRehydrateFromHistory(messages){let catalog=this.getCatalog();if(this.#historyScannedGeneration===this.#registryGeneration)return[];this.#historyScannedGeneration=this.#registryGeneration;let docsByName=new Map(catalog.map(doc=>[doc.name,{name:doc.name,registrationId:doc.registrationId,source:doc.source,allowLazyActivation:!0}])),restored=rehydrate(messages,docsByName);return restored.length>0&&this.#activateNames(restored,catalog),restored}#refreshExtensionDocs(){let docs=this.#runtime.getAllTools().filter(tool=>tool.exposure==="search"&&tool.allowLazyActivation).map(extensionDocument).filter(doc=>doc!==void 0).sort((left,right)=>left.name.localeCompare(right.name)),fingerprint=JSON.stringify(docs);fingerprint!==this.#extensionFingerprint&&(this.#extensionDocs=docs,this.#extensionFingerprint=fingerprint,this.#feeds.set("extension",{docs,hooks:{activate:names=>this.#promoteExtensionTools(names)}}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle())}#activateNames(names,catalog=this.getCatalog()){let sourceByName=new Map(catalog.map(doc=>[doc.name,doc.source])),namesBySource=new Map;for(let name of names){let source2=sourceByName.get(name);if(source2===void 0)continue;let sourceNames=namesBySource.get(source2)??[];sourceNames.push(name),namesBySource.set(source2,sourceNames)}for(let[source2,sourceNames]of namesBySource)this.#feeds.get(source2)?.hooks.activate(sourceNames)}#syncToolSearchLifecycle(){let hasDocuments=this.#extensionDocs.length>0||(this.#feeds.get("mcp")?.docs.length??0)>0;hasDocuments&&this.#registerToolSearch?.();let current=this.#runtime.getActiveTools(),isActive2=current.includes(TOOL_SEARCH_TOOL_NAME);hasDocuments!==isActive2&&this.#runtime.setActiveTools(hasDocuments?[...current,TOOL_SEARCH_TOOL_NAME]:current.filter(name=>name!==TOOL_SEARCH_TOOL_NAME))}#promoteExtensionTools(names){if(names.length===0)return;let current=this.#runtime.getActiveTools(),active=new Set(current),added=[...new Set(names.filter(name=>!active.has(name)))].sort();this.#runtime.setActiveTools([...current,...added])}};function extensionDocument(tool){if(tool.name.length===0)return;let ownerLabel=extensionOwnerLabel(tool),registrationId=deriveExtensionRegistrationId(tool.sourceInfo,tool.name);if(registrationId.length!==0)return{name:tool.name,label:tool.label,aliases:[],description:tool.description,searchText:tool.searchText,keywords:tool.searchKeywords,source:"extension",group:tool.searchGroup??ownerLabel,ownerLabel,registrationId}}function extensionOwnerLabel(tool){let fileName=basename4(tool.sourceInfo.path),extension=extname(fileName);return extension.length===0?fileName:fileName.slice(0,-extension.length)}function isValidDocument(doc,source2){return doc.source===source2&&doc.name.length>0&&doc.registrationId.length>0}var scopedService=new AsyncLocalStorage,servicesByExtensionLoad=new WeakMap,sessionServices=new Set,sessionlessService=null;function installScopedToolSearchService(value2){scopedService.enterWith(value2)}function registerToolSearchServiceForExtensionLoad(pi,value2){let load=extensionLoadKey(pi);load!==void 0&&servicesByExtensionLoad.set(load,value2)}function getToolSearchServiceForExtension(pi){let load=extensionLoadKey(pi);return load===void 0?void 0:servicesByExtensionLoad.get(load)}function adoptToolSearchServiceForSession(extensionLoad){let value2=servicesByExtensionLoad.get(extensionLoad);return value2!==void 0&&sessionServices.add(value2),value2}function getToolSearchService(runtime){let scoped=scopedService.getStore();if(scoped!==void 0)return runtime!==void 0&&scoped.bindRuntime(runtime),scoped;if(sessionServices.size===1)return[...sessionServices][0];if(sessionServices.size>1)throw new Error(`getToolSearchService() cannot choose between ${sessionServices.size} live sessions; resolve the service through the session that owns it`);if(sessionlessService===null){if(runtime===void 0)throw new Error("ToolSearchService runtime is not bound");sessionlessService=new ToolSearchService(runtime)}else runtime!==void 0&&sessionlessService.bindRuntime(runtime);return sessionlessService}import*as fs3 from"node:fs";import{createRequire as createRequire4}from"node:module";import*as path11 from"node:path";import{fileURLToPath as fileURLToPath7}from"node:url";var oauth_exports={};__export(oauth_exports,{loadAnthropicOAuth:()=>loadAnthropicOAuth,registerBundledOAuthFlowLoaders:()=>registerBundledOAuthFlowLoaders});var dist_exports3={};__export(dist_exports3,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS2,DEFAULT_HOST_LAUNCH_SPEC:()=>DEFAULT_HOST_LAUNCH_SPEC,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES3,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ENDPOINT_REGISTRY_VERSION:()=>ENDPOINT_REGISTRY_VERSION,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,GENERATION_HANDOFF_CAPABILITY:()=>GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR:()=>HOST_EXIT_ERROR,HOST_EXIT_FALLBACK:()=>HOST_EXIT_FALLBACK,HOST_EXIT_OK:()=>HOST_EXIT_OK,HOST_EXIT_REFUSED:()=>HOST_EXIT_REFUSED,HOST_EXIT_USAGE:()=>HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION:()=>HOST_PROTOCOL_VERSION,HostEnsureRefusedError:()=>HostEnsureRefusedError,HostLaunchSpecError:()=>HostLaunchSpecError,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,PINNED_HOST_CLIENT_CAPABILITIES:()=>PINNED_HOST_CLIENT_CAPABILITIES,ProjectTrustStore:()=>ProjectTrustStore,REQUIRED_HOST_CAPABILITIES:()=>REQUIRED_HOST_CAPABILITIES,RpcClient:()=>RpcClient,RpcClientOpenInFlightError:()=>RpcClientOpenInFlightError,RpcTransportGoneError:()=>RpcTransportGoneError,SESSION_CONTROL_DELIVERY_TYPE:()=>SESSION_CONTROL_DELIVERY_TYPE,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,TUI_PROBE_TIMEOUT_MS:()=>TUI_PROBE_TIMEOUT_MS,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UnknownCommandError:()=>UnknownCommandError,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,VIRTUAL_MODEL_STATE_ENTRY:()=>VIRTUAL_MODEL_STATE_ENTRY,buildContextEntries:()=>buildContextEntries,buildNoticeBox:()=>buildNoticeBox,buildSessionContext:()=>buildSessionContext,buildSessionProjection:()=>buildSessionProjection,calculateContextTokens:()=>calculateContextTokens2,classifyEndpointLiveness:()=>classifyEndpointLiveness,classifyRead:()=>classifyRead,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary2,collectOrphanedChildren:()=>collectOrphanedChildren,compact:()=>compact2,compareEngineOrdinal:()=>compareEngineOrdinal,connectWebViewService:()=>connectWebViewService,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool2,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool2,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createHostDaemonPaths:()=>createHostDaemonPaths,createLocalBashOperations:()=>createLocalBashOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool2,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool2,createWriteToolDefinition:()=>createWriteToolDefinition,daemonDirectoryName:()=>daemonDirectoryName,decideHostAction:()=>decideHostAction,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,endpointProbeTimeoutMs:()=>endpointProbeTimeoutMs,engineBuildIdentity:()=>engineBuildIdentity,engineBuildIdentityFrom:()=>engineBuildIdentityFrom,ensureHost:()=>ensureHost,estimateTokens:()=>estimateTokens2,findCutPoint:()=>findCutPoint2,findTurnStartIndex:()=>findTurnStartIndex2,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize2,formatSkillsForPrompt:()=>formatSkillsForPrompt,gcHostEndpoints:()=>gcHostEndpoints,generateBranchSummary:()=>generateBranchSummary2,generateDiffString:()=>generateDiffString2,generateSummary:()=>generateSummary2,generateSummaryWithUsage:()=>generateSummaryWithUsage2,generateUnifiedPatch:()=>generateUnifiedPatch2,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage2,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,handoffHost:()=>handoffHost,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isSessionControlDeliveryDetails:()=>isSessionControlDeliveryDetails,isToolCallEventType:()=>isToolCallEventType,isTransportGoneError:()=>isTransportGoneError,isWriteToolResult:()=>isWriteToolResult,kernelToolsStorage:()=>kernelToolsStorage,keyHint:()=>keyHint,keyText:()=>keyText,listHostEndpoints:()=>listHostEndpoints,loadHostLaunchSpec:()=>loadHostLaunchSpec,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills2,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,noticeEntryRenderer:()=>noticeEntryRenderer,noticeMessageRenderer:()=>noticeMessageRenderer,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter3,parseHostLaunchSpec:()=>parseHostLaunchSpec,parseHostProtocolInfo:()=>parseHostProtocolInfo,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries2,probeHost:()=>probeHost,rawKeyHint:()=>rawKeyHint,readAllHostStatus:()=>readAllHostStatus,readHostStatus:()=>readHostStatus,readOwnFootprint:()=>readOwnFootprint,readProcessFootprint:()=>readProcessFootprint,readStoredCredential:()=>readStoredCredential,registerReadClassifier:()=>registerReadClassifier,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runHostCommand:()=>runHostCommand,runHostRequest:()=>runHostRequest,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,sanitizeTerminalLabel:()=>sanitizeTerminalLabel,serializeConversation:()=>serializeConversation2,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shardKey:()=>shardKey,shardSocketPath:()=>shardSocketPath,shardSocketPathForKey:()=>shardSocketPathForKey,shouldCompact:()=>shouldCompact2,stopHost:()=>stopHost,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,truncateToVisualLines:()=>truncateToVisualLines,withBundledBunCommands:()=>withBundledBunCommands,withFileMutationQueue:()=>withFileMutationQueue2,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync3,mkdirSync as mkdirSync2,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync2,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname5,join as join6}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve46,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value2=>{settled||(settled=!0,cleanup(),resolve46(value2))},error2=>{settled||(settled=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname5(this.authPath);existsSync3(dir)||mkdirSync2(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync3(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync3(this.authPath)&&chmodSync(temporary,statSync2(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path15){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path15,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path15,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release4;try{release4=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release4&&release4()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let release4=await import_proper_lockfile.default.lock(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onCompromised});return signal?.aborted&&(await release4(),signal.throwIfAborted()),release4}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve46=>setTimeout(resolve46,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release4,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release4=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release4)try{await release4()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);let value2=credential;if(value2.type==="api_key"){let validKey=value2.key===void 0||typeof value2.key=="string",validEnv=value2.env===void 0||typeof value2.env=="object"&&value2.env!==null&&!Array.isArray(value2.env)&&Object.values(value2.env).every(entry=>typeof entry=="string");if(validKey&&validEnv)continue}else if(value2.type==="oauth"&&typeof value2.access=="string"&&typeof value2.refresh=="string"&&typeof value2.expires=="number"&&Number.isFinite(value2.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}return this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);if(options?.signal?.throwIfAborted(),!!credential)return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.busyReads=0,this.dataLoaded=!1,this.dataFromBusyRead=!1,this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath&&this.readState.loaded){this.data=this.readState.data,this.dataLoaded=!0;let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join6(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data);return{data:migrated.data,repaired:repaired.repaired,migrated:migrated.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync3(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS)}updateReadState(data,revision){this.data=data,this.dataLoaded=!0,this.dataFromBusyRead=!1,this.readState.data=data,this.readState.loaded=!0,this.readState.revision=revision}reload(){let data={},revision;try{return this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision),"loaded"}catch(error2){return this.recordError(error2 instanceof Error?error2:new Error(String(error2))),error2 instanceof CredentialStoreBusyError?(this.dataLoaded||(this.busyReads++,this.dataFromBusyRead=!0),"busy"):"failed"}}isCredentialStoreBusy(){return this.dataFromBusyRead}getBusyReadCount(){return this.busyReads}noteBusyFallback(error2){error2 instanceof CredentialStoreBusyError&&!this.readState.loaded&&this.busyReads++}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.noteBusyFallback(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch(error2){return options?.signal?.throwIfAborted(),this.noteBusyFallback(error2),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),credential?.type!=="api_key"||credential.key===void 0?credential:{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value2=>{if(value2===void 0)throw new Error("Login cancelled");return value2});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join6(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{EventEmitter}from"node:events";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var providerScopeStorage=new AsyncLocalStorage2,ProviderScope=class{constructor(){this.overlay=new Map,this.imagesOverlay=new Map,this.state="active"}close(){this.state="closed",this.overlay.clear(),this.imagesOverlay.clear()}};installProviderScopeAccessor(()=>providerScopeStorage.getStore());installImagesProviderScopeAccessor(()=>providerScopeStorage.getStore());function activeProviderScope(){return providerScopeStorage.getStore()}function runWithProviderScope(scope,fn){if(scope.state==="closed")throw new Error("Provider scope is closed");return providerScopeStorage.run(scope,fn)}function bindToProviderScope(fn){let scope=providerScopeStorage.getStore();if(!scope)throw new Error("No active provider scope to bind");return(...args)=>runWithProviderScope(scope,()=>fn(...args))}var EXTENSION_RPC_EVENT_CHANNEL="senpi:extension-rpc-event";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let scopedHandler=bindHandler(handler),safeHandler=async data=>{try{await scopedHandler(data)}catch(err2){console.error(`Event handler error (${channel}):`,err2)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}function bindHandler(handler){try{return bindToProviderScope(handler)}catch{return handler}}import{AsyncLocalStorage as AsyncLocalStorage3}from"node:async_hooks";var kernelToolsStorage=new AsyncLocalStorage3;var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text2){return{render(width){return wrapTextWithAnsi(text2,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec2,options,theme2){let box2=new Box(1,1,text2=>theme2.bg("customMessageBg",text2));box2.addChild(noticeText(theme2.fg(spec2.tone??"accent",`${BOLD}${spec2.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec2.why)));for(let line of spec2.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec2.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec2.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec2=map(message);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}function noticeEntryRenderer(map){return(entry,options,theme2)=>{let spec2=map(entry);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}import{join as join9}from"node:path";import{dirname as dirname7,join as join8}from"node:path";import{mkdirSync as mkdirSync3,readFileSync as readFileSync6,renameSync as renameSync3,writeFileSync as writeFileSync4}from"node:fs";import{dirname as dirname6}from"node:path";var CACHE_FILE="claude-code-version.json";function resolveClaudeCodeVersionCachePath(env=process.env){return`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/${CACHE_FILE}`}function isCachedVersion(value2){return typeof value2=="object"&&value2!==null&&typeof value2.version=="string"&&typeof value2.checkedAt=="number"}function createClaudeCodeVersionFileStore(path15){let savingEnabled=!0;return{load:()=>{let parsed;try{parsed=JSON.parse(readFileSync6(path15,"utf8"))}catch{return}return isCachedVersion(parsed)?parsed:void 0},save:record7=>{if(savingEnabled)try{mkdirSync3(dirname6(path15),{recursive:!0});let temporaryPath=`${path15}.${process.pid}.tmp`;writeFileSync4(temporaryPath,`${JSON.stringify(record7)}
|
|
708
|
+
`)}function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneLine(text2){if(text2===void 0)return;let collapsed=text2.replace(/\s+/g," ").trim();if(collapsed.length!==0)return collapsed.length<=160?collapsed:`${collapsed.slice(0,157)}...`}function compactParameters(parameters){if(isRecord4(parameters))try{return JSON.stringify(parameters)}catch(error2){if(error2 instanceof TypeError)return;throw error2}}var ToolSearchService=class{#runtime;#feeds=new Map;#extensionDocs=[];#extensionFingerprint="";#registryGeneration=0;#historyScannedGeneration=-1;#registerToolSearch;#removedToolHints=()=>({});#disposed;constructor(runtime){this.#runtime=runtime,this.#feeds.set("extension",{docs:[],hooks:{activate:names=>this.#promoteExtensionTools(names)}})}#nativeInjectionFailure=null;get isDisposed(){return this.#disposed!==void 0}dispose(sessionId,reason){this.#disposed??={sessionId,reason},sessionServices.delete(this)}#assertLive(){if(this.#disposed===void 0)return;let{sessionId,reason}=this.#disposed;throw new Error(`The tool-search service of session ${sessionId} is disposed (${reason}). Resolve the live session's own tool-search service instead of a retained one.`)}noteNativeInjectionFailure(reason){this.#assertLive(),this.#nativeInjectionFailure=reason}takeNativeInjectionFailure(){this.#assertLive();let reason=this.#nativeInjectionFailure;return this.#nativeInjectionFailure=null,reason}bindRuntime(runtime){this.#runtime=runtime}bindActivationRuntime(runtime){this.#runtime={...this.#runtime,...runtime}}bindToolRegistrar(register){this.#registerToolSearch=register}bindRemovedToolHints(provider){this.#removedToolHints=provider}hiddenToolHints(query){this.#assertLive();let hints=this.#removedToolHints(),byNormalizedName=new Map(Object.entries(hints).map(([name,hint])=>[normalizeToolName(name),{hint,name}]));if(byNormalizedName.size===0)return[];let seen=new Set,matched=[];for(let candidate of[normalizeToolName(query),...tokenizeToolText(query)]){let entry=byNormalizedName.get(candidate);entry===void 0||seen.has(entry.name)||(seen.add(entry.name),matched.push(entry))}return matched}getToolParameters(name){return this.#assertLive(),this.#runtime.getAllTools().find(tool=>tool.name===name)?.parameters}beginSession(){this.#assertLive(),this.#feeds.delete("mcp"),this.#registryGeneration+=1,this.#historyScannedGeneration=-1,this.#refreshExtensionDocs(),this.#syncToolSearchLifecycle()}feed(source2,docs,hooks){this.#assertLive();let validDocs=docs.filter(doc=>isValidDocument(doc,source2));this.#feeds.set(source2,{docs:validDocs,hooks}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle()}getCatalog(){return this.#assertLive(),this.#refreshExtensionDocs(),[...this.#feeds.get("mcp")?.docs??[],...this.#extensionDocs]}search(query,limit=10,options={}){return buildBm25Index(this.getCatalog()).search(query,limit,{precision:DEFAULT_BM25_PRECISION,...options})}activate(matches){this.#assertLive();let namesBySource=new Map;for(let match of matches){let names=namesBySource.get(match.doc.source)??[];names.push(match.name),namesBySource.set(match.doc.source,names)}for(let[source2,names]of namesBySource)this.#feeds.get(source2)?.hooks.activate(names);let active=new Set(this.#runtime.getActiveTools());return matches.map(({name})=>name).filter(name=>active.has(name))}activateTool(name){let doc=this.getCatalog().find(candidate=>candidate.name===name);return doc===void 0?!1:(this.#feeds.get(doc.source)?.hooks.activate([name]),this.#runtime.getActiveTools().includes(name))}maybeRehydrateFromHistory(messages){let catalog=this.getCatalog();if(this.#historyScannedGeneration===this.#registryGeneration)return[];this.#historyScannedGeneration=this.#registryGeneration;let docsByName=new Map(catalog.map(doc=>[doc.name,{name:doc.name,registrationId:doc.registrationId,source:doc.source,allowLazyActivation:!0}])),restored=rehydrate(messages,docsByName);return restored.length>0&&this.#activateNames(restored,catalog),restored}#refreshExtensionDocs(){let docs=this.#runtime.getAllTools().filter(tool=>tool.exposure==="search"&&tool.allowLazyActivation).map(extensionDocument).filter(doc=>doc!==void 0).sort((left,right)=>left.name.localeCompare(right.name)),fingerprint=JSON.stringify(docs);fingerprint!==this.#extensionFingerprint&&(this.#extensionDocs=docs,this.#extensionFingerprint=fingerprint,this.#feeds.set("extension",{docs,hooks:{activate:names=>this.#promoteExtensionTools(names)}}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle())}#activateNames(names,catalog=this.getCatalog()){let sourceByName=new Map(catalog.map(doc=>[doc.name,doc.source])),namesBySource=new Map;for(let name of names){let source2=sourceByName.get(name);if(source2===void 0)continue;let sourceNames=namesBySource.get(source2)??[];sourceNames.push(name),namesBySource.set(source2,sourceNames)}for(let[source2,sourceNames]of namesBySource)this.#feeds.get(source2)?.hooks.activate(sourceNames)}#syncToolSearchLifecycle(){let hasDocuments=this.#extensionDocs.length>0||(this.#feeds.get("mcp")?.docs.length??0)>0;hasDocuments&&this.#registerToolSearch?.();let current=this.#runtime.getActiveTools(),isActive2=current.includes(TOOL_SEARCH_TOOL_NAME);hasDocuments!==isActive2&&this.#runtime.setActiveTools(hasDocuments?[...current,TOOL_SEARCH_TOOL_NAME]:current.filter(name=>name!==TOOL_SEARCH_TOOL_NAME))}#promoteExtensionTools(names){if(names.length===0)return;let current=this.#runtime.getActiveTools(),active=new Set(current),added=[...new Set(names.filter(name=>!active.has(name)))].sort();this.#runtime.setActiveTools([...current,...added])}};function extensionDocument(tool){if(tool.name.length===0)return;let ownerLabel=extensionOwnerLabel(tool),registrationId=deriveExtensionRegistrationId(tool.sourceInfo,tool.name);if(registrationId.length!==0)return{name:tool.name,label:tool.label,aliases:[],description:tool.description,searchText:tool.searchText,keywords:tool.searchKeywords,source:"extension",group:tool.searchGroup??ownerLabel,ownerLabel,registrationId}}function extensionOwnerLabel(tool){let fileName=basename4(tool.sourceInfo.path),extension=extname(fileName);return extension.length===0?fileName:fileName.slice(0,-extension.length)}function isValidDocument(doc,source2){return doc.source===source2&&doc.name.length>0&&doc.registrationId.length>0}var scopedService=new AsyncLocalStorage,servicesByExtensionLoad=new WeakMap,sessionServices=new Set,sessionlessService=null;function installScopedToolSearchService(value2){scopedService.enterWith(value2)}function registerToolSearchServiceForExtensionLoad(pi,value2){let load=extensionLoadKey(pi);load!==void 0&&servicesByExtensionLoad.set(load,value2)}function getToolSearchServiceForExtension(pi){let load=extensionLoadKey(pi);return load===void 0?void 0:servicesByExtensionLoad.get(load)}function adoptToolSearchServiceForSession(extensionLoad){let value2=servicesByExtensionLoad.get(extensionLoad);return value2!==void 0&&sessionServices.add(value2),value2}function getToolSearchService(runtime){let scoped=scopedService.getStore();if(scoped!==void 0)return runtime!==void 0&&scoped.bindRuntime(runtime),scoped;if(sessionServices.size===1)return[...sessionServices][0];if(sessionServices.size>1)throw new Error(`getToolSearchService() cannot choose between ${sessionServices.size} live sessions; resolve the service through the session that owns it`);if(sessionlessService===null){if(runtime===void 0)throw new Error("ToolSearchService runtime is not bound");sessionlessService=new ToolSearchService(runtime)}else runtime!==void 0&&sessionlessService.bindRuntime(runtime);return sessionlessService}import*as fs3 from"node:fs";import{createRequire as createRequire4}from"node:module";import*as path11 from"node:path";import{fileURLToPath as fileURLToPath7}from"node:url";var oauth_exports={};__export(oauth_exports,{loadAnthropicOAuth:()=>loadAnthropicOAuth,registerBundledOAuthFlowLoaders:()=>registerBundledOAuthFlowLoaders});var dist_exports3={};__export(dist_exports3,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS2,DEFAULT_HOST_LAUNCH_SPEC:()=>DEFAULT_HOST_LAUNCH_SPEC,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES3,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ENDPOINT_REGISTRY_VERSION:()=>ENDPOINT_REGISTRY_VERSION,EVAL_HANDLE_ERROR_CODES:()=>EVAL_HANDLE_ERROR_CODES,EvalHandleError:()=>EvalHandleError,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,GENERATION_HANDOFF_CAPABILITY:()=>GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR:()=>HOST_EXIT_ERROR,HOST_EXIT_FALLBACK:()=>HOST_EXIT_FALLBACK,HOST_EXIT_OK:()=>HOST_EXIT_OK,HOST_EXIT_REFUSED:()=>HOST_EXIT_REFUSED,HOST_EXIT_USAGE:()=>HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION:()=>HOST_PROTOCOL_VERSION,HostEnsureRefusedError:()=>HostEnsureRefusedError,HostLaunchSpecError:()=>HostLaunchSpecError,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,PINNED_HOST_CLIENT_CAPABILITIES:()=>PINNED_HOST_CLIENT_CAPABILITIES,ProjectTrustStore:()=>ProjectTrustStore,REQUIRED_HOST_CAPABILITIES:()=>REQUIRED_HOST_CAPABILITIES,RpcClient:()=>RpcClient,RpcClientOpenInFlightError:()=>RpcClientOpenInFlightError,RpcTransportGoneError:()=>RpcTransportGoneError,SESSION_CONTROL_DELIVERY_TYPE:()=>SESSION_CONTROL_DELIVERY_TYPE,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,TUI_PROBE_TIMEOUT_MS:()=>TUI_PROBE_TIMEOUT_MS,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UnknownCommandError:()=>UnknownCommandError,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,VIRTUAL_MODEL_STATE_ENTRY:()=>VIRTUAL_MODEL_STATE_ENTRY,buildContextEntries:()=>buildContextEntries,buildNoticeBox:()=>buildNoticeBox,buildSessionContext:()=>buildSessionContext,buildSessionProjection:()=>buildSessionProjection,calculateContextTokens:()=>calculateContextTokens2,classifyEndpointLiveness:()=>classifyEndpointLiveness,classifyRead:()=>classifyRead,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary2,collectOrphanedChildren:()=>collectOrphanedChildren,compact:()=>compact2,compareEngineOrdinal:()=>compareEngineOrdinal,connectWebViewService:()=>connectWebViewService,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool2,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool2,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createHostDaemonPaths:()=>createHostDaemonPaths,createLocalBashOperations:()=>createLocalBashOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool2,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool2,createWriteToolDefinition:()=>createWriteToolDefinition,daemonDirectoryName:()=>daemonDirectoryName,decideHostAction:()=>decideHostAction,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,endpointProbeTimeoutMs:()=>endpointProbeTimeoutMs,engineBuildIdentity:()=>engineBuildIdentity,engineBuildIdentityFrom:()=>engineBuildIdentityFrom,ensureHost:()=>ensureHost,estimateTokens:()=>estimateTokens2,findCutPoint:()=>findCutPoint2,findTurnStartIndex:()=>findTurnStartIndex2,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize2,formatSkillsForPrompt:()=>formatSkillsForPrompt,gcHostEndpoints:()=>gcHostEndpoints,generateBranchSummary:()=>generateBranchSummary2,generateDiffString:()=>generateDiffString2,generateSummary:()=>generateSummary2,generateSummaryWithUsage:()=>generateSummaryWithUsage2,generateUnifiedPatch:()=>generateUnifiedPatch2,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage2,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,handoffHost:()=>handoffHost,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isSessionControlDeliveryDetails:()=>isSessionControlDeliveryDetails,isToolCallEventType:()=>isToolCallEventType,isTransportGoneError:()=>isTransportGoneError,isWriteToolResult:()=>isWriteToolResult,kernelToolsStorage:()=>kernelToolsStorage,keyHint:()=>keyHint,keyText:()=>keyText,listHostEndpoints:()=>listHostEndpoints,loadHostLaunchSpec:()=>loadHostLaunchSpec,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills2,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,noticeEntryRenderer:()=>noticeEntryRenderer,noticeMessageRenderer:()=>noticeMessageRenderer,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter3,parseHostLaunchSpec:()=>parseHostLaunchSpec,parseHostProtocolInfo:()=>parseHostProtocolInfo,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries2,probeHost:()=>probeHost,rawKeyHint:()=>rawKeyHint,readAllHostStatus:()=>readAllHostStatus,readHostStatus:()=>readHostStatus,readOwnFootprint:()=>readOwnFootprint,readProcessFootprint:()=>readProcessFootprint,readStoredCredential:()=>readStoredCredential,registerReadClassifier:()=>registerReadClassifier,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runHostCommand:()=>runHostCommand,runHostRequest:()=>runHostRequest,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,sanitizeTerminalLabel:()=>sanitizeTerminalLabel,serializeConversation:()=>serializeConversation2,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shardKey:()=>shardKey,shardSocketPath:()=>shardSocketPath,shardSocketPathForKey:()=>shardSocketPathForKey,shouldCompact:()=>shouldCompact2,stopHost:()=>stopHost,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,truncateToVisualLines:()=>truncateToVisualLines,withBundledBunCommands:()=>withBundledBunCommands,withFileMutationQueue:()=>withFileMutationQueue2,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync3,mkdirSync as mkdirSync2,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync2,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname5,join as join6}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve46,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value2=>{settled||(settled=!0,cleanup(),resolve46(value2))},error2=>{settled||(settled=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname5(this.authPath);existsSync3(dir)||mkdirSync2(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync3(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync3(this.authPath)&&chmodSync(temporary,statSync2(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path15){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path15,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path15,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release4;try{release4=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release4&&release4()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let release4=await import_proper_lockfile.default.lock(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onCompromised});return signal?.aborted&&(await release4(),signal.throwIfAborted()),release4}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve46=>setTimeout(resolve46,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release4,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release4=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release4)try{await release4()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);let value2=credential;if(value2.type==="api_key"){let validKey=value2.key===void 0||typeof value2.key=="string",validEnv=value2.env===void 0||typeof value2.env=="object"&&value2.env!==null&&!Array.isArray(value2.env)&&Object.values(value2.env).every(entry=>typeof entry=="string");if(validKey&&validEnv)continue}else if(value2.type==="oauth"&&typeof value2.access=="string"&&typeof value2.refresh=="string"&&typeof value2.expires=="number"&&Number.isFinite(value2.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}return this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);if(options?.signal?.throwIfAborted(),!!credential)return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.busyReads=0,this.dataLoaded=!1,this.dataFromBusyRead=!1,this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath&&this.readState.loaded){this.data=this.readState.data,this.dataLoaded=!0;let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join6(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data);return{data:migrated.data,repaired:repaired.repaired,migrated:migrated.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync3(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS)}updateReadState(data,revision){this.data=data,this.dataLoaded=!0,this.dataFromBusyRead=!1,this.readState.data=data,this.readState.loaded=!0,this.readState.revision=revision}reload(){let data={},revision;try{return this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision),"loaded"}catch(error2){return this.recordError(error2 instanceof Error?error2:new Error(String(error2))),error2 instanceof CredentialStoreBusyError?(this.dataLoaded||(this.busyReads++,this.dataFromBusyRead=!0),"busy"):"failed"}}isCredentialStoreBusy(){return this.dataFromBusyRead}getBusyReadCount(){return this.busyReads}noteBusyFallback(error2){error2 instanceof CredentialStoreBusyError&&!this.readState.loaded&&this.busyReads++}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.noteBusyFallback(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch(error2){return options?.signal?.throwIfAborted(),this.noteBusyFallback(error2),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),credential?.type!=="api_key"||credential.key===void 0?credential:{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value2=>{if(value2===void 0)throw new Error("Login cancelled");return value2});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join6(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{EventEmitter}from"node:events";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var providerScopeStorage=new AsyncLocalStorage2,ProviderScope=class{constructor(){this.overlay=new Map,this.imagesOverlay=new Map,this.state="active"}close(){this.state="closed",this.overlay.clear(),this.imagesOverlay.clear()}};installProviderScopeAccessor(()=>providerScopeStorage.getStore());installImagesProviderScopeAccessor(()=>providerScopeStorage.getStore());function activeProviderScope(){return providerScopeStorage.getStore()}function runWithProviderScope(scope,fn){if(scope.state==="closed")throw new Error("Provider scope is closed");return providerScopeStorage.run(scope,fn)}function bindToProviderScope(fn){let scope=providerScopeStorage.getStore();if(!scope)throw new Error("No active provider scope to bind");return(...args)=>runWithProviderScope(scope,()=>fn(...args))}var EXTENSION_RPC_EVENT_CHANNEL="senpi:extension-rpc-event";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let scopedHandler=bindHandler(handler),safeHandler=async data=>{try{await scopedHandler(data)}catch(err2){console.error(`Event handler error (${channel}):`,err2)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}function bindHandler(handler){try{return bindToProviderScope(handler)}catch{return handler}}var EVAL_HANDLE_ERROR_CODES=["eval_handle_stale","eval_handle_forbidden","eval_handle_not_found","eval_handle_pending","eval_handle_operation_unsupported","eval_wait_unavailable","eval_wait_timeout","eval_wait_empty","eval_pool_open","eval_workpool_failed"],EvalHandleError=class extends Error{constructor(code,message,details){super(`${code}: ${message}`),this.name="EvalHandleError",this.code=code,details!==void 0&&(this.details=details)}};import{AsyncLocalStorage as AsyncLocalStorage3}from"node:async_hooks";var kernelToolsStorage=new AsyncLocalStorage3;var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text2){return{render(width){return wrapTextWithAnsi(text2,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec2,options,theme2){let box2=new Box(1,1,text2=>theme2.bg("customMessageBg",text2));box2.addChild(noticeText(theme2.fg(spec2.tone??"accent",`${BOLD}${spec2.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec2.why)));for(let line of spec2.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec2.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec2.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec2=map(message);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}function noticeEntryRenderer(map){return(entry,options,theme2)=>{let spec2=map(entry);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}import{join as join9}from"node:path";import{dirname as dirname7,join as join8}from"node:path";import{mkdirSync as mkdirSync3,readFileSync as readFileSync6,renameSync as renameSync3,writeFileSync as writeFileSync4}from"node:fs";import{dirname as dirname6}from"node:path";var CACHE_FILE="claude-code-version.json";function resolveClaudeCodeVersionCachePath(env=process.env){return`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/${CACHE_FILE}`}function isCachedVersion(value2){return typeof value2=="object"&&value2!==null&&typeof value2.version=="string"&&typeof value2.checkedAt=="number"}function createClaudeCodeVersionFileStore(path15){let savingEnabled=!0;return{load:()=>{let parsed;try{parsed=JSON.parse(readFileSync6(path15,"utf8"))}catch{return}return isCachedVersion(parsed)?parsed:void 0},save:record7=>{if(savingEnabled)try{mkdirSync3(dirname6(path15),{recursive:!0});let temporaryPath=`${path15}.${process.pid}.tmp`;writeFileSync4(temporaryPath,`${JSON.stringify(record7)}
|
|
709
709
|
`),renameSync3(temporaryPath,path15)}catch{savingEnabled=!1}}}}function installClaudeCodeVersionFileStore(options={}){let env=process.env,offline=options.offline??(env.PI_OFFLINE!==void 0&&env.PI_OFFLINE!==""&&env.PI_OFFLINE!=="0");installClaudeCodeVersionStore(createClaudeCodeVersionFileStore(options.path??resolveClaudeCodeVersionCachePath(env)),{offline})}var REFUSED_AFTER_REEXCHANGE="A freshly re-exchanged token for this account was refused as well; log in to this account again or switch accounts.";function refusesToken(event,statuses){if(event.type!=="error"||event.reason!=="error")return!1;let status=event.error.providerDiagnostic?.httpStatus;return status!==void 0&&statuses.includes(status)}async function*markRefusalAfterReexchange(stream2,statuses){let committed=!1;for await(let event of stream2)!committed&&event.type==="error"&&refusesToken(event,statuses)&&(event.error.errorMessage=`${event.error.errorMessage??"provider stream error"}
|
|
710
710
|
${REFUSED_AFTER_REEXCHANGE}`),committed||=isCommittedRotationOutput(event),yield event}async function retryOnceOnRejectedToken(attempt2){let first=await attempt2(void 0),statuses=first.rejectedTokenStatuses??[],rejectedAccess=first.rejectableAccess;if(rejectedAccess===void 0||statuses.length===0)return first.stream;let final=first.stream;async function*events(){let iterator=first.stream[Symbol.asyncIterator](),held=[];try{for(;;){let next=await iterator.next();if(next.done){yield*held;return}let event=next.value;if(refusesToken(event,statuses)){await iterator.return?.(void 0);let retried=await attempt2(rejectedAccess);final=retried.stream,yield*markRefusalAfterReexchange(retried.stream,statuses);return}if(isCommittedRotationOutput(event)){yield*held,yield event;break}held.push(event)}yield*{[Symbol.asyncIterator]:()=>iterator}}finally{await iterator.return?.(void 0)}}let source2=events();return typeof first.stream.result=="function"&&(source2.result=()=>final.result?.()??Promise.reject(new Error("provider stream has no result"))),source2}import{readFileSync as readFileSync8}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(typebox_exports.String({minLength:1}))},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1}),PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ModelPromptCacheSchema=typebox_exports.Object({short:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0})),long:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0}))}),ImageResizeSchema=typebox_exports.Object({maxWidth:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxHeight:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),jpegQuality:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:100}))}),ModelInputLimitsSchema=typebox_exports.Object({maxRequestBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),images:typebox_exports.Optional(typebox_exports.Object({resize:typebox_exports.Optional(ImageResizeSchema),maxPerMessage:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxPerRequest:typebox_exports.Optional(typebox_exports.Integer({minimum:1}))}))}),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean()),allowedFallbackModels:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Object({provider:typebox_exports.String({minLength:1}),model:typebox_exports.String({minLength:1}),cost:ModelCostSchema}),{maxItems:3}))}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority"),typebox_exports.Literal("ultrafast")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(ModelCostSchema),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(typebox_exports.String({minLength:1})),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);import{chmodSync as chmodSync2,existsSync as existsSync4,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync2,statSync as statSync3,writeFileSync as writeFileSync5}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord5=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2),JsoncSpanScanner=class{constructor(text2){this.text=text2}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
711
711
|
`||c==="\r"||c==="\uFEFF")i++;else if(this.text.startsWith("//",i))i=this.lineEnd(i);else if(this.text.startsWith("/*",i))i=this.blockCommentEnd(i);else break}return i}value(from){let start=this.skipTrivia(from),c=this.text[start];if(c==="{")return this.object(start);if(c==="[")return this.array(start);if(c==='"')return{start,end:this.stringEnd(start)};let end=start;for(;end<this.text.length&&!/[\s,\]}/]/.test(this.text[end]??"");)end++;if(end===start)throw new Error(`unexpected character at offset ${start}`);return{start,end}}object(start){let members=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="}")return{start,end:i+1,members};if(c===","){i++;continue}if(c!=='"')throw new Error(`expected a key at offset ${i}`);let keySpan={start:i,end:this.stringEnd(i)},colon=this.skipTrivia(keySpan.end);if(this.text[colon]!==":")throw new Error(`expected ':' at offset ${colon}`);let value2=this.value(colon+1);members.push({key:JSON.parse(this.text.slice(keySpan.start,keySpan.end)),keySpan,value:value2}),i=value2.end}}array(start){let elements=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="]")return{start,end:i+1,elements};if(c===","){i++;continue}let element=this.value(i);elements.push(element),i=element.end}}stringEnd(start){for(let i=start+1;i<this.text.length;i++)if(this.text[i]==="\\")i++;else if(this.text[i]==='"')return i+1;throw new Error("unterminated string")}blockCommentEnd(from){let close=this.text.indexOf("*/",from+2);if(close<0)throw new Error("unterminated comment");return close+2}lineEnd(from){let newline=this.text.indexOf(`
|
|
@@ -2413,7 +2413,7 @@ ${renderToolDiff(generateAddedContentDiff(normalizedContent,maxLines),{filePath:
|
|
|
2413
2413
|
|
|
2414
2414
|
${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",line)).join(`
|
|
2415
2415
|
`)}`}remaining>0&&(text2+=`${theme2.fg("muted",`
|
|
2416
|
-
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path15,content)=>fsWriteFile2(path15,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path15,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path15,ctx?.cwd||cwd),dir=dirname43(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path15}`}],details:createWriteDetails(path15,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync35,mkdirSync as mkdirSync16}from"node:fs";import{basename as basename24,join as join69,parse as parse6,resolve as resolve39}from"node:path";import{basename as basename23}from"node:path";var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function isUserBashEventResult(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function sameMessages(left,right){return left.length===right.length&&left.every((message,index)=>message===right[index])}function restoreSystemMessages(current,visible,returned){if(sameMessages(returned,visible))return current;let head=getCurrentSystemMessage(current);return head?[head,...returned]:returned}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getBrowserEngineFn=()=>{},this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.getCallableToolsFn=()=>[],this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendUserMessage=(content,options)=>this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options)),this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.getSettings=actions.getSettings,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),this.runtime.createContext=()=>this.createContext(),this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err2){this.emitError({extensionPath,event:"register_virtual_model",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run2){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run2().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path15,resolvedPath})=>({path:path15,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename23(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context=await buildContext2(entries),valid3=!0;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,baseEvent.type))for(let handler of handlers){let event={...baseEvent,entries,continue:shouldContinue,context};try{let handlerResult=await handler(event,ctx);handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}catch(err2){this.emitError({extensionPath:ext.path,event:baseEvent.type,error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}try{context=await buildContext2(entries),valid3=!0}catch(err2){valid3=!1,this.emitError({extensionPath:ext.path,event:baseEvent.type,error:`Invalid boundary entries: ${err2 instanceof Error?err2.message:String(err2)}`,stack:err2 instanceof Error?err2.stack:void 0})}}return valid3?{entries,continue:shouldContinue,context,valid:!0}:{entries:[],continue:!1,context,valid:!1}}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve46=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve46(!0),budget.timeoutMs)),settled.then(()=>resolve46(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):this.dispatchEmit(event)}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"message_end"))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}if(modified)return{content:currentEvent.content,details:currentEvent.details,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}return result3}async emitUserBash(event){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err2}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"context"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hasSystemMessages=currentMessages.some(message=>message.role==="system"),visibleMessages=hasSystemMessages?currentMessages.filter(message=>message.role!=="system"):currentMessages,visibleSnapshot=visibleMessages.slice(),returned=(await handler({type:"context",messages:visibleMessages},this.createContext(ext.path)))?.messages??(sameMessages(visibleMessages,visibleSnapshot)?void 0:visibleMessages);if(!returned)continue;currentMessages=hasSystemMessages?restoreSystemMessages(currentMessages,visibleSnapshot,returned):returned}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"context_with_system"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hadLeadingSystemMessage=currentMessages[0]?.role==="system";currentMessages=(await handler({type:"context_with_system",messages:currentMessages},this.createContext(ext.path)))?.messages??currentMessages,hadLeadingSystemMessage&¤tMessages[0]?.role!=="system"&&this.emitError({extensionPath:ext.path,event:"context_with_system",error:"Handler removed the leading system message; the request has no prompt or initial tool declarations. Keep it at index 0 or replace a dropped prefix with getCurrentSystemMessage()."})}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context_with_system",error:message,stack})}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}return currentPayload}async emitBeforeProviderHeaders(headers){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source2,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{existsSync as existsSync34}from"node:fs";function getMissingSessionCwdIssue(sessionManager,fallbackCwd){let sessionFile=sessionManager.getSessionFile();if(!sessionFile)return;let sessionCwd=sessionManager.getCwd();if(!(!sessionCwd||existsSync34(sessionCwd)))return{sessionFile,sessionCwd,fallbackCwd}}function formatMissingSessionCwdError(issue){let sessionFile=issue.sessionFile?`
|
|
2416
|
+
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path15,content)=>fsWriteFile2(path15,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path15,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path15,ctx?.cwd||cwd),dir=dirname43(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path15}`}],details:createWriteDetails(path15,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync35,mkdirSync as mkdirSync16}from"node:fs";import{basename as basename24,join as join69,parse as parse6,resolve as resolve39}from"node:path";import{basename as basename23}from"node:path";var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function isUserBashEventResult(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function sameMessages(left,right){return left.length===right.length&&left.every((message,index)=>message===right[index])}function restoreSystemMessages(current,visible,returned){if(sameMessages(returned,visible))return current;let head=getCurrentSystemMessage(current);return head?[head,...returned]:returned}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getBrowserEngineFn=()=>{},this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.getCallableToolsFn=()=>[],this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendUserMessage=(content,options)=>this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options)),this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.getSettings=actions.getSettings,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),this.runtime.createContext=()=>this.createContext(),this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err2){this.emitError({extensionPath,event:"register_virtual_model",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run2){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run2().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path15,resolvedPath})=>({path:path15,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename23(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},get evalHandleHost(){return runner.assertActive(),runner.runtime.evalHandleHost},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context=await buildContext2(entries),valid3=!0;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,baseEvent.type))for(let handler of handlers){let event={...baseEvent,entries,continue:shouldContinue,context};try{let handlerResult=await handler(event,ctx);handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}catch(err2){this.emitError({extensionPath:ext.path,event:baseEvent.type,error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}try{context=await buildContext2(entries),valid3=!0}catch(err2){valid3=!1,this.emitError({extensionPath:ext.path,event:baseEvent.type,error:`Invalid boundary entries: ${err2 instanceof Error?err2.message:String(err2)}`,stack:err2 instanceof Error?err2.stack:void 0})}}return valid3?{entries,continue:shouldContinue,context,valid:!0}:{entries:[],continue:!1,context,valid:!1}}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve46=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve46(!0),budget.timeoutMs)),settled.then(()=>resolve46(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):this.dispatchEmit(event)}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"message_end"))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}if(modified)return{content:currentEvent.content,details:currentEvent.details,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}return result3}async emitUserBash(event){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err2}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"context"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hasSystemMessages=currentMessages.some(message=>message.role==="system"),visibleMessages=hasSystemMessages?currentMessages.filter(message=>message.role!=="system"):currentMessages,visibleSnapshot=visibleMessages.slice(),returned=(await handler({type:"context",messages:visibleMessages},this.createContext(ext.path)))?.messages??(sameMessages(visibleMessages,visibleSnapshot)?void 0:visibleMessages);if(!returned)continue;currentMessages=hasSystemMessages?restoreSystemMessages(currentMessages,visibleSnapshot,returned):returned}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"context_with_system"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hadLeadingSystemMessage=currentMessages[0]?.role==="system";currentMessages=(await handler({type:"context_with_system",messages:currentMessages},this.createContext(ext.path)))?.messages??currentMessages,hadLeadingSystemMessage&¤tMessages[0]?.role!=="system"&&this.emitError({extensionPath:ext.path,event:"context_with_system",error:"Handler removed the leading system message; the request has no prompt or initial tool declarations. Keep it at index 0 or replace a dropped prefix with getCurrentSystemMessage()."})}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context_with_system",error:message,stack})}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}return currentPayload}async emitBeforeProviderHeaders(headers){for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source2,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{existsSync as existsSync34}from"node:fs";function getMissingSessionCwdIssue(sessionManager,fallbackCwd){let sessionFile=sessionManager.getSessionFile();if(!sessionFile)return;let sessionCwd=sessionManager.getCwd();if(!(!sessionCwd||existsSync34(sessionCwd)))return{sessionFile,sessionCwd,fallbackCwd}}function formatMissingSessionCwdError(issue){let sessionFile=issue.sessionFile?`
|
|
2417
2417
|
Session file: ${issue.sessionFile}`:"";return`Stored session working directory does not exist: ${issue.sessionCwd}${sessionFile}
|
|
2418
2418
|
Current working directory: ${issue.fallbackCwd}`}function formatMissingSessionCwdPrompt(issue){return`cwd from session file does not exist
|
|
2419
2419
|
${issue.sessionCwd}
|
|
@@ -2431,7 +2431,7 @@ $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.ex
|
|
|
2431
2431
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2432
2432
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2433
2433
|
|
|
2434
|
-
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync36}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join71}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync36(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join71(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync36(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join71(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync36(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-VRCAO7RV.js");return await handlePackageCommand(args,runtimeOptions)}async function dispatchConfigCommand(args,runtimeOptions={}){if(args[0]!==CONFIG_COMMAND_ARGV)return!1;let{handleConfigCommand}=await import("./package-manager-cli-VRCAO7RV.js");return await handleConfigCommand(args,runtimeOptions)}async function dispatchAppServerCommand(args){if(args[0]!==APP_SERVER_COMMAND_ARGV)return!1;let{handleAppServerCommand}=await import("./app-server-command-GNTX4MZT.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-N6XS5O67.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-QTYSUYO2.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2434
|
+
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync36}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join71}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync36(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join71(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync36(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join71(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync36(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-NCD5FQGV.js");return await handlePackageCommand(args,runtimeOptions)}async function dispatchConfigCommand(args,runtimeOptions={}){if(args[0]!==CONFIG_COMMAND_ARGV)return!1;let{handleConfigCommand}=await import("./package-manager-cli-NCD5FQGV.js");return await handleConfigCommand(args,runtimeOptions)}async function dispatchAppServerCommand(args){if(args[0]!==APP_SERVER_COMMAND_ARGV)return!1;let{handleAppServerCommand}=await import("./app-server-command-SO5RJ2N7.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-YXQAXNKK.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-UTXB465F.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2435
2435
|
`;continue}let attachment={type:"image",mimeType:processed.mimeType,data:processed.data};images.push(attachment),processed.hints.length>0?text2+=`<file name="${absolutePath}">${processed.hints.join(`
|
|
2436
2436
|
`)}</file>
|
|
2437
2437
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2490,11 +2490,11 @@ Press any key to continue...`)),await new Promise(resolve46=>{process.stdin.setR
|
|
|
2490
2490
|
`)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});if(await session.waitForSettledSessionWork(),mode==="text"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");if(lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted"){let described=describeProviderFailureForUser(assistantMsg.errorMessage);console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`)),exitCode=1}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
|
|
2491
2491
|
`):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
|
|
2492
2492
|
`),writeRawStdout(`${formatProviderNativeBody(content,!1)}
|
|
2493
|
-
`))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync44}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync44(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat12=linuxStat(pid),tail=stat12?.slice(stat12.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat12=linuxStat(pid),open8=stat12?.indexOf("(")??-1,close=stat12?.lastIndexOf(")")??-1;return stat12===void 0||open8===-1||close<=open8?"":stat12.slice(open8+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-7OVWGVIZ.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID12}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync24,renameSync as renameSync18,rmSync as rmSync14}from"node:fs";import{basename as basename27,dirname as dirname48,join as join83,relative as relative20,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve42(path15))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join83(current,QUARANTINE_DIR_NAME);let parent=dirname48(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join83(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join83(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync24(dirname48(quarantinePath),{recursive:!0}),renameSync18(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path15,error:error2})=>({type:"warning",message:`Failed to load extension "${path15}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2493
|
+
`))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync44}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync44(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat12=linuxStat(pid),tail=stat12?.slice(stat12.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat12=linuxStat(pid),open8=stat12?.indexOf("(")??-1,close=stat12?.lastIndexOf(")")??-1;return stat12===void 0||open8===-1||close<=open8?"":stat12.slice(open8+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-L4XQIATP.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID12}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync24,renameSync as renameSync18,rmSync as rmSync14}from"node:fs";import{basename as basename27,dirname as dirname48,join as join83,relative as relative20,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve42(path15))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join83(current,QUARANTINE_DIR_NAME);let parent=dirname48(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join83(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join83(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync24(dirname48(quarantinePath),{recursive:!0}),renameSync18(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path15,error:error2})=>({type:"warning",message:`Failed to load extension "${path15}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2494
2494
|
`));if(command.kind!=="check"){let signal=AbortSignal.timeout(15e3),modelRuntime=await ModelRuntime.create({allowModelNetwork:!1,signal}),credential2=await resolveCredentialForPrint(parsed,modelRuntime,command.kind,command.minExpiryMs,signal);return process.stdout.write(`${credential2}
|
|
2495
2495
|
`),!0}let requestedAuth=validateAuthCommandArgs(parsed,command.kind),result3,credential;try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create(),modelRuntime=await createAuthCheckModelRuntime(credentials);result3=await checkProviderAuth(parsed,modelRuntime,{refresh:!command.noRefresh}),command.credentials&&result3.status==="ready"&&(credential=await getProviderCredential(result3.provider,modelRuntime,credentials,{refresh:!command.noRefresh}),credential||(result3={status:"not_ready",provider:result3.provider,reason:"credential_not_available"}))}catch{result3={status:"invalid",provider:requestedAuth.provider??requestedAuth.model,reason:"invalid_state"}}let accounts=[];if(command.json&&result3.status!=="invalid")try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create();accounts=await summarizeCredentialAccounts(result3.provider,await credentials.read(result3.provider))}catch{}let output=command.json?JSON.stringify({...result3,accounts,...credential?{credentials:credential}:{}}):credential??result3.status;process.stdout.write(`${output}
|
|
2496
|
-
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-VTTRFGE7.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&runtimeSettingsManager.applyOverrides({retry:{modelFallback:launchProfile.retryFallback.modelFallback,fallbackChains:Object.fromEntries(Object.entries(launchProfile.retryFallback.fallbackChains).map(([key,entries])=>[key,[...entries]]))}}),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-JQDZPB6C.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-QLLTPWIM.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join84(agentDir,"auth.json")),authPath:join84(agentDir,"auth.json"),agentDir,modelsPath:join84(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
2497
|
-
`)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-2OPE6J7P.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-CM4C4ZFY.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{this.getData(await this.send({type:"close_session",sessionId},!1))}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path15){await this.send({type:"cleanup_bash_output",path:path15})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2496
|
+
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-VTTRFGE7.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&runtimeSettingsManager.applyOverrides({retry:{modelFallback:launchProfile.retryFallback.modelFallback,fallbackChains:Object.fromEntries(Object.entries(launchProfile.retryFallback.fallbackChains).map(([key,entries])=>[key,[...entries]]))}}),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-JQDZPB6C.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-5WTKAQJM.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join84(agentDir,"auth.json")),authPath:join84(agentDir,"auth.json"),agentDir,modelsPath:join84(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
2497
|
+
`)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-MWURKCP2.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ROO5W56P.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{this.getData(await this.send({type:"close_session",sessionId},!1))}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path15){await this.send({type:"cleanup_bash_output",path:path15})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2498
2498
|
|
|
2499
2499
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2500
2500
|
|
|
@@ -2539,7 +2539,7 @@ ${boundedContent}`}let output=getTextOutput(result3,showImages);return output&&(
|
|
|
2539
2539
|
${sanitizeFallbackString(output,FALLBACK_JSON_MAX_LENGTH)}`),text2}function isComponent(value2){return(typeof value2=="object"||typeof value2=="function")&&value2!==null&&typeof Reflect.get(value2,"render")=="function"&&typeof Reflect.get(value2,"invalidate")=="function"}var ToolRendererBoundary=class{constructor(component,fallback,onFailure){this.componentDisposed=!1,this.failed=!1,this.component=component,this.fallback=fallback,this.onFailure=onFailure}render(width){if(!this.failed){try{let lines=this.component.render(width);if(Array.isArray(lines)){let safeLines=[];for(let line of lines){if(typeof line!="string")throw new TypeError("Tool renderer returned a non-string line");safeLines.push(line)}return safeLines}}catch{return this.fail(),this.renderFallback(width)}this.fail()}return this.renderFallback(width)}invalidate(){if(!this.failed)try{this.component.invalidate()}catch{this.fail()}this.fallback?.invalidate()}dispose(){this.disposeComponent(),this.fallback?.dispose?.()}fail(){this.failed||(this.failed=!0,this.onFailure(),this.disposeComponent())}disposeComponent(){if(!this.componentDisposed){this.componentDisposed=!0;try{this.component.dispose?.()}catch{return}}}renderFallback(width){return this.fallback?.render(width)??[]}};var ToolExecutionRenderer=class extends Container{constructor(identity,state,onInvalidate,onToggleExpanded){super(),this.selfRenderContainer=new Container,this.rendererState={},this.identity=identity,this.state=state,this.onInvalidate=onInvalidate,this.onToggleExpanded=onToggleExpanded,this.builtInDefinition=createAllToolDefinitions(identity.cwd)[identity.toolName],this.contentBox=new Box(1,1,text2=>theme.bg("toolPendingBg",text2)),this.contentText=new Text("",1,1,text2=>theme.bg("toolPendingBg",text2)),this.addChild(this.hasRendererDefinition?this.renderShell==="self"?this.selfRenderContainer:this.contentBox:this.clickToExpand(this.contentText))}clickToExpand(component){let onToggleExpanded=this.onToggleExpanded;return onToggleExpanded?new MouseRegion(component,event=>{if(!(!this.state.result||event.type!=="click"||event.button!=="left"))return onToggleExpanded(),{handled:!0}}):component}get hasRendererDefinition(){return this.builtInDefinition!==void 0||this.identity.toolDefinition!==void 0}get hasResultRenderer(){return this.getResultRenderer()!==void 0}get renderShell(){return this.identity.toolDefinition?.renderShell??this.builtInDefinition?.renderShell??"default"}update(state){this.state=state;let background=state.isPartial?text2=>theme.bg("toolPendingBg",text2):state.result?.isError?text2=>theme.bg("toolErrorBg",text2):text2=>theme.bg("toolSuccessBg",text2),progress=state.isPartial?readToolProgress(state.result?.details):void 0;if(!this.hasRendererDefinition){this.contentText.setCustomBgFn(background);let text2=formatToolExecutionFallback(this.identity.toolName,state.args,state.result,state.showImages);progress&&(text2+=`
|
|
2540
2540
|
${formatToolProgressLine(progress,Date.now(),state.spinnerFrame)}`),this.contentText.setText(text2);return}let container=this.renderShell==="self"?this.selfRenderContainer:this.contentBox;container instanceof Box&&container.setBgFn(background),container.detachAll(),this.renderCall(container),state.result&&this.renderResult(container,state.result),progress&&container.addChild(new Text(formatToolProgressLine(progress,Date.now(),state.spinnerFrame),0,0))}getCallRenderer(){return this.identity.toolDefinition?.renderCall??this.builtInDefinition?.renderCall}getResultRenderer(){return this.identity.toolDefinition?.renderResult??this.builtInDefinition?.renderResult}getRenderContext(lastComponent){return{args:this.state.args,toolCallId:this.identity.toolCallId,invalidate:this.onInvalidate,lastComponent,state:this.rendererState,cwd:this.identity.cwd,executionStarted:this.state.executionStarted,argsComplete:this.state.argsComplete,isPartial:this.state.isPartial,expanded:this.state.expanded,showImages:this.state.showImages,imageProtocol:getCapabilities().images,isError:this.state.result?.isError??!1,hasResult:this.state.result!==void 0,spinnerFrame:this.state.spinnerFrame}}renderCall(container){let fallback=createToolCallFallback(this.identity.toolName,this.state.args,this.state.expanded),renderer=this.getCallRenderer();if(!renderer){container.addChild(this.clickToExpand(fallback));return}try{let component=renderer(this.state.args,theme,this.getRenderContext(this.callRendererComponent));this.addRendererComponent(container,"call",component,fallback)}catch{this.callRendererComponent=void 0,container.addChild(this.clickToExpand(fallback))}}renderResult(container,result3){let fallback=createToolResultFallback(result3,this.state.showImages),renderer=this.getResultRenderer();if(!renderer){fallback&&container.addChild(this.clickToExpand(fallback));return}try{let agentResult={content:result3.content,details:result3.details},component=renderer(agentResult,{expanded:this.state.expanded,isPartial:this.state.isPartial},theme,this.getRenderContext(this.resultRendererComponent));this.addRendererComponent(container,"result",component,fallback)}catch{this.resultRendererComponent=void 0,fallback&&container.addChild(this.clickToExpand(fallback))}}addRendererComponent(container,slot,value2,fallback){if(!isComponent(value2)){this.setRendererComponent(slot,void 0),fallback&&container.addChild(this.clickToExpand(fallback));return}this.setRendererComponent(slot,value2),container.addChild(this.clickToExpand(new ToolRendererBoundary(value2,fallback,()=>{this.getRendererComponent(slot)===value2&&this.setRendererComponent(slot,void 0)})))}getRendererComponent(slot){return slot==="call"?this.callRendererComponent:this.resultRendererComponent}setRendererComponent(slot,component){slot==="call"?this.callRendererComponent=component:this.resultRendererComponent=component}};var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.renderCache=new ToolExecutionRenderCache,this.animation=new ToolExecutionAnimation({invalidate:()=>this.invalidateRenderCache(),redraw:()=>{this.updateDisplay(),this.ui.requestRender()}}),this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.invalidate(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0,this.renderCache.finalizeResult(serializedToolResultBytes(result3))),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.renderCache.setImages(result3.content.filter(part=>part.type==="image").length),this.invalidateRenderCache()}stopAnimation(){this.animation.stop()}dispose(){this.stopAnimation(),this.renderCache.dispose(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}getRenderRevision(){if(!(this.presentation==="grok"||this.isPartial||!this.argsComplete||this.result===void 0||this.animation.running))return this.renderCache.revision}render(width){if(this.presentation==="grok")return super.render(width);let signature=this.createRenderSignature(),cached=this.renderCache.read(width,signature);if(cached)return cached;let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.renderCache.store(width,signature,lines),lines}updateDisplay(){let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state.isPartial,result:state.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state,result:collapseFallbackResult(state.result,state.showImages,state.expanded)}:state;renderer.update(renderState2),this.images.updateOptions({showImages:state.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.animation.frame,result:this.result?{...this.result,content:this.result.content.filter(part=>!isModelOnlyText(part))}:void 0}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){this.animation.spin(toolCardSpins(this.identity.toolName,this.createRenderState()))}updateTodoStrikeAnimation(){this.animation.strike(toolCardStrikes(this.identity.toolName,this.createRenderState()))}invalidateRenderCache(){this.renderCache.invalidate()}};var TREE_GUTTER_WIDTH=2,MIN_VISIBLE_ANCHOR_CONTENT_WIDTH=4,MAX_VISIBLE_ANCHOR_CONTENT_WIDTH=20,MIN_ANCHOR_CONTEXT_WIDTH=2,MAX_ANCHOR_CONTEXT_WIDTH=12;function renderHorizontalViewport(rows,width){let viewportWidth=Math.max(0,width-TREE_GUTTER_WIDTH),maxBodyWidth=rows.reduce((max,row)=>Math.max(max,row.bodyWidth),0),maxHorizontalScroll=Math.max(0,maxBodyWidth-viewportWidth),selectedRow=rows.find(row=>row.isSelected),horizontalScroll=0;if(selectedRow&&maxHorizontalScroll>0){let minVisibleAnchorContentWidth=Math.min(MAX_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.max(MIN_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.floor(viewportWidth/3)));if(selectedRow.anchorCol>viewportWidth-minVisibleAnchorContentWidth){let anchorContextWidth=Math.min(MAX_ANCHOR_CONTEXT_WIDTH,Math.max(MIN_ANCHOR_CONTEXT_WIDTH,Math.floor(viewportWidth/4)));horizontalScroll=Math.min(maxHorizontalScroll,selectedRow.anchorCol-anchorContextWidth)}}return rows.map(row=>{let line=horizontalScroll>0?`${row.gutter}${sliceByColumn(row.body,horizontalScroll,viewportWidth,!0)}\x1B[0m`:row.gutter+row.body;return truncateToWidth(line,width,"")})}var TreeList=class{constructor(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode){this.flatNodes=[],this.filteredNodes=[],this.selectedIndex=0,this.filterMode="default",this.searchQuery="",this.toolCallMap=new Map,this.multipleRoots=!1,this.showLabelTimestamps=!1,this.activePathIds=new Set,this.visibleParentMap=new Map,this.visibleChildrenMap=new Map,this.lastSelectedId=null,this.foldedNodes=new Set,this.currentLeafId=currentLeafId,this.maxVisibleLines=maxVisibleLines,this.filterMode=initialFilterMode??"default",this.multipleRoots=tree.length>1,this.flatNodes=this.flattenTree(tree),this.buildActivePath(),this.applyFilter();let targetId=initialSelectedId??currentLeafId;this.selectedIndex=this.findNearestVisibleIndex(targetId),this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??null}findNearestVisibleIndex(entryId){if(this.filteredNodes.length===0)return 0;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let visibleIdToIndex=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=entryId;for(;currentId!==null;){let index=visibleIdToIndex.get(currentId);if(index!==void 0)return index;let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}return this.filteredNodes.length-1}buildActivePath(){if(this.activePathIds.clear(),!this.currentLeafId)return;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let currentId=this.currentLeafId;for(;currentId;){this.activePathIds.add(currentId);let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}}flattenTree(roots){let result3=[];this.toolCallMap.clear();let stack=[],containsActive=new Map,leafId=this.currentLeafId;{let allNodes=[],preOrderStack=[...roots];for(;preOrderStack.length>0;){let node=preOrderStack.pop();allNodes.push(node);for(let i=node.children.length-1;i>=0;i--)preOrderStack.push(node.children[i])}for(let i=allNodes.length-1;i>=0;i--){let node=allNodes[i],has=leafId!==null&&node.entry.id===leafId;for(let child of node.children)containsActive.get(child)&&(has=!0);containsActive.set(node,has)}}let multipleRoots=roots.length>1,orderedRoots=[...roots].sort((a,b)=>Number(containsActive.get(b))-Number(containsActive.get(a)));for(let i=orderedRoots.length-1;i>=0;i--){let isLast=i===orderedRoots.length-1;stack.push([orderedRoots[i],multipleRoots?1:0,multipleRoots,multipleRoots,isLast,[],multipleRoots])}for(;stack.length>0;){let[node,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),entry=node.entry;if(entry.type==="message"&&entry.message.role==="assistant"){let content=entry.message.content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="toolCall"){let tc=block;this.toolCallMap.set(tc.id,{name:tc.name,arguments:tc.arguments})}}}result3.push({node,indent,showConnector,isLast,gutters,isVirtualRootChild});let children=node.children,multipleChildren=children.length>1,orderedChildren=(()=>{let prioritized=[],rest=[];for(let child of children)containsActive.get(child)?prioritized.push(child):rest.push(child);return[...prioritized,...rest]})(),childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=orderedChildren.length-1;i>=0;i--){let childIsLast=i===orderedChildren.length-1;stack.push([orderedChildren[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}return result3}applyFilter(){this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId);let searchTokens=this.searchQuery.toLowerCase().split(/\s+/).filter(Boolean);if(this.filteredNodes=this.flatNodes.filter(flatNode=>{let entry=flatNode.node.entry;if(entry.type==="usage")return!1;let isCurrentLeaf=entry.id===this.currentLeafId;if(entry.type==="message"&&entry.message.role==="assistant"&&!isCurrentLeaf){let msg=entry.message,hasText=this.hasTextContent(msg.content),isErrorOrAborted=msg.stopReason&&msg.stopReason!=="stop"&&msg.stopReason!=="toolUse";if(!hasText&&!isErrorOrAborted)return!1}let passesFilter=!0,isSettingsEntry=entry.type==="label"||entry.type==="context_edit"||entry.type==="custom"||entry.type==="model_change"||entry.type==="model_change_rejected"||entry.type==="thinking_level_change"||entry.type==="session_info";switch(this.filterMode){case"user-only":passesFilter=entry.type==="message"&&entry.message.role==="user";break;case"no-tools":passesFilter=!isSettingsEntry&&!(entry.type==="message"&&entry.message.role==="toolResult");break;case"labeled-only":passesFilter=flatNode.node.label!==void 0;break;case"all":passesFilter=!0;break;default:passesFilter=!isSettingsEntry;break}if(!passesFilter)return!1;if(searchTokens.length>0){let nodeText=this.getSearchableText(flatNode.node).toLowerCase();return searchTokens.every(token=>nodeText.includes(token))}return!0}),this.foldedNodes.size>0){let skipSet=new Set;for(let flatNode of this.flatNodes){let{id,parentId}=flatNode.node.entry;parentId!=null&&(this.foldedNodes.has(parentId)||skipSet.has(parentId))&&skipSet.add(id)}this.filteredNodes=this.filteredNodes.filter(flatNode=>!skipSet.has(flatNode.node.entry.id))}this.recalculateVisualStructure(),this.lastSelectedId?this.selectedIndex=this.findNearestVisibleIndex(this.lastSelectedId):this.selectedIndex>=this.filteredNodes.length&&(this.selectedIndex=Math.max(0,this.filteredNodes.length-1)),this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId)}recalculateVisualStructure(){if(this.filteredNodes.length===0)return;let visibleIds=new Set(this.filteredNodes.map(n=>n.node.entry.id)),entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let findVisibleAncestor=nodeId=>{let currentId=entryMap.get(nodeId)?.node.entry.parentId??null;for(;currentId!==null;){if(visibleIds.has(currentId))return currentId;currentId=entryMap.get(currentId)?.node.entry.parentId??null}return null},visibleParent=new Map,visibleChildren=new Map;visibleChildren.set(null,[]);for(let flatNode of this.filteredNodes){let nodeId=flatNode.node.entry.id,ancestorId=findVisibleAncestor(nodeId);visibleParent.set(nodeId,ancestorId),visibleChildren.has(ancestorId)||visibleChildren.set(ancestorId,[]),visibleChildren.get(ancestorId).push(nodeId)}let visibleRootIds=visibleChildren.get(null);this.multipleRoots=visibleRootIds.length>1;let filteredNodeMap=new Map;for(let flatNode of this.filteredNodes)filteredNodeMap.set(flatNode.node.entry.id,flatNode);let stack=[];for(let i=visibleRootIds.length-1;i>=0;i--){let isLast=i===visibleRootIds.length-1;stack.push([visibleRootIds[i],this.multipleRoots?1:0,this.multipleRoots,this.multipleRoots,isLast,[],this.multipleRoots])}for(;stack.length>0;){let[nodeId,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),flatNode=filteredNodeMap.get(nodeId);if(!flatNode)continue;flatNode.indent=indent,flatNode.showConnector=showConnector,flatNode.isLast=isLast,flatNode.gutters=gutters,flatNode.isVirtualRootChild=isVirtualRootChild;let children=visibleChildren.get(nodeId)||[],multipleChildren=children.length>1,childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=children.length-1;i>=0;i--){let childIsLast=i===children.length-1;stack.push([children[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}this.visibleParentMap=visibleParent,this.visibleChildrenMap=visibleChildren}getSearchableText(node){let entry=node.entry,parts=[];switch(node.label&&parts.push(node.label),entry.type){case"message":{let msg=entry.message;if(parts.push(msg.role),"content"in msg&&msg.content&&parts.push(this.extractContent(msg.content)),msg.role==="bashExecution"){let bashMsg=msg;bashMsg.command&&parts.push(bashMsg.command)}break}case"custom_message":{parts.push(entry.customType),typeof entry.content=="string"?parts.push(entry.content):parts.push(this.extractContent(entry.content));break}case"compaction":parts.push("compaction");break;case"branch_summary":parts.push("branch summary",entry.summary);break;case"session_info":parts.push("title"),entry.name&&parts.push(entry.name);break;case"model_change":parts.push("model",entry.modelId);break;case"model_change_rejected":parts.push("model rejected",entry.modelId,entry.reason);break;case"thinking_level_change":parts.push("thinking",entry.thinkingLevel);break;case"custom":parts.push("custom",entry.customType);break;case"context_edit":parts.push("context edit",entry.replacement===null?"omit":"replace",entry.targetId);break;case"label":parts.push("label",entry.label??"");break}return parts.join(" ")}invalidate(){}getSearchQuery(){return this.searchQuery}getSelectedNode(){return this.filteredNodes[this.selectedIndex]?.node}copySelected(){let node=this.getSelectedNode();this.onCopy?.(node?this.getEntryCopyText(node):void 0)}editSelected(){let entry=this.getSelectedNode()?.entry;entry&&(entry.type==="message"&&entry.message.role==="assistant"?this.onEditMessage?.(entry.id):(entry.type==="message"&&entry.message.role==="user"||entry.type==="custom_message")&&this.onSelect?.(entry.id))}updateNodeLabel(entryId,label3,labelTimestamp){for(let flatNode of this.flatNodes)if(flatNode.node.entry.id===entryId){flatNode.node.label=label3,flatNode.node.labelTimestamp=label3?labelTimestamp??new Date().toISOString():void 0;break}}getStatusLabels(){let labels="";switch(this.filterMode){case"no-tools":labels+=" [no-tools]";break;case"user-only":labels+=" [user]";break;case"labeled-only":labels+=" [labeled]";break;case"all":labels+=" [all]";break}return this.showLabelTimestamps&&(labels+=" [+label time]"),labels}render(width){let lines=[];if(this.filteredNodes.length===0)return lines.push(truncateToWidth(theme.fg("muted"," No entries found"),width)),lines.push(truncateToWidth(theme.fg("muted",` (0/0)${this.getStatusLabels()}`),width)),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisibleLines/2),this.filteredNodes.length-this.maxVisibleLines)),endIndex=Math.min(startIndex+this.maxVisibleLines,this.filteredNodes.length),renderedRows=[];for(let i=startIndex;i<endIndex;i++){let flatNode=this.filteredNodes[i],entry=flatNode.node.entry,isSelected=i===this.selectedIndex,cursor=isSelected?theme.fg("accent","\u203A "):" ",displayIndent=this.multipleRoots?Math.max(0,flatNode.indent-1):flatNode.indent,connector=flatNode.showConnector&&!flatNode.isVirtualRootChild?flatNode.isLast?"\u2514\u2500 ":"\u251C\u2500 ":"",connectorPosition=connector?displayIndent-1:-1,totalChars=displayIndent*3,prefixChars=[],isFolded=this.foldedNodes.has(entry.id);for(let i2=0;i2<totalChars;i2++){let level=Math.floor(i2/3),posInLevel=i2%3,gutter2=flatNode.gutters.find(g=>g.position===level);if(gutter2)posInLevel===0?prefixChars.push(gutter2.show?"\u2502":" "):prefixChars.push(" ");else if(connector&&level===connectorPosition)if(posInLevel===0)prefixChars.push(flatNode.isLast?"\u2514":"\u251C");else if(posInLevel===1){let foldable=this.isFoldable(entry.id);prefixChars.push(isFolded?"\u229E":foldable?"\u229F":"\u2500")}else prefixChars.push(" ");else prefixChars.push(" ")}let prefix=prefixChars.join(""),showsFoldInConnector=flatNode.showConnector&&!flatNode.isVirtualRootChild,foldMarker=isFolded&&!showsFoldInConnector?theme.fg("accent","\u229E "):"",pathMarker=this.activePathIds.has(entry.id)?theme.fg("accent","\u2022 "):"",label3=flatNode.node.label?theme.fg("warning",`[${flatNode.node.label}] `):"",labelTimestamp=this.showLabelTimestamps&&flatNode.node.label&&flatNode.node.labelTimestamp?theme.fg("muted",`${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `):"",content=this.getEntryDisplayText(flatNode.node,isSelected),prefixPart=theme.fg("dim",prefix)+foldMarker+pathMarker,anchorCol=visibleWidth(prefixPart),gutter=cursor,body=prefixPart+label3+labelTimestamp+content;isSelected&&(gutter=theme.bg("selectedBg",gutter),body=theme.bg("selectedBg",body)),renderedRows.push({gutter,body,anchorCol,bodyWidth:visibleWidth(body),isSelected})}return lines.push(...renderHorizontalViewport(renderedRows,width)),lines.push(truncateToWidth(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredNodes.length})${this.getStatusLabels()}`),width)),lines}getEntryDisplayText(node,isSelected){let entry=node.entry,result3,normalize3=s=>s.replace(/[\n\t]/g," ").trim();switch(entry.type){case"message":{let msg=entry.message,role=msg.role;if(role==="user"){let msgWithContent=msg,content=normalize3(this.extractContent(msgWithContent.content));result3=theme.fg("accent","user: ")+content}else if(role==="assistant"){let msgWithContent=msg,textContent3=normalize3(this.extractContent(msgWithContent.content));if(textContent3)result3=theme.fg("success","assistant: ")+textContent3;else if(msgWithContent.stopReason==="aborted")result3=theme.fg("success","assistant: ")+theme.fg("muted","(aborted)");else if(msgWithContent.errorMessage){let errMsg=normalize3(msgWithContent.errorMessage).slice(0,80);result3=theme.fg("success","assistant: ")+theme.fg("error",errMsg)}else result3=theme.fg("success","assistant: ")+theme.fg("muted","(no content)")}else if(role==="toolResult"){let toolMsg=msg,toolCall=toolMsg.toolCallId?this.toolCallMap.get(toolMsg.toolCallId):void 0;toolCall?result3=theme.fg("muted",this.formatToolCall(toolCall.name,toolCall.arguments)):result3=theme.fg("muted",`[${toolMsg.toolName??"tool"}]`)}else if(role==="bashExecution"){let bashMsg=msg;result3=theme.fg("dim",`[bash]: ${normalize3(bashMsg.command??"")}`)}else result3=theme.fg("dim",`[${role}]`);break}case"custom_message":{let content=typeof entry.content=="string"?entry.content:entry.content.filter(c=>c.type==="text").map(c=>c.text).join("");result3=theme.fg("customMessageLabel",`[${entry.customType}]: `)+normalize3(content);break}case"compaction":{let tokens=Math.round(entry.tokensBefore/1e3);result3=theme.fg("borderAccent",`[compaction: ${tokens}k tokens]`);break}case"branch_summary":result3=theme.fg("warning","[branch summary]: ")+normalize3(entry.summary);break;case"model_change":result3=theme.fg("dim",`[model: ${entry.modelId}]`);break;case"model_change_rejected":result3=theme.fg("warning",`[model rejected: ${entry.modelId} (${entry.reason})]`);break;case"thinking_level_change":result3=theme.fg("dim",`[thinking: ${entry.thinkingLevel}]`);break;case"custom":result3=theme.fg("dim",`[custom: ${entry.customType}]`);break;case"context_edit":result3=theme.fg("dim",`[context ${entry.replacement===null?"omit":"replace"}: ${entry.targetId}]`);break;case"label":result3=theme.fg("dim",`[label: ${entry.label??"(cleared)"}]`);break;case"session_info":result3=entry.name?[theme.fg("dim","[title: "),theme.fg("dim",entry.name),theme.fg("dim","]")].join(""):[theme.fg("dim","[title: "),theme.italic(theme.fg("dim","empty")),theme.fg("dim","]")].join("");break;default:result3=""}return isSelected?theme.bold(result3):result3}formatLabelTimestamp(timestamp){let date=new Date(timestamp),now2=new Date,hours=date.getHours().toString().padStart(2,"0"),minutes=date.getMinutes().toString().padStart(2,"0"),time2=`${hours}:${minutes}`;if(date.getFullYear()===now2.getFullYear()&&date.getMonth()===now2.getMonth()&&date.getDate()===now2.getDate())return time2;let month=date.getMonth()+1,day=date.getDate();return date.getFullYear()===now2.getFullYear()?`${month}/${day} ${time2}`:`${date.getFullYear().toString().slice(-2)}/${month}/${day} ${time2}`}extractContent(content){return this.extractFullContent(content).slice(0,200)}extractFullContent(content){if(typeof content=="string")return content;if(!Array.isArray(content))return"";let result3="";for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="text"&&(result3+=block.text),typeof block=="object"&&block!==null&&"type"in block&&block.type==="providerNative"){let subtype=block.subtype??"unknown";result3+=`[providerNative:${subtype}]`}return result3}getEntryCopyText(node){let entry=node.entry,text2;switch(entry.type){case"message":entry.message.role==="bashExecution"?text2=entry.message.command:"content"in entry.message&&(text2=this.extractFullContent(entry.message.content),!text2&&entry.message.role==="assistant"&&(text2=entry.message.errorMessage));break;case"custom_message":text2=this.extractFullContent(entry.content);break;case"compaction":text2=entry.summary;break;case"branch_summary":text2=entry.summary;break}return text2?.trim()?text2:void 0}hasTextContent(content){if(typeof content=="string")return content.trim().length>0;if(Array.isArray(content))for(let c of content){if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="text"){let text2=c.text;if(text2&&text2.trim().length>0)return!0}if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="providerNative")return!0}return!1}formatToolCall(name,args){let shortenPath2=p=>{let home=process.env.HOME||process.env.USERPROFILE||"";return home&&p.startsWith(home)?`~${p.slice(home.length)}`:p};switch(name){case"read":{let path15=shortenPath2(String(args.path||args.file_path||"")),offset=args.offset,limit=args.limit,display=path15;if(offset!==void 0||limit!==void 0){let start=offset??1,end=limit!==void 0?start+limit-1:"";display+=`:${start}${end?`-${end}`:""}`}return`[read: ${display}]`}case"write":return`[write: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"edit":return`[edit: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"bash":{let rawCmd=String(args.command||"");return`[bash: ${rawCmd.replace(/[\n\t]/g," ").trim().slice(0,50)}${rawCmd.length>50?"...":""}]`}case"grep":{let pattern=String(args.pattern||""),path15=shortenPath2(String(args.path||"."));return`[grep: /${pattern}/ in ${path15}]`}case"find":{let pattern=String(args.pattern||""),path15=shortenPath2(String(args.path||"."));return`[find: ${pattern} in ${path15}]`}case"ls":return`[ls: ${shortenPath2(String(args.path||"."))}]`;default:{let argsStr=JSON.stringify(args).slice(0,40);return`[${name}: ${argsStr}${JSON.stringify(args).length>40?"...":""}]`}}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.filteredNodes.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.filteredNodes.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"app.tree.foldOrUp")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.isFoldable(currentId)&&!this.foldedNodes.has(currentId)?(this.foldedNodes.add(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("up")}else if(kb.matches(keyData,"app.tree.unfoldOrDown")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.foldedNodes.has(currentId)?(this.foldedNodes.delete(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("down")}else if(kb.matches(keyData,"tui.editor.cursorLeft")||kb.matches(keyData,"tui.select.pageUp"))this.selectedIndex=Math.max(0,this.selectedIndex-this.maxVisibleLines);else if(kb.matches(keyData,"tui.editor.cursorRight")||kb.matches(keyData,"tui.select.pageDown"))this.selectedIndex=Math.min(this.filteredNodes.length-1,this.selectedIndex+this.maxVisibleLines);else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.node.entry.id)}else if(kb.matches(keyData,"app.message.copy"))this.copySelected();else if(kb.matches(keyData,"app.tree.editMessage"))this.editSelected();else if(kb.matches(keyData,"tui.select.cancel"))this.searchQuery?(this.searchQuery="",this.foldedNodes.clear(),this.applyFilter()):this.onCancel?.();else if(kb.matches(keyData,"app.tree.filter.default"))this.filterMode="default",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.noTools"))this.filterMode=this.filterMode==="no-tools"?"default":"no-tools",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.userOnly"))this.filterMode=this.filterMode==="user-only"?"default":"user-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.labeledOnly"))this.filterMode=this.filterMode==="labeled-only"?"default":"labeled-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.all"))this.filterMode=this.filterMode==="all"?"default":"all",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.cycleBackward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex-1+modes.length)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"app.tree.filter.cycleForward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex+1)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"tui.editor.deleteCharBackward"))this.searchQuery.length>0&&(this.searchQuery=this.searchQuery.slice(0,-1),this.foldedNodes.clear(),this.applyFilter());else if(kb.matches(keyData,"app.tree.editLabel")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onLabelEdit&&this.onLabelEdit(selected.node.entry.id,selected.node.label)}else kb.matches(keyData,"app.tree.toggleLabelTimestamp")?this.showLabelTimestamps=!this.showLabelTimestamps:![...keyData].some(ch=>{let code=ch.charCodeAt(0);return code<32||code===127||code>=128&&code<=159})&&keyData.length>0&&(this.searchQuery+=keyData,this.foldedNodes.clear(),this.applyFilter())}isFoldable(entryId){let children=this.visibleChildrenMap.get(entryId);if(!children||children.length===0)return!1;let parentId=this.visibleParentMap.get(entryId);if(parentId==null)return!0;let siblings=this.visibleChildrenMap.get(parentId);return siblings!==void 0&&siblings.length>1}findBranchSegmentStart(direction){let selectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id;if(!selectedId)return this.selectedIndex;let indexByEntryId=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=selectedId;if(direction==="down")for(;;){let children=this.visibleChildrenMap.get(currentId)??[];if(children.length===0)return indexByEntryId.get(currentId);if(children.length>1)return indexByEntryId.get(children[0]);currentId=children[0]}for(;;){let parentId=this.visibleParentMap.get(currentId)??null;if(parentId===null)return indexByEntryId.get(currentId);if((this.visibleChildrenMap.get(parentId)??[]).length>1){let segmentStart=indexByEntryId.get(currentId);if(segmentStart<this.selectedIndex)return segmentStart}currentId=parentId}}},SearchLine=class{constructor(treeList){this.treeList=treeList}invalidate(){}render(width){let query=this.treeList.getSearchQuery();return query?[truncateToWidth(` ${theme.fg("muted","Type to search:")} ${theme.fg("accent",query)}`,width)]:[truncateToWidth(` ${theme.fg("muted","Type to search:")}`,width)]}handleInput(_keyData){}},TreeHelp=class{invalidate(){}render(width){let items=TREE_HELP_ITEMS.map(({keys,label:label3,labelFirst})=>{let text2=formatHelpKeys(keys);return text2?labelFirst?`${label3} ${text2}`:`${text2} ${label3}`:label3}),availableWidth=Math.max(1,width),indent=" ",separator=" \xB7 ",lines=[],currentLine="";for(let item of items){let candidate=currentLine?`${currentLine}${separator}${item}`:visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item;if(!currentLine||visibleWidth(candidate)<=availableWidth){currentLine=candidate;continue}lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),currentLine=visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item}return currentLine&&lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),lines.map(line=>theme.fg("muted",line))}},TREE_HELP_ITEMS=[{keys:["tui.select.up","tui.select.down"],label:"move"},{keys:["tui.editor.cursorLeft","tui.editor.cursorRight"],label:"page"},{keys:["app.tree.foldOrUp","app.tree.unfoldOrDown"],label:"branch"},{keys:["app.message.copy"],label:"copy"},{keys:["app.tree.editMessage"],label:"edit"},{keys:["app.tree.editLabel"],label:"label"},{keys:["app.tree.toggleLabelTimestamp"],label:"label time"},{keys:["app.tree.filter.default","app.tree.filter.noTools","app.tree.filter.userOnly","app.tree.filter.labeledOnly","app.tree.filter.all"],label:"filters",labelFirst:!0},{keys:["app.tree.filter.cycleForward","app.tree.filter.cycleBackward"],label:"cycle",labelFirst:!0}];function formatHelpKeys(keybindings){let keys=[];for(let keybinding of keybindings){let key=getKeybindings().getKeys(keybinding)[0];key!==void 0&&keys.push(key)}return keys.length===0?"":formatKeyText(compactRawKeys(keys)).replace(/\bpageUp\b/g,"pgup").replace(/\bpageDown\b/g,"pgdn").replace(/\bup\b/g,"\u2191").replace(/\bdown\b/g,"\u2193").replace(/\bleft\b/g,"\u2190").replace(/\bright\b/g,"\u2192")}function compactRawKeys(keys){if(keys.length===1)return keys[0];let parts=keys.map(key=>{let separatorIndex=key.lastIndexOf("+");return separatorIndex===-1?{prefix:"",suffix:key}:{prefix:key.slice(0,separatorIndex+1),suffix:key.slice(separatorIndex+1)}}),prefix=parts[0].prefix;return prefix&&parts.every(part=>part.prefix===prefix)?`${prefix}${parts.map(part=>part.suffix).join("/")}`:keys.join("/")}var LabelInput=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(entryId,currentLabel){this._focused=!1,this.entryId=entryId,this.input=new Input,currentLabel&&this.input.setValue(currentLabel)}invalidate(){}render(width){let lines=[],availableWidth=width-2;return lines.push(truncateToWidth(` ${theme.fg("muted","Label (empty to remove):")}`,width)),lines.push(...this.input.render(availableWidth).map(line=>truncateToWidth(` ${line}`,width))),lines.push(truncateToWidth(` ${keyHint("tui.select.confirm","save")} ${keyHint("tui.select.cancel","cancel")}`,width)),lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.confirm")){let value2=this.input.getValue().trim();this.onSubmit?.(this.entryId,value2||void 0)}else kb.matches(keyData,"tui.select.cancel")?this.onCancel?.():this.input.handleInput(keyData)}},TreeSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.labelInput&&(this.labelInput.focused=value2)}constructor(tree,currentLeafId,terminalHeight,onSelect,onCancel,onLabelChange,initialSelectedId,initialFilterMode){super(),this.labelInput=null,this._focused=!1,this.onLabelChangeCallback=onLabelChange;let maxVisibleLines=Math.max(5,Math.floor(terminalHeight/2));this.treeList=new TreeList(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode),this.treeList.onSelect=onSelect,this.treeList.onCancel=onCancel,this.treeList.onCopy=text2=>this.onCopy?.(text2),this.treeList.onEditMessage=entryId=>this.onEditMessage?.(entryId),this.treeList.onLabelEdit=(entryId,currentLabel)=>this.showLabelInput(entryId,currentLabel),this.treeContainer=new Container,this.treeContainer.addChild(this.treeList),this.labelInputContainer=new Container,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Text(theme.bold(" Session Tree"),1,0)),this.addChild(new TreeHelp),this.addChild(new SearchLine(this.treeList)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(this.treeContainer),this.addChild(this.labelInputContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),tree.length===0&&setTimeout(()=>onCancel(),100)}showLabelInput(entryId,currentLabel){this.labelInput=new LabelInput(entryId,currentLabel),this.labelInput.onSubmit=(id,label3)=>{this.treeList.updateNodeLabel(id,label3),this.onLabelChangeCallback?.(id,label3),this.hideLabelInput()},this.labelInput.onCancel=()=>this.hideLabelInput(),this.labelInput.focused=this._focused,this.treeContainer.clear(),this.labelInputContainer.clear(),this.labelInputContainer.addChild(this.labelInput)}hideLabelInput(){this.labelInput=null,this.labelInputContainer.clear(),this.treeContainer.clear(),this.treeContainer.addChild(this.treeList)}handleInput(keyData){this.labelInput?this.labelInput.handleInput(keyData):this.treeList.handleInput(keyData)}getTreeList(){return this.treeList}};function formatDecision(trustPath,decision){if(decision===null)return"none";let label3=decision.decision?"trusted":"untrusted";return trustPath!==void 0&&decision.path!==trustPath?`${label3} (inherited from ${decision.path})`:`${label3} (${decision.path})`}var TrustSelectorComponent=class extends Container{constructor(options){super(),this.savedDecision=options.savedDecision,this.trustOptions=getProjectTrustOptions(options.cwd),this.selectedIndex=Math.max(0,this.trustOptions.findIndex(option=>this.isSavedOption(option))),this.onSelectCallback=options.onSelect,this.onCancelCallback=options.onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Project trust")),1,0)),this.addChild(new Text(theme.fg("muted",options.cwd),1,0)),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",`Saved decision: ${formatDecision(this.trustOptions[0]?.savedPath,options.savedDecision)}`),1,0)),this.addChild(new Text(theme.fg("muted",`Current session: ${options.projectTrusted?"trusted":"untrusted"}`),1,0)),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new Text(rawKeyHint("\u2191\u2193","navigate")+" "+keyHint("tui.select.confirm","save")+" "+keyHint("tui.select.cancel","cancel"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateList()}isSavedOption(option){return option.savedPath!==void 0&&this.savedDecision?.decision===option.trusted&&this.savedDecision.path===option.savedPath}updateList(){this.listContainer.clear();for(let i=0;i<this.trustOptions.length;i++){let option=this.trustOptions[i];if(!option)continue;let isSelected=i===this.selectedIndex,currentMarker=this.isSavedOption(option)?theme.fg("accent","\u2713 "):" ",prefix=isSelected?theme.fg("accent","\u2192 "):" ",label3=isSelected?theme.fg("accent",option.label):theme.fg("text",option.label);this.listContainer.addChild(new Text(`${prefix}${currentMarker}${label3}`,1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")||keyData==="k")this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList();else if(kb.matches(keyData,"tui.select.down")||keyData==="j")this.selectedIndex=Math.min(this.trustOptions.length-1,this.selectedIndex+1),this.updateList();else if(kb.matches(keyData,"tui.select.confirm")||keyData===`
|
|
2541
2541
|
`){let selected=this.trustOptions[this.selectedIndex];selected&&this.onSelectCallback({trusted:selected.trusted,updates:selected.updates})}else kb.matches(keyData,"tui.select.cancel")&&this.onCancelCallback()}};function getAskUserAnswerHeaders(entries,requestId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==ASK_USER_QUESTION_ENTRY)continue;let data=entry.data;if(typeof data!="object"||data===null||!("requestId"in data)||data.requestId!==requestId||!("headers"in data)||!Array.isArray(data.headers))continue;return data.headers.filter(header2=>typeof header2=="string")}return[]}function summaryRows(frame2,headers){let fallbackHeaders=headers.length>0?headers:[frame2.requestId];if(/^(?:The user did not answer|The user dismissed|The pending question|This session has no user)/.test(frame2.body))return fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`);let answers=[],comment,unanswered=[];for(let line of frame2.body.split(`
|
|
2542
|
-
`)){let separator=line.indexOf(": ");if(separator<1)continue;let header2=line.slice(0,separator),value2=line.slice(separator+2);header2==="The user responded"?comment=value2:header2==="Unanswered"?unanswered=value2.split(", "):answers.push(`\u21B3 ${header2}: ${value2}`)}return comment!==void 0?answers.push(`\u21B3 ${headers[0]??unanswered[0]??frame2.requestId}: ${JSON.stringify(comment)}`):answers.push(...unanswered.map(header2=>`\u21B3 ${header2}: (no answer)`)),answers.length>0?answers:fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`)}var AskUserAnswerChip=class extends MouseRegion{constructor(frame2,headers,fullBody){let rows=summaryRows(frame2,headers).map(row=>stripAnsi(row).replace(/\s+/g," ")),summary={render:width=>rows.map(row=>theme.fg("muted",truncateToWidth(row,width,"\u2026"))),invalidate(){}},content=new Container;content.addChild(summary);let expanded=!1;super(content,event=>{if(event.button==="left"){if(event.type==="press")return{handled:!0,render:!1};if(!(event.type!=="click"||(event.clickCount??1)!==1))return expanded=!expanded,content.detachAll(),content.addChild(expanded?fullBody:summary),{handled:!0}}}),this.fullBody=fullBody}invalidate(){super.invalidate(),this.fullBody.invalidate()}dispose(){this.fullBody.dispose?.()}};var OSC133_ZONE_START2="\x1B]133;A\x07",OSC133_ZONE_END2="\x1B]133;B\x07",OSC133_ZONE_FINAL2="\x1B]133;C\x07",UserMessageComponent=class extends Container{constructor(text2,markdownTheme=getMarkdownTheme(),outputPad=1,markdownTransformers=[],answerHeaders=[]){super(),this.text=text2,this.markdownTheme=markdownTheme,this.outputPad=outputPad,this.markdownTransformers=markdownTransformers,this.answerHeaders=answerHeaders,this.rebuild()}setOutputPad(padding){this.outputPad=padding,this.rebuild()}rebuild(){this.clear();let contentBox=new Markdown(this.text,this.outputPad,1,this.markdownTheme,{color:content=>theme.fg("userMessageText",content),bgColor:content=>theme.bg("userMessageBg",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}),answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}getRenderRevision(){return this.childRenderRevision()}render(width){let lines=super.render(width);return lines.length===0?lines:lines.length===1?(lines[0]=OSC133_ZONE_START2+lines[0]+OSC133_ZONE_END2+OSC133_ZONE_FINAL2,lines):(lines[0]=OSC133_ZONE_START2+lines[0],lines[lines.length-1]=OSC133_ZONE_END2+OSC133_ZONE_FINAL2+lines[lines.length-1],lines)}};var UserMessageList=class{constructor(messages,initialSelectedId){this.messages=[],this.selectedIndex=0,this.maxVisible=10,this.messages=messages;let initialIndex=initialSelectedId?messages.findIndex(message=>message.id===initialSelectedId):-1;this.selectedIndex=initialIndex>=0?initialIndex:Math.max(0,messages.length-1)}invalidate(){}render(width){let lines=[];if(this.messages.length===0)return lines.push(theme.fg("muted"," No user messages found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.messages.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.messages.length);for(let i=startIndex;i<endIndex;i++){let message=this.messages[i],isSelected=i===this.selectedIndex,normalizedMessage=message.text.replace(/\n/g," ").trim(),cursor=isSelected?theme.fg("accent","\u203A "):" ",maxMsgWidth=width-2,truncatedMsg=truncateToWidth(normalizedMessage,maxMsgWidth),messageLine=cursor+(isSelected?theme.bold(truncatedMsg):truncatedMsg);lines.push(messageLine);let metadata=` Message ${i+1} of ${this.messages.length}`,metadataLine=theme.fg("muted",metadata);lines.push(metadataLine),lines.push("")}if(startIndex>0||endIndex<this.messages.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.messages.length})`);lines.push(scrollInfo)}return lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.messages.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.messages.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.messages[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.id)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}},UserMessageSelectorComponent=class extends Container{constructor(messages,onSelect,onCancel,initialSelectedId){super(),this.addChild(new Spacer(1)),this.addChild(new Text(theme.bold("Fork from Message"),1,0)),this.addChild(new Text(theme.fg("muted","Select a user message to copy the active path up to that point into a new session"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.messageList=new UserMessageList(messages,initialSelectedId),this.messageList.onSelect=onSelect,this.messageList.onCancel=onCancel,this.addChild(this.messageList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),messages.length===0&&setTimeout(()=>onCancel(),100)}getMessageList(){return this.messageList}};import{spawn as spawn11}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve46=>{let proc=spawn11(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{killed||(killed=!0,proc.kill("SIGTERM"),setTimeout(()=>{proc.killed||proc.kill("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),resolve46({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve46({stdout,stderr,code:1,killed})})})}function createSessionControlActions(deps){return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();return host===void 0?{status:"unsupported",reason:"unsupported_mode"}:host.register(options)},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow()}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized"))}}import{statSync as statSync23}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync23(file,{bigint:!0});return`${stats.mtimeNs}:${stats.size}`}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.fingerprints)if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function absorbNewlyCompiled(live){for(let file of live.importer.compiledFiles?.()??[]){if(live.fingerprints.has(file))continue;let fingerprint=fingerprintOf(file);fingerprint!==void 0&&live.fingerprints.set(file,fingerprint)}}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return absorbNewlyCompiled(generation),generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create2){return generation?generation.importer:(pendingImporter??=create2().then(importer=>(generation={importer,factories:new Map,fingerprints:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledFiles!==void 0&&(generation.factories.set(resolvedPath,factory),absorbNewlyCompiled(generation))}function clearExtensionCache(){dropGeneration()}var __rewriteRelativeImportExtension=function(path15,preserveJsx){return typeof path15=="string"&&/^\.\.?\//.test(path15)?path15.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"}):path15};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_exports,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports,"@earendil-works/pi-agent-core":dist_exports2,"@earendil-works/pi-tui":dist_exports,"@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_exports2,"@mariozechner/pi-tui":dist_exports,"@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=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path11.extname(fileURLToPath7(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path11.dirname(fileURLToPath7(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path11.resolve(__dirname,"../../.."),packagesRoot=path11.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path11.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path11.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path11.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath7(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path11.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path11.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs3.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.")},state={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,assertActive=()=>{if(state.staleMessage)throw new Error(state.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(!state.staleMessage){state.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(),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(entry=>({kind:"config",...entry})),...runtime.pendingNativeProviderRegistrations.map(entry=>({kind:"native",...entry}))];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=[],state="loading",assertActive=()=>{if(state==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state==="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=(...args)=>handler(...args),list4=extension.handlers.get(event)??[];return list4.push(registeredHandler),extension.handlers.set(event,list4),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.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:tool,sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerLazyToolActivator(activator){runtime.assertActive();let activators=extension.lazyToolActivators??[];activators.push(activator),extension.lazyToolActivators=activators,runtime.registerLazyToolActivator(activator)},registerRemovedToolHint(name,hint){runtime.assertActive();let hints=extension.removedToolHints;hints||(hints=new Map,extension.removedToolHints=hints),hints.set(name,hint),runtime.registerRemovedToolHint(name,hint)},registerFilesystemPolicy(policy){runtime.assertActive();let policies=extension.filesystemPolicies??[];policies.push(policy),extension.filesystemPolicies=policies},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})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},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)&&(state==="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 state==="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)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},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)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},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)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model)},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()}},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,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 state==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}};return recordExtensionLoadKey(api,runtime),{api,commit:()=>{if(state==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state="active",clearPending()}},discard:()=>{if(state==="loading"){state="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-3TEDTSKJ.js");return createBunExtensionImporter(VIRTUAL_MODULES)}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:path11.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),load=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await factory(load.api),load.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load.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(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}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=path11.join(dir,"package.json");if(fs3.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path11.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path11.join(dir,"index.ts"),indexJs=path11.join(dir,"index.js");return fs3.existsSync(indexTs)?[indexTs]:fs3.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs3.existsSync(dir))return[];let discovered=[];try{let entries=fs3.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path11.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.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=path11.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path11.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path11.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs3.existsSync(resolved)&&fs3.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function wrapRegisteredTool(registeredTool,runner,createToolContext){return{...wrapToolDefinition(registeredTool.definition),execute:async(toolCallId,params,signal,onUpdate)=>{let activeBefore=runner.getActiveTools(),invocation=createToolContext?.(signal),result3;try{result3=await registeredTool.definition.execute(toolCallId,params,signal,onUpdate,runner.createToolContext(toolCallId,signal,invocation?.context))}finally{invocation?.dispose()}let activeAfter=runner.getActiveTools();if(!activeBefore.every(name=>activeAfter.includes(name)))return result3;let beforeNames=new Set(activeBefore),addedToolNames=activeAfter.filter(name=>!beforeNames.has(name));return addedToolNames.length===0?result3:{...result3,addedToolNames:[...new Set([...result3.addedToolNames??[],...addedToolNames])]}}}}function wrapRegisteredTools(registeredTools,runner,createToolContext){return registeredTools.map(tool=>wrapRegisteredTool(tool,runner,createToolContext))}var KERNEL_BUILTIN_GLOBALS=new Set(["agent","completion","display","env","log","output","parallel","phase","pipeline","print","read","tool","tool_schema","tools","workpool","write"]),KernelPreludeCollisionError=class extends Error{constructor(toolName,collidingExport){super(`Tool "${toolName}" kernelPrelude export "${collidingExport}" collides with a built-in eval kernel global.`),this.name="KernelPreludeCollisionError",this.toolName=toolName,this.collidingExport=collidingExport}};function projectKernelPrelude(toolName,prelude){let collision=prelude?.exports.find(name=>KERNEL_BUILTIN_GLOBALS.has(name)||name.startsWith("__"));if(collision!==void 0)throw new KernelPreludeCollisionError(toolName,collision);return prelude}var ExternalAdmission=class{constructor(port){this.turnEpochValue=0,this.pending=new Map,this.emitted=new Set,this.failed=new Map,this.fileTakesWrites=!0,this.emittedListeners=new Set,this.inputHolds=new Set,this.settledListeners=new Set,this.port=port}get turnEpoch(){return this.turnEpochValue}beginTurn(){this.turnEpochValue+=1}setEditorSource(source2){this.editorSource=source2}beginInput(options={}){let parents=options.submittedByCommand?[...this.inputHolds].filter(hold=>hold.command):[],state={command:options.command===!0};this.inputHolds.add(state);let end=()=>this.endHold(state);return{accepted:()=>{end();for(let parent of parents)this.endHold(parent)},end}}onInputsSettled(listener){return this.settledListeners.add(listener),()=>this.settledListeners.delete(listener)}onEmitted(listener){return this.emittedListeners.add(listener),()=>this.emittedListeners.delete(listener)}close(reason){this.closedReason??=reason}reopen(){this.closedReason=void 0}gate(){let editor=this.editorSource?.()??{revision:0},base={editor_revision:editor.revision,turn_epoch:this.turnEpochValue};return this.inputHolds.size>0?{can_admit:!1,hold_reason:"draft",...base}:editor.hold_reason===void 0?{can_admit:!0,...base}:{can_admit:!1,hold_reason:editor.hold_reason,...base}}admit(input){if(this.closedReason!==void 0)throw new Error(this.closedReason);let turn_epoch=this.turnEpochValue,id=input.delivery_id;if(this.pending.has(id)||this.emitted.has(id)||this.failed.has(id))return{kind:"already_admitted",turn_epoch};if(!this.gate().can_admit)return{kind:"held_draft",turn_epoch};if(input.expected_turn_id!==void 0&&input.expected_turn_id!==turn_epoch)return{kind:"turn_conflict",turn_epoch};let message=deliveryMessage(input);return this.isBusy()?input.deliverAs==="steer"?input.expected_turn_id===void 0?{kind:"turn_conflict",turn_epoch}:(this.pending.set(id,"steer"),this.port.enqueue(message,"steer"),{kind:"steered",turn_epoch}):(this.pending.set(id,"followUp"),this.port.enqueue(message,"followUp"),{kind:"queued",turn_epoch}):(this.pending.set(id,"start"),this.port.start(message).finally(()=>{this.pending.get(id)==="start"&&this.pending.set(id,"followUp")}),{kind:"started",turn_epoch})}list(){let deliveries={pending:[...this.pending.keys()],emitted:[...this.emitted]};if(this.failed.size===0)return deliveries;let failed=[...this.failed].map(([delivery_id,error2])=>({delivery_id,error:error2}));return{...deliveries,failed}}observePersisted(message){this.fileTakesWrites=!0;let id=deliveryIdOf(message);if(!(id===void 0||this.emitted.has(id))){this.pending.delete(id),this.emitted.add(id);for(let listener of this.emittedListeners)listener(id)}}observeRefused(message,error2){this.fileTakesWrites=!1;let id=deliveryIdOf(message);id===void 0||this.emitted.has(id)||(this.pending.delete(id),this.failed.set(id,error2))}observeRunSettled(){this.fileTakesWrites&&this.failed.clear()}dropQueued(){for(let[id,lane]of this.pending)lane!=="start"&&this.pending.delete(id)}endHold(state){if(this.inputHolds.delete(state)&&this.inputHolds.size===0)for(let listener of this.settledListeners)listener()}isBusy(){if(this.port.isBusy())return!0;for(let lane of this.pending.values())if(lane==="start")return!0;return!1}};function deliveryMessage(input){return{role:"custom",customType:SESSION_CONTROL_DELIVERY_TYPE,content:input.text,display:!0,details:{delivery_id:input.delivery_id,source:"session_control",deliverAs:input.deliverAs},timestamp:Date.now()}}function deliveryIdOf(message){if(!(message.role!=="custom"||message.customType!==SESSION_CONTROL_DELIVERY_TYPE))return isSessionControlDeliveryDetails(message.details)?message.details.delivery_id:void 0}var SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6(?:\.\d+|\d)?-sol|gpt-6-astra)(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(thinkingLevel==="xhigh"||thinkingLevel==="max")&&isSensitiveHighReasoningModel(model)}function buildHighReasoningWarning(model,thinkingLevel){let modelId=model.id,title=`\u26A0 HIGH-REASONING MODEL WARNING \u2014 ${model.provider}/${modelId} @ ${thinkingLevel}`,body=[`${modelId} is a frontier reasoning model. Running it at "${thinkingLevel}" effort makes it acutely sensitive to prompt quality.`,"Driving this model directly from a human prompt is NOT recommended. Risks include:"," \u2022 The model may refuse to stop, looping or working far past the stated goal.",' \u2022 It may perform unrequested actions in order to "complete" the task.'," \u2022 It may take risky, irreversible, or dangerous actions to force completion.","Strongly recommended: use this model ONLY through the ultrabrain subagent.","Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's \u2014 exactly what these high-effort models need to stay bounded.",'From the main agent, delegate instead: "query ultrabrain with <task>".',`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`];return{title,body}}var LazyToolActivation=class{#host;#activators=[];constructor(host){this.#host=host}register(activator){this.#activators.push(activator)}reset(){this.#activators=[]}activate(toolName){let definition=this.#host.getToolDefinition(toolName);if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this.#activators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.#host.getActiveTools().includes(toolName)&&this.#host.setActiveTools([...this.#host.getActiveTools(),toolName]),this.#host.getActiveTools().includes(toolName)):!1}};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 record7={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?(record7.argumentsBytes=bytes,this.complete=!1):(record7.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record7),this.startedAt.set(record7,performance.now()),record7}finish(record7,isError,errorText6){record7&&(record7.status=isError?"error":"ok",record7.durationMs=Math.round(performance.now()-(this.startedAt.get(record7)??performance.now())),this.startedAt.delete(record7),isError&&errorText6&&(record7.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(`
|
|
2542
|
+
`)){let separator=line.indexOf(": ");if(separator<1)continue;let header2=line.slice(0,separator),value2=line.slice(separator+2);header2==="The user responded"?comment=value2:header2==="Unanswered"?unanswered=value2.split(", "):answers.push(`\u21B3 ${header2}: ${value2}`)}return comment!==void 0?answers.push(`\u21B3 ${headers[0]??unanswered[0]??frame2.requestId}: ${JSON.stringify(comment)}`):answers.push(...unanswered.map(header2=>`\u21B3 ${header2}: (no answer)`)),answers.length>0?answers:fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`)}var AskUserAnswerChip=class extends MouseRegion{constructor(frame2,headers,fullBody){let rows=summaryRows(frame2,headers).map(row=>stripAnsi(row).replace(/\s+/g," ")),summary={render:width=>rows.map(row=>theme.fg("muted",truncateToWidth(row,width,"\u2026"))),invalidate(){}},content=new Container;content.addChild(summary);let expanded=!1;super(content,event=>{if(event.button==="left"){if(event.type==="press")return{handled:!0,render:!1};if(!(event.type!=="click"||(event.clickCount??1)!==1))return expanded=!expanded,content.detachAll(),content.addChild(expanded?fullBody:summary),{handled:!0}}}),this.fullBody=fullBody}invalidate(){super.invalidate(),this.fullBody.invalidate()}dispose(){this.fullBody.dispose?.()}};var OSC133_ZONE_START2="\x1B]133;A\x07",OSC133_ZONE_END2="\x1B]133;B\x07",OSC133_ZONE_FINAL2="\x1B]133;C\x07",UserMessageComponent=class extends Container{constructor(text2,markdownTheme=getMarkdownTheme(),outputPad=1,markdownTransformers=[],answerHeaders=[]){super(),this.text=text2,this.markdownTheme=markdownTheme,this.outputPad=outputPad,this.markdownTransformers=markdownTransformers,this.answerHeaders=answerHeaders,this.rebuild()}setOutputPad(padding){this.outputPad=padding,this.rebuild()}rebuild(){this.clear();let contentBox=new Markdown(this.text,this.outputPad,1,this.markdownTheme,{color:content=>theme.fg("userMessageText",content),bgColor:content=>theme.bg("userMessageBg",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}),answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}getRenderRevision(){return this.childRenderRevision()}render(width){let lines=super.render(width);return lines.length===0?lines:lines.length===1?(lines[0]=OSC133_ZONE_START2+lines[0]+OSC133_ZONE_END2+OSC133_ZONE_FINAL2,lines):(lines[0]=OSC133_ZONE_START2+lines[0],lines[lines.length-1]=OSC133_ZONE_END2+OSC133_ZONE_FINAL2+lines[lines.length-1],lines)}};var UserMessageList=class{constructor(messages,initialSelectedId){this.messages=[],this.selectedIndex=0,this.maxVisible=10,this.messages=messages;let initialIndex=initialSelectedId?messages.findIndex(message=>message.id===initialSelectedId):-1;this.selectedIndex=initialIndex>=0?initialIndex:Math.max(0,messages.length-1)}invalidate(){}render(width){let lines=[];if(this.messages.length===0)return lines.push(theme.fg("muted"," No user messages found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.messages.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.messages.length);for(let i=startIndex;i<endIndex;i++){let message=this.messages[i],isSelected=i===this.selectedIndex,normalizedMessage=message.text.replace(/\n/g," ").trim(),cursor=isSelected?theme.fg("accent","\u203A "):" ",maxMsgWidth=width-2,truncatedMsg=truncateToWidth(normalizedMessage,maxMsgWidth),messageLine=cursor+(isSelected?theme.bold(truncatedMsg):truncatedMsg);lines.push(messageLine);let metadata=` Message ${i+1} of ${this.messages.length}`,metadataLine=theme.fg("muted",metadata);lines.push(metadataLine),lines.push("")}if(startIndex>0||endIndex<this.messages.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.messages.length})`);lines.push(scrollInfo)}return lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.messages.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.messages.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.messages[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.id)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}},UserMessageSelectorComponent=class extends Container{constructor(messages,onSelect,onCancel,initialSelectedId){super(),this.addChild(new Spacer(1)),this.addChild(new Text(theme.bold("Fork from Message"),1,0)),this.addChild(new Text(theme.fg("muted","Select a user message to copy the active path up to that point into a new session"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.messageList=new UserMessageList(messages,initialSelectedId),this.messageList.onSelect=onSelect,this.messageList.onCancel=onCancel,this.addChild(this.messageList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),messages.length===0&&setTimeout(()=>onCancel(),100)}getMessageList(){return this.messageList}};import{spawn as spawn11}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve46=>{let proc=spawn11(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{killed||(killed=!0,proc.kill("SIGTERM"),setTimeout(()=>{proc.killed||proc.kill("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),resolve46({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve46({stdout,stderr,code:1,killed})})})}function createSessionControlActions(deps){return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();return host===void 0?{status:"unsupported",reason:"unsupported_mode"}:host.register(options)},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow()}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized"))}}import{statSync as statSync23}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync23(file,{bigint:!0});return`${stats.mtimeNs}:${stats.size}`}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.fingerprints)if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function absorbNewlyCompiled(live){for(let file of live.importer.compiledFiles?.()??[]){if(live.fingerprints.has(file))continue;let fingerprint=fingerprintOf(file);fingerprint!==void 0&&live.fingerprints.set(file,fingerprint)}}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return absorbNewlyCompiled(generation),generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create2){return generation?generation.importer:(pendingImporter??=create2().then(importer=>(generation={importer,factories:new Map,fingerprints:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledFiles!==void 0&&(generation.factories.set(resolvedPath,factory),absorbNewlyCompiled(generation))}function clearExtensionCache(){dropGeneration()}var __rewriteRelativeImportExtension=function(path15,preserveJsx){return typeof path15=="string"&&/^\.\.?\//.test(path15)?path15.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"}):path15};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_exports,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports,"@earendil-works/pi-agent-core":dist_exports2,"@earendil-works/pi-tui":dist_exports,"@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_exports2,"@mariozechner/pi-tui":dist_exports,"@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=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path11.extname(fileURLToPath7(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path11.dirname(fileURLToPath7(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path11.resolve(__dirname,"../../.."),packagesRoot=path11.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path11.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path11.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path11.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath7(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path11.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path11.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs3.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.")},state={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,assertActive=()=>{if(state.staleMessage)throw new Error(state.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(!state.staleMessage){state.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(entry=>({kind:"config",...entry})),...runtime.pendingNativeProviderRegistrations.map(entry=>({kind:"native",...entry}))];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=[],state="loading",assertActive=()=>{if(state==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state==="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=(...args)=>handler(...args),list4=extension.handlers.get(event)??[];return list4.push(registeredHandler),extension.handlers.set(event,list4),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.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:tool,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)},registerFilesystemPolicy(policy){runtime.assertActive();let policies=extension.filesystemPolicies??[];policies.push(policy),extension.filesystemPolicies=policies},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})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},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)&&(state==="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 state==="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)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},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)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},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)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model)},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()}},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,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 state==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}};return recordExtensionLoadKey(api,runtime),{api,commit:()=>{if(state==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state="active",clearPending()}},discard:()=>{if(state==="loading"){state="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-3TEDTSKJ.js");return createBunExtensionImporter(VIRTUAL_MODULES)}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:path11.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),load=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await factory(load.api),load.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load.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(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}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=path11.join(dir,"package.json");if(fs3.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path11.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path11.join(dir,"index.ts"),indexJs=path11.join(dir,"index.js");return fs3.existsSync(indexTs)?[indexTs]:fs3.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs3.existsSync(dir))return[];let discovered=[];try{let entries=fs3.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path11.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.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=path11.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path11.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path11.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs3.existsSync(resolved)&&fs3.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function wrapRegisteredTool(registeredTool,runner,createToolContext){return{...wrapToolDefinition(registeredTool.definition),execute:async(toolCallId,params,signal,onUpdate)=>{let activeBefore=runner.getActiveTools(),invocation=createToolContext?.(signal),result3;try{result3=await registeredTool.definition.execute(toolCallId,params,signal,onUpdate,runner.createToolContext(toolCallId,signal,invocation?.context))}finally{invocation?.dispose()}let activeAfter=runner.getActiveTools();if(!activeBefore.every(name=>activeAfter.includes(name)))return result3;let beforeNames=new Set(activeBefore),addedToolNames=activeAfter.filter(name=>!beforeNames.has(name));return addedToolNames.length===0?result3:{...result3,addedToolNames:[...new Set([...result3.addedToolNames??[],...addedToolNames])]}}}}function wrapRegisteredTools(registeredTools,runner,createToolContext){return registeredTools.map(tool=>wrapRegisteredTool(tool,runner,createToolContext))}var KERNEL_BUILTIN_GLOBALS=new Set(["agent","completion","display","env","log","output","parallel","phase","pipeline","print","read","tool","tool_schema","tools","workpool","write"]),KernelPreludeCollisionError=class extends Error{constructor(toolName,collidingExport){super(`Tool "${toolName}" kernelPrelude export "${collidingExport}" collides with a built-in eval kernel global.`),this.name="KernelPreludeCollisionError",this.toolName=toolName,this.collidingExport=collidingExport}};function projectKernelPrelude(toolName,prelude){let collision=prelude?.exports.find(name=>KERNEL_BUILTIN_GLOBALS.has(name)||name.startsWith("__"));if(collision!==void 0)throw new KernelPreludeCollisionError(toolName,collision);return prelude}var ExternalAdmission=class{constructor(port){this.turnEpochValue=0,this.pending=new Map,this.emitted=new Set,this.failed=new Map,this.fileTakesWrites=!0,this.emittedListeners=new Set,this.inputHolds=new Set,this.settledListeners=new Set,this.port=port}get turnEpoch(){return this.turnEpochValue}beginTurn(){this.turnEpochValue+=1}setEditorSource(source2){this.editorSource=source2}beginInput(options={}){let parents=options.submittedByCommand?[...this.inputHolds].filter(hold=>hold.command):[],state={command:options.command===!0};this.inputHolds.add(state);let end=()=>this.endHold(state);return{accepted:()=>{end();for(let parent of parents)this.endHold(parent)},end}}onInputsSettled(listener){return this.settledListeners.add(listener),()=>this.settledListeners.delete(listener)}onEmitted(listener){return this.emittedListeners.add(listener),()=>this.emittedListeners.delete(listener)}close(reason){this.closedReason??=reason}reopen(){this.closedReason=void 0}gate(){let editor=this.editorSource?.()??{revision:0},base={editor_revision:editor.revision,turn_epoch:this.turnEpochValue};return this.inputHolds.size>0?{can_admit:!1,hold_reason:"draft",...base}:editor.hold_reason===void 0?{can_admit:!0,...base}:{can_admit:!1,hold_reason:editor.hold_reason,...base}}admit(input){if(this.closedReason!==void 0)throw new Error(this.closedReason);let turn_epoch=this.turnEpochValue,id=input.delivery_id;if(this.pending.has(id)||this.emitted.has(id)||this.failed.has(id))return{kind:"already_admitted",turn_epoch};if(!this.gate().can_admit)return{kind:"held_draft",turn_epoch};if(input.expected_turn_id!==void 0&&input.expected_turn_id!==turn_epoch)return{kind:"turn_conflict",turn_epoch};let message=deliveryMessage(input);return this.isBusy()?input.deliverAs==="steer"?input.expected_turn_id===void 0?{kind:"turn_conflict",turn_epoch}:(this.pending.set(id,"steer"),this.port.enqueue(message,"steer"),{kind:"steered",turn_epoch}):(this.pending.set(id,"followUp"),this.port.enqueue(message,"followUp"),{kind:"queued",turn_epoch}):(this.pending.set(id,"start"),this.port.start(message).finally(()=>{this.pending.get(id)==="start"&&this.pending.set(id,"followUp")}),{kind:"started",turn_epoch})}list(){let deliveries={pending:[...this.pending.keys()],emitted:[...this.emitted]};if(this.failed.size===0)return deliveries;let failed=[...this.failed].map(([delivery_id,error2])=>({delivery_id,error:error2}));return{...deliveries,failed}}observePersisted(message){this.fileTakesWrites=!0;let id=deliveryIdOf(message);if(!(id===void 0||this.emitted.has(id))){this.pending.delete(id),this.emitted.add(id);for(let listener of this.emittedListeners)listener(id)}}observeRefused(message,error2){this.fileTakesWrites=!1;let id=deliveryIdOf(message);id===void 0||this.emitted.has(id)||(this.pending.delete(id),this.failed.set(id,error2))}observeRunSettled(){this.fileTakesWrites&&this.failed.clear()}dropQueued(){for(let[id,lane]of this.pending)lane!=="start"&&this.pending.delete(id)}endHold(state){if(this.inputHolds.delete(state)&&this.inputHolds.size===0)for(let listener of this.settledListeners)listener()}isBusy(){if(this.port.isBusy())return!0;for(let lane of this.pending.values())if(lane==="start")return!0;return!1}};function deliveryMessage(input){return{role:"custom",customType:SESSION_CONTROL_DELIVERY_TYPE,content:input.text,display:!0,details:{delivery_id:input.delivery_id,source:"session_control",deliverAs:input.deliverAs},timestamp:Date.now()}}function deliveryIdOf(message){if(!(message.role!=="custom"||message.customType!==SESSION_CONTROL_DELIVERY_TYPE))return isSessionControlDeliveryDetails(message.details)?message.details.delivery_id:void 0}var SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6(?:\.\d+|\d)?-sol|gpt-6-astra)(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(thinkingLevel==="xhigh"||thinkingLevel==="max")&&isSensitiveHighReasoningModel(model)}function buildHighReasoningWarning(model,thinkingLevel){let modelId=model.id,title=`\u26A0 HIGH-REASONING MODEL WARNING \u2014 ${model.provider}/${modelId} @ ${thinkingLevel}`,body=[`${modelId} is a frontier reasoning model. Running it at "${thinkingLevel}" effort makes it acutely sensitive to prompt quality.`,"Driving this model directly from a human prompt is NOT recommended. Risks include:"," \u2022 The model may refuse to stop, looping or working far past the stated goal.",' \u2022 It may perform unrequested actions in order to "complete" the task.'," \u2022 It may take risky, irreversible, or dangerous actions to force completion.","Strongly recommended: use this model ONLY through the ultrabrain subagent.","Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's \u2014 exactly what these high-effort models need to stay bounded.",'From the main agent, delegate instead: "query ultrabrain with <task>".',`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`];return{title,body}}var LazyToolActivation=class{#host;#activators=[];constructor(host){this.#host=host}register(activator){this.#activators.push(activator)}reset(){this.#activators=[]}activate(toolName){let definition=this.#host.getToolDefinition(toolName);if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this.#activators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.#host.getActiveTools().includes(toolName)&&this.#host.setActiveTools([...this.#host.getActiveTools(),toolName]),this.#host.getActiveTools().includes(toolName)):!1}};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 record7={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?(record7.argumentsBytes=bytes,this.complete=!1):(record7.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record7),this.startedAt.set(record7,performance.now()),record7}finish(record7,isError,errorText6){record7&&(record7.status=isError?"error":"ok",record7.durationMs=Math.round(performance.now()-(this.startedAt.get(record7)??performance.now())),this.startedAt.delete(record7),isError&&errorText6&&(record7.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(`
|
|
2543
2543
|
`)}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??{}},record7=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(resolve46=>{release4=resolve46}),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(record7,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()}};var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv2(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);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,toProviderEnv2(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await untilAborted2(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let systemPrompt=await untilAborted2(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state=agent.state,model=state.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state.reasoningBaseline,state.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state.thinkingSelection!==void 0&&(options.thinkingSelection=state.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted2(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt,messages:[],tools:state.tools.slice(),...state.declaredTools!==void 0?{declaredTools:state.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted2(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve46=>{onAbort=()=>resolve46(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}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}){let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0){await continuation;return}let timer=setTimeout(()=>{getActiveSignal()===ownedSignal&&abortActive()},timeoutMs);try{await continuation}finally{clearTimeout(timer)}}async function checkSessionReloadVeto(runner,isPromptStartPending){if(isPromptStartPending())return{cancelled:!0,reason:"A prompt is being admitted."};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."}:result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}function isHealthExhaustionFailure(errorMessage8){return isBillingErrorMessage(errorMessage8)||isQuotaExhaustionMessage(errorMessage8)}var CircuitProbes=class{constructor(circuits){this.circuits=circuits}isOpen(selector){return this.circuits?.isOpen(selector)??!1}governs(selector){return this.circuits?.governs(selector)??!1}admit(selector){let admission=this.circuits?.admit(selector)??{kind:"closed"};return admission.kind==="probe"&&this.token?.selector!==selector&&(this.release(),this.token=admission.token),admission.kind}holds(selector){return this.token?.selector===selector}get probing(){return this.token?.selector}noteFailure(selector,failure2){this.circuits?.noteFailure(selector,failure2),this.token?.selector===selector&&(this.token=void 0)}accept(selector){this.circuits?.close(selector),this.token?.selector===selector&&(this.token=void 0)}release(){this.token&&this.circuits?.release(this.token),this.token=void 0}releaseAll(){this.token=void 0,this.circuits?.releaseAll()}};function firstUsableCandidate(entries,current,filters){let isSpent=filters.isProviderSpent;if(!isSpent)return scanCandidates(entries,current,filters,()=>!1);let avoided=!1,elsewhere=scanCandidates(entries,current,filters,provider=>{let spent=isSpent(provider);return avoided||=spent,spent});return elsewhere||!avoided?elsewhere:scanCandidates(entries,current,filters,()=>!1)}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(selector.provider===current.model.provider&&selector.id===current.model.id){filters.skip(raw,"self");continue}if(avoidProvider(selector.provider)){filters.skip(raw,"account-limit");continue}let base=baseSelector(selector);if(filters.tried.has(base)){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}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 UnusableEntries=class{constructor(cooldowns){this.cooldowns=cooldowns}note(model,failure2){let scope=usageLimitScope(failure2.errorMessage);scope==="account"?this.cooldowns.note(accountKey(model.provider),failure2):(scope==="model"||isHealthExhaustionFailure(failure2.errorMessage))&&this.cooldowns.note(entryKey(model),failure2)}isProviderSpent(provider){return this.cooldowns.isSuppressed(accountKey(provider))}isUnusable(model){return this.isProviderSpent(model.provider)||this.cooldowns.isSuppressed(entryKey(model))}clear(model){this.cooldowns.clear(accountKey(model.provider)),this.cooldowns.clear(entryKey(model))}};function accountKey(provider){return`account:${provider}`}function entryKey(model){return`exhausted:${formatSelector(model)}`}var RetryFallbackController=class{constructor(deps){this.triedSelectors=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}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy){let state=this.state,current=this.deps.getCurrentSelector();if(!state||state.pinned||!current)return!1;let selector=parseFallbackSelector(state.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&&!this.originalRecovered(state.originalSelector,revertPolicy))return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.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:state.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector,...cause}),!0}originalRecovered(originalSelector,revertPolicy){return revertPolicy!=="cooldown-expiry"?!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 state=this.state;if(!state)return!1;state.pinnedByRefusal=!1;let wasPinned=state.pinned;return state.pinned=state.pinnedByBilling,!wasPinned||state.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state.chainKey,originalSelector:state.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.deps.cooldowns.clear(formatSelector(model)),this.unusable.clear(model),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteHealthFailure(model,thinkingLevel,failure2){this.managedChainKey({model,thinkingLevel})&&(this.unusable.note(model,failure2),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")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){let current=this.deps.getCurrentSelector();current&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let limit=usageLimitScope(failure2.errorMessage);current&&this.unusable.note(current.model,failure2);let candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);return(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage})),await this.applyCandidate(current,candidate,reason,limit),!0}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(baseSelector(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),skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(baseSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random){this.expiresAtBySelector=new Map,this.now=now2,this.random=random}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)}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs3,errorMessage:errorMessage8}){if(retryAfterMs3!==void 0&&Number.isFinite(retryAfterMs3)&&retryAfterMs3>0)return retryAfterMs3;let message=stripProviderRequestIds(errorMessage8??"").toLowerCase();return/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:/"type"\s*:\s*"forbidden"[^}]*request not allowed|request not allowed[^}]*"type"\s*:\s*"forbidden"/.test(message)||/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/.test(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(state,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state.attempt-1);if(state.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state.hintDeadlineMs,cumulativeHintedWaitMs:state.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{chmodSync as chmodSync12,closeSync as closeSync6,mkdirSync as mkdirSync25,openSync as openSync6,renameSync as renameSync19,rmSync as rmSync16,statSync as statSync25,writeSync as writeSync4}from"node:fs";import{dirname as dirname50,join as join87}from"node:path";var DEFAULT_MAX_BYTES8=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_TEXT3=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join87(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(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 validMaxBytes4(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES8}function formatLine3(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText3(event)};if(data!==void 0){for(let[key,value2]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine4(filePath,line,maxBytes){mkdirSync25(dirname50(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2544
2544
|
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync16(`${filePath}.1`,{force:!0}),renameSync19(filePath,`${filePath}.1`),chmodSync12(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync4(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync12(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync25(filePath).size+incomingBytes>maxBytes}catch(error2){if(isMissingFileError3(error2))return!1;throw error2}}function isMissingFileError3(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}function serializeValue2(value2,seen){if(typeof value2=="string")return safeText3(value2);if(typeof value2=="bigint")return value2.toString();if(typeof value2=="number"||typeof value2=="boolean"||value2===null)return value2;if(typeof value2>"u")return;if(typeof value2=="function"||typeof value2=="symbol")return String(value2);if(seen.has(value2))return"[Circular]";if(seen.add(value2),Array.isArray(value2))return value2.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value2))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value2){try{let entries=[];for(let key of Object.keys(value2))try{let item=Reflect.get(value2,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText3(value2){let redacted=value2.replace(SENSITIVE_TEXT3,"$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())}}};function isAssistantEntry(entry){return entry.type==="message"&&entry.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry))continue;let{message}=entry;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}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,errorMessage8){if(!(sentReasoning!==void 0||errorMessage8===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage8))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.
|
|
2545
2545
|
|
|
@@ -2588,7 +2588,7 @@ ${codeSpan(styledWarning)}
|
|
|
2588
2588
|
`)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source2==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source2==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source2,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source2){return source2.usesDefaultSessionDir()?{}:{sessionDir:source2.getSessionDir()}}function currentScopeSessions(source2,onProgress,signal){let cwd=source2.getCwd();return withMovedSessions(SessionManager.list(cwd,source2.getSessionDir(),onProgress,signal),cwd,sharedSessionDir(source2))}async function allScopeSessions(source2,onProgress,signal){let sessions2=source2.usesDefaultSessionDir()?await SessionManager.listAll(onProgress,signal):await SessionManager.listAll(source2.getSessionDir(),onProgress,signal);return markMovedSessions(sessions2,source2.getCwd())}async function chooseResumePath(sessionPath,source2,ui){let cwd=source2.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source2),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
|
|
2589
2589
|
This directory is the same git repository: ${cwd}
|
|
2590
2590
|
Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync50,mkdirSync as mkdirSync28,readFileSync as readFileSync51,realpathSync as realpathSync10,writeFileSync as writeFileSync25}from"node:fs";import{join as join89}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync51(join89(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync28(agentDir,{recursive:!0}),writeFileSync25(join89(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2591
|
-
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync50,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-
|
|
2591
|
+
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync50,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-J6RHZXWB.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
|
|
2592
2592
|
${theme.bold("Failures")}
|
|
2593
2593
|
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2594
2594
|
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|
|
@@ -2708,4 +2708,4 @@ ${theme.fg("dim","Cache Re-billed:")} ${detail}`}}return info+=formatSessionFail
|
|
|
2708
2708
|
|-----|--------|
|
|
2709
2709
|
`;for(let[key,shortcut]of shortcuts){let description=shortcut.description??shortcut.extensionPath,keyDisplay=formatKeyText(key,{capitalize:!0});hotkeys+=`| \`${keyDisplay}\` | ${description} |
|
|
2710
2710
|
`}}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(`
|
|
2711
|
-
`);fs6.mkdirSync(path14.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()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,isSessionControlDeliveryDetails,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,AUTO_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,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,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};
|
|
2711
|
+
`);fs6.mkdirSync(path14.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()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,isSessionControlDeliveryDetails,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,EVAL_HANDLE_ERROR_CODES,EvalHandleError,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,AUTO_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,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,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};
|