@code-yeongyu/senpi 2026.9.23-4 → 2026.9.23-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/dist/bundle/chunks/{app-server-command-QRBQLEXY.js → app-server-command-BGT65PGC.js} +1 -1
- package/dist/bundle/chunks/chunk-LTIMMSDM.js +8 -0
- package/dist/bundle/chunks/{chunk-N46LNXHU.js → chunk-RRSND33J.js} +19 -15
- package/dist/bundle/chunks/{cli-main-ROBDBYAB.js → cli-main-W55CWPEI.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-SLPAGRHH.js → interactive-mode-EDJZ4CSY.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-3PACMEHC.js → multi-session-host-GFSDQQUJ.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-6UIUSRQO.js → package-manager-cli-J7244EJE.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-47EVLL6X.js → rpc-mode-75CRTY24.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +19 -15
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +9 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +14 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/output-format.d.ts +15 -0
- package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/output-format.js +43 -2
- package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +4 -3
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.js +3 -3
- package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -4
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js +5 -0
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
- package/dist/core/tool-call-display-name.d.ts +15 -0
- package/dist/core/tool-call-display-name.d.ts.map +1 -0
- package/dist/core/tool-call-display-name.js +14 -0
- package/dist/core/tool-call-display-name.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/json-event.d.ts +1 -0
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +1 -0
- package/dist/modes/json-event.js.map +1 -1
- package/docs/json.md +4 -1
- package/docs/rpc.md +7 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -23
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts +8 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js +27 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-KBG7BJIL.js +0 -8
|
@@ -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{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-XDSQYM4F.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-BBOQ5H4W.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-PSMTQDII.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,MAX_DURABLE_MONITORS,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-GFUZPFHN.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-KBG7BJIL.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-WUYBEF7C.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-ORCF262V.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-EN6KDFY2.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-ZEFQYQOU.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-DUV3UFKX.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-3XHWW7SQ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-7PANH3NB.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-NNHFMZD5.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-WXIRFRXY.js";import{discoverEnvSlots}from"./chunk-J3QXPP4T.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.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{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-HKE42SWX.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VKBY4F76.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-3RN6BFG2.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-KLDLZHHS.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-34HMVB33.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,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-XYM54ZWK.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-IVYZMSFY.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.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 platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="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=(path13,{windows}={})=>{let segs=path13.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 constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,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:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.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,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.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+open7.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=parse5(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 open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);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};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.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}).)*?)`,create=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 source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=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,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.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,regex,options,{glob,posix:posix5}),result3={glob,state,regex,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,regex,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,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;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 os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync37,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname44}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}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_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,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:()=>formatSize2,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,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:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,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);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"),...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}var GATEWAY_TOOL_NAMESPACE=/^mcp__[^_]+__(.+)$/;function foldToolName(name){return name.toLowerCase().replaceAll(/[-_]/g,"")}function resolveToolNameAlias(requested,available){let names=[...new Set(available)];if(names.includes(requested))return requested;let unnamespaced=GATEWAY_TOOL_NAMESPACE.exec(requested)?.[1]??requested;if(names.includes(unnamespaced))return unnamespaced;let key=foldToolName(unnamespaced),matches=names.filter(name=>foldToolName(name)===key);return matches.length===1?matches[0]:void 0}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}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 newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});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,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){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}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 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)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(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){await emit({type:"agent_end",messages:newMessages});return}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,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}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:result3=>{providerToolResults.push(result3)}}:{}}),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 response.result(),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 response.result();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(resolve42=>{let abortHandler=()=>resolve42(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((resolve42,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(()=>resolve42(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){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,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){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,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,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,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};let tool=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(!tool&&config.resolveUnknownToolCall&&(tool=await config.resolveUnknownToolCall(toolCall.name,currentContext)),!tool){let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));tool=currentContext.tools?.find(candidate=>candidate.name===aliasedName)}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)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName)},...result3.content??[]]}}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(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,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);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},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==="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()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}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}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}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},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.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,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()}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.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)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()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,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,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,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,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(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=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 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),...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);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((resolve42,reject)=>{resolveCompletion=resolve42,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{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-XDSQYM4F.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-BBOQ5H4W.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-PSMTQDII.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,MAX_DURABLE_MONITORS,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-GFUZPFHN.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-LTIMMSDM.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-WUYBEF7C.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-ORCF262V.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-EN6KDFY2.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-ZEFQYQOU.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-DUV3UFKX.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-3XHWW7SQ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-7PANH3NB.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-NNHFMZD5.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-WXIRFRXY.js";import{discoverEnvSlots}from"./chunk-J3QXPP4T.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.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{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-HKE42SWX.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VKBY4F76.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-3RN6BFG2.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-KLDLZHHS.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-34HMVB33.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,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-XYM54ZWK.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-IVYZMSFY.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.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 platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="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=(path13,{windows}={})=>{let segs=path13.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 constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,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:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.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,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.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+open7.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=parse5(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 open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);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};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.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}).)*?)`,create=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 source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=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,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.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,regex,options,{glob,posix:posix5}),result3={glob,state,regex,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,regex,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,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;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 os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync37,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname44}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}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_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,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:()=>formatSize2,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,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:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,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);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"),...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}var GATEWAY_TOOL_NAMESPACE=/^mcp__[^_]+__(.+)$/;function foldToolName(name){return name.toLowerCase().replaceAll(/[-_]/g,"")}function resolveToolNameAlias(requested,available){let names=[...new Set(available)];if(names.includes(requested))return requested;let unnamespaced=GATEWAY_TOOL_NAMESPACE.exec(requested)?.[1]??requested;if(names.includes(unnamespaced))return unnamespaced;let key=foldToolName(unnamespaced),matches=names.filter(name=>foldToolName(name)===key);return matches.length===1?matches[0]:void 0}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 newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});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,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){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}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 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)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(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){await emit({type:"agent_end",messages:newMessages});return}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,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}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:result3=>{providerToolResults.push(result3)}}:{}}),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 response.result(),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 response.result();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(resolve42=>{let abortHandler=()=>resolve42(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((resolve42,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(()=>resolve42(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,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,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(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,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);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},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==="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()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}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}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}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},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.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,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()}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.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)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()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,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,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,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,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(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=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 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),...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);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((resolve42,reject)=>{resolveCompletion=resolve42,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=`
|
|
@@ -2026,12 +2026,15 @@ ${truncatedRules.map(formatRule).join(`
|
|
|
2026
2026
|
`,lineStart),lineEnd=nextNewline===-1?content.length:nextNewline;if(content.slice(lineStart,lineEnd).replace(/\r$/,"")==="---")return{start:lineStart,bodyStart:nextNewline===-1?content.length:nextNewline+1};if(nextNewline===-1)break;lineStart=nextNewline+1}return null}function parseYamlFrontmatter(yamlContent){let lines=yamlContent.replace(/\r\n/g,`
|
|
2027
2027
|
`).split(`
|
|
2028
2028
|
`),frontmatter={},globValues=[],lineIndex=0;for(;lineIndex<lines.length;){let rawLine=lines[lineIndex];if(rawLine===void 0)break;let line=stripComment(rawLine).trim();if(line.length===0){lineIndex+=1;continue}let colonIndex=line.indexOf(":");if(colonIndex===-1)throw new RuleFrontmatterParseError(`Expected key-value pair on line ${lineIndex+1}`);let key=line.slice(0,colonIndex).trim(),rawValue=line.slice(colonIndex+1).trim();if(key==="description"){frontmatter.description=parseStringValue(rawValue),lineIndex+=1;continue}if(key==="alwaysApply"){frontmatter.alwaysApply=parseBooleanValue(rawValue,lineIndex+1),lineIndex+=1;continue}if(key==="globs"||key==="paths"||key==="applyTo"){let parsed=parseGlobValue(rawValue,lines,lineIndex);for(let glob of parsed.values)globValues.includes(glob)||globValues.push(glob);lineIndex+=parsed.consumed;continue}lineIndex+=1}if(globValues.length===1){let singleGlob=globValues[0];singleGlob!==void 0&&(frontmatter.globs=singleGlob)}else globValues.length>1&&(frontmatter.globs=globValues);return frontmatter}function parseBooleanValue(value2,lineNumber){if(value2==="true")return!0;if(value2==="false")return!1;throw new RuleFrontmatterParseError(`Expected boolean on line ${lineNumber}`)}function parseGlobValue(rawValue,lines,lineIndex){if(rawValue.startsWith("["))return{values:parseInlineArray(rawValue),consumed:1};if(rawValue.length===0)return parseMultilineArray(lines,lineIndex);let value2=parseStringValue(rawValue);return value2.includes(",")?{values:value2.split(",").map(item=>item.trim()).filter(Boolean),consumed:1}:{values:[value2],consumed:1}}function parseMultilineArray(lines,lineIndex){let values=[],consumed=1;for(let index=lineIndex+1;index<lines.length;index+=1){let rawLine=lines[index];if(rawLine===void 0)break;let lineWithoutComment=stripComment(rawLine);if(lineWithoutComment.trim().length===0){consumed+=1;continue}let arrayItem=lineWithoutComment.match(/^\s+-\s*(.*)$/);if(arrayItem===null)break;values.push(parseStringValue(arrayItem[1]??"")),consumed+=1}return{values:values.filter(Boolean),consumed}}function parseInlineArray(value2){let closingBracketIndex=findClosingBracket(value2);if(closingBracketIndex===-1)throw new RuleFrontmatterParseError("Unclosed inline array");if(value2.slice(closingBracketIndex+1).trim().length>0)throw new RuleFrontmatterParseError("Unexpected content after inline array");let content=value2.slice(1,closingBracketIndex).trim();return content.length===0?[]:splitCommaSeparated(content).map(parseStringValue).filter(Boolean)}function findClosingBracket(value2){let quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="]")return index}}return-1}function splitCommaSeparated(value2){let values=[],current="",quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){current+=character,escaped=!1;continue}if(quote!==null&&character==="\\"){current+=character,escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null),current+=character;continue}if(quote===null&&character===","){values.push(current.trim()),current="";continue}current+=character}}if(quote!==null)throw new RuleFrontmatterParseError("Unclosed quoted value");return values.push(current.trim()),values.filter(Boolean)}function parseStringValue(value2){if(value2.length===0)return"";if(value2.startsWith('"'))return parseJsonString(value2);if(value2.startsWith("'")&&value2.endsWith("'"))return value2.slice(1,-1);if(value2.startsWith("'"))throw new RuleFrontmatterParseError("Unclosed quoted value");return value2}function parseJsonString(value2){let parsedValue;try{parsedValue=JSON.parse(value2)}catch{throw new RuleFrontmatterParseError("Invalid JSON-quoted string")}if(typeof parsedValue!="string")throw new RuleFrontmatterParseError("Expected JSON-quoted string");return parsedValue}function stripComment(line){let quote=null,escaped=!1;for(let index=0;index<line.length;index+=1){let character=line[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="#")return line.slice(0,index)}}return line}var MAX_DYNAMIC_MATCH_CACHE_ENTRIES=4096,ROOT_SINGLE_FILE_SOURCES=new Set(PROJECT_SINGLE_FILES.filter(source=>!source.includes("/")));function defaultConfig(){return{disabled:!1,mode:"both",maxRuleChars:DEFAULT_MAX_RULE_CHARS,maxResultChars:DEFAULT_MAX_RESULT_CHARS,enabledSources:"auto"}}function createEngine(config,deps){let state=createSessionState(),dynamicMatchCache=new Map;function loadStaticRules(cwd){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="dynamic")return emptyLoadResult(state);let projectRoot=deps.findProjectRoot(cwd),disabledSources=disabledSourcesFor(config),candidates=deps.findCandidates({projectRoot,targetFile:null,...disabledSources===void 0?{}:{disabledSources}}),result3=loadStaticCandidates(candidates,deps,projectRoot,new Map);return storeLastLoad(state,result3.rules,result3.diagnostics),result3}function loadDynamicRules(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return emptyLoadResult(state);let targetFiles=uniqueStrings(targetPaths),shouldCacheLookups=targetFiles.length>1,rules=[],diagnostics=[],seenRules=new Set,loadedRuleContent=new Map,projectMembership=new Map,disabledSources=disabledSourcesFor(config),discoveryCache=shouldCacheLookups?createRuleDiscoveryCache():void 0,candidateDiscoveryCache=new Map,projectRootCache=new Map,realPathCache=new Map;for(let targetFile of targetFiles){let projectRoot=shouldCacheLookups?findProjectRootCached(projectRootCache,targetFile,deps.findProjectRoot):deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,...discoveryCache===void 0?{}:{cache:discoveryCache},...disabledSources===void 0?{}:{disabledSources}},candidates=shouldCacheLookups?findSortedCandidatesCached(candidateDiscoveryCache,deps.findCandidates,findOptions):sortCandidates(deps.findCandidates(findOptions));for(let candidate of candidates){let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{loadedRuleContent,projectMembership,realPathCache});if(loadedRule===null)continue;let matchReason=matchDynamicRuleCached(dynamicMatchCache,projectRoot,targetFile,candidate,loadedRule,deps.matchRule??matchRule);if(matchReason===null)continue;let dedupKey=ruleDedupKey(loadedRule);seenRules.has(dedupKey)||(seenRules.add(dedupKey),rules.push({...loadedRule,matchReason}))}}let sortedRules=sortCandidates(rules);return storeLastLoad(state,sortedRules,diagnostics),{rules:sortedRules,diagnostics}}function fingerprintDynamicTargets(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return[];let fingerprintFn=deps.fileFingerprint??fileStatFingerprint,disabledSources=disabledSourcesFor(config),discoveryCache=createRuleDiscoveryCache(),cwdProjectRoot=deps.findProjectRoot(cwd),fingerprints=[];for(let targetFile of uniqueStrings(targetPaths)){let projectRoot=cwdProjectRoot!==null&&isSameOrChildPath2(targetFile,cwdProjectRoot)?cwdProjectRoot:deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,cache:discoveryCache,...disabledSources===void 0?{}:{disabledSources}},candidates=sortCandidates(deps.findCandidates(findOptions)),cacheKey=dynamicTargetCacheKey(targetFile);fingerprints.push({targetPath:targetFile,cacheKey,fingerprint:computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fingerprintFn)})}return fingerprints}function commitDynamicTargetFingerprints(fingerprints){for(let target of fingerprints)state.dynamicTargetFingerprints.set(target.cacheKey,target.fingerprint)}function isDynamicTargetFingerprintCurrent(target){return state.dynamicTargetFingerprints.get(target.cacheKey)===target.fingerprint}return{state,config,loadStaticRules,loadDynamicRules,formatStatic:rules=>formatStaticBlock(rules,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),formatDynamic:(rules,target)=>formatDynamicBlock(rules,target,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),resetSession:cwd=>{clearSession(state),dynamicMatchCache.clear(),cwd!==void 0&&(state.cwd=cwd)},isStaticInjected:rule=>isStaticInjected(state,rule),isDynamicInjected:(scopeKey,rule)=>isDynamicInjected(state,scopeKey,rule),markStaticInjected:rule=>markStaticInjected(state,rule),markDynamicInjected:(scopeKey,rule)=>markDynamicInjected(state,scopeKey,rule),fingerprintDynamicTargets,isDynamicTargetFingerprintCurrent,commitDynamicTargetFingerprints}}function isSameOrChildPath2(childPath,parentPath){let childRelativePath=relative12(parentPath,resolve22(childPath));return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute12(childRelativePath)}function matchDynamicRuleCached(cache,projectRoot,targetFile,candidate,loadedRule,matchRuleImpl){let cacheKey=dynamicMatchCacheKey(projectRoot,targetFile,candidate,loadedRule.contentHash);if(cache.has(cacheKey)){let cachedReason=cache.get(cacheKey)??null;return cache.delete(cacheKey),cache.set(cacheKey,cachedReason),cachedReason}let matchResult=matchRuleImpl({frontmatter:loadedRule.frontmatter,isSingleFile:candidate.isSingleFile,pathBases:pathBasesForTarget(projectRoot,targetFile,candidate)}),reason=matchResult.matched?matchResult.reason:null;return setDynamicMatchCacheEntry(cache,cacheKey,reason),reason}function setDynamicMatchCacheEntry(cache,cacheKey,reason){if(cache.size>=MAX_DYNAMIC_MATCH_CACHE_ENTRIES){let oldestCacheKey=cache.keys().next().value;oldestCacheKey!==void 0&&cache.delete(oldestCacheKey)}cache.set(cacheKey,reason)}function dynamicMatchCacheKey(projectRoot,targetFile,candidate,contentHash){return[projectRoot??"",toPosixPath2(resolve22(targetFile)),candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),contentHash].join("\0")}function loadStaticCandidates(candidates,deps,projectRoot,realPathCache){let rules=[],diagnostics=[],rootSingleFileSelected=!1;for(let candidate of sortCandidates(candidates)){if(isDedupedRootSingleFile(candidate,rootSingleFileSelected))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{realPathCache});if(loadedRule===null)continue;let matchReason=staticMatchReason(loadedRule);matchReason!==null&&(isRootSingleFile(candidate)&&(rootSingleFileSelected=!0),rules.push({...loadedRule,matchReason}))}return{rules:sortCandidates(rules),diagnostics}}function loadCandidate2(candidate,deps,diagnostics,projectRoot,caches){if(!isCandidateWithinProjectCached(candidate,projectRoot,caches.projectMembership,caches.realPathCache))return diagnostics.push({severity:"warning",source:candidate.path,message:"Rule file resolves outside project root"}),null;let cachedContent=caches.loadedRuleContent?.get(candidate.realPath);if(cachedContent!==void 0)return loadedRuleFromContent(candidate,cachedContent,diagnostics);let content=deps.readFile(candidate.path);if(content===null)return caches.loadedRuleContent?.set(candidate.realPath,null),diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null;let parsed=parseRule(content),loadedContent={frontmatter:parsed.frontmatter,body:parsed.body,contentHash:hashContent(content)};return parsed.diagnostic!==void 0&&(loadedContent.diagnostic=parsed.diagnostic),caches.loadedRuleContent?.set(candidate.realPath,loadedContent),loadedRuleFromContent(candidate,loadedContent,diagnostics)}function loadedRuleFromContent(candidate,content,diagnostics){return content===null?(diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null):(content.diagnostic!==void 0&&diagnostics.push({severity:"warning",source:candidate.path,message:content.diagnostic}),{...candidate,frontmatter:content.frontmatter,body:content.body,contentHash:content.contentHash,matchReason:{kind:"no-match"}})}function ruleDedupKey(rule){return`${rule.realPath}::${rule.contentHash}`}function isCandidateWithinProject(candidate,projectRoot,realPathCache){if(candidate.isGlobal)return!0;if(projectRoot===null)return!1;let relativeRealPath=relative12(realPathOrResolved(projectRoot,realPathCache),resolve22(candidate.realPath));return relativeRealPath===""||!relativeRealPath.startsWith("..")&&!isAbsolute12(relativeRealPath)}function realPathOrResolved(path13,cache){let cached=cache?.get(path13);if(cached!==void 0)return cached;try{let realPath=realpathSync5.native(path13);return cache?.set(path13,realPath),realPath}catch{let resolvedPath=resolve22(path13);return cache?.set(path13,resolvedPath),resolvedPath}}function isCandidateWithinProjectCached(candidate,projectRoot,projectMembership,realPathCache){if(projectMembership===void 0)return isCandidateWithinProject(candidate,projectRoot,realPathCache);let cacheKey=`${projectRoot??""}\0${candidate.realPath}`,cached=projectMembership.get(cacheKey);if(cached!==void 0)return cached;let isWithinProject=isCandidateWithinProject(candidate,projectRoot,realPathCache);return projectMembership.set(cacheKey,isWithinProject),isWithinProject}function findSortedCandidatesCached(cache,findCandidates,options){let cacheKey=candidateDiscoveryCacheKey(options),cached=cache.get(cacheKey);if(cached!==void 0)return cached;let candidates=sortCandidates(findCandidates(options));return cache.set(cacheKey,candidates),candidates}function candidateDiscoveryCacheKey(options){return[options.projectRoot??"",options.targetFile===null?"":dirname30(resolve22(options.targetFile)),...[...options.disabledSources??[]].sort()].join("\0")}function findProjectRootCached(cache,targetFile,findProjectRoot2){let cacheKey=dirname30(resolve22(targetFile));if(cache.has(cacheKey))return cache.get(cacheKey)??null;let projectRoot=findProjectRoot2(targetFile);return cache.set(cacheKey,projectRoot),projectRoot}function staticMatchReason(rule){return rule.frontmatter.alwaysApply===!0?"alwaysApply":rule.isSingleFile?"single-file":null}function disabledSourcesFor(config){if(config.enabledSources==="auto")return;let enabledSources=new Set(config.enabledSources);return new Set([...SOURCE_PRIORITY.keys()].filter(source=>!enabledSources.has(source)))}function isDedupedRootSingleFile(candidate,rootSingleFileSelected){return rootSingleFileSelected&&isRootSingleFile(candidate)}function isRootSingleFile(candidate){return candidate.distance===0&&candidate.isSingleFile&&ROOT_SINGLE_FILE_SOURCES.has(candidate.source)}function pathBasesForTarget(projectRoot,targetFile,candidate){let targetBasename=basename14(targetFile);if(projectRoot===null)return{projectRelative:targetBasename,basename:targetBasename};let projectRelative=toPosixPath2(relative12(projectRoot,targetFile)),scopeDirectory=scopeDirectoryForCandidate(projectRoot,candidate);return scopeDirectory===null?{projectRelative,basename:targetBasename}:{projectRelative,scopeRelative:toPosixPath2(relative12(scopeDirectory,targetFile)),basename:targetBasename}}function scopeDirectoryForCandidate(projectRoot,candidate){if(candidate.isGlobal)return null;if(candidate.isSingleFile)return dirname30(candidate.path);let sourceIndex=candidate.relativePath.indexOf(candidate.source);if(sourceIndex===-1)return projectRoot;let scopeRelativeDirectory=candidate.relativePath.slice(0,sourceIndex).replace(/\/$/,"");return scopeRelativeDirectory.length===0?projectRoot:join48(projectRoot,scopeRelativeDirectory)}function toPosixPath2(path13){return path13.replaceAll("\\","/")}function dynamicTargetCacheKey(targetFile){return toPosixPath2(resolve22(targetFile))}function computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fileFingerprintFn){let candidateFingerprint=candidates.map(candidate=>fingerprintCandidate(candidate,fileFingerprintFn)).join("");return hashContent(["v1",config.enabledSources==="auto"?"auto":config.enabledSources.join(","),projectRoot??"",dynamicTargetCacheKey(targetFile),candidateFingerprint].join("\0"))}function fingerprintCandidate(candidate,fileFingerprintFn){return[candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),fileFingerprintFn(candidate.path)].join("\0")}function fileStatFingerprint(filePath){try{let stats=statSync13(filePath,{bigint:!0});return`${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`}catch{return"missing"}}function uniqueStrings(values){return[...new Set(values)]}function storeLastLoad(state,rules,diagnostics){state.loadedRules.length=0,state.loadedRules.push(...rules),state.diagnostics.length=0,state.diagnostics.push(...diagnostics)}function emptyLoadResult(state){return storeLastLoad(state,[],[]),{rules:[],diagnostics:[]}}var TRUTHY_VALUES=new Set(["1","true","yes","on"]);function configFromEnvironment(env=process.env){let config=defaultConfig(),disabled2=readEnv(env,"PI_RULES_DISABLED");return config.disabled=disabled2!==void 0&&TRUTHY_VALUES.has(disabled2.trim().toLowerCase()),config.maxRuleChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RULE_CHARS"))??config.maxRuleChars,config.maxResultChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RESULT_CHARS"))??config.maxResultChars,config}function readEnv(env,name){let value2=env[name];return typeof value2=="string"&&value2.trim().length>0?value2:void 0}function parsePositiveInteger(value2){if(value2===void 0)return;let normalized2=value2.trim();if(!/^\d+$/.test(normalized2))return;let parsed=Number(normalized2);return Number.isSafeInteger(parsed)&&parsed>0?parsed:void 0}import{existsSync as existsSync26,statSync as statSync14}from"node:fs";import{dirname as dirname31,join as join49,resolve as resolve23}from"node:path";function findProjectRoot(startPath,markers=PROJECT_MARKERS){let resolvedStartPath=resolve23(startPath);if(!existsSync26(resolvedStartPath))return null;let currentDirectory=statSync14(resolvedStartPath).isDirectory()?resolvedStartPath:dirname31(resolvedStartPath),filesystemRoot=resolve23("/");for(;;){for(let marker of markers)if(existsSync26(join49(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname31(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}import{isAbsolute as isAbsolute13,resolve as resolve24}from"node:path";function isTrackedTool(toolName){return TRACKED_BUILTIN_TOOL_SET.has(toolName)}function extractToolPaths(event,cwd){if(event.isError||!isTrackedTool(event.toolName))return[];let filePaths=new Set;return(event.toolName==="read"||event.toolName==="edit")&&(addPath(filePaths,getStringProperty(event.details,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),event.toolName==="write"&&(addPath(filePaths,getStringProperty(event.input,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),[...filePaths]}function addPath(filePaths,filePath,cwd){filePath===void 0||filePath.length===0||filePaths.add(isAbsolute13(filePath)?filePath:resolve24(cwd,filePath))}function getStringProperty(value2,propertyName){if(!isRecord44(value2))return;let propertyValue=value2[propertyName];return typeof propertyValue=="string"?propertyValue:void 0}function isRecord44(value2){return typeof value2=="object"&&value2!==null}var MODE_VALUES=new Set(["static","dynamic","both","off"]),DYNAMIC_CONTEXT_SCOPE="live-context";function piRulesExtension(pi){pi.registerFlag("pi-rules-disabled",{type:"boolean",default:!1,description:"Disable pi-rules hooks."}),pi.registerFlag("pi-rules-mode",{type:"string",default:"both",description:"Rule injection mode: static, dynamic, both, or off."});let config=configFromEnvironment(),envDisabled=config.disabled,engine=createEngine(config,{findCandidates:findRuleCandidates,readFile:path13=>{try{return readFileSync30(path13,"utf-8")}catch{return null}},findProjectRoot,extractToolPaths});registerSlashCommands(pi,engine),registerRuleActivationRenderer(pi);function syncConfigFromFlags(){let disabled2=pi.getFlag("pi-rules-disabled"),mode=pi.getFlag("pi-rules-mode");typeof disabled2=="boolean"&&(engine.config.disabled=disabled2||envDisabled),typeof mode=="string"&&isPiRulesMode(mode)&&(engine.config.mode=mode)}pi.on("session_start",async(event,ctx)=>{syncConfigFromFlags(),!engine.config.disabled&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:event.reason}))}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:"compact"}))}),pi.on("before_agent_start",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="dynamic")return;let loaded2=engine.loadStaticRules(ctx.cwd),nativeContextPaths=new Set(event.systemPromptOptions.contextFiles?.flatMap(contextFile=>pathKeys(contextFile.path))??[]);for(let rule of loaded2.rules)(nativeContextPaths.has(rule.path)||nativeContextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!nativeContextPaths.has(rule.path)&&!nativeContextPaths.has(rule.realPath));if(rules.length===0)return;let block=engine.formatStatic(rules);for(let rule of rules)engine.markStaticInjected(rule);return{systemPrompt:event.systemPrompt+block}}),pi.on("tool_result",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="static"||event.isError)return;let targetPaths=extractToolPaths(event,ctx.cwd),firstTargetPath=targetPaths[0];if(firstTargetPath===void 0)return;let fingerprints=engine.fingerprintDynamicTargets(ctx.cwd,targetPaths),pendingFingerprints=fingerprints.filter(target=>!engine.isDynamicTargetFingerprintCurrent(target));if(pendingFingerprints.length===0){engine.commitDynamicTargetFingerprints(fingerprints);return}let loaded2=engine.loadDynamicRules(ctx.cwd,pendingFingerprints.map(target=>target.targetPath));engine.commitDynamicTargetFingerprints(fingerprints);let rules=loaded2.rules.filter(rule=>!engine.isStaticInjected(rule)&&!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule));if(rules.length===0)return;let firstPendingTarget=pendingFingerprints[0]?.targetPath??firstTargetPath,targetPath=displayPath4(ctx.cwd,firstPendingTarget),block=engine.formatDynamic(rules,targetPath);for(let rule of rules)engine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule);return appendRuleActivation(pi,{kind:"project-rules",targetPath,rules:rules.map(rule=>rule.relativePath),toolCallId:event.toolCallId}),{content:[...event.content,{type:"text",text:block,audience:"model"}]}})}function isPiRulesMode(value2){return MODE_VALUES.has(value2)}function pathKeys(filePath){try{return[filePath,realpathSync6.native(filePath)]}catch{return[filePath]}}function displayPath4(cwd,filePath){return isAbsolute14(filePath)?relative13(cwd,filePath):filePath}import{isAbsolute as isAbsolute16,join as join53}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}import{stat as stat4}from"node:fs/promises";import{isAbsolute as isAbsolute15}from"node:path";import{join as join50}from"node:path";var TERMINAL_MANIFEST_VERSION=1,TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS=3e4;function createTerminalManifestStore(session){return createSidecarStore({baseDir:join50(session.getSessionDir(),"extensions","terminal"),sessionId:session.getSessionId(),version:TERMINAL_MANIFEST_VERSION,tempPrefix:"terminal",parse:parseTerminalManifest})}var TerminalManifestWriter=class{#sessionId;#debounceMs;#now;#entries=new Map;#backgrounds=new Map;#pending=new Map;#timer;#tail=Promise.resolve();constructor(options){this.store=createTerminalManifestStore(options.session),this.#sessionId=options.session.getSessionId(),this.#debounceMs=options.debounceMs??TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS,this.#now=options.now??Date.now}recordRegister(registration){return this.#entries.set(registration.monitorId,this.#entryFor(registration)),this.#persist()}adoptRestored(entry){this.#entries.set(entry.monitorId,{...entry,suspended:!1})}durableCount(){let count=0;for(let entry of this.#entries.values())entry.durabilityClass!=="ephemeral"&&(count+=1);return count}observeMonitorState(snapshot){let live=new Map;for(let entry of snapshot){if(typeof entry.monitorId!="string"||entry.monitorId.length===0)throw new Error(`terminal manifest writer saw a monitor snapshot entry without a stable monitorId (runtime id ${entry.id}); surfacing instead of silently skipping it`);live.set(entry.monitorId,{paused:entry.paused,fireWindow:entry.fireWindow})}let changed=!1;for(let[monitorId,known]of this.#entries){let current=live.get(monitorId);if(current===void 0){if(known.suspended)continue;this.#entries.delete(monitorId),changed=!0;continue}let fireWindow2=current.fireWindow??known.fireWindow;(known.deliveryPaused!==current.paused||known.fireWindow.count!==fireWindow2.count)&&(this.#entries.set(monitorId,{...known,deliveryPaused:current.paused,fireWindow:fireWindow2}),changed=!0)}return changed?this.#persist():Promise.resolve()}scheduleCheckpoint(monitorId,checkpoint2){this.#pending.set(monitorId,checkpoint2),this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=setTimeout(()=>{this.#timer=void 0,this.#absorbPending(),this.#persist()},this.#debounceMs)}async flush(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#pending.size===0?await this.#tail:(this.#absorbPending(),await this.#persist())}async recordShutdown(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#absorbPending();for(let[monitorId,entry]of this.#entries)this.#entries.set(monitorId,{...entry,suspended:!0});await this.#persist()}recordBackgroundStart(id,command,startedAtMs){return this.#backgrounds.set(id,{id,command,startedAtMs:startedAtMs??this.#now()}),this.#persist()}recordBackgroundExit(id){return this.#backgrounds.delete(id)?this.#persist():Promise.resolve()}#absorbPending(){for(let[monitorId,checkpoint2]of this.#pending){let entry=this.#entries.get(monitorId);entry&&this.#entries.set(monitorId,{...entry,lastCheckpoint:checkpoint2})}this.#pending.clear()}#entryFor({monitorId,spec}){let createdAt=this.#now(),persistent=spec.persistent===!0;return{monitorId,sessionId:this.#sessionId,description:spec.description,runtimeKind:spec.kind,durabilityClass:persistent?spec.kind==="file"?"checkpointed-file":"restartable-command":"ephemeral",command:spec.kind==="command"?spec.command:void 0,path:spec.kind==="file"?spec.path:void 0,event:spec.kind==="file"?spec.event:void 0,filter:spec.kind==="command"?spec.filter:void 0,cwd:spec.cwd,approvedParent:spec.kind==="file"?spec.approvedParent:void 0,createdAt,expiresAt:persistent?createdAt+DURABLE_MONITOR_EXPIRY_MS:null,persistent,suspended:!1,lastCheckpoint:null,deliveryPaused:!1,fireWindow:{startMs:createdAt,count:0}}}#persist(){let run=this.#tail.then(()=>this.store.write({version:TERMINAL_MANIFEST_VERSION,sessionId:this.#sessionId,monitors:[...this.#entries.values()],backgroundSessions:[...this.#backgrounds.values()],updatedAt:this.#now()}));return this.#tail=run.then(()=>{},error2=>{this.persistFailure=error2}),this.#tail}};var InvalidTerminalManifestError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidTerminalManifestError"}},RUNTIME_KINDS=["command","file"],DURABILITY_CLASSES=["ephemeral","restartable-command","checkpointed-file"],FILE_EVENTS=["create","modify"],isStr=value2=>typeof value2=="string"&&value2.length>0,isNum=value2=>typeof value2=="number"&&Number.isFinite(value2),isBool=value2=>typeof value2=="boolean",isObj=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function invalid(message){throw new InvalidTerminalManifestError(`terminal manifest is invalid: ${message}`)}function str(raw,field){return isStr(raw[field])||invalid(`field ${field} must be a non-empty string`),raw[field]}function num(raw,field){return isNum(raw[field])||invalid(`field ${field} must be a finite number`),raw[field]}function digest2(raw,field){return typeof raw[field]!="string"&&invalid(`field ${field} must be a string`),raw[field]}function bool(raw,field){return isBool(raw[field])||invalid(`field ${field} must be a boolean`),raw[field]}function opt(raw,field,required){return raw[field]===void 0?void 0:required(raw,field)}function oneOf(values,raw,field){let value2=raw[field];return(typeof value2!="string"||!values.includes(value2))&&invalid(`field ${field} must be one of: ${values.join(", ")}`),value2}function checkpoint(raw){return isObj(raw)||invalid("field lastCheckpoint must be an object"),{dev:num(raw,"dev"),ino:num(raw,"ino"),size:num(raw,"size"),mtimeMs:num(raw,"mtimeMs"),digest:digest2(raw,"digest"),present:bool(raw,"present")}}function fireWindow(raw){return isObj(raw)||invalid("field fireWindow must be an object"),{startMs:num(raw,"startMs"),count:num(raw,"count")}}function parseMonitor(entry){return isObj(entry)||invalid("a monitor entry must be an object"),{monitorId:str(entry,"monitorId"),sessionId:str(entry,"sessionId"),description:str(entry,"description"),runtimeKind:oneOf(RUNTIME_KINDS,entry,"runtimeKind"),durabilityClass:oneOf(DURABILITY_CLASSES,entry,"durabilityClass"),command:opt(entry,"command",str),path:opt(entry,"path",str),event:opt(entry,"event",(raw,field)=>oneOf(FILE_EVENTS,raw,field)),filter:opt(entry,"filter",str),cwd:opt(entry,"cwd",str),approvedParent:opt(entry,"approvedParent",str),createdAt:num(entry,"createdAt"),expiresAt:entry.expiresAt===void 0||entry.expiresAt===null?null:num(entry,"expiresAt"),persistent:bool(entry,"persistent"),suspended:bool(entry,"suspended"),lastCheckpoint:entry.lastCheckpoint===null?null:checkpoint(entry.lastCheckpoint),deliveryPaused:bool(entry,"deliveryPaused"),fireWindow:fireWindow(entry.fireWindow)}}function parseBackgroundSession(entry){return isObj(entry)||invalid("a background session entry must be an object"),{id:str(entry,"id"),command:str(entry,"command"),startedAtMs:num(entry,"startedAtMs")}}function parseTerminalManifest(raw,ref){return isObj(raw)||invalid("the payload must be an object"),Array.isArray(raw.monitors)||invalid("field monitors must be an array"),Array.isArray(raw.backgroundSessions)||invalid("field backgroundSessions must be an array"),{version:TERMINAL_MANIFEST_VERSION,sessionId:ref.sessionId,monitors:raw.monitors.map(parseMonitor),backgroundSessions:raw.backgroundSessions.map(parseBackgroundSession),updatedAt:num(raw,"updatedAt")}}function reapplyPersistedMute(registry,monitor,runtimeId){return monitor.deliveryPaused?(registry.pause([runtimeId]),"muted"):"restored"}var stubRestoreHandlers={"restartable-command":()=>({outcome:"lost"}),"checkpointed-file":()=>({outcome:"lost"})};async function restoreTerminalState(options){let digest3={restored:0,lost:0,expired:0,muted:0,attachedElsewhere:0,storeError:!1},state;try{state=await options.manifest.read()}catch{return{...digest3,storeError:!0}}if(state===null)return digest3;let now2=(options.now??Date.now)(),handlers={...stubRestoreHandlers,...options.handlers};for(let monitor of state.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=now2){digest3.expired+=1;continue}if(monitor.durabilityClass==="ephemeral"){digest3.lost+=1;continue}let outcome=(await handlers[monitor.durabilityClass](monitor)).outcome;digest3[outcome]+=1}return digest3.lost+=state.backgroundSessions.length,digest3}async function spawnCommandSession(ctx,request2){let shell=getShellConfig(ctx.shellPath),useStdin=shell.commandTransport==="stdin",args=useStdin?[...shell.args]:[...shell.args,request2.command],created=await ctx.manager.create(shell.shell,{command:shell.shell,args,cwd:request2.cwd??ctx.cwd,env:{...ctx.getEnv(),...request2.envOverrides},cols:request2.cols,rows:request2.rows,timeoutMs:request2.timeoutMs});return useStdin&&created.runtime.session.write(`${request2.command}
|
|
2029
|
-
`),created}function describeExit(runtime){let exit=runtime.exitResult;return exit?exit.timedOut?"timed_out":exit.cancelled?"killed":exit.exitCode===0?"completed":exit.exitCode!==null?`exited_${exit.exitCode}`:exit.signal?`signal_${exit.signal}`:"exited":null}var LOST={outcome:"lost"};async function defaultDirectoryExists(path13){try{return(await stat4(path13)).isDirectory()}catch{return!1}}function compileFilter(source){if(source!==void 0)try{return new RegExp(source)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function restorable(monitor){if(monitor.runtimeKind!=="command"||!monitor.persistent)return;let{command,cwd}=monitor;if(!(command===void 0||command.length===0)&&!(cwd===void 0||!isAbsolute15(cwd)))return{command,cwd}}function createRestartableCommandHandler(deps){let spawn12=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists;return async monitor=>{let target=restorable(monitor);if(target===void 0||!await directoryExists(target.cwd))return LOST;let spawned;try{spawned=await spawn12(deps.ctx,{command:target.command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd:target.cwd})}catch{return LOST}return deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command:monitor.command,persistent:!0,deadlineMs:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id),deps.onRestored?.(monitor.monitorId,spawned.id),{outcome:reapplyPersistedMute(deps.registry,monitor,spawned.id)}}}import{stat as stat5}from"node:fs/promises";import{resolve as resolve25}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async monitor=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost(`monitor ${monitor.monitorId} is not a restorable file watch`);let saved=monitor.lastCheckpoint;if(saved===null)return lost(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat5(resolve25(monitor.cwd,monitor.path))).isFile())return lost(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,persistent:!0,deadlineMs:null,event:monitor.event??"create",timeoutMs:remainingMs(monitor,now2()),cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{mkdir as mkdir10,open as open4,readFile as readFile14,unlink as unlink2}from"node:fs/promises";import{join as join51}from"node:path";function errorCode2(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&typeof error2.code=="string")return error2.code}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode2(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}async function readLease(path13){let raw;try{raw=await readFile14(path13,"utf8")}catch(error2){if(errorCode2(error2)==="ENOENT")return"missing";throw error2}try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let pid=parsed.pid,startedAtMs=parsed.startedAtMs;return typeof pid!="number"||!Number.isFinite(pid)||typeof startedAtMs!="number"||!Number.isFinite(startedAtMs)?"unparseable":{pid,startedAtMs}}catch{return"unparseable"}}async function exclusiveCreate(path13,record7){let file=await open4(path13,"wx");try{await file.writeFile(JSON.stringify(record7),"utf8")}finally{await file.close()}}async function unlinkIfPresent(path13){try{await unlink2(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}async function tryAcquire(path13,record7,isProcessAlive2,retry){try{return await exclusiveCreate(path13,record7),{acquired:!0,path:path13,pid:record7.pid}}catch(error2){if(errorCode2(error2)!=="EEXIST")throw error2;let existing=await readLease(path13);if((existing==="missing"||existing==="unparseable"||!probeAlive(existing.pid,isProcessAlive2))&&retry)return await unlinkIfPresent(path13),tryAcquire(path13,record7,isProcessAlive2,!1);if(existing==="missing"||existing==="unparseable")throw error2;return{acquired:!1,holder:existing}}}async function acquireTerminalLease(options){let pid=options.pid??process.pid,startedAtMs=(options.now??Date.now)(),path13=join51(options.dir,`${options.encodedSessionId}.lease`);return await mkdir10(options.dir,{recursive:!0}),tryAcquire(path13,{pid,startedAtMs},options.isProcessAlive,!0)}async function releaseTerminalLease(handle){let existing=await readLease(handle.path);existing==="missing"||existing==="unparseable"||existing.pid===handle.pid&&await unlinkIfPresent(handle.path)}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
|
|
2029
|
+
`),created}function describeExit(runtime){let exit=runtime.exitResult;return exit?exit.timedOut?"timed_out":exit.cancelled?"killed":exit.exitCode===0?"completed":exit.exitCode!==null?`exited_${exit.exitCode}`:exit.signal?`signal_${exit.signal}`:"exited":null}var LOST={outcome:"lost"};async function defaultDirectoryExists(path13){try{return(await stat4(path13)).isDirectory()}catch{return!1}}function compileFilter(source){if(source!==void 0)try{return new RegExp(source)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function restorable(monitor){if(monitor.runtimeKind!=="command"||!monitor.persistent)return;let{command,cwd}=monitor;if(!(command===void 0||command.length===0)&&!(cwd===void 0||!isAbsolute15(cwd)))return{command,cwd}}function createRestartableCommandHandler(deps){let spawn12=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists;return async monitor=>{let target=restorable(monitor);if(target===void 0||!await directoryExists(target.cwd))return LOST;let spawned;try{spawned=await spawn12(deps.ctx,{command:target.command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd:target.cwd})}catch{return LOST}return deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command:monitor.command,persistent:!0,deadlineMs:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id),deps.onRestored?.(monitor.monitorId,spawned.id),{outcome:reapplyPersistedMute(deps.registry,monitor,spawned.id)}}}import{stat as stat5}from"node:fs/promises";import{resolve as resolve25}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async monitor=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost(`monitor ${monitor.monitorId} is not a restorable file watch`);let saved=monitor.lastCheckpoint;if(saved===null)return lost(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat5(resolve25(monitor.cwd,monitor.path))).isFile())return lost(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,persistent:!0,deadlineMs:null,event:monitor.event??"create",timeoutMs:remainingMs(monitor,now2()),cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{mkdir as mkdir10,open as open4,readFile as readFile14,unlink as unlink2}from"node:fs/promises";import{join as join51}from"node:path";function errorCode2(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&typeof error2.code=="string")return error2.code}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode2(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}async function readLease(path13){let raw;try{raw=await readFile14(path13,"utf8")}catch(error2){if(errorCode2(error2)==="ENOENT")return"missing";throw error2}try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let pid=parsed.pid,startedAtMs=parsed.startedAtMs;return typeof pid!="number"||!Number.isFinite(pid)||typeof startedAtMs!="number"||!Number.isFinite(startedAtMs)?"unparseable":{pid,startedAtMs}}catch{return"unparseable"}}async function exclusiveCreate(path13,record7){let file=await open4(path13,"wx");try{await file.writeFile(JSON.stringify(record7),"utf8")}finally{await file.close()}}async function unlinkIfPresent(path13){try{await unlink2(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}async function tryAcquire(path13,record7,isProcessAlive2,retry){try{return await exclusiveCreate(path13,record7),{acquired:!0,path:path13,pid:record7.pid}}catch(error2){if(errorCode2(error2)!=="EEXIST")throw error2;let existing=await readLease(path13);if((existing==="missing"||existing==="unparseable"||!probeAlive(existing.pid,isProcessAlive2))&&retry)return await unlinkIfPresent(path13),tryAcquire(path13,record7,isProcessAlive2,!1);if(existing==="missing"||existing==="unparseable")throw error2;return{acquired:!1,holder:existing}}}async function acquireTerminalLease(options){let pid=options.pid??process.pid,startedAtMs=(options.now??Date.now)(),path13=join51(options.dir,`${options.encodedSessionId}.lease`);return await mkdir10(options.dir,{recursive:!0}),tryAcquire(path13,{pid,startedAtMs},options.isProcessAlive,!0)}async function releaseTerminalLease(handle){let existing=await readLease(handle.path);existing==="missing"||existing==="unparseable"||existing.pid===handle.pid&&await unlinkIfPresent(handle.path)}function modelOnlyText(text2){return{type:"text",text:text2,audience:"model"}}function isModelOnlyText(part){return typeof part=="object"&&part!==null&&"type"in part&&part.type==="text"&&"audience"in part&&part.audience==="model"}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
|
|
2030
2030
|
`).split(`
|
|
2031
2031
|
`).map(collapseRedraws).join(`
|
|
2032
|
-
`)}function formatTerminalToolOutput(raw){let sanitized=sanitizeTerminalOutput(raw).trimEnd(),truncation=truncateTail(sanitized,{maxLines:TERMINAL_TOOL_MAX_LINES,maxBytes:TERMINAL_TOOL_MAX_BYTES});if(!truncation.truncated)return{text:sanitized,truncated:!1,truncation};let marker=truncation.lastLinePartial?`[Showing last ${formatSize(truncation.outputBytes)} of a single line; earlier output dropped]`:`[Showing lines ${truncation.totalLines-truncation.outputLines+1}-${truncation.totalLines} of ${truncation.totalLines}; earlier output dropped]`;return{text:`${truncation.content}
|
|
2032
|
+
`)}function formatTerminalToolOutput(raw){let sanitized=sanitizeTerminalOutput(raw).trimEnd(),truncation=truncateTail(sanitized,{maxLines:TERMINAL_TOOL_MAX_LINES,maxBytes:TERMINAL_TOOL_MAX_BYTES});if(!truncation.truncated)return{text:sanitized,body:sanitized,truncated:!1,truncation};let marker=truncation.lastLinePartial?`[Showing last ${formatSize(truncation.outputBytes)} of a single line; earlier output dropped]`:`[Showing lines ${truncation.totalLines-truncation.outputLines+1}-${truncation.totalLines} of ${truncation.totalLines}; earlier output dropped]`;return{text:`${truncation.content}
|
|
2033
2033
|
|
|
2034
|
-
${marker}`,truncated:!0,truncation}}
|
|
2034
|
+
${marker}`,body:truncation.content,marker,truncated:!0,truncation}}function splitModelOnlyNotices(text2,notices){let parts=[],cursor=0,afterNotice=!1;for(let notice2 of notices){if(notice2===void 0||notice2.length===0)continue;let index=text2.indexOf(notice2,cursor);if(index<0)continue;let end=index+notice2.length;if(!(end<text2.length&&text2[end]!==`
|
|
2035
|
+
`)){if(afterNotice&&index===cursor)parts.push(modelOnlyText(notice2));else if(index>cursor&&text2[index-1]===`
|
|
2036
|
+
`)parts.push({type:"text",text:text2.slice(cursor,index-1)},modelOnlyText(notice2));else continue;cursor=end<text2.length?end+1:end,afterNotice=end<text2.length}}return parts.length===0?[{type:"text",text:text2}]:((cursor<text2.length||text2[text2.length-1]===`
|
|
2037
|
+
`)&&parts.push({type:"text",text:text2.slice(cursor)}),parts)}var NON_INTERACTIVE_MODES=new Set(["print","json"]),TERMINAL_NOTIFICATION_CUSTOM_TYPE="senpi-terminal:notification",NOTICE_TAIL_MAX_CHARS=2e3;function getTerminalNotificationDelivery(deps,customType=TERMINAL_NOTIFICATION_CUSTOM_TYPE){let mode=deps.getMode();if(mode==="off")return;let ctx=deps.getContext();if(!(!ctx||NON_INTERACTIVE_MODES.has(ctx.mode)||!ctx.model))return{send:(content,options)=>deps.sendMessage({customType,content,display:!1,...options?.details===void 0?{}:{details:options.details}},{triggerTurn:!0,deliverAs:mode==="wake"||options?.forceWake===!0?"steer":"followUp"})}}function buildNotice(id,runtime){let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`,tail=sanitizeTerminalOutput(runtime.fullOutput()).trimEnd(),tailSection="";if(tail.length>0){let truncated=tail.length>NOTICE_TAIL_MAX_CHARS,shown=truncated?tail.slice(tail.length-NOTICE_TAIL_MAX_CHARS):tail,note=truncated?`
|
|
2035
2038
|
[Final output truncated to the last ${NOTICE_TAIL_MAX_CHARS} chars; the full history is still peekable.]`:"";tailSection=`
|
|
2036
2039
|
Final output:
|
|
2037
2040
|
${shown}${note}`}return`<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`}var TerminalNotifier=class{constructor(deps){this.notified=new Set,this.deps=deps}notifyCompletion(id,runtime){if(this.notified.has(id))return;let delivery=getTerminalNotificationDelivery(this.deps);delivery&&(this.notified.add(id),delivery.send(buildNotice(id,runtime)))}};var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",QUEUE_OVERHEAD_CHARS=512,MONITOR_NOTIFICATION_CUSTOM_TYPE="senpi-monitor:notification",WAKE_STREAK_QUIET_GAP_MULTIPLIER=2,systemScheduler={now:()=>Date.now(),setTimeout:(callback,delayMs)=>setTimeout(callback,delayMs),clearTimeout:timer=>clearTimeout(timer)};function boundedPositiveInt(value2,fallback,minimum,maximum){return Number.isFinite(value2)?Math.min(Math.max(Math.trunc(value2),minimum),maximum):fallback}function resolveSettings3(settings){return{coalesceWindowMs:boundedPositiveInt(settings.coalesceWindowMs,2e3,1,6e4),rateLimitMs:boundedPositiveInt(settings.rateLimitMs,5e3,1,36e5),maxLinesPerInjection:boundedPositiveInt(settings.maxLinesPerInjection,50,1,200),maxCharsPerInjection:boundedPositiveInt(settings.maxCharsPerInjection,4096,512,16384),wakeBudget:boundedPositiveInt(settings.wakeBudget,5,1,100)}}function eventBody(event){let value2=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value2).replace(/[\r\n]+/g," ").trimEnd()}function clip(text2,maxChars){return text2.length<=maxChars?text2:maxChars<=3?text2.slice(0,maxChars):`${text2.slice(0,maxChars-3)}...`}function formatEvents(events){let groups=new Map;for(let event of events){let group=groups.get(event.id)??{description:event.description,bodies:[]};group.bodies.push(eventBody(event)),groups.set(event.id,group)}return[...groups.values()].map(group=>`Monitor event(${group.description}): ${group.bodies.join(`
|
|
@@ -2079,7 +2082,7 @@ manual \`&\` backgrounding \u2014 use the built-in session tools:
|
|
|
2079
2082
|
- \`bash_resize({ bash_id, cols, rows })\` resizes the PTY so full-screen programs reflow.
|
|
2080
2083
|
- \`kill_bash({ bash_id })\` (or \`{ all: true }\`) tears the session tree down with no orphans.
|
|
2081
2084
|
`}var TerminalManager=class{constructor(options={}){this.runtimes=new Map,this.monitorIds=new Map,this.exited=new Set,this.reservations=0,this.maxSessions=options.maxSessions??DEFAULT_MAX_SESSIONS,this.scrollback=options.scrollback}get size(){return this.runtimes.size}get activeSize(){return this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations}reserve(){if(this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations>=this.maxSessions)return null;this.reservations+=1;let released=!1;return()=>{released||(released=!0,this.reservations-=1)}}async create(command,options){let pty=await loadPty(),release3=this.reserve();if(!release3)throw new pty.SessionRegistryCapacityError(this.maxSessions);this.registry??=new pty.SessionRegistry({maxSessions:this.maxSessions});let registry=this.registry,runtimeOptions={...options,scrollback:this.scrollback},{TerminalRuntimeSession}=await import("./runtime-session-F3EXC44D.js"),runtime=new TerminalRuntimeSession(command,runtimeOptions),entry;try{entry=await registry.create({command,session:runtime.session})}catch(error2){throw release3(),runtime.dispose(),runtime.session.kill(),error2}return this.runtimes.set(entry.id,runtime),runtime.session.onExit(()=>{this.exited.add(entry.id)}),release3(),this.reconcileRuntimes(),{id:entry.id,runtime}}get(id){let registry=this.registry;return!registry||!registry.get(id)?null:this.runtimes.get(id)??null}bindMonitorId(monitorId,sessionId){this.monitorIds.set(monitorId,sessionId)}resolveId(idOrMonitorId){if(idOrMonitorId.startsWith("mon_"))return this.monitorIds.get(idOrMonitorId);let registry=this.registry;if(registry)return registry.get(idOrMonitorId)?idOrMonitorId:void 0}list(){let registry=this.registry;if(!registry)return[];let result3=[];for(let entry of registry.list()){let runtime=this.runtimes.get(entry.id);runtime&&result3.push({id:entry.id,runtime})}return result3}async stop(id){let registry=this.registry;if(!registry)return!1;let stopped=await registry.stop(id);return this.reconcileRuntimes(),stopped}async teardown(){let registry=this.registry;registry&&await registry.teardown(),this.registry=void 0;for(let runtime of this.runtimes.values())runtime.dispose();this.runtimes.clear(),this.exited.clear(),this.monitorIds.clear()}reconcileRuntimes(){let registry=this.registry;if(!registry)return;let liveIds=new Set(registry.list().map(entry=>entry.id));for(let[id,runtime]of this.runtimes)if(!liveIds.has(id)){runtime.dispose(),this.runtimes.delete(id),this.exited.delete(id);for(let[monitorId,sessionId]of this.monitorIds)sessionId===id&&this.monitorIds.delete(monitorId)}}};import{randomBytes as randomBytes4}from"node:crypto";import{watch}from"node:fs";import{access,lstat,open as open5,stat as stat6}from"node:fs/promises";import{basename as basename15,dirname as dirname32,join as join52,resolve as resolve26}from"node:path";import{createHash as createHash16}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash16("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
|
|
2082
|
-
`);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var MONITOR_ID_ALPHABET="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function allocateMonitorId(){let id="mon_",buffer=0,bits=0;for(let byte of randomBytes4(10))for(buffer=buffer<<8|byte,bits+=8;bits>=5;)bits-=5,id+=MONITOR_ID_ALPHABET[buffer>>bits&31];return id}var MonitorRegistry=class{#records=new Map;#emit;#onChange;#onEnded;#onFire;#reserve;#files=new Map;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#pending=new Set;#lifecycle=0;constructor(emit,options){this.#emit=emit,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire,this.#reserve=options?.reserve}setParked(parked){if(this.#parked!==parked){this.#parked=parked;for(let record7 of this.#files.values())parked?record7.watch.pause():record7.paused||record7.watch.resume()}}snapshot(){return[...this.#records.values(),...this.#files.values()].map(record7=>({id:record7.id,monitorId:record7.monitorId,description:record7.description,paused:record7.paused,startedAtMs:record7.startedAtMs,command:record7.command,filter:record7.filter?.source??null,persistent:record7.persistent,deadlineMs:record7.deadlineMs,fireCount:record7.fireCount,lastFiredAtMs:record7.lastFiredAtMs,expiresAt:record7.expiresAt,fireWindow:"fireWindow"in record7?record7.fireWindow:void 0}))}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release3=this.#reserve?.();if(this.#reserve&&!release3)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending={release:release3??void 0,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),options.timeoutMs),settled:!1};this.#pending.add(pending);let path13=resolve26(options.cwd,options.path),parent=dirname32(path13),approvedParent;try{await this.#registrationAwait(pending,access(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path13}`);if(initialHandle=await this.#registrationAwait(pending,open5(path13,"r"),async handle=>{await handle.close()}),initial=await this.#registrationAwait(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path13}`);if(realpathWithoutOpen(path13)!==join52(approvedParent,basename15(path13)))throw new Error(`Cannot watch file: target identity changed: ${path13}`);if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path13}`);let reboundStat=await this.#registrationAwait(pending,stat6(path13));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path13}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2}if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#registrationAwait(pending,probeDirectoryOpenable(activationParent)),watcher=watch(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename15(String(name))===basename15(path13))&&this.#checkFile(id)})}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path13}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record8=this.#files.get(id);record8&&this.#settleFile(record8,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#finishPending(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath=join52(approvedParent,basename15(path13)),digest3;try{digest3=initial&&initialHandle?await this.#registrationAwait(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record7={id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent:options.persistent??options.expiresAt!==void 0,deadlineMs:options.persistent??options.expiresAt!==void 0?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path13,canonicalPath,canonicalParent:approvedParent,event:options.event,watcher,release:release3??(()=>{}),watch:new FileWatchLoop(()=>{this.#checkFile(id)}),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:setTimeout(()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")},options.timeoutMs)};if(this.#files.set(id,record7),this.#parked&&record7.watch.pause(),finishRegistration(),this.#finishPending(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record7,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#notifyChange(),{id,monitorId:record7.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}emitFileLine(id,line){let record7=this.#files.get(id);return!record7||record7.settled?!1:(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),!0)}async stopFile(id){let record7=this.#files.get(id);return record7?(this.#settleFile(record7,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record7 of records)this.#settleFile(record7,"watcher killed");for(let pending of[...this.#pending])this.#finishPending(pending);return records.length}#settleFile(record7,summary){if(record7.settled)return;record7.settled=!0,record7.watch.stop(),clearTimeout(record7.deadline),record7.watcher.close(),record7.release(),this.#files.delete(record7.id),this.#notifyChange(),this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#emitEnded(record7,reason,null)}async#checkFile(id){let record7=this.#files.get(id);if(!(!record7||record7.settled||record7.paused||this.#parked)){if(record7.checking){record7.dirty=!0;return}return record7.checking=this.#checkFileImpl(record7).catch(error2=>{record7.settled||this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record7.checking=void 0;let now2=Date.now();now2-record7.dirtyWindowStartedAt>=1e3&&(record7.dirtyWindowStartedAt=now2,record7.dirtyPasses=0),record7.dirty&&!record7.settled&&record7.dirtyPasses<1?(record7.dirty=!1,record7.dirtyPasses+=1,this.#checkFile(id)):record7.dirty=!1}),record7.checking}}async#checkFileImpl(record7){if(record7.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname32(record7.path))!==record7.canonicalParent){this.#settleFile(record7,`watcher error: monitored parent changed: ${dirname32(record7.path)}`);return}if((await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(realpathWithoutOpen(record7.canonicalPath)!==record7.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);handle=await open5(record7.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record7.path}`);if((opened.dev!==record7.device||opened.ino!==record7.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(current=opened,(await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);let reboundPath=await stat6(record7.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await this.#digestHandle(handle):"",present&&handle){let afterDigest=await stat6(record7.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}}finally{await handle?.close()}let changed=record7.event==="create"?!record7.present&&present:record7.present&&present&&(current.mtimeMs!==record7.mtimeMs||current.size!==record7.size||digest3!==record7.digest);record7.pendingChange||=changed,!record7.present&¤t&&(record7.device=current.dev,record7.inode=current.ino),record7.present=present,record7.mtimeMs=current?.mtimeMs??0,record7.size=current?.size??0,record7.digest=digest3,!(!record7.pendingChange||record7.paused||record7.settled)&&(record7.pendingChange=!1,!record7.settled&&(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line:`${record7.event} ${record7.path}`}),this.#settleFile(record7,"watcher completed")))}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record7={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,unsubscribeOutput:void 0,unsubscribeExit:void 0};return this.#records.set(record7.id,record7),this.#notifyChange(),this.#consume(record7,record7.runtime.fullOutput()),record7.unsubscribeOutput=record7.runtime.onOutput(chunk=>this.#consume(record7,chunk)),record7.unsubscribeExit=record7.runtime.session.onExit(()=>this.#settle(record7)),record7.runtime.exited&&this.#settle(record7),record7.monitorId}pause(ids){let paused=[];for(let id of ids){let record7=this.#records.get(id)??this.#files.get(id);!record7||record7.paused||(record7.paused=!0,"watch"in record7&&record7.watch.pause(),paused.push(record7.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#records.keys(),...this.#files.keys()])}resume(ids){let candidates=ids??[...this.#records.keys(),...this.#files.keys()],resumed=[];for(let id of candidates){let record7=this.#records.get(id)??this.#files.get(id);if(!record7?.paused)continue;record7.paused=!1;let mutedDropped="mutedDropped"in record7?record7.mutedDropped:0;"mutedDropped"in record7&&(record7.mutedDropped=0),"fireWindow"in record7&&record7.fireWindow!==void 0&&(record7.fireWindow.count=0),resumed.push({id:record7.id,mutedDropped}),"watch"in record7&&!this.#parked&&record7.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#records.get(id)?.mutedDropped??0}rearm(id){let record7=this.#records.get(id)??this.#files.get(id);return record7?record7.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){for(let record7 of this.#records.values())if(record7.monitorId===monitorId)return record7.fireWindow={...fireWindow2},!0;return!1}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record7 of[...this.#records.values()])this.#disposeRecord(record7);for(let record7 of this.#files.values())this.#settleFile(record7,"watcher disposed");for(let pending of this.#pending)this.#finishPending(pending);this.#records.clear(),this.#notifyChange()}#finishPending(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async#registrationAwait(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value2=>lateCleanup?.(value2),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value2=>(aborted&&lateCleanup?.(value2),value2),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}#notifyChange(){this.#onChange?.(this.snapshot())}#consume(record7,chunk){if(!(record7.settled||chunk.length===0)){for(let line of record7.lineBuffer.append(chunk))if(!record7.filter||record7.filter.test(line)){if(record7.paused){record7.mutedDropped+=1;continue}if(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),record7.fireWindow!==void 0){let now2=Date.now();now2-record7.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record7.fireWindow={startMs:now2,count:0}),record7.fireWindow.count+=1,record7.fireWindow.count>=DEFAULT_DURABLE_MONITOR_FIRE_BUDGET&&(record7.paused=!0,this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:FIRE_BUDGET_AUTO_MUTE_SUMMARY}),this.#notifyChange())}}}}#settle(record7){if(record7.settled)return;record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#notifyChange();let status=describeExit(record7.runtime)??"exited",code=record7.runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:`watcher ${status}${codeText}`});let exit=record7.runtime.exitResult;this.#emitEnded(record7,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record7){record7.settled||(record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#emitEnded(record7,"disposed",null))}#emitForRecord(record7,event){record7.fireCount+=1,record7.lastFiredAtMs=Date.now(),this.#emit(event),record7.settled||this.#onFire?.(this.snapshot())}#emitEnded(record7,reason,exitCode){this.#onEnded?.({id:record7.id,description:record7.description,startedAtMs:record7.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record7.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}var TERMINAL_SETTINGS_DEFAULTS={defaultCols:DEFAULT_COLS,defaultRows:DEFAULT_ROWS,scrollback:DEFAULT_SCROLLBACK,maxSessions:DEFAULT_MAX_SESSIONS,timeoutAction:"background",notify:"wake",monitor:{coalesceWindowMs:2e3,rateLimitMs:5e3,maxLinesPerInjection:50,maxCharsPerInjection:4096,wakeBudget:5}};function positiveInt(value2,fallback,maximum=Number.MAX_SAFE_INTEGER){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?fallback:Math.min(Math.trunc(value2),maximum)}function nonNegativeInt(value2,fallback){return typeof value2!="number"||!Number.isFinite(value2)||value2<0?fallback:Math.trunc(value2)}function oneOf2(value2,allowed,fallback){return typeof value2=="string"&&allowed.includes(value2)?value2:fallback}function resolveTerminalSettings(raw){return raw?{defaultCols:positiveInt(raw.defaultCols,TERMINAL_SETTINGS_DEFAULTS.defaultCols),defaultRows:positiveInt(raw.defaultRows,TERMINAL_SETTINGS_DEFAULTS.defaultRows),scrollback:nonNegativeInt(raw.scrollback,TERMINAL_SETTINGS_DEFAULTS.scrollback),maxSessions:positiveInt(raw.maxSessions,TERMINAL_SETTINGS_DEFAULTS.maxSessions),timeoutAction:oneOf2(raw.timeoutAction,["background","kill"],TERMINAL_SETTINGS_DEFAULTS.timeoutAction),notify:oneOf2(raw.notify,["wake","next-turn","off"],TERMINAL_SETTINGS_DEFAULTS.notify),monitor:{coalesceWindowMs:positiveInt(raw.monitorCoalesceWindowMs,TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,6e4),rateLimitMs:positiveInt(raw.monitorRateLimitMs,TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs,36e5),maxLinesPerInjection:positiveInt(raw.monitorMaxLinesPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,200),maxCharsPerInjection:positiveInt(raw.monitorMaxCharsPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,16384),wakeBudget:positiveInt(raw.monitorWakeBudget,TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget,100)}}:TERMINAL_SETTINGS_DEFAULTS}function loadTerminalSettings(settingsManager){let global=settingsManager.getGlobalSettings().terminal,project=settingsManager.getProjectSettings().terminal,merged={...global,...project};return resolveTerminalSettings(merged)}function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function createForegroundDetachGate(options){let cancelled=!1,committed=!1,timer,resolveDetached,detached=new Promise(resolve42=>{resolveDetached=resolve42}),clearDeadline=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)},linearize=()=>{if(cancelled||committed||options.runtime.exited||options.signal?.aborted)return;let exitedAtGate=!1,unsubscribeExit=options.runtime.session.onExit(()=>{committed||(exitedAtGate=!0)});if(cancelled||options.runtime.exited||exitedAtGate||options.signal?.aborted){unsubscribeExit();return}committed=!0,options.removeAbortListener(),unsubscribeExit(),resolveDetached()};return timer=setTimeout(()=>queueMicrotask(linearize),options.delayMs),{detached,cancel(){cancelled=!0,clearDeadline()}}}var SHELL_WRAPPER=/^(?:env\s+(?:[\w.]+=[^\s]*\s+)*)?(?:\/(?:usr\/)?bin\/)?(?:ba|z|da|k)?sh\s+-[a-z]*c\s+/i,POWER_MANAGEMENT=/\b(?:pmset|systemsetup|caffeinate|displaysleep|disksleep)\b/,SLEEP_CALL=/(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+(\d+(?:\.\d+)?)/g,PURE=/^sleep\s+\d+(?:\.\d+)?$/,LEADING=/^\(?\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*(?:[;&|]|$)/,LOOP=/\b(?:while|until|for)\b[\s\S]*?(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+\d/,TRAILING=/[;&|]\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*\)?\s*$/;function unwrap(command){let current=command.trim();for(let depth=0;depth<3;depth+=1){let stripped=current.replace(SHELL_WRAPPER,"");if(stripped===current)break;current=stripped.trim();let quote=current[0];(quote==="'"||quote==='"')&¤t.endsWith(quote)&¤t.length>1&&(current=current.slice(1,-1).trim())}return current}function longestSleepSeconds(command){SLEEP_CALL.lastIndex=0;let longest;for(let match of command.matchAll(SLEEP_CALL)){let seconds=Number.parseFloat(match[1]??"");Number.isFinite(seconds)&&(longest===void 0||seconds>longest)&&(longest=seconds)}return longest}function classifySleepWait(command){if(POWER_MANAGEMENT.test(command))return;let unwrapped=unwrap(command),seconds=longestSleepSeconds(unwrapped);if(seconds!==void 0){if(LOOP.test(unwrapped))return seconds>=2?{kind:"sleep-wait",rule:"R3",seconds}:void 0;if(!(seconds<10)){if(PURE.test(unwrapped))return{kind:"sleep-wait",rule:"R1",seconds};if(LEADING.test(unwrapped))return{kind:"sleep-wait",rule:"R2",seconds};if(TRAILING.test(unwrapped))return{kind:"sleep-wait",rule:"R4",seconds}}}}var ptyBashSchema=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute in a PTY-backed session."}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Process kill deadline in seconds (default 1800). Foreground blocking stops at the ~60s window: a command still running then auto-detaches to a live background session instead of being killed. Ignored for run_in_background sessions (they live until exit or kill_bash)."})),description:typebox_exports.Optional(typebox_exports.String({description:"Short human-readable label for this command."})),run_in_background:typebox_exports.Optional(typebox_exports.Boolean({description:"Run as a persistent background session. Returns a bash_id immediately; query it with bash_output, steer with bash_input, tear down with kill_bash."})),cols:typebox_exports.Optional(typebox_exports.Number({description:"PTY width in columns (default 120)."})),rows:typebox_exports.Optional(typebox_exports.Number({description:"PTY height in rows (default 40)."}))});function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function delay2(ms){return new Promise(resolve42=>setTimeout(resolve42,ms))}var MAX_TIMEOUT_MS=2147483647,BASH_UPDATE_THROTTLE_MS=100;function createThrottledEmitter(emit,throttleMs=BASH_UPDATE_THROTTLE_MS){let timer,dirty=!1,lastEmissionAt,emitIfDirty=()=>{dirty&&(dirty=!1,lastEmissionAt=Date.now(),emit())},clearTimer=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)};return{schedule(){if(dirty=!0,timer!==void 0)return;let elapsed=lastEmissionAt===void 0?throttleMs:Date.now()-lastEmissionAt;if(elapsed>=throttleMs){emitIfDirty();return}timer=setTimeout(()=>{timer=void 0,emitIfDirty()},throttleMs-elapsed)},flush(){clearTimer(),emitIfDirty()},dispose(){clearTimer(),dirty=!1,lastEmissionAt=void 0}}}function sessionSpawnContext(ctx){return{...ctx,getEnv:()=>({...ctx.getEnv(),PI_SESSION_CWD:void 0,PI_GOAL_STORE_FILE:void 0})}}function sessionEnvOverrides(ctx,execCtx){let session=execCtx??ctx.getSessionContext?.();if(!session?.sessionManager)return{};let env={};env.PI_SESSION_ID=session.sessionManager.getSessionId(),session.cwd&&(env.PI_SESSION_CWD=session.cwd),session.goalStoreFile&&(env.PI_GOAL_STORE_FILE=session.goalStoreFile);let sessionFile=session.sessionManager.getSessionFile();return sessionFile&&(env.PI_SESSION_FILE=sessionFile),session.model&&(env.PI_PROVIDER=session.model.provider,env.PI_MODEL=session.model.id),session.thinkingLevel&&(env.PI_REASONING_LEVEL=session.thinkingLevel),env}function raceExitWithKillGrace(runtime,signal,timeoutMs){return new Promise((resolve42,reject)=>{let settled=!1,abortGraceTimer,timeoutGraceTimer,armAbortGrace,settle=finish=>{settled||(settled=!0,abortGraceTimer&&clearTimeout(abortGraceTimer),timeoutGraceTimer&&clearTimeout(timeoutGraceTimer),signal&&armAbortGrace&&signal.removeEventListener("abort",armAbortGrace),finish())};if(runtime.session.waitExit().then(()=>settle(()=>resolve42("exited")),error2=>settle(()=>reject(error2 instanceof Error?error2:new Error(String(error2))))),timeoutMs!==void 0){let timeoutGraceDeadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;timeoutGraceDeadlineMs<=MAX_TIMEOUT_MS&&(timeoutGraceTimer=setTimeout(()=>settle(()=>resolve42("timeout_grace")),timeoutGraceDeadlineMs))}signal&&(armAbortGrace=()=>{abortGraceTimer??=setTimeout(()=>settle(()=>resolve42("abort_grace")),KILLED_SESSION_EXIT_GRACE_MS)},signal.aborted?armAbortGrace():signal.addEventListener("abort",armAbortGrace,{once:!0}))})}function resolveAutoDetachDelayMs(ctx,input,sleepWait){if(ctx.timeoutAction==="kill")return;let windowSeconds=sleepWait?Math.min(5,resolveForegroundWindowSeconds(process.env)):resolveForegroundWindowSeconds(process.env);if(!((input.timeout!==void 0&&Number.isFinite(input.timeout)?input.timeout:1/0)<=windowSeconds))return Math.max(0,Math.trunc(windowSeconds*1e3))}function scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt){if(timeoutMs===void 0)return;let deadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;if(!Number.isFinite(deadlineMs)||deadlineMs>MAX_TIMEOUT_MS||runtime.exited)return;let remainingMs2=Math.max(0,deadlineMs-(Date.now()-startedAt)),timer,unsubscribeExit,clearSweep=()=>{timer!==void 0&&clearTimeout(timer),timer=void 0,unsubscribeExit?.(),unsubscribeExit=void 0};if(unsubscribeExit=runtime.session.onExit(clearSweep),runtime.exited){clearSweep();return}timer=setTimeout(()=>{clearSweep(),runtime.exited||ctx.manager.stop(id).catch(()=>{})},remainingMs2)}async function runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx){if(signal?.aborted)return errorResult("Command aborted");let timeoutMs=input.timeout!==void 0?Math.trunc(input.timeout*1e3):void 0,{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,timeoutMs,cwd,envOverrides:{...sessionEnvOverrides(ctx,execCtx),...FOREGROUND_ENV_OVERRIDES}}),startedAt=Date.now(),activity=`running ${input.command.slice(0,80)}`,updateEmitter=onUpdate?createThrottledEmitter(()=>{let text2=formatTerminalToolOutput(runtime.fullOutput()).text.slice(-2e3);onUpdate?.({content:[{type:"text",text:text2}],details:{progress:{activity,startedAt}}})}):void 0;onUpdate?.({content:[],details:void 0});let unsubscribeOutput=onUpdate?runtime.onOutput(()=>updateEmitter?.schedule()):void 0,sleepWait=classifySleepWait(input.command),detachDelayMs=resolveAutoDetachDelayMs(ctx,input,sleepWait),outcome;if(detachDelayMs===void 0){let onAbort=()=>runtime.session.kill("SIGKILL");signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));try{outcome=await raceExitWithKillGrace(runtime,signal,timeoutMs)}finally{signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}else{let abortGate=new AbortController,onAbort=()=>{runtime.session.kill("SIGKILL"),abortGate.abort()};signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let detachGate=createForegroundDetachGate({runtime,signal,delayMs:detachDelayMs,removeAbortListener:()=>signal?.removeEventListener("abort",onAbort)});try{outcome=await Promise.race([raceExitWithKillGrace(runtime,abortGate.signal,timeoutMs),detachGate.detached.then(()=>"detached")])}finally{detachGate.cancel(),signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}if(outcome==="detached"){scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt),ctx.onBackgroundStart?.(id,input.description??input.command,startedAt),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime));let delta=runtime.readDelta(),partialOutput=formatTerminalToolOutput(delta.text).text||"(no output yet)",timeoutNote=input.timeout!==void 0&&Number.isFinite(input.timeout)?`not killed; the original ${input.timeout}s timeout still applies`:"not killed; it will run until exit or kill_bash",guidance=sleepWait?`This command is a wait (${sleepWait.seconds}s sleep), so it detached immediately; the wait continues in the background. Do nothing and end your turn \u2014 completion will be reported automatically with exit status and output tail. Do NOT poll bash_output({ bash_id: "${id}" }) for it. When you are waiting for a pattern in a command's output, launch it with monitor({ command, filter }) instead so matching lines arrive as events. Use kill_bash({ bash_id: "${id}" }) to stop this session.`:`Continue other work; completion will be reported automatically with exit status and output tail. Use bash_output({ bash_id: "${id}" }) only to peek at new output. monitor cannot attach to this session; use it for future event-driven launches. Use kill_bash({ bash_id: "${id}" }) to stop this session.`;return textResult2(`Command is still running; auto-detached to background with ID: ${id} (${timeoutNote}).
|
|
2085
|
+
`);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var MONITOR_ID_ALPHABET="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function allocateMonitorId(){let id="mon_",buffer=0,bits=0;for(let byte of randomBytes4(10))for(buffer=buffer<<8|byte,bits+=8;bits>=5;)bits-=5,id+=MONITOR_ID_ALPHABET[buffer>>bits&31];return id}var MonitorRegistry=class{#records=new Map;#emit;#onChange;#onEnded;#onFire;#reserve;#files=new Map;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#pending=new Set;#lifecycle=0;constructor(emit,options){this.#emit=emit,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire,this.#reserve=options?.reserve}setParked(parked){if(this.#parked!==parked){this.#parked=parked;for(let record7 of this.#files.values())parked?record7.watch.pause():record7.paused||record7.watch.resume()}}snapshot(){return[...this.#records.values(),...this.#files.values()].map(record7=>({id:record7.id,monitorId:record7.monitorId,description:record7.description,paused:record7.paused,startedAtMs:record7.startedAtMs,command:record7.command,filter:record7.filter?.source??null,persistent:record7.persistent,deadlineMs:record7.deadlineMs,fireCount:record7.fireCount,lastFiredAtMs:record7.lastFiredAtMs,expiresAt:record7.expiresAt,fireWindow:"fireWindow"in record7?record7.fireWindow:void 0}))}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release3=this.#reserve?.();if(this.#reserve&&!release3)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending={release:release3??void 0,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),options.timeoutMs),settled:!1};this.#pending.add(pending);let path13=resolve26(options.cwd,options.path),parent=dirname32(path13),approvedParent;try{await this.#registrationAwait(pending,access(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path13}`);if(initialHandle=await this.#registrationAwait(pending,open5(path13,"r"),async handle=>{await handle.close()}),initial=await this.#registrationAwait(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path13}`);if(realpathWithoutOpen(path13)!==join52(approvedParent,basename15(path13)))throw new Error(`Cannot watch file: target identity changed: ${path13}`);if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path13}`);let reboundStat=await this.#registrationAwait(pending,stat6(path13));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path13}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2}if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#registrationAwait(pending,probeDirectoryOpenable(activationParent)),watcher=watch(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename15(String(name))===basename15(path13))&&this.#checkFile(id)})}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path13}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record8=this.#files.get(id);record8&&this.#settleFile(record8,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#finishPending(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath=join52(approvedParent,basename15(path13)),digest3;try{digest3=initial&&initialHandle?await this.#registrationAwait(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record7={id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent:options.persistent??options.expiresAt!==void 0,deadlineMs:options.persistent??options.expiresAt!==void 0?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path13,canonicalPath,canonicalParent:approvedParent,event:options.event,watcher,release:release3??(()=>{}),watch:new FileWatchLoop(()=>{this.#checkFile(id)}),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:setTimeout(()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")},options.timeoutMs)};if(this.#files.set(id,record7),this.#parked&&record7.watch.pause(),finishRegistration(),this.#finishPending(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record7,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#notifyChange(),{id,monitorId:record7.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}emitFileLine(id,line){let record7=this.#files.get(id);return!record7||record7.settled?!1:(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),!0)}async stopFile(id){let record7=this.#files.get(id);return record7?(this.#settleFile(record7,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record7 of records)this.#settleFile(record7,"watcher killed");for(let pending of[...this.#pending])this.#finishPending(pending);return records.length}#settleFile(record7,summary){if(record7.settled)return;record7.settled=!0,record7.watch.stop(),clearTimeout(record7.deadline),record7.watcher.close(),record7.release(),this.#files.delete(record7.id),this.#notifyChange(),this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#emitEnded(record7,reason,null)}async#checkFile(id){let record7=this.#files.get(id);if(!(!record7||record7.settled||record7.paused||this.#parked)){if(record7.checking){record7.dirty=!0;return}return record7.checking=this.#checkFileImpl(record7).catch(error2=>{record7.settled||this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record7.checking=void 0;let now2=Date.now();now2-record7.dirtyWindowStartedAt>=1e3&&(record7.dirtyWindowStartedAt=now2,record7.dirtyPasses=0),record7.dirty&&!record7.settled&&record7.dirtyPasses<1?(record7.dirty=!1,record7.dirtyPasses+=1,this.#checkFile(id)):record7.dirty=!1}),record7.checking}}async#checkFileImpl(record7){if(record7.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname32(record7.path))!==record7.canonicalParent){this.#settleFile(record7,`watcher error: monitored parent changed: ${dirname32(record7.path)}`);return}if((await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(realpathWithoutOpen(record7.canonicalPath)!==record7.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);handle=await open5(record7.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record7.path}`);if((opened.dev!==record7.device||opened.ino!==record7.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(current=opened,(await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);let reboundPath=await stat6(record7.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await this.#digestHandle(handle):"",present&&handle){let afterDigest=await stat6(record7.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}}finally{await handle?.close()}let changed=record7.event==="create"?!record7.present&&present:record7.present&&present&&(current.mtimeMs!==record7.mtimeMs||current.size!==record7.size||digest3!==record7.digest);record7.pendingChange||=changed,!record7.present&¤t&&(record7.device=current.dev,record7.inode=current.ino),record7.present=present,record7.mtimeMs=current?.mtimeMs??0,record7.size=current?.size??0,record7.digest=digest3,!(!record7.pendingChange||record7.paused||record7.settled)&&(record7.pendingChange=!1,!record7.settled&&(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line:`${record7.event} ${record7.path}`}),this.#settleFile(record7,"watcher completed")))}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record7={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,unsubscribeOutput:void 0,unsubscribeExit:void 0};return this.#records.set(record7.id,record7),this.#notifyChange(),this.#consume(record7,record7.runtime.fullOutput()),record7.unsubscribeOutput=record7.runtime.onOutput(chunk=>this.#consume(record7,chunk)),record7.unsubscribeExit=record7.runtime.session.onExit(()=>this.#settle(record7)),record7.runtime.exited&&this.#settle(record7),record7.monitorId}pause(ids){let paused=[];for(let id of ids){let record7=this.#records.get(id)??this.#files.get(id);!record7||record7.paused||(record7.paused=!0,"watch"in record7&&record7.watch.pause(),paused.push(record7.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#records.keys(),...this.#files.keys()])}resume(ids){let candidates=ids??[...this.#records.keys(),...this.#files.keys()],resumed=[];for(let id of candidates){let record7=this.#records.get(id)??this.#files.get(id);if(!record7?.paused)continue;record7.paused=!1;let mutedDropped="mutedDropped"in record7?record7.mutedDropped:0;"mutedDropped"in record7&&(record7.mutedDropped=0),"fireWindow"in record7&&record7.fireWindow!==void 0&&(record7.fireWindow.count=0),resumed.push({id:record7.id,mutedDropped}),"watch"in record7&&!this.#parked&&record7.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#records.get(id)?.mutedDropped??0}rearm(id){let record7=this.#records.get(id)??this.#files.get(id);return record7?record7.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){for(let record7 of this.#records.values())if(record7.monitorId===monitorId)return record7.fireWindow={...fireWindow2},!0;return!1}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record7 of[...this.#records.values()])this.#disposeRecord(record7);for(let record7 of this.#files.values())this.#settleFile(record7,"watcher disposed");for(let pending of this.#pending)this.#finishPending(pending);this.#records.clear(),this.#notifyChange()}#finishPending(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async#registrationAwait(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value2=>lateCleanup?.(value2),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value2=>(aborted&&lateCleanup?.(value2),value2),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}#notifyChange(){this.#onChange?.(this.snapshot())}#consume(record7,chunk){if(!(record7.settled||chunk.length===0)){for(let line of record7.lineBuffer.append(chunk))if(!record7.filter||record7.filter.test(line)){if(record7.paused){record7.mutedDropped+=1;continue}if(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),record7.fireWindow!==void 0){let now2=Date.now();now2-record7.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record7.fireWindow={startMs:now2,count:0}),record7.fireWindow.count+=1,record7.fireWindow.count>=DEFAULT_DURABLE_MONITOR_FIRE_BUDGET&&(record7.paused=!0,this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:FIRE_BUDGET_AUTO_MUTE_SUMMARY}),this.#notifyChange())}}}}#settle(record7){if(record7.settled)return;record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#notifyChange();let status=describeExit(record7.runtime)??"exited",code=record7.runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:`watcher ${status}${codeText}`});let exit=record7.runtime.exitResult;this.#emitEnded(record7,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record7){record7.settled||(record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#emitEnded(record7,"disposed",null))}#emitForRecord(record7,event){record7.fireCount+=1,record7.lastFiredAtMs=Date.now(),this.#emit(event),record7.settled||this.#onFire?.(this.snapshot())}#emitEnded(record7,reason,exitCode){this.#onEnded?.({id:record7.id,description:record7.description,startedAtMs:record7.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record7.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}var TERMINAL_SETTINGS_DEFAULTS={defaultCols:DEFAULT_COLS,defaultRows:DEFAULT_ROWS,scrollback:DEFAULT_SCROLLBACK,maxSessions:DEFAULT_MAX_SESSIONS,timeoutAction:"background",notify:"wake",monitor:{coalesceWindowMs:2e3,rateLimitMs:5e3,maxLinesPerInjection:50,maxCharsPerInjection:4096,wakeBudget:5}};function positiveInt(value2,fallback,maximum=Number.MAX_SAFE_INTEGER){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?fallback:Math.min(Math.trunc(value2),maximum)}function nonNegativeInt(value2,fallback){return typeof value2!="number"||!Number.isFinite(value2)||value2<0?fallback:Math.trunc(value2)}function oneOf2(value2,allowed,fallback){return typeof value2=="string"&&allowed.includes(value2)?value2:fallback}function resolveTerminalSettings(raw){return raw?{defaultCols:positiveInt(raw.defaultCols,TERMINAL_SETTINGS_DEFAULTS.defaultCols),defaultRows:positiveInt(raw.defaultRows,TERMINAL_SETTINGS_DEFAULTS.defaultRows),scrollback:nonNegativeInt(raw.scrollback,TERMINAL_SETTINGS_DEFAULTS.scrollback),maxSessions:positiveInt(raw.maxSessions,TERMINAL_SETTINGS_DEFAULTS.maxSessions),timeoutAction:oneOf2(raw.timeoutAction,["background","kill"],TERMINAL_SETTINGS_DEFAULTS.timeoutAction),notify:oneOf2(raw.notify,["wake","next-turn","off"],TERMINAL_SETTINGS_DEFAULTS.notify),monitor:{coalesceWindowMs:positiveInt(raw.monitorCoalesceWindowMs,TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,6e4),rateLimitMs:positiveInt(raw.monitorRateLimitMs,TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs,36e5),maxLinesPerInjection:positiveInt(raw.monitorMaxLinesPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,200),maxCharsPerInjection:positiveInt(raw.monitorMaxCharsPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,16384),wakeBudget:positiveInt(raw.monitorWakeBudget,TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget,100)}}:TERMINAL_SETTINGS_DEFAULTS}function loadTerminalSettings(settingsManager){let global=settingsManager.getGlobalSettings().terminal,project=settingsManager.getProjectSettings().terminal,merged={...global,...project};return resolveTerminalSettings(merged)}function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function noticedResult(text2,notices,extra){return{content:splitModelOnlyNotices(text2,notices),details:extra?.details,isError:extra?.isError}}function createForegroundDetachGate(options){let cancelled=!1,committed=!1,timer,resolveDetached,detached=new Promise(resolve42=>{resolveDetached=resolve42}),clearDeadline=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)},linearize=()=>{if(cancelled||committed||options.runtime.exited||options.signal?.aborted)return;let exitedAtGate=!1,unsubscribeExit=options.runtime.session.onExit(()=>{committed||(exitedAtGate=!0)});if(cancelled||options.runtime.exited||exitedAtGate||options.signal?.aborted){unsubscribeExit();return}committed=!0,options.removeAbortListener(),unsubscribeExit(),resolveDetached()};return timer=setTimeout(()=>queueMicrotask(linearize),options.delayMs),{detached,cancel(){cancelled=!0,clearDeadline()}}}var SHELL_WRAPPER=/^(?:env\s+(?:[\w.]+=[^\s]*\s+)*)?(?:\/(?:usr\/)?bin\/)?(?:ba|z|da|k)?sh\s+-[a-z]*c\s+/i,POWER_MANAGEMENT=/\b(?:pmset|systemsetup|caffeinate|displaysleep|disksleep)\b/,SLEEP_CALL=/(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+(\d+(?:\.\d+)?)/g,PURE=/^sleep\s+\d+(?:\.\d+)?$/,LEADING=/^\(?\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*(?:[;&|]|$)/,LOOP=/\b(?:while|until|for)\b[\s\S]*?(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+\d/,TRAILING=/[;&|]\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*\)?\s*$/;function unwrap(command){let current=command.trim();for(let depth=0;depth<3;depth+=1){let stripped=current.replace(SHELL_WRAPPER,"");if(stripped===current)break;current=stripped.trim();let quote=current[0];(quote==="'"||quote==='"')&¤t.endsWith(quote)&¤t.length>1&&(current=current.slice(1,-1).trim())}return current}function longestSleepSeconds(command){SLEEP_CALL.lastIndex=0;let longest;for(let match of command.matchAll(SLEEP_CALL)){let seconds=Number.parseFloat(match[1]??"");Number.isFinite(seconds)&&(longest===void 0||seconds>longest)&&(longest=seconds)}return longest}function classifySleepWait(command){if(POWER_MANAGEMENT.test(command))return;let unwrapped=unwrap(command),seconds=longestSleepSeconds(unwrapped);if(seconds!==void 0){if(LOOP.test(unwrapped))return seconds>=2?{kind:"sleep-wait",rule:"R3",seconds}:void 0;if(!(seconds<10)){if(PURE.test(unwrapped))return{kind:"sleep-wait",rule:"R1",seconds};if(LEADING.test(unwrapped))return{kind:"sleep-wait",rule:"R2",seconds};if(TRAILING.test(unwrapped))return{kind:"sleep-wait",rule:"R4",seconds}}}}var ptyBashSchema=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute in a PTY-backed session."}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Process kill deadline in seconds (default 1800). Foreground blocking stops at the ~60s window: a command still running then auto-detaches to a live background session instead of being killed. Ignored for run_in_background sessions (they live until exit or kill_bash)."})),description:typebox_exports.Optional(typebox_exports.String({description:"Short human-readable label for this command."})),run_in_background:typebox_exports.Optional(typebox_exports.Boolean({description:"Run as a persistent background session. Returns a bash_id immediately; query it with bash_output, steer with bash_input, tear down with kill_bash."})),cols:typebox_exports.Optional(typebox_exports.Number({description:"PTY width in columns (default 120)."})),rows:typebox_exports.Optional(typebox_exports.Number({description:"PTY height in rows (default 40)."}))});function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function delay2(ms){return new Promise(resolve42=>setTimeout(resolve42,ms))}var MAX_TIMEOUT_MS=2147483647,BASH_UPDATE_THROTTLE_MS=100;function createThrottledEmitter(emit,throttleMs=BASH_UPDATE_THROTTLE_MS){let timer,dirty=!1,lastEmissionAt,emitIfDirty=()=>{dirty&&(dirty=!1,lastEmissionAt=Date.now(),emit())},clearTimer=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)};return{schedule(){if(dirty=!0,timer!==void 0)return;let elapsed=lastEmissionAt===void 0?throttleMs:Date.now()-lastEmissionAt;if(elapsed>=throttleMs){emitIfDirty();return}timer=setTimeout(()=>{timer=void 0,emitIfDirty()},throttleMs-elapsed)},flush(){clearTimer(),emitIfDirty()},dispose(){clearTimer(),dirty=!1,lastEmissionAt=void 0}}}function sessionSpawnContext(ctx){return{...ctx,getEnv:()=>({...ctx.getEnv(),PI_SESSION_CWD:void 0,PI_GOAL_STORE_FILE:void 0})}}function sessionEnvOverrides(ctx,execCtx){let session=execCtx??ctx.getSessionContext?.();if(!session?.sessionManager)return{};let env={};env.PI_SESSION_ID=session.sessionManager.getSessionId(),session.cwd&&(env.PI_SESSION_CWD=session.cwd),session.goalStoreFile&&(env.PI_GOAL_STORE_FILE=session.goalStoreFile);let sessionFile=session.sessionManager.getSessionFile();return sessionFile&&(env.PI_SESSION_FILE=sessionFile),session.model&&(env.PI_PROVIDER=session.model.provider,env.PI_MODEL=session.model.id),session.thinkingLevel&&(env.PI_REASONING_LEVEL=session.thinkingLevel),env}function raceExitWithKillGrace(runtime,signal,timeoutMs){return new Promise((resolve42,reject)=>{let settled=!1,abortGraceTimer,timeoutGraceTimer,armAbortGrace,settle=finish=>{settled||(settled=!0,abortGraceTimer&&clearTimeout(abortGraceTimer),timeoutGraceTimer&&clearTimeout(timeoutGraceTimer),signal&&armAbortGrace&&signal.removeEventListener("abort",armAbortGrace),finish())};if(runtime.session.waitExit().then(()=>settle(()=>resolve42("exited")),error2=>settle(()=>reject(error2 instanceof Error?error2:new Error(String(error2))))),timeoutMs!==void 0){let timeoutGraceDeadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;timeoutGraceDeadlineMs<=MAX_TIMEOUT_MS&&(timeoutGraceTimer=setTimeout(()=>settle(()=>resolve42("timeout_grace")),timeoutGraceDeadlineMs))}signal&&(armAbortGrace=()=>{abortGraceTimer??=setTimeout(()=>settle(()=>resolve42("abort_grace")),KILLED_SESSION_EXIT_GRACE_MS)},signal.aborted?armAbortGrace():signal.addEventListener("abort",armAbortGrace,{once:!0}))})}function resolveAutoDetachDelayMs(ctx,input,sleepWait){if(ctx.timeoutAction==="kill")return;let windowSeconds=sleepWait?Math.min(5,resolveForegroundWindowSeconds(process.env)):resolveForegroundWindowSeconds(process.env);if(!((input.timeout!==void 0&&Number.isFinite(input.timeout)?input.timeout:1/0)<=windowSeconds))return Math.max(0,Math.trunc(windowSeconds*1e3))}function scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt){if(timeoutMs===void 0)return;let deadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;if(!Number.isFinite(deadlineMs)||deadlineMs>MAX_TIMEOUT_MS||runtime.exited)return;let remainingMs2=Math.max(0,deadlineMs-(Date.now()-startedAt)),timer,unsubscribeExit,clearSweep=()=>{timer!==void 0&&clearTimeout(timer),timer=void 0,unsubscribeExit?.(),unsubscribeExit=void 0};if(unsubscribeExit=runtime.session.onExit(clearSweep),runtime.exited){clearSweep();return}timer=setTimeout(()=>{clearSweep(),runtime.exited||ctx.manager.stop(id).catch(()=>{})},remainingMs2)}async function runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx){if(signal?.aborted)return errorResult("Command aborted");let timeoutMs=input.timeout!==void 0?Math.trunc(input.timeout*1e3):void 0,{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,timeoutMs,cwd,envOverrides:{...sessionEnvOverrides(ctx,execCtx),...FOREGROUND_ENV_OVERRIDES}}),startedAt=Date.now(),activity=`running ${input.command.slice(0,80)}`,updateEmitter=onUpdate?createThrottledEmitter(()=>{let text2=formatTerminalToolOutput(runtime.fullOutput()).body.slice(-2e3);onUpdate?.({content:[{type:"text",text:text2}],details:{progress:{activity,startedAt}}})}):void 0;onUpdate?.({content:[],details:void 0});let unsubscribeOutput=onUpdate?runtime.onOutput(()=>updateEmitter?.schedule()):void 0,sleepWait=classifySleepWait(input.command),detachDelayMs=resolveAutoDetachDelayMs(ctx,input,sleepWait),outcome;if(detachDelayMs===void 0){let onAbort=()=>runtime.session.kill("SIGKILL");signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));try{outcome=await raceExitWithKillGrace(runtime,signal,timeoutMs)}finally{signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}else{let abortGate=new AbortController,onAbort=()=>{runtime.session.kill("SIGKILL"),abortGate.abort()};signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let detachGate=createForegroundDetachGate({runtime,signal,delayMs:detachDelayMs,removeAbortListener:()=>signal?.removeEventListener("abort",onAbort)});try{outcome=await Promise.race([raceExitWithKillGrace(runtime,abortGate.signal,timeoutMs),detachGate.detached.then(()=>"detached")])}finally{detachGate.cancel(),signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}if(outcome==="detached"){scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt),ctx.onBackgroundStart?.(id,input.description??input.command,startedAt),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime));let delta=runtime.readDelta(),partialOutput=formatTerminalToolOutput(delta.text).text||"(no output yet)",timeoutNote=input.timeout!==void 0&&Number.isFinite(input.timeout)?`not killed; the original ${input.timeout}s timeout still applies`:"not killed; it will run until exit or kill_bash",guidance=sleepWait?`This command is a wait (${sleepWait.seconds}s sleep), so it detached immediately; the wait continues in the background. Do nothing and end your turn \u2014 completion will be reported automatically with exit status and output tail. Do NOT poll bash_output({ bash_id: "${id}" }) for it. When you are waiting for a pattern in a command's output, launch it with monitor({ command, filter }) instead so matching lines arrive as events. Use kill_bash({ bash_id: "${id}" }) to stop this session.`:`Continue other work; completion will be reported automatically with exit status and output tail. Use bash_output({ bash_id: "${id}" }) only to peek at new output. monitor cannot attach to this session; use it for future event-driven launches. Use kill_bash({ bash_id: "${id}" }) to stop this session.`;return textResult2(`Command is still running; auto-detached to background with ID: ${id} (${timeoutNote}).
|
|
2083
2086
|
|
|
2084
2087
|
Partial output:
|
|
2085
2088
|
${partialOutput}
|
|
@@ -2090,18 +2093,19 @@ ${guidance}`,{details:{bash_id:id,background:!0,auto_detached:!0,...sleepWait?{s
|
|
|
2090
2093
|
|
|
2091
2094
|
`:""}Command timed out after ${input.timeout} seconds`);let status=describeExit(runtime);return exit&&exit.exitCode!==0&&exit.exitCode!==null?errorResult(`${output?`${output}
|
|
2092
2095
|
|
|
2093
|
-
`:""}Command exited with code ${exit.exitCode}`):
|
|
2096
|
+
`:""}Command exited with code ${exit.exitCode}`):noticedResult(output||"(no output)",[formatted.marker],{details:{status,...formatted.truncated?{truncation:formatted.truncation}:{}}})}async function runBackground(ctx,input,cols,rows,cwd,execCtx){let{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,cwd,envOverrides:sessionEnvOverrides(ctx,execCtx)});ctx.onBackgroundStart?.(id,input.description??input.command,Date.now()),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime)),await Promise.race([delay2(BACKGROUND_START_GRACE_MS),runtime.session.waitExit()]);let early=formatTerminalToolOutput(runtime.readDelta().text).text,header2=`Command running in background with ID: ${id}`,backendNote=runtime.backend==="pipe-fallback"?`
|
|
2094
2097
|
(native PTY unavailable \u2014 running via pipe fallback; bash_input/bash_resize are limited.)`:"",earlyBlock=early?`
|
|
2095
2098
|
|
|
2096
|
-
${early}`:"";return textResult2(`${header2}${backendNote}${earlyBlock}`,{details:{bash_id:id,background:!0}})}function createPtyBashTool(ctx){return{name:TERMINAL_BASH_TOOL,exposure:"eval",label:"bash",description:"Execute a shell command in a persistent PTY-backed session. Set run_in_background:true for long-lived or interactive sessions; steer them with bash_input, snapshot with bash_output, tear down with kill_bash. To wait on observable state (a build finishing, a server coming up, a log line), never run sleep or poll loops \u2014 subscribe with the monitor tool instead. Foreground blocking stops at the ~60s window and a still-running command auto-detaches to a live background session; `timeout` is the process kill deadline in seconds.",promptSnippet:"Run shell commands; run_in_background:true for long-lived/interactive PTY sessions",promptGuidelines:["You can inspect PI_* environment variables for current model and session details."],parameters:ptyBashSchema,async execute(_toolCallId,input,signal,onUpdate,execCtx){let cols=resolveDimension(input.cols,ctx.defaultCols||DEFAULT_COLS),rows=resolveDimension(input.rows,ctx.defaultRows||DEFAULT_ROWS),cwd=execCtx?.cwd;return input.run_in_background?runBackground(ctx,input,cols,rows,cwd,execCtx):runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx)}}}var bashInputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),input:typebox_exports.Optional(typebox_exports.String({description:"Literal text to write to the session's stdin."})),keys:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Named keys to send, e.g. ['ctrl+c'], ['enter'], ['up']. Sent after `input` when both are given."})),submit:typebox_exports.Optional(typebox_exports.Boolean({description:"Append Enter (\\r) after `input`. Default true when `input` is a non-empty string."}))});function createBashInputTool(ctx){return{name:TERMINAL_INPUT_TOOL,label:"bash_input",description:"Write stdin or named keys (ctrl+c, enter, up, ...) to a live background bash session \u2014 e.g. drive a REPL or send SIGINT. This executes arbitrary shell input and is permission-gated like bash.",promptSnippet:"Send stdin/keys to a live background bash session (REPL steering, ctrl+c, etc.)",parameters:bashInputSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot send input.`);let notes=[];if(typeof input.input=="string"){let submit=input.submit??input.input.length>0,result3=runtime.session.write(submit?`${input.input}\r`:input.input);if(!result3.ok)return errorResult(`Failed to write input: ${result3.note}`);notes.push(submit?"wrote input + Enter":"wrote input")}if(input.keys&&input.keys.length>0){let{data,unknown}=encodeKeys(input.keys);if(data.length>0){let result3=runtime.session.write(data);if(!result3.ok)return errorResult(`Failed to send keys: ${result3.note}`);notes.push(`sent ${input.keys.length-unknown.length} key(s)`)}unknown.length>0&¬es.push(`ignored unknown keys: ${unknown.join(", ")}`)}return notes.length===0?errorResult("Nothing to send: provide `input` and/or `keys`."):textResult2(`Sent to ${input.bash_id}: ${notes.join("; ")}.`)}}}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){
|
|
2099
|
+
${early}`:"";return textResult2(`${header2}${backendNote}${earlyBlock}`,{details:{bash_id:id,background:!0}})}function createPtyBashTool(ctx){return{name:TERMINAL_BASH_TOOL,exposure:"eval",label:"bash",description:"Execute a shell command in a persistent PTY-backed session. Set run_in_background:true for long-lived or interactive sessions; steer them with bash_input, snapshot with bash_output, tear down with kill_bash. To wait on observable state (a build finishing, a server coming up, a log line), never run sleep or poll loops \u2014 subscribe with the monitor tool instead. Foreground blocking stops at the ~60s window and a still-running command auto-detaches to a live background session; `timeout` is the process kill deadline in seconds.",promptSnippet:"Run shell commands; run_in_background:true for long-lived/interactive PTY sessions",promptGuidelines:["You can inspect PI_* environment variables for current model and session details."],parameters:ptyBashSchema,async execute(_toolCallId,input,signal,onUpdate,execCtx){let cols=resolveDimension(input.cols,ctx.defaultCols||DEFAULT_COLS),rows=resolveDimension(input.rows,ctx.defaultRows||DEFAULT_ROWS),cwd=execCtx?.cwd;return input.run_in_background?runBackground(ctx,input,cols,rows,cwd,execCtx):runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx)}}}var bashInputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),input:typebox_exports.Optional(typebox_exports.String({description:"Literal text to write to the session's stdin."})),keys:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Named keys to send, e.g. ['ctrl+c'], ['enter'], ['up']. Sent after `input` when both are given."})),submit:typebox_exports.Optional(typebox_exports.Boolean({description:"Append Enter (\\r) after `input`. Default true when `input` is a non-empty string."}))});function createBashInputTool(ctx){return{name:TERMINAL_INPUT_TOOL,label:"bash_input",description:"Write stdin or named keys (ctrl+c, enter, up, ...) to a live background bash session \u2014 e.g. drive a REPL or send SIGINT. This executes arbitrary shell input and is permission-gated like bash.",promptSnippet:"Send stdin/keys to a live background bash session (REPL steering, ctrl+c, etc.)",parameters:bashInputSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot send input.`);let notes=[];if(typeof input.input=="string"){let submit=input.submit??input.input.length>0,result3=runtime.session.write(submit?`${input.input}\r`:input.input);if(!result3.ok)return errorResult(`Failed to write input: ${result3.note}`);notes.push(submit?"wrote input + Enter":"wrote input")}if(input.keys&&input.keys.length>0){let{data,unknown}=encodeKeys(input.keys);if(data.length>0){let result3=runtime.session.write(data);if(!result3.ok)return errorResult(`Failed to send keys: ${result3.note}`);notes.push(`sent ${input.keys.length-unknown.length} key(s)`)}unknown.length>0&¬es.push(`ignored unknown keys: ${unknown.join(", ")}`)}return notes.length===0?errorResult("Nothing to send: provide `input` and/or `keys`."):textResult2(`Sent to ${input.bash_id}: ${notes.join("; ")}.`)}}}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){this.#text=result3.content.filter(content=>content.type==="text"&&!isModelOnlyText(content)).map(content=>content.type==="text"?content.text:"").join(`
|
|
2100
|
+
`),this.#isPartial=options.isPartial,this.#expanded=options.expanded}render(width){return!this.#isPartial||this.#expanded?this.#text.split(`
|
|
2097
2101
|
`):truncateToVisualLines(this.#text,OUTPUT_PREVIEW_LINES,Math.max(1,width)).visualLines.map(line=>line.trimEnd())}invalidate(){}};function renderBashOutputCall(args,theme2){return new Text(theme2.fg("toolTitle",theme2.bold(`bash_output ${args.bash_id}`)),0,0)}function renderMonitorCall(args,theme2){let label2=args.action==="rearm"?`monitor rearm ${args.bash_id??""}`.trimEnd():`monitor ${args.description??args.command??""}`.trimEnd();return new Text(theme2.fg("toolTitle",theme2.bold(label2)),0,0)}function renderBashOutputResult(result3,options,_theme,context){let component=context.lastComponent??new BashOutputResultComponent;return component.setResult(result3,options),component}var bashOutputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),filter:typebox_exports.Optional(typebox_exports.String({description:"Only return output lines matching this regex."})),view:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("log"),typebox_exports.Literal("screen")],{description:"'log' returns new raw output (default); 'screen' returns the rendered xterm grid."}))});function statusLine(runtime){if(!runtime.exited)return"status: running";let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode;return code==null?`status: ${status}`:`status: ${status} exit_code: ${code}`}function applyFilter(text2,filter){if(!filter)return text2;let regex=safeRegExp(filter);return regex===null?text2:text2.split(`
|
|
2098
2102
|
`).filter(line=>regex.test(line)).join(`
|
|
2099
2103
|
`)}function screenView(runtime){return runtime.snapshot().visibleGrid.join(`
|
|
2100
2104
|
`).replace(/\s+$/,"")}function createBashOutputTool(ctx){return{name:TERMINAL_OUTPUT_TOOL,label:"bash_output",description:"Read output from a background bash session without blocking: new output since the last read, the status line, or a rendered full-screen snapshot via view:'screen'. Pattern watches run through monitor; completion arrives as a notification carrying the exit code and output tail.",promptSnippet:"Peek at background bash session output (filter, screen view, status); watch patterns with monitor, completion arrives as a notification",parameters:bashOutputSchema,async execute(_toolCallId,input){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);let monitorEntry=ctx.monitorRegistry?.snapshot().find(entry=>entry.id===sessionId),muted=monitorEntry?.paused===!0,mutedDropped=muted?ctx.monitorRegistry?.mutedDropped(sessionId)??0:0,mutedNote="";muted&&(mutedNote=mutedDropped>0?`monitor muted \u2014 ${mutedDropped} line(s) dropped while muted; run monitor({ action: "rearm", bash_id: "${input.bash_id}" }) to resume.`:`monitor muted; run monitor({ action: "rearm", bash_id: "${input.bash_id}" }) to resume.`);let extra=monitorEntry?{details:{monitorMuted:muted,mutedDropped}}:void 0,prefix=mutedNote.length>0?`${mutedNote}
|
|
2101
2105
|
`:"";if(input.view==="screen")return textResult2(`${prefix}${statusLine(runtime)}
|
|
2102
|
-
${screenView(runtime)}`,extra);let delta=runtime.readDelta(),formatted=formatTerminalToolOutput(applyFilter(delta.text,input.filter)),
|
|
2103
|
-
|
|
2104
|
-
${dropped}${formatted.text||"(no new output)"}`,extra)},renderCall:renderBashOutputCall,renderResult:renderBashOutputResult}}var bashResizeSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),cols:typebox_exports.Number({description:"New PTY width in columns."}),rows:typebox_exports.Number({description:"New PTY height in rows."})});function valid(value2){return Number.isFinite(value2)&&value2>=1}function createBashResizeTool(ctx){return{name:TERMINAL_RESIZE_TOOL,label:"bash_resize",description:"Resize a live background bash session's PTY (cols x rows) so full-screen TUIs reflow. No-ops with a note under the pipe fallback.",promptSnippet:"Resize a background bash session's PTY so TUIs reflow",parameters:bashResizeSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot resize.`);if(!valid(input.cols)||!valid(input.rows))return errorResult("cols and rows must be finite integers >= 1.");let cols=Math.trunc(input.cols),rows=Math.trunc(input.rows),result3=runtime.session.resize(cols,rows);return runtime.resizeScreen(cols,rows),result3.ok?textResult2(`Resized ${input.bash_id} to ${cols}x${rows}.`):textResult2(`Resize note for ${input.bash_id}: ${result3.note}`)}}}var killBashSchema=typebox_exports.Object({bash_id:typebox_exports.Optional(typebox_exports.String({description:"Session id to tree-kill."})),all:typebox_exports.Optional(typebox_exports.Boolean({description:"Tree-kill every live background session."}))});function createKillBashTool(ctx){return{name:TERMINAL_KILL_TOOL,label:"kill_bash",description:"Terminate a background bash session (or all of them) and its process tree cleanly.",promptSnippet:"Tree-kill a background bash session (or all) with no orphans",parameters:killBashSchema,async execute(_toolCallId,input,_signal){if(input.all){let terminalCount=ctx.manager.size,fileCount=await ctx.monitorRegistry?.stopAllFiles()??0;return await ctx.manager.teardown(),textResult2(`Killed ${terminalCount+fileCount} session(s).`)}if(!input.bash_id)return errorResult("Provide `bash_id` or set `all:true`.");let sessionId=resolveTerminalId(ctx.manager,input.bash_id);return await ctx.monitorRegistry?.stopFile(sessionId)?textResult2(`Killed ${input.bash_id}.`):ctx.manager.get(sessionId)?(await ctx.manager.stop(sessionId),textResult2(`Killed ${input.bash_id}.`)):errorResult(`No terminal session found with id: ${input.bash_id}`)}}}import{resolve as resolve27}from"node:path";var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; max 5 per session; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension2(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}async function createMonitor(ctx,registry,input,execCtx){let filter;try{filter=compileFilter2(input.filter)}catch{return errorResult(`Invalid monitor filter regex: ${input.filter}`)}let cwd=resolve27(execCtx?.cwd??ctx.cwd),timeoutMs=input.persistent?void 0:resolveTimeoutMs(input.timeout_ms),deadlineMs=timeoutMs===void 0?null:Date.now()+timeoutMs,{id,runtime}=await spawnCommandSession(ctx,{command:input.command,cols:resolveDimension2(void 0,ctx.defaultCols||DEFAULT_COLS),rows:resolveDimension2(void 0,ctx.defaultRows||DEFAULT_ROWS),cwd,...timeoutMs===void 0?{}:{timeoutMs}});ctx.onMonitorRearmed?.(id);let monitorId=registry.register({id,description:input.description,runtime,filter,command:input.command,persistent:input.persistent===!0,deadlineMs,durabilityClass:input.persistent===!0?"restartable-command":"ephemeral",...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});return ctx.manager.bindMonitorId(monitorId,id),handMonitorSpec(manifestSessionKey(ctx),{monitorId,spec:{kind:"command",description:input.description,command:input.command,filter:input.filter,cwd,persistent:input.persistent===!0}}),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}var manifestWriters=new Map;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}function handMonitorSpec(sessionKey,registration){(sessionKey===void 0?void 0:manifestWriters.get(sessionKey))?.recordRegister(registration)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let sessionKey=manifestSessionKey(ctx),writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey);if(!(writer===void 0||writer.durableCount()<MAX_DURABLE_MONITORS))return errorResult(`Cannot start another persistent monitor: this session already holds ${MAX_DURABLE_MONITORS} durable monitors (the maximum). Stop one with kill_bash first.`)}function createMonitorTool(ctx){let fallbackRegistry,getRegistry=()=>{let sessionRegistry2=ctx.monitorRegistry;return sessionRegistry2||(fallbackRegistry??=new MonitorRegistry(event=>ctx.onMonitorEvent?.(event)),fallbackRegistry)};return{name:TERMINAL_MONITOR_TOOL,label:"monitor",description:"Subscribe to a change instead of polling. Pass command XOR path, never both: command watches a PTY session, injecting matching newline-terminated output lines (stderr merged) plus an exit summary; path natively watches one file and fires once, where create (the default) fires only when the file appears after registration, so use event modify for an existing file, and filter is rejected. Returns a bash_id immediately; peek with bash_output, stop with kill_bash.",promptSnippet:"Subscribe to a command's output or a file's create/modify event as injected events instead of polling",promptGuidelines:["Waiting on observable state (CI checks, builds, log patterns, deploys, a file landing) means a monitor, never a foreground sleep/poll loop.",'Waiting for one file to appear or change is the path branch: `monitor({ description, path, event? })` beats wrapping `test -f` in a shell poll loop; a file that already exists needs `event: "modify"`, since `create` only fires on appearance, and registration needs the parent directory to exist already \u2014 when the run creates that directory too, use the `command` branch instead.',"Shape the command for the events you need: one-shot gate = `until <cond>; do sleep 1; done; printf 'READY\\n'` with filter ^READY$; stream = `tail -n 0 -F <log> | grep --line-buffered <pat>` with persistent: true, then kill_bash.","Sleep loops belong INSIDE the monitor command, never in your turn: about to sleep, re-poll bash_output, or foreground-block on a long command means register a monitor and keep working."],parameters:monitorSchema,renderCall:renderMonitorCall,async execute(_toolCallId,input,_signal,_onUpdate,execCtx){let registry=getRegistry();if(input.action==="rearm"){if(input.bash_id===void 0||input.bash_id.length===0){let resumed=registry.resume();if(resumed.length===0)return textResult2("No paused monitors to re-arm.");ctx.onMonitorsResumed?.(resumed.map(monitor=>monitor.id));let total=resumed.reduce((sum,monitor)=>sum+monitor.mutedDropped,0);return textResult2(total>0?`Re-armed ${resumed.length} paused monitor(s) (${total} line(s) dropped while muted).`:`Re-armed ${resumed.length} paused monitor(s).`)}let bashId=resolveTerminalId(ctx.manager,input.bash_id),dropped=registry.mutedDropped(bashId),outcome=registry.rearm(bashId);return outcome==="not_found"?errorResult(`No active monitor found with id: ${bashId}`):outcome==="not_paused"?textResult2(`Monitor ${bashId} is not paused; no action taken.`):(ctx.onMonitorRearmed?.(bashId),textResult2(dropped>0?`Monitor ${bashId} re-armed (${dropped} line(s) dropped while muted).`:`Monitor ${bashId} re-armed.`))}let fileInput=isFileCreateInput(input),commandInput=isCreateInput(input);if(fileInput&&commandInput)return errorResult("monitor accepts either command or path, not both.");if(input.persistent===!0&&(fileInput||commandInput)){let refused=durableAdmissionError(ctx);if(refused)return refused}if(fileInput){if(input.filter!==void 0)return errorResult("Native file monitors do not support filter.");if(!ctx.monitorRegistry)return errorResult("Native file monitors require a lifecycle-owned monitor registry.");try{let approvedParent=input[APPROVED_MONITOR_PARENT],{id,monitorId}=await ctx.monitorRegistry.registerFile({description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),persistent:input.persistent===!0,deadlineMs:input.persistent===!0?null:Date.now()+resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,...approvedParent!==void 0?{approvedParent}:{},...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});ctx.manager.bindMonitorId(monitorId,id);let sessionKey=manifestSessionKey(ctx);return handMonitorSpec(sessionKey,{monitorId,spec:{kind:"file",description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,persistent:input.persistent===!0,...approvedParent!==void 0?{approvedParent}:{}}}),input.persistent===!0&&handFileCheckpoint(sessionKey,monitorId,ctx.monitorRegistry,id),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}catch(error2){return errorResult(error2 instanceof Error?error2.message:String(error2))}}return commandInput?createMonitor(ctx,registry,input,execCtx):errorResult("monitor requires description and command or path to start a watcher.")}}}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function terminalStateDir(ctx){let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute16(sessionDir)))return join53(sessionDir,"extensions","terminal")}function createBundle(state){return new TerminalSessionBundle({maxSessions:state.settings.maxSessions,scrollback:state.settings.scrollback})}function bundleSinks(pi,state){return{onMonitorEvent:event=>state.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event)},onMonitorState:(snapshot,transition=!0)=>{state.parked||state.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,paused:entry.paused,startedAtMs:entry.startedAtMs,command:entry.command,filter:entry.filter,persistent:entry.persistent,deadlineMs:entry.deadlineMs,fireCount:entry.fireCount,lastFiredAtMs:entry.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,startedAtMs:entry.startedAtMs}))}),state.manifestWriter&&state.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let writer=state.manifestWriter;if(writer)for(let entry of snapshot)state.recordedBackgroundIds.has(entry.id)||(state.recordedBackgroundIds.add(entry.id),writer.recordBackgroundStart(entry.id,entry.description??entry.id,entry.startedAtMs))},onBackgroundExit:(id,runtime)=>{state.recordedBackgroundIds.delete(id),state.manifestWriter&&state.manifestWriter.recordBackgroundExit(id),state.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state){let requireBundle=()=>(state.bundle||(state.bundle=createBundle(state),state.bundle.monitors.setParked(state.parked),state.bundle.bind(bundleSinks(pi,state))),state.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state.ctx?.cwd??process.cwd()},get shellPath(){return state.shellPath},get defaultCols(){return state.settings.defaultCols},get defaultRows(){return state.settings.defaultRows},get timeoutAction(){return state.settings.timeoutAction},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state.monitorNotifier?.resume(ids)}}function shouldStepAside(ctx){return isAnthropicBashEnabled()&&ctx?.model?.api==="anthropic-messages"}function syncToolset2(pi,state){let stepAside=shouldStepAside(state.ctx),active=new Set(pi.getActiveTools());if(stepAside){for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown||(state.ctx?.ui.notify("native Anthropic bash active \u2014 monitor sessions remain available","info"),state.noticeShown=!0)}else{active.add(TERMINAL_BASH_TOOL);for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown=!1}state.steppedAside=stepAside,pi.setActiveTools([...active])}function sendTerminalReminder(pi,state,sentence){getTerminalNotificationDelivery({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify})?.send(`<system-reminder>${sentence}</system-reminder>`)}function clauseWithDescriptions(label2,count,descriptions){return descriptions.length>0?`${label2} ${count} (${descriptions.join(", ")})`:`${label2} ${count}`}function restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions){let clauses=[];if(digest3.restored>0&&clauses.push(clauseWithDescriptions("restored",digest3.restored,restoredDescriptions)),digest3.lost>0&&clauses.push(clauseWithDescriptions("lost",digest3.lost,lostDescriptions)),digest3.expired>0&&clauses.push(`expired ${digest3.expired}`),digest3.muted>0&&clauses.push(`${digest3.muted} still muted`),clauses.length!==0)return`Terminal state after restart: ${clauses.join("; ")}.`}async function adoptPersistedTerminalState(pi,state,toolCtx,bundle,sessionKey){let ctx=state.ctx,dir=terminalStateDir(ctx);if(dir===void 0||!ctx?.sessionManager)return;let lease=await acquireTerminalLease({dir,encodedSessionId:sessionKey});if(!lease.acquired){sendTerminalReminder(pi,state,`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`);return}state.lease={path:lease.path,pid:lease.pid};let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer);let nowMs=Date.now(),outcomesById=new Map,registry=bundle.monitors,record7=handler=>async monitor=>{let result3=await handler(monitor);return outcomesById.set(monitor.monitorId,result3.outcome),(result3.outcome==="restored"||result3.outcome==="muted")&&(writer.adoptRestored(monitor),registry.adoptFireWindow(monitor.monitorId,monitor.fireWindow)),result3},restartableCommand=createRestartableCommandHandler({ctx:toolCtx,registry}),freshFileRuntimeId,checkpointedFile=createCheckpointedFileRestoreHandler({registry,writer,bindMonitorId:(monitorId,runtimeId)=>{freshFileRuntimeId=runtimeId,bundle.manager.bindMonitorId(monitorId,runtimeId)},now:()=>nowMs}),handlers={"restartable-command":record7(restartableCommand),"checkpointed-file":record7(async monitor=>{freshFileRuntimeId=void 0;let result3=await checkpointedFile(monitor);return result3.outcome!=="restored"||freshFileRuntimeId===void 0?result3:{...result3,outcome:reapplyPersistedMute(registry,monitor,freshFileRuntimeId)}})},digest3=await restoreTerminalState({manifest:writer.store,handlers,now:()=>nowMs}),manifest=null,unreadable=digest3.storeError;if(!unreadable)try{manifest=await writer.store.read()}catch{unreadable=!0}if(unreadable){sendTerminalReminder(pi,state,"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).");return}if(manifest===null)return;let restoredDescriptions=[],lostDescriptions=[];for(let monitor of manifest.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=nowMs)continue;let outcome=outcomesById.get(monitor.monitorId);outcome==="restored"?restoredDescriptions.push(monitor.description):(outcome===void 0||outcome==="lost")&&lostDescriptions.push(monitor.description)}for(let background of manifest.backgroundSessions)lostDescriptions.push(background.command);let sentence=restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions);sentence!==void 0&&sendTerminalReminder(pi,state,sentence)}function detachManifestWriter(state,sessionKey){state.manifestWriter=null,state.recordedBackgroundIds.clear(),sessionKey!==void 0&&unbindTerminalManifestWriter(sessionKey)}async function suspendAndFlushManifest(state,sessionKey){let writer=state.manifestWriter;writer&&state.bundle&&await writer.observeMonitorState(state.bundle.monitors.snapshot()),detachManifestWriter(state,sessionKey),writer&&await writer.recordShutdown()}function registerTerminalExtension(pi){let state={bundle:null,settings:TERMINAL_SETTINGS_DEFAULTS,notifier:null,monitorNotifier:null,statusTicker:new MonitorStatusTicker({render:status=>{let ctx=state.ctx;ctx?.ui.setStatus(MONITOR_STATUS_KEY,status===void 0||ctx.mode!=="tui"?status:ctx.ui.theme.bg("selectedBg",ctx.ui.theme.fg("text",status)))}}),ctx:void 0,shellPath:void 0,steppedAside:!1,noticeShown:!1,lease:null,manifestWriter:null,recordedBackgroundIds:new Set,parked:!1},toolCtx=buildToolContext(pi,state);pi.registerTool(createPtyBashTool(toolCtx)),pi.registerTool(createBashOutputTool(toolCtx)),pi.registerTool(createBashInputTool(toolCtx)),pi.registerTool(createBashResizeTool(toolCtx)),pi.registerTool(createKillBashTool(toolCtx)),pi.registerTool(createMonitorTool(toolCtx)),pi.on("session_start",async(event,ctx)=>{state.ctx=ctx;let settingsManager=SettingsManager.create(ctx.cwd);state.settings=loadTerminalSettings(settingsManager),state.shellPath=settingsManager.getShellPath(),state.notifier=new TerminalNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify}),state.monitorNotifier?.dispose(),state.monitorNotifier=new MonitorNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify,getSettings:()=>state.settings.monitor,pauseMonitors:ids=>state.bundle?.monitors.pause(ids)??[]});let sessionKey=sessionKeyOf(ctx);if(event.reason==="reload"){let claimed=sessionKey===void 0?void 0:claimParkedBundle(sessionKey);claimed&&(await state.bundle?.teardown(),state.bundle=claimed)}else sessionKey!==void 0&&await teardownParkedBundle(sessionKey),await state.bundle?.teardown(),state.bundle=createBundle(state);if(state.bundle??=createBundle(state),state.bundle.bind(bundleSinks(pi,state)),event.reason==="reload"){if(sessionKey!==void 0&&terminalStateDir(ctx)!==void 0){let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer)}}else sessionKey!==void 0&&await adoptPersistedTerminalState(pi,state,toolCtx,state.bundle,sessionKey);syncToolset2(pi,state)}),pi.on("session_parked",()=>{state.parked=!0,state.bundle?.monitors.setParked(!0),state.statusTicker.stop()}),pi.on("session_resumed",()=>{state.parked=!1,state.bundle?.monitors.setParked(!1),state.bundle&&state.statusTicker.sync(state.bundle.monitors.snapshot())}),pi.on("model_select",async(event,ctx)=>{state.ctx={...ctx,model:event.model},syncToolset2(pi,state)}),pi.on("input",event=>{if(event.source==="extension")return;state.monitorNotifier?.noteActivity();let resumed=state.bundle?.monitors.resume()??[];resumed.length>0&&state.monitorNotifier?.resume(resumed.map(monitor=>monitor.id))}),pi.on("tool_call",()=>{state.monitorNotifier?.noteActivity()}),pi.on("before_agent_start",async event=>{if(!state.steppedAside)return{systemPrompt:`${event.systemPrompt}
|
|
2106
|
+
${screenView(runtime)}`,extra);let delta=runtime.readDelta(),formatted=formatTerminalToolOutput(applyFilter(delta.text,input.filter)),droppedNotice=delta.droppedChars>0?`[${delta.droppedChars} earlier chars dropped]`:void 0,dropped=droppedNotice===void 0?"":`${droppedNotice}
|
|
2107
|
+
`;return noticedResult(`${prefix}${statusLine(runtime)}
|
|
2108
|
+
${dropped}${formatted.text||"(no new output)"}`,[droppedNotice,formatted.marker],extra)},renderCall:renderBashOutputCall,renderResult:renderBashOutputResult}}var bashResizeSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),cols:typebox_exports.Number({description:"New PTY width in columns."}),rows:typebox_exports.Number({description:"New PTY height in rows."})});function valid(value2){return Number.isFinite(value2)&&value2>=1}function createBashResizeTool(ctx){return{name:TERMINAL_RESIZE_TOOL,label:"bash_resize",description:"Resize a live background bash session's PTY (cols x rows) so full-screen TUIs reflow. No-ops with a note under the pipe fallback.",promptSnippet:"Resize a background bash session's PTY so TUIs reflow",parameters:bashResizeSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot resize.`);if(!valid(input.cols)||!valid(input.rows))return errorResult("cols and rows must be finite integers >= 1.");let cols=Math.trunc(input.cols),rows=Math.trunc(input.rows),result3=runtime.session.resize(cols,rows);return runtime.resizeScreen(cols,rows),result3.ok?textResult2(`Resized ${input.bash_id} to ${cols}x${rows}.`):textResult2(`Resize note for ${input.bash_id}: ${result3.note}`)}}}var killBashSchema=typebox_exports.Object({bash_id:typebox_exports.Optional(typebox_exports.String({description:"Session id to tree-kill."})),all:typebox_exports.Optional(typebox_exports.Boolean({description:"Tree-kill every live background session."}))});function createKillBashTool(ctx){return{name:TERMINAL_KILL_TOOL,label:"kill_bash",description:"Terminate a background bash session (or all of them) and its process tree cleanly.",promptSnippet:"Tree-kill a background bash session (or all) with no orphans",parameters:killBashSchema,async execute(_toolCallId,input,_signal){if(input.all){let terminalCount=ctx.manager.size,fileCount=await ctx.monitorRegistry?.stopAllFiles()??0;return await ctx.manager.teardown(),textResult2(`Killed ${terminalCount+fileCount} session(s).`)}if(!input.bash_id)return errorResult("Provide `bash_id` or set `all:true`.");let sessionId=resolveTerminalId(ctx.manager,input.bash_id);return await ctx.monitorRegistry?.stopFile(sessionId)?textResult2(`Killed ${input.bash_id}.`):ctx.manager.get(sessionId)?(await ctx.manager.stop(sessionId),textResult2(`Killed ${input.bash_id}.`)):errorResult(`No terminal session found with id: ${input.bash_id}`)}}}import{resolve as resolve27}from"node:path";var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; max 5 per session; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension2(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}async function createMonitor(ctx,registry,input,execCtx){let filter;try{filter=compileFilter2(input.filter)}catch{return errorResult(`Invalid monitor filter regex: ${input.filter}`)}let cwd=resolve27(execCtx?.cwd??ctx.cwd),timeoutMs=input.persistent?void 0:resolveTimeoutMs(input.timeout_ms),deadlineMs=timeoutMs===void 0?null:Date.now()+timeoutMs,{id,runtime}=await spawnCommandSession(ctx,{command:input.command,cols:resolveDimension2(void 0,ctx.defaultCols||DEFAULT_COLS),rows:resolveDimension2(void 0,ctx.defaultRows||DEFAULT_ROWS),cwd,...timeoutMs===void 0?{}:{timeoutMs}});ctx.onMonitorRearmed?.(id);let monitorId=registry.register({id,description:input.description,runtime,filter,command:input.command,persistent:input.persistent===!0,deadlineMs,durabilityClass:input.persistent===!0?"restartable-command":"ephemeral",...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});return ctx.manager.bindMonitorId(monitorId,id),handMonitorSpec(manifestSessionKey(ctx),{monitorId,spec:{kind:"command",description:input.description,command:input.command,filter:input.filter,cwd,persistent:input.persistent===!0}}),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}var manifestWriters=new Map;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}function handMonitorSpec(sessionKey,registration){(sessionKey===void 0?void 0:manifestWriters.get(sessionKey))?.recordRegister(registration)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let sessionKey=manifestSessionKey(ctx),writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey);if(!(writer===void 0||writer.durableCount()<MAX_DURABLE_MONITORS))return errorResult(`Cannot start another persistent monitor: this session already holds ${MAX_DURABLE_MONITORS} durable monitors (the maximum). Stop one with kill_bash first.`)}function createMonitorTool(ctx){let fallbackRegistry,getRegistry=()=>{let sessionRegistry2=ctx.monitorRegistry;return sessionRegistry2||(fallbackRegistry??=new MonitorRegistry(event=>ctx.onMonitorEvent?.(event)),fallbackRegistry)};return{name:TERMINAL_MONITOR_TOOL,label:"monitor",description:"Subscribe to a change instead of polling. Pass command XOR path, never both: command watches a PTY session, injecting matching newline-terminated output lines (stderr merged) plus an exit summary; path natively watches one file and fires once, where create (the default) fires only when the file appears after registration, so use event modify for an existing file, and filter is rejected. Returns a bash_id immediately; peek with bash_output, stop with kill_bash.",promptSnippet:"Subscribe to a command's output or a file's create/modify event as injected events instead of polling",promptGuidelines:["Waiting on observable state (CI checks, builds, log patterns, deploys, a file landing) means a monitor, never a foreground sleep/poll loop.",'Waiting for one file to appear or change is the path branch: `monitor({ description, path, event? })` beats wrapping `test -f` in a shell poll loop; a file that already exists needs `event: "modify"`, since `create` only fires on appearance, and registration needs the parent directory to exist already \u2014 when the run creates that directory too, use the `command` branch instead.',"Shape the command for the events you need: one-shot gate = `until <cond>; do sleep 1; done; printf 'READY\\n'` with filter ^READY$; stream = `tail -n 0 -F <log> | grep --line-buffered <pat>` with persistent: true, then kill_bash.","Sleep loops belong INSIDE the monitor command, never in your turn: about to sleep, re-poll bash_output, or foreground-block on a long command means register a monitor and keep working."],parameters:monitorSchema,renderCall:renderMonitorCall,async execute(_toolCallId,input,_signal,_onUpdate,execCtx){let registry=getRegistry();if(input.action==="rearm"){if(input.bash_id===void 0||input.bash_id.length===0){let resumed=registry.resume();if(resumed.length===0)return textResult2("No paused monitors to re-arm.");ctx.onMonitorsResumed?.(resumed.map(monitor=>monitor.id));let total=resumed.reduce((sum,monitor)=>sum+monitor.mutedDropped,0);return textResult2(total>0?`Re-armed ${resumed.length} paused monitor(s) (${total} line(s) dropped while muted).`:`Re-armed ${resumed.length} paused monitor(s).`)}let bashId=resolveTerminalId(ctx.manager,input.bash_id),dropped=registry.mutedDropped(bashId),outcome=registry.rearm(bashId);return outcome==="not_found"?errorResult(`No active monitor found with id: ${bashId}`):outcome==="not_paused"?textResult2(`Monitor ${bashId} is not paused; no action taken.`):(ctx.onMonitorRearmed?.(bashId),textResult2(dropped>0?`Monitor ${bashId} re-armed (${dropped} line(s) dropped while muted).`:`Monitor ${bashId} re-armed.`))}let fileInput=isFileCreateInput(input),commandInput=isCreateInput(input);if(fileInput&&commandInput)return errorResult("monitor accepts either command or path, not both.");if(input.persistent===!0&&(fileInput||commandInput)){let refused=durableAdmissionError(ctx);if(refused)return refused}if(fileInput){if(input.filter!==void 0)return errorResult("Native file monitors do not support filter.");if(!ctx.monitorRegistry)return errorResult("Native file monitors require a lifecycle-owned monitor registry.");try{let approvedParent=input[APPROVED_MONITOR_PARENT],{id,monitorId}=await ctx.monitorRegistry.registerFile({description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),persistent:input.persistent===!0,deadlineMs:input.persistent===!0?null:Date.now()+resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,...approvedParent!==void 0?{approvedParent}:{},...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});ctx.manager.bindMonitorId(monitorId,id);let sessionKey=manifestSessionKey(ctx);return handMonitorSpec(sessionKey,{monitorId,spec:{kind:"file",description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,persistent:input.persistent===!0,...approvedParent!==void 0?{approvedParent}:{}}}),input.persistent===!0&&handFileCheckpoint(sessionKey,monitorId,ctx.monitorRegistry,id),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}catch(error2){return errorResult(error2 instanceof Error?error2.message:String(error2))}}return commandInput?createMonitor(ctx,registry,input,execCtx):errorResult("monitor requires description and command or path to start a watcher.")}}}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function terminalStateDir(ctx){let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute16(sessionDir)))return join53(sessionDir,"extensions","terminal")}function createBundle(state){return new TerminalSessionBundle({maxSessions:state.settings.maxSessions,scrollback:state.settings.scrollback})}function bundleSinks(pi,state){return{onMonitorEvent:event=>state.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event)},onMonitorState:(snapshot,transition=!0)=>{state.parked||state.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,paused:entry.paused,startedAtMs:entry.startedAtMs,command:entry.command,filter:entry.filter,persistent:entry.persistent,deadlineMs:entry.deadlineMs,fireCount:entry.fireCount,lastFiredAtMs:entry.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,startedAtMs:entry.startedAtMs}))}),state.manifestWriter&&state.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let writer=state.manifestWriter;if(writer)for(let entry of snapshot)state.recordedBackgroundIds.has(entry.id)||(state.recordedBackgroundIds.add(entry.id),writer.recordBackgroundStart(entry.id,entry.description??entry.id,entry.startedAtMs))},onBackgroundExit:(id,runtime)=>{state.recordedBackgroundIds.delete(id),state.manifestWriter&&state.manifestWriter.recordBackgroundExit(id),state.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state){let requireBundle=()=>(state.bundle||(state.bundle=createBundle(state),state.bundle.monitors.setParked(state.parked),state.bundle.bind(bundleSinks(pi,state))),state.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state.ctx?.cwd??process.cwd()},get shellPath(){return state.shellPath},get defaultCols(){return state.settings.defaultCols},get defaultRows(){return state.settings.defaultRows},get timeoutAction(){return state.settings.timeoutAction},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state.monitorNotifier?.resume(ids)}}function shouldStepAside(ctx){return isAnthropicBashEnabled()&&ctx?.model?.api==="anthropic-messages"}function syncToolset2(pi,state){let stepAside=shouldStepAside(state.ctx),active=new Set(pi.getActiveTools());if(stepAside){for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown||(state.ctx?.ui.notify("native Anthropic bash active \u2014 monitor sessions remain available","info"),state.noticeShown=!0)}else{active.add(TERMINAL_BASH_TOOL);for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown=!1}state.steppedAside=stepAside,pi.setActiveTools([...active])}function sendTerminalReminder(pi,state,sentence){getTerminalNotificationDelivery({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify})?.send(`<system-reminder>${sentence}</system-reminder>`)}function clauseWithDescriptions(label2,count,descriptions){return descriptions.length>0?`${label2} ${count} (${descriptions.join(", ")})`:`${label2} ${count}`}function restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions){let clauses=[];if(digest3.restored>0&&clauses.push(clauseWithDescriptions("restored",digest3.restored,restoredDescriptions)),digest3.lost>0&&clauses.push(clauseWithDescriptions("lost",digest3.lost,lostDescriptions)),digest3.expired>0&&clauses.push(`expired ${digest3.expired}`),digest3.muted>0&&clauses.push(`${digest3.muted} still muted`),clauses.length!==0)return`Terminal state after restart: ${clauses.join("; ")}.`}async function adoptPersistedTerminalState(pi,state,toolCtx,bundle,sessionKey){let ctx=state.ctx,dir=terminalStateDir(ctx);if(dir===void 0||!ctx?.sessionManager)return;let lease=await acquireTerminalLease({dir,encodedSessionId:sessionKey});if(!lease.acquired){sendTerminalReminder(pi,state,`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`);return}state.lease={path:lease.path,pid:lease.pid};let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer);let nowMs=Date.now(),outcomesById=new Map,registry=bundle.monitors,record7=handler=>async monitor=>{let result3=await handler(monitor);return outcomesById.set(monitor.monitorId,result3.outcome),(result3.outcome==="restored"||result3.outcome==="muted")&&(writer.adoptRestored(monitor),registry.adoptFireWindow(monitor.monitorId,monitor.fireWindow)),result3},restartableCommand=createRestartableCommandHandler({ctx:toolCtx,registry}),freshFileRuntimeId,checkpointedFile=createCheckpointedFileRestoreHandler({registry,writer,bindMonitorId:(monitorId,runtimeId)=>{freshFileRuntimeId=runtimeId,bundle.manager.bindMonitorId(monitorId,runtimeId)},now:()=>nowMs}),handlers={"restartable-command":record7(restartableCommand),"checkpointed-file":record7(async monitor=>{freshFileRuntimeId=void 0;let result3=await checkpointedFile(monitor);return result3.outcome!=="restored"||freshFileRuntimeId===void 0?result3:{...result3,outcome:reapplyPersistedMute(registry,monitor,freshFileRuntimeId)}})},digest3=await restoreTerminalState({manifest:writer.store,handlers,now:()=>nowMs}),manifest=null,unreadable=digest3.storeError;if(!unreadable)try{manifest=await writer.store.read()}catch{unreadable=!0}if(unreadable){sendTerminalReminder(pi,state,"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).");return}if(manifest===null)return;let restoredDescriptions=[],lostDescriptions=[];for(let monitor of manifest.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=nowMs)continue;let outcome=outcomesById.get(monitor.monitorId);outcome==="restored"?restoredDescriptions.push(monitor.description):(outcome===void 0||outcome==="lost")&&lostDescriptions.push(monitor.description)}for(let background of manifest.backgroundSessions)lostDescriptions.push(background.command);let sentence=restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions);sentence!==void 0&&sendTerminalReminder(pi,state,sentence)}function detachManifestWriter(state,sessionKey){state.manifestWriter=null,state.recordedBackgroundIds.clear(),sessionKey!==void 0&&unbindTerminalManifestWriter(sessionKey)}async function suspendAndFlushManifest(state,sessionKey){let writer=state.manifestWriter;writer&&state.bundle&&await writer.observeMonitorState(state.bundle.monitors.snapshot()),detachManifestWriter(state,sessionKey),writer&&await writer.recordShutdown()}function registerTerminalExtension(pi){let state={bundle:null,settings:TERMINAL_SETTINGS_DEFAULTS,notifier:null,monitorNotifier:null,statusTicker:new MonitorStatusTicker({render:status=>{let ctx=state.ctx;ctx?.ui.setStatus(MONITOR_STATUS_KEY,status===void 0||ctx.mode!=="tui"?status:ctx.ui.theme.bg("selectedBg",ctx.ui.theme.fg("text",status)))}}),ctx:void 0,shellPath:void 0,steppedAside:!1,noticeShown:!1,lease:null,manifestWriter:null,recordedBackgroundIds:new Set,parked:!1},toolCtx=buildToolContext(pi,state);pi.registerTool(createPtyBashTool(toolCtx)),pi.registerTool(createBashOutputTool(toolCtx)),pi.registerTool(createBashInputTool(toolCtx)),pi.registerTool(createBashResizeTool(toolCtx)),pi.registerTool(createKillBashTool(toolCtx)),pi.registerTool(createMonitorTool(toolCtx)),pi.on("session_start",async(event,ctx)=>{state.ctx=ctx;let settingsManager=SettingsManager.create(ctx.cwd);state.settings=loadTerminalSettings(settingsManager),state.shellPath=settingsManager.getShellPath(),state.notifier=new TerminalNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify}),state.monitorNotifier?.dispose(),state.monitorNotifier=new MonitorNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify,getSettings:()=>state.settings.monitor,pauseMonitors:ids=>state.bundle?.monitors.pause(ids)??[]});let sessionKey=sessionKeyOf(ctx);if(event.reason==="reload"){let claimed=sessionKey===void 0?void 0:claimParkedBundle(sessionKey);claimed&&(await state.bundle?.teardown(),state.bundle=claimed)}else sessionKey!==void 0&&await teardownParkedBundle(sessionKey),await state.bundle?.teardown(),state.bundle=createBundle(state);if(state.bundle??=createBundle(state),state.bundle.bind(bundleSinks(pi,state)),event.reason==="reload"){if(sessionKey!==void 0&&terminalStateDir(ctx)!==void 0){let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer)}}else sessionKey!==void 0&&await adoptPersistedTerminalState(pi,state,toolCtx,state.bundle,sessionKey);syncToolset2(pi,state)}),pi.on("session_parked",()=>{state.parked=!0,state.bundle?.monitors.setParked(!0),state.statusTicker.stop()}),pi.on("session_resumed",()=>{state.parked=!1,state.bundle?.monitors.setParked(!1),state.bundle&&state.statusTicker.sync(state.bundle.monitors.snapshot())}),pi.on("model_select",async(event,ctx)=>{state.ctx={...ctx,model:event.model},syncToolset2(pi,state)}),pi.on("input",event=>{if(event.source==="extension")return;state.monitorNotifier?.noteActivity();let resumed=state.bundle?.monitors.resume()??[];resumed.length>0&&state.monitorNotifier?.resume(resumed.map(monitor=>monitor.id))}),pi.on("tool_call",()=>{state.monitorNotifier?.noteActivity()}),pi.on("before_agent_start",async event=>{if(!state.steppedAside)return{systemPrompt:`${event.systemPrompt}
|
|
2105
2109
|
${buildTerminalPromptSection({evalOnly:isEvalOnlyRouting(pi)})}`}}),pi.on("session_shutdown",async(event,ctx)=>{state.monitorNotifier?.dispose(),state.monitorNotifier=null,state.notifier=null,state.statusTicker.stop();let sessionKey=sessionKeyOf(ctx)??sessionKeyOf(state.ctx);if(event.reason==="reload"&&state.bundle&&sessionKey!==void 0){detachManifestWriter(state,sessionKey),state.bundle.park(),await parkBundle(sessionKey,state.bundle);return}sessionKey!==void 0&&await suspendAndFlushManifest(state,sessionKey);let lease=state.lease;if(state.lease=null,lease!==null)await releaseTerminalLease(lease);else if(sessionKey!==void 0){let dir=terminalStateDir(ctx)??terminalStateDir(state.ctx);dir!==void 0&&await releaseTerminalLease({path:join53(dir,`${encodedSessionId(sessionKey)}.lease`),pid:process.pid})}let bundle=state.bundle;state.bundle=null,await bundle?.teardown(),sessionKey!==void 0&&await teardownParkedBundle(sessionKey)})}var extension_default2=registerTerminalExtension;import{readFile as readFile15,writeFile as writeFile11}from"node:fs/promises";import{platform as platform3}from"node:os";import{spawn as spawn6}from"node:child_process";function runClipboardCommand(command,args,options){return new Promise(resolve42=>{let child=spawn6(command,args,{stdio:["pipe",options?.input===void 0?"pipe":"ignore","ignore"],windowsHide:!0}),chunks=[],length=0,settled=!1,finish=result3=>{settled||(settled=!0,clearTimeout(timer),resolve42(result3))},abort=()=>{child.kill("SIGKILL"),child.stdout?.destroy(),child.stdin?.destroy(),finish(void 0)},timer=setTimeout(abort,options?.timeoutMs??3e3);child.on("error",()=>finish(void 0)),child.on("close",code=>{settled||finish(code===0?Buffer.concat(chunks,length):void 0)}),child.stdout?.on("data",chunk=>{settled||(length+=chunk.length,length>(options?.maxBufferBytes??50*1024*1024)?abort():chunks.push(chunk))}),child.stdin?.on("error",()=>{}),child.stdin?.end(options?.input)})}var MAX_OSC52_ENCODED_LENGTH=1e5;function isRemoteSession(env=process.env){return!!(env.SSH_CONNECTION||env.SSH_CLIENT||env.MOSH_CONNECTION)}function emitOsc52(text2){let encoded=Buffer.from(text2).toString("base64");return encoded.length>MAX_OSC52_ENCODED_LENGTH?!1:(process.stdout.write(`\x1B]52;c;${encoded}\x07`),!0)}async function readClipboardText(){if(platform3()==="linux"){let commands=[];process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-get",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-paste",["--no-newline","--type","text"]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard","-out"]],["xsel",["--clipboard","--output"]]);for(let[command,args]of commands){let bytes=await runClipboardCommand(command,args,{timeoutMs:5e3});if(bytes!==void 0)return bytes.toString("utf8")||null}}try{return await getNativeClipboard()?.getText()||null}catch{return null}}async function copyToClipboard(text2){let p=platform3(),copied=!1;if(p!=="linux")try{let clipboard=getNativeClipboard();clipboard?.setText&&(await clipboard.setText(text2),copied=!0)}catch{}if(!copied){let commands=[];p==="darwin"?commands.push(["pbcopy",[]]):p==="win32"?commands.push(["clip",[]]):(process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-set",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-copy",[]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard"]],["xsel",["--clipboard","--input"]]));for(let[command,args]of commands)if(await runClipboardCommand(command,args,{input:text2,timeoutMs:5e3})!==void 0){copied=!0;break}}if((isRemoteSession()||!copied)&&(copied=emitOsc52(text2)||copied),!copied)throw new Error("Failed to copy to clipboard")}import{isAbsolute as isAbsolute17,resolve as resolve28}from"node:path";var STATUS_TO_MARKER={pending:" ",in_progress:"/",completed:"x",abandoned:"-"},MARKER_TO_STATUS={" ":"pending","":"pending",x:"completed",X:"completed","/":"in_progress",">":"in_progress","-":"abandoned","~":"abandoned"},DEFAULT_TODO_MARKDOWN_FILE="TODO.md";function resolveTodoMarkdownPath(input,cwd){let raw=input.trim().replace(/^["']|["']$/g,"")||DEFAULT_TODO_MARKDOWN_FILE;return isAbsolute17(raw)?raw:resolve28(cwd,raw)}function phasesToMarkdown(phases){if(phases.length===0)return`# ${DEFAULT_INIT_PHASE}
|
|
2106
2110
|
`;let out=[];for(let index=0;index<phases.length;index+=1){index>0&&out.push(""),out.push(`# ${phases[index].name}`);for(let task of phases[index].tasks)out.push(`- [${STATUS_TO_MARKER[task.status]}] ${task.content}`)}return`${out.join(`
|
|
2107
2111
|
`)}
|
|
@@ -2189,7 +2193,7 @@ ${TASK_MANAGEMENT_SECTION}`})),registerTodoTool(pi,{getCurrentPhases,setCurrentP
|
|
|
2189
2193
|
`),0,0)}let lines=[header2,theme2.fg("dim",`URL: ${shorten3(details.finalUrl,URL_BUDGET)}`),theme2.fg("dim",`Content-Type: ${details.contentType||"unknown"}`),"",...collectLines(text2,24).map(line=>theme2.fg("toolOutput",truncateToWidth(line,PREVIEW_WIDTH)))];return new Text(lines.join(`
|
|
2190
2194
|
`),0,0)}function collectLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
|
|
2191
2195
|
`,start);if(newlineIndex===-1){lines.push(text2.slice(start));break}lines.push(text2.slice(start,newlineIndex)),start=newlineIndex+1}return lines}function collectNonEmptyTrimmedLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
|
|
2192
|
-
`,start),line=(newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex)).trim();if(line.length>0&&lines.push(line),newlineIndex===-1)break;start=newlineIndex+1}return lines}function parseWebfetchArgs(args){if(typeof args!="object"||args===null)return{url:""};let webfetchArgs={url:"url"in args&&typeof args.url=="string"?args.url:""};return"format"in args&&typeof args.format=="string"&&(webfetchArgs.format=args.format),"timeout"in args&&typeof args.timeout=="number"&&(webfetchArgs.timeout=args.timeout),webfetchArgs}function formatProgress2(details){let url=shorten3(details.url,URL_BUDGET);if(details.phase==="downloading"){let downloaded=formatBytes(details.bytesRead??0),total=details.totalBytes===void 0?"":` / ${formatBytes(details.totalBytes)}`;return`Downloading ${url}: ${downloaded}${total}`}return details.phase==="converting"?`Converting ${url} to ${details.format}`:`Fetching ${url} as ${details.format} (${details.timeoutSeconds}s)`}function isWebfetchProgressDetails(details){return typeof details=="object"&&details!==null&&"phase"in details&&(details.phase==="fetching"||details.phase==="downloading"||details.phase==="converting")}function isWebfetchDetails(details){return typeof details=="object"&&details!==null&&"status"in details&&typeof details.status=="number"}function previewText(text2,theme2){let lines=collectNonEmptyTrimmedLines(text2,PREVIEW_LINES);return lines.length===0?[theme2.fg("dim"," empty response")]:lines.map(line=>theme2.fg("toolOutput",` ${truncateToWidth(line,PREVIEW_WIDTH)}`))}function shorten3(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)} KB`:`${(bytes/(1024*1024)).toFixed(1)} MB`}function modelOnlyText(text2){return{type:"text",text:text2,audience:"model"}}function isModelOnlyText(part){return typeof part=="object"&&part!==null&&"type"in part&&part.type==="text"&&"audience"in part&&part.audience==="model"}var loadContentModule=()=>import("./content-IWCEHYXU.js");async function htmlToMarkdown(html,url){return(await loadContentModule()).htmlToMarkdown(html,url)}async function htmlToText(html,url){return(await loadContentModule()).htmlToText(html,url)}var import_undici=__toESM(require_undici(),1);var InvalidWebfetchUrlError=class extends Error{constructor(message){super(message),this.name="InvalidWebfetchUrlError"}},WebfetchTimeoutError=class extends Error{constructor(message){super(message),this.name="WebfetchTimeoutError"}},WebfetchResponseTooLargeError=class extends Error{constructor(message){super(message),this.name="WebfetchResponseTooLargeError"}},WebfetchAbortError=class extends Error{constructor(message){super(message),this.name="WebfetchAbortError"}};async function discardBody(body,maxBytes,signal){body.on?.("error",()=>{});try{if(typeof body.dump=="function"){await body.dump(signal?{limit:1024,signal}:{limit:1024});return}await drainBody(body,maxBytes,signal)}catch{}finally{body.destroy()}}async function drainBody(body,maxBytes,signal){let drained=0,iterator=body[Symbol.asyncIterator]();for(;;){let result3=await nextChunk(iterator,signal);if(!result3||result3.done||(drained+=toUint8Array(result3.value).length,drained>maxBytes))return}}async function nextChunk(iterator,signal){if(!signal)return iterator.next();if(signal.aborted)return;let resolveAbort=()=>{},aborted=new Promise(resolve42=>{resolveAbort=()=>resolve42(void 0)}),onAbort=()=>resolveAbort();signal.addEventListener("abort",onAbort,{once:!0});try{return await Promise.race([iterator.next(),aborted])}finally{signal.removeEventListener("abort",onAbort)}}function toUint8Array(chunk){if(chunk instanceof Uint8Array)return chunk;if(typeof chunk=="string")return new TextEncoder().encode(chunk);throw new Error("Unexpected response body chunk")}var MAX_RESPONSE_SIZE_BYTES=5*1024*1024,DEFAULT_TIMEOUT_SECONDS=30,MAX_TIMEOUT_SECONDS2=120,MAX_REDIRECTS=20,BROWSER_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",CHROME_MAJOR_VERSION="143",REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function fetchUrl(options){validateUrl(options.url);let timeoutSeconds=clampTimeout(options.timeoutSeconds),timeoutMs=timeoutSeconds*1e3,controller=new AbortController,timeout=setTimeout(()=>controller.abort(new WebfetchTimeoutError(`Request timed out after ${timeoutSeconds}s`)),timeoutMs),removeAbortForwarder=forwardAbort(options.signal,controller);try{let response=await requestUrl({url:options.url,format:options.format,signal:controller.signal,timeoutMs});return await readHttpResponse(response,controller.signal,options.onProgress)}finally{clearTimeout(timeout),removeAbortForwarder()}}function validateUrl(url){if(!url.startsWith("http://")&&!url.startsWith("https://"))throw new InvalidWebfetchUrlError("URL must start with http:// or https://");try{new URL(url)}catch{throw new InvalidWebfetchUrlError(`Invalid URL: ${url}`)}}function clampTimeout(timeoutSeconds){return timeoutSeconds===void 0||!Number.isFinite(timeoutSeconds)||timeoutSeconds<=0?DEFAULT_TIMEOUT_SECONDS:Math.min(Math.ceil(timeoutSeconds),MAX_TIMEOUT_SECONDS2)}function buildAcceptHeader(format2){switch(format2){case"markdown":return"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";case"text":return"text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";case"html":return"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"}}function buildHeaders2(format2){return{Accept:buildAcceptHeader(format2),"Accept-Language":"en-US,en;q=0.9","Sec-CH-UA":`"Google Chrome";v="${CHROME_MAJOR_VERSION}", "Chromium";v="${CHROME_MAJOR_VERSION}", "Not A(Brand";v="24"`,"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":BROWSER_USER_AGENT}}async function requestUrl(options){let headers=buildHeaders2(options.format),currentUrl=options.url;for(let redirectCount=0;redirectCount<=MAX_REDIRECTS;redirectCount+=1){let response=await(0,import_undici.request)(currentUrl,{method:"GET",headers,signal:options.signal,headersTimeout:options.timeoutMs,bodyTimeout:options.timeoutMs});if(!REDIRECT_STATUSES.has(response.statusCode))return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};let location=getHeader(response.headers,"location");if(!location)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};if(redirectCount===MAX_REDIRECTS)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,options.signal),currentUrl=new URL(location,currentUrl).toString()}throw new WebfetchAbortError("Redirect resolution aborted")}async function readHttpResponse(response,signal,onProgress){await rejectOversizedContentLength(response,signal);let body=await readResponseBody(response,signal,onProgress);return{url:response.url,status:response.status,statusText:response.statusText,contentType:getHeader(response.headers,"content-type"),bytes:body.length,body,truncated:body.length===MAX_RESPONSE_SIZE_BYTES}}async function rejectOversizedContentLength(response,signal){let contentLength=getHeader(response.headers,"content-length");if(contentLength&&Number.parseInt(contentLength,10)>MAX_RESPONSE_SIZE_BYTES)throw await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,signal),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)")}function getHeader(headers,name){let value2=headers[name.toLowerCase()];return Array.isArray(value2)?value2.join(", "):value2??""}async function readResponseBody(response,signal,onProgress){let chunks=[],totalBytes=parseContentLength(response),total=0;try{for await(let chunk of response.body){if(signal.aborted)throw response.body.destroy(),new WebfetchAbortError("Request aborted");let bytes=toUint8Array(chunk);if(chunks.push(bytes),total+=bytes.length,total>MAX_RESPONSE_SIZE_BYTES)throw response.body.destroy(),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)");onProgress?.(total,totalBytes)}}catch(error2){throw signal.aborted?new WebfetchAbortError("Request aborted"):error2}let body=new Uint8Array(total),offset=0;for(let chunk of chunks)body.set(chunk,offset),offset+=chunk.length;return body}function parseContentLength(response){let contentLength=getHeader(response.headers,"content-length");if(contentLength==="")return;let parsed=Number.parseInt(contentLength,10);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0}function forwardAbort(signal,controller){if(!signal)return()=>{};if(signal.aborted)return controller.abort(signal.reason),()=>{};let listener=()=>controller.abort(signal.reason);return signal.addEventListener("abort",listener,{once:!0}),()=>signal.removeEventListener("abort",listener)}var WEBFETCH_FORMATS=["markdown","text","html"],Params2=typebox_exports.Object({url:typebox_exports.String({description:"The URL to fetch content from"}),format:typebox_exports.Optional(StringEnum(["markdown","text","html"],{description:"The format to return the content in. Defaults to markdown."})),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Optional timeout in seconds. Maximum 120."}))}),webfetch={name:"webfetch",label:"Web Fetch",description:"Fetches content from a URL and returns it as markdown, plain text, or HTML. Network use is bounded by timeout and response size limits.",promptSnippet:"webfetch: retrieve URL content as markdown, text, or html",promptGuidelines:["Use webfetch when a specific URL must be retrieved.","Prefer markdown format unless raw HTML or plain text is explicitly needed.","The tool is read-only and does not modify files."],parameters:Params2,async execute(_toolCallId,params,signal,onUpdate,_ctx){let format2=parseWebfetchFormat(params.format),timeoutSeconds=clampTimeout(params.timeout),startedAt=Date.now(),progress={activity:`fetching ${params.url}`,startedAt,maxWaitMs:timeoutSeconds*1e3},downloadedTotalBytes,emitProgress=details2=>{onUpdate?.({content:[{type:"text",text:`Fetching ${params.url} as ${format2} (timeout ${timeoutSeconds}s)`}],details:details2})};emitProgress({phase:"fetching",url:params.url,format:format2,timeoutSeconds,progress});let fetched=await fetchUrl({url:params.url,format:format2,timeoutSeconds,...signal===void 0?{}:{signal},onProgress:(bytesRead,totalBytes)=>{downloadedTotalBytes=totalBytes,emitProgress({phase:"downloading",url:params.url,format:format2,timeoutSeconds,bytesRead,...totalBytes===void 0?{}:{totalBytes},progress})}}),raw=new TextDecoder().decode(fetched.body),contentType=fetched.contentType.toLowerCase();emitProgress({phase:"converting",url:params.url,format:format2,timeoutSeconds,bytesRead:fetched.bytes,...downloadedTotalBytes===void 0?{}:{totalBytes:downloadedTotalBytes},progress});let isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),text2=raw,converted=!1;isHtml&&format2==="markdown"?(text2=await htmlToMarkdown(raw,fetched.url),converted=!0):isHtml&&format2==="text"&&(text2=await htmlToText(raw,fetched.url),converted=!0);let capped=capWebfetchOutput(text2),details={url:params.url,finalUrl:fetched.url,format:format2,status:fetched.status,statusText:fetched.statusText,contentType:fetched.contentType,bytes:fetched.bytes,timeoutSeconds,converted,truncated:fetched.truncated,outputTruncated:capped.truncated,outputBytes:capped.outputBytes,outputTotalBytes:capped.totalBytes},content=[{type:"text",text:capped.notice===void 0?capped.text:`${capped.text}
|
|
2196
|
+
`,start),line=(newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex)).trim();if(line.length>0&&lines.push(line),newlineIndex===-1)break;start=newlineIndex+1}return lines}function parseWebfetchArgs(args){if(typeof args!="object"||args===null)return{url:""};let webfetchArgs={url:"url"in args&&typeof args.url=="string"?args.url:""};return"format"in args&&typeof args.format=="string"&&(webfetchArgs.format=args.format),"timeout"in args&&typeof args.timeout=="number"&&(webfetchArgs.timeout=args.timeout),webfetchArgs}function formatProgress2(details){let url=shorten3(details.url,URL_BUDGET);if(details.phase==="downloading"){let downloaded=formatBytes(details.bytesRead??0),total=details.totalBytes===void 0?"":` / ${formatBytes(details.totalBytes)}`;return`Downloading ${url}: ${downloaded}${total}`}return details.phase==="converting"?`Converting ${url} to ${details.format}`:`Fetching ${url} as ${details.format} (${details.timeoutSeconds}s)`}function isWebfetchProgressDetails(details){return typeof details=="object"&&details!==null&&"phase"in details&&(details.phase==="fetching"||details.phase==="downloading"||details.phase==="converting")}function isWebfetchDetails(details){return typeof details=="object"&&details!==null&&"status"in details&&typeof details.status=="number"}function previewText(text2,theme2){let lines=collectNonEmptyTrimmedLines(text2,PREVIEW_LINES);return lines.length===0?[theme2.fg("dim"," empty response")]:lines.map(line=>theme2.fg("toolOutput",` ${truncateToWidth(line,PREVIEW_WIDTH)}`))}function shorten3(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)} KB`:`${(bytes/(1024*1024)).toFixed(1)} MB`}var loadContentModule=()=>import("./content-IWCEHYXU.js");async function htmlToMarkdown(html,url){return(await loadContentModule()).htmlToMarkdown(html,url)}async function htmlToText(html,url){return(await loadContentModule()).htmlToText(html,url)}var import_undici=__toESM(require_undici(),1);var InvalidWebfetchUrlError=class extends Error{constructor(message){super(message),this.name="InvalidWebfetchUrlError"}},WebfetchTimeoutError=class extends Error{constructor(message){super(message),this.name="WebfetchTimeoutError"}},WebfetchResponseTooLargeError=class extends Error{constructor(message){super(message),this.name="WebfetchResponseTooLargeError"}},WebfetchAbortError=class extends Error{constructor(message){super(message),this.name="WebfetchAbortError"}};async function discardBody(body,maxBytes,signal){body.on?.("error",()=>{});try{if(typeof body.dump=="function"){await body.dump(signal?{limit:1024,signal}:{limit:1024});return}await drainBody(body,maxBytes,signal)}catch{}finally{body.destroy()}}async function drainBody(body,maxBytes,signal){let drained=0,iterator=body[Symbol.asyncIterator]();for(;;){let result3=await nextChunk(iterator,signal);if(!result3||result3.done||(drained+=toUint8Array(result3.value).length,drained>maxBytes))return}}async function nextChunk(iterator,signal){if(!signal)return iterator.next();if(signal.aborted)return;let resolveAbort=()=>{},aborted=new Promise(resolve42=>{resolveAbort=()=>resolve42(void 0)}),onAbort=()=>resolveAbort();signal.addEventListener("abort",onAbort,{once:!0});try{return await Promise.race([iterator.next(),aborted])}finally{signal.removeEventListener("abort",onAbort)}}function toUint8Array(chunk){if(chunk instanceof Uint8Array)return chunk;if(typeof chunk=="string")return new TextEncoder().encode(chunk);throw new Error("Unexpected response body chunk")}var MAX_RESPONSE_SIZE_BYTES=5*1024*1024,DEFAULT_TIMEOUT_SECONDS=30,MAX_TIMEOUT_SECONDS2=120,MAX_REDIRECTS=20,BROWSER_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",CHROME_MAJOR_VERSION="143",REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function fetchUrl(options){validateUrl(options.url);let timeoutSeconds=clampTimeout(options.timeoutSeconds),timeoutMs=timeoutSeconds*1e3,controller=new AbortController,timeout=setTimeout(()=>controller.abort(new WebfetchTimeoutError(`Request timed out after ${timeoutSeconds}s`)),timeoutMs),removeAbortForwarder=forwardAbort(options.signal,controller);try{let response=await requestUrl({url:options.url,format:options.format,signal:controller.signal,timeoutMs});return await readHttpResponse(response,controller.signal,options.onProgress)}finally{clearTimeout(timeout),removeAbortForwarder()}}function validateUrl(url){if(!url.startsWith("http://")&&!url.startsWith("https://"))throw new InvalidWebfetchUrlError("URL must start with http:// or https://");try{new URL(url)}catch{throw new InvalidWebfetchUrlError(`Invalid URL: ${url}`)}}function clampTimeout(timeoutSeconds){return timeoutSeconds===void 0||!Number.isFinite(timeoutSeconds)||timeoutSeconds<=0?DEFAULT_TIMEOUT_SECONDS:Math.min(Math.ceil(timeoutSeconds),MAX_TIMEOUT_SECONDS2)}function buildAcceptHeader(format2){switch(format2){case"markdown":return"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";case"text":return"text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";case"html":return"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"}}function buildHeaders2(format2){return{Accept:buildAcceptHeader(format2),"Accept-Language":"en-US,en;q=0.9","Sec-CH-UA":`"Google Chrome";v="${CHROME_MAJOR_VERSION}", "Chromium";v="${CHROME_MAJOR_VERSION}", "Not A(Brand";v="24"`,"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":BROWSER_USER_AGENT}}async function requestUrl(options){let headers=buildHeaders2(options.format),currentUrl=options.url;for(let redirectCount=0;redirectCount<=MAX_REDIRECTS;redirectCount+=1){let response=await(0,import_undici.request)(currentUrl,{method:"GET",headers,signal:options.signal,headersTimeout:options.timeoutMs,bodyTimeout:options.timeoutMs});if(!REDIRECT_STATUSES.has(response.statusCode))return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};let location=getHeader(response.headers,"location");if(!location)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};if(redirectCount===MAX_REDIRECTS)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,options.signal),currentUrl=new URL(location,currentUrl).toString()}throw new WebfetchAbortError("Redirect resolution aborted")}async function readHttpResponse(response,signal,onProgress){await rejectOversizedContentLength(response,signal);let body=await readResponseBody(response,signal,onProgress);return{url:response.url,status:response.status,statusText:response.statusText,contentType:getHeader(response.headers,"content-type"),bytes:body.length,body,truncated:body.length===MAX_RESPONSE_SIZE_BYTES}}async function rejectOversizedContentLength(response,signal){let contentLength=getHeader(response.headers,"content-length");if(contentLength&&Number.parseInt(contentLength,10)>MAX_RESPONSE_SIZE_BYTES)throw await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,signal),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)")}function getHeader(headers,name){let value2=headers[name.toLowerCase()];return Array.isArray(value2)?value2.join(", "):value2??""}async function readResponseBody(response,signal,onProgress){let chunks=[],totalBytes=parseContentLength(response),total=0;try{for await(let chunk of response.body){if(signal.aborted)throw response.body.destroy(),new WebfetchAbortError("Request aborted");let bytes=toUint8Array(chunk);if(chunks.push(bytes),total+=bytes.length,total>MAX_RESPONSE_SIZE_BYTES)throw response.body.destroy(),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)");onProgress?.(total,totalBytes)}}catch(error2){throw signal.aborted?new WebfetchAbortError("Request aborted"):error2}let body=new Uint8Array(total),offset=0;for(let chunk of chunks)body.set(chunk,offset),offset+=chunk.length;return body}function parseContentLength(response){let contentLength=getHeader(response.headers,"content-length");if(contentLength==="")return;let parsed=Number.parseInt(contentLength,10);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0}function forwardAbort(signal,controller){if(!signal)return()=>{};if(signal.aborted)return controller.abort(signal.reason),()=>{};let listener=()=>controller.abort(signal.reason);return signal.addEventListener("abort",listener,{once:!0}),()=>signal.removeEventListener("abort",listener)}var WEBFETCH_FORMATS=["markdown","text","html"],Params2=typebox_exports.Object({url:typebox_exports.String({description:"The URL to fetch content from"}),format:typebox_exports.Optional(StringEnum(["markdown","text","html"],{description:"The format to return the content in. Defaults to markdown."})),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Optional timeout in seconds. Maximum 120."}))}),webfetch={name:"webfetch",label:"Web Fetch",description:"Fetches content from a URL and returns it as markdown, plain text, or HTML. Network use is bounded by timeout and response size limits.",promptSnippet:"webfetch: retrieve URL content as markdown, text, or html",promptGuidelines:["Use webfetch when a specific URL must be retrieved.","Prefer markdown format unless raw HTML or plain text is explicitly needed.","The tool is read-only and does not modify files."],parameters:Params2,async execute(_toolCallId,params,signal,onUpdate,_ctx){let format2=parseWebfetchFormat(params.format),timeoutSeconds=clampTimeout(params.timeout),startedAt=Date.now(),progress={activity:`fetching ${params.url}`,startedAt,maxWaitMs:timeoutSeconds*1e3},downloadedTotalBytes,emitProgress=details2=>{onUpdate?.({content:[{type:"text",text:`Fetching ${params.url} as ${format2} (timeout ${timeoutSeconds}s)`}],details:details2})};emitProgress({phase:"fetching",url:params.url,format:format2,timeoutSeconds,progress});let fetched=await fetchUrl({url:params.url,format:format2,timeoutSeconds,...signal===void 0?{}:{signal},onProgress:(bytesRead,totalBytes)=>{downloadedTotalBytes=totalBytes,emitProgress({phase:"downloading",url:params.url,format:format2,timeoutSeconds,bytesRead,...totalBytes===void 0?{}:{totalBytes},progress})}}),raw=new TextDecoder().decode(fetched.body),contentType=fetched.contentType.toLowerCase();emitProgress({phase:"converting",url:params.url,format:format2,timeoutSeconds,bytesRead:fetched.bytes,...downloadedTotalBytes===void 0?{}:{totalBytes:downloadedTotalBytes},progress});let isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),text2=raw,converted=!1;isHtml&&format2==="markdown"?(text2=await htmlToMarkdown(raw,fetched.url),converted=!0):isHtml&&format2==="text"&&(text2=await htmlToText(raw,fetched.url),converted=!0);let capped=capWebfetchOutput(text2),details={url:params.url,finalUrl:fetched.url,format:format2,status:fetched.status,statusText:fetched.statusText,contentType:fetched.contentType,bytes:fetched.bytes,timeoutSeconds,converted,truncated:fetched.truncated,outputTruncated:capped.truncated,outputBytes:capped.outputBytes,outputTotalBytes:capped.totalBytes},content=[{type:"text",text:capped.notice===void 0?capped.text:`${capped.text}
|
|
2193
2197
|
`}];return capped.notice!==void 0&&content.push(modelOnlyText(capped.notice)),{content,details}}};function parseWebfetchFormat(value2){if(value2===void 0)return"markdown";for(let format2 of WEBFETCH_FORMATS)if(value2===format2)return format2;return"markdown"}var DEFAULT_OUTPUT_MAX_BYTES=50*1024;function capWebfetchOutput(text2){let totalBytes=Buffer.byteLength(text2,"utf-8");if(totalBytes<=DEFAULT_OUTPUT_MAX_BYTES)return{text:text2,truncated:!1,outputBytes:totalBytes,totalBytes};let head=takeHeadBytes(text2,DEFAULT_OUTPUT_MAX_BYTES),outputBytes=Buffer.byteLength(head,"utf-8"),notice2=`[Output truncated: ${formatByteSize(outputBytes)} of ${formatByteSize(totalBytes)} shown (${formatByteSize(DEFAULT_OUTPUT_MAX_BYTES)} limit). Re-fetch a more specific URL or use web_search for targeted content.]`;return{text:head,notice:notice2,truncated:!0,outputBytes,totalBytes}}function takeHeadBytes(text2,maxBytes){let lines=[],usedBytes=0,start=0;for(;start<=text2.length;){let newlineIndex=text2.indexOf(`
|
|
2194
2198
|
`,start),line=newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex),lineBytes=Buffer.byteLength(line,"utf-8")+(lines.length>0?1:0);if(usedBytes+lineBytes>maxBytes||(lines.push(line),usedBytes+=lineBytes,newlineIndex===-1))break;start=newlineIndex+1}return lines.length===0?sliceUtf8Head(text2,maxBytes):lines.join(`
|
|
2195
2199
|
`)}function sliceUtf8Head(value2,maxBytes){let buffer=Buffer.from(value2,"utf-8");if(buffer.length<=maxBytes)return value2;let decoded=new TextDecoder("utf-8").decode(buffer.subarray(0,maxBytes));return decoded.endsWith("\uFFFD")?decoded.slice(0,-1):decoded}function formatByteSize(bytes){return bytes<1024?`${bytes}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(1)}MB`}var ENABLE_ENV4="PI_WEBFETCH",STATUS_KEY5="pi-webfetch",WIDGET_KEY5="pi-webfetch";function parseEnableEnv4(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isWebfetchEnabled(){return parseEnableEnv4(ENABLE_ENV4)}function clearUi3(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY5,void 0),ctx.ui.setWidget(WIDGET_KEY5,void 0))}function webfetch_default(pi){isWebfetchEnabled()&&(pi.registerTool({...webfetch,renderCall:renderWebfetchCall,renderResult:renderWebfetchResult}),pi.on("session_start",async(_event,ctx)=>{clearUi3(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi3(ctx)}))}import{access as access2,readFile as readFile16}from"node:fs/promises";import{homedir as homedir8}from"node:os";import{join as join55}from"node:path";var DEFAULT_PROVIDER_URLS={exa:"https://api.exa.ai/search",tavily:"https://api.tavily.com/search",brave:"https://api.search.brave.com/res/v1/web/search","duckduckgo-html":"https://html.duckduckgo.com/html/",deepseek:"https://api.deepseek.com/anthropic/v1/messages",serper:"https://google.serper.dev/search","google-cse":"https://customsearch.googleapis.com/customsearch/v1","z-ai":"https://api.z.ai/api/paas/v4/web_search",openai:"https://api.openai.com/v1/responses",codex:"https://api.openai.com/v1/responses",anthropic:"https://api.anthropic.com/v1/messages",perplexity:"https://api.perplexity.ai/search",xai:"https://api.x.ai/v1/responses",kimi:"https://api.kimi.com/coding/v1/search"};function defaultProviderUrl(provider){return DEFAULT_PROVIDER_URLS[provider]}function isPrivateIpv4(hostname){let parts=hostname.split(".").map(part=>Number.parseInt(part,10));if(parts.length!==4||parts.some(part=>!Number.isInteger(part)||part<0||part>255))return!1;let first=parts[0]??-1,second=parts[1]??-1;return first===10||first===127||first===0||first===169&&second===254||first===172&&second>=16&&second<=31?!0:first===192&&second===168}function isPrivateHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2==="localhost"||normalized2.endsWith(".localhost")||normalized2.includes(":")||normalized2==="::1"||normalized2.startsWith("fc")||normalized2.startsWith("fd")||/^fe[89ab][0-9a-f]:/.test(normalized2)||isPrivateIpv4(normalized2)}function isAllowedProviderBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.protocol==="https:"&&configured.username===""&&configured.password===""&&!configured.hostname.endsWith("..")&&!isPrivateHostname(configured.hostname)}function providerUrl(config){return config.baseUrl??defaultProviderUrl(config.provider)}var PROVIDERS=["exa","tavily","brave","duckduckgo-html","deepseek","serper","google-cse","z-ai","openai","codex","anthropic","perplexity","xai","kimi"],CONTEXT_SIZES=["low","medium","high"],CODEX_MODES=["cached","live"],STRATEGIES=["priority","round-robin","fill-first"],DEFAULT_FREE_CONFIG={strategy:"priority",fallback:!0,auto:!0,providers:[{id:"default",provider:"duckduckgo-html",maxResults:10}]};function isJsonObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneOf3(values,value2){return typeof value2=="string"&&values.includes(value2)}function isStringArray2(value2){return Array.isArray(value2)&&value2.every(item=>typeof item=="string")}function optionalString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function optionalNumber(value2){return typeof value2=="number"&&Number.isFinite(value2)?value2:void 0}function optionalBoolean(value2){return typeof value2=="boolean"?value2:void 0}function optionalProvider(value2){return oneOf3(PROVIDERS,value2)?value2:void 0}function optionalContextSize(value2){return oneOf3(CONTEXT_SIZES,value2)?value2:void 0}function optionalCodexMode(value2){return oneOf3(CODEX_MODES,value2)?value2:void 0}function optionalStrategy(value2){return oneOf3(STRATEGIES,value2)?value2:void 0}function optionalLocation(value2){if(!isJsonObject(value2))return;let location={},country=optionalString(value2.country),region=optionalString(value2.region),city=optionalString(value2.city),timezone=optionalString(value2.timezone);return country&&(location.country=country),region&&(location.region=region),city&&(location.city=city),timezone&&(location.timezone=timezone),Object.keys(location).length>0?location:void 0}function parseJsonObject(content){let parsed;try{parsed=JSON.parse(content)}catch{return null}return isJsonObject(parsed)?parsed:null}function providerEntryFromObject(raw){let provider=optionalProvider(raw.provider)??optionalProvider(raw.backend);if(!provider)return null;let config={provider},id=optionalString(raw.id),apiKey=optionalString(raw.apiKey),baseUrl=optionalString(raw.baseUrl),searchEngineId=optionalString(raw.searchEngineId),maxResults=optionalNumber(raw.maxResults),model=optionalString(raw.model),codexMode=optionalCodexMode(raw.codexMode),searchContextSize=optionalContextSize(raw.searchContextSize),rawAllowedDomains=raw.allowedDomains,rawBlockedDomains=raw.blockedDomains,allowedDomains=isStringArray2(rawAllowedDomains)?rawAllowedDomains:void 0,blockedDomains=isStringArray2(rawBlockedDomains)?rawBlockedDomains:void 0,userLocation=optionalLocation(raw.userLocation),timeoutMs=optionalNumber(raw.timeoutMs),priority=optionalNumber(raw.priority),weight=optionalNumber(raw.weight);return id&&(config.id=id),apiKey&&(config.apiKey=apiKey),baseUrl&&(config.baseUrl=baseUrl),searchEngineId&&(config.searchEngineId=searchEngineId),maxResults&&(config.maxResults=maxResults),model&&(config.model=model),codexMode&&(config.codexMode=codexMode),searchContextSize&&(config.searchContextSize=searchContextSize),allowedDomains&&(config.allowedDomains=allowedDomains),blockedDomains&&(config.blockedDomains=blockedDomains),userLocation&&(config.userLocation=userLocation),timeoutMs!==void 0&&(config.timeoutMs=timeoutMs),priority!==void 0&&(config.priority=priority),weight!==void 0&&(config.weight=weight),config}function configFromObject(raw){let auto=optionalBoolean(raw.auto)??!0,providersValue=raw.providers,rawProviders=Array.isArray(providersValue)?providersValue:void 0;if(rawProviders){if(optionalProvider(raw.provider))return null;let providers=rawProviders.map(value2=>isJsonObject(value2)?providerEntryFromObject(value2):null).filter(entry=>entry!==null),strategy=optionalStrategy(raw.strategy)??"priority",fallback=optionalBoolean(raw.fallback)??!0;return{strategy,fallback,auto,providers}}let provider=providerEntryFromObject(raw);return provider?{strategy:"priority",fallback:!0,auto,providers:[provider]}:null}function hasApiKey(config){return typeof config.apiKey=="string"&&config.apiKey.length>0}function validateProviderConfig(config){return PROVIDERS.includes(config.provider)?config.allowedDomains&&config.blockedDomains?{ok:!1,reason:"invalid_config",message:"Provider config cannot specify both allowedDomains and blockedDomains."}:config.weight!==void 0&&config.weight<=0?{ok:!1,reason:"invalid_config",message:"Provider weight must be greater than 0."}:config.timeoutMs!==void 0&&config.timeoutMs<=0?{ok:!1,reason:"invalid_config",message:"Provider timeoutMs must be greater than 0."}:config.baseUrl&&!isAllowedProviderBaseUrl(config.baseUrl)?{ok:!1,reason:"invalid_config",message:`Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`}:config.provider==="google-cse"&&!config.searchEngineId?{ok:!1,reason:"missing_api_key",message:"Provider google-cse requires searchEngineId."}:(config.provider==="codex"||config.provider==="openai")&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey for hosted Responses API search.`}:config.provider!=="codex"&&config.provider!=="openai"&&config.provider!=="duckduckgo-html"&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey.`}:{ok:!0,config}:{ok:!1,reason:"invalid_config",message:`Unsupported provider: ${config.provider}`}}function validateWebsearchConfig(config){if(!STRATEGIES.includes(config.strategy))return{ok:!1,reason:"invalid_config",message:`Unsupported routing strategy: ${config.strategy}`};if(typeof config.auto!="boolean")return{ok:!1,reason:"invalid_config",message:"Websearch config auto must be a boolean."};if(config.providers.length===0)return{ok:!1,reason:"invalid_config",message:"Websearch config requires at least one provider."};for(let provider of config.providers){let validation=validateProviderConfig(provider);if(!validation.ok)return validation}return{ok:!0,config}}async function fileExists2(path13){try{return await access2(path13),!0}catch{return!1}}async function loadWebsearchConfig(options){let home=options.homeDir??homedir8(),paths=[join55(options.cwd,CONFIG_DIR_NAME,"websearch.json"),join55(options.cwd,".pi","websearch.json"),join55(home,"websearch.json"),join55(home,CONFIG_DIR_NAME,"websearch.json"),join55(home,".pi","websearch.json")].filter((path13,index,all)=>all.indexOf(path13)===index);for(let path13 of paths){if(!await fileExists2(path13))continue;let raw=parseJsonObject(await readFile16(path13,"utf8"));if(!raw)return{ok:!1,reason:"invalid_config",message:`Invalid JSON object in ${path13}`,source:path13};let config=configFromObject(raw);if(!config)return{ok:!1,reason:"invalid_config",message:`Invalid provider config in ${path13}`,source:path13};let validation=validateWebsearchConfig(config);return validation.ok?{ok:!0,config,source:path13}:{...validation,source:path13}}return{ok:!0,config:DEFAULT_FREE_CONFIG,source:"default:duckduckgo-html"}}var EMPTY_DOMAIN_SENTINEL="invalid.invalid";function contentHeaders(extra){return{Accept:"application/json","Content-Type":"application/json",...extra??{}}}function clamp(value2,min,max){return Math.max(min,Math.min(max,Math.trunc(value2)))}function appendDomainFilters(query,allowedDomains,blockedDomains){let parts=[query];for(let domain of allowedDomains??[])parts.push(`site:${domain}`);for(let domain of blockedDomains??[])parts.push(`-site:${domain}`);return parts.join(" ")}function unique(values){return[...new Set(values)]}function nonEmptyDomains(values){return values.length>0?values:[EMPTY_DOMAIN_SENTINEL]}function resolveDomainFilters(config,request2){let configAllowed=config.allowedDomains,configBlocked=config.blockedDomains,requestAllowed=request2.allowedDomains,requestBlocked=request2.blockedDomains;if(configAllowed){let narrowed=requestAllowed?configAllowed.filter(domain=>requestAllowed.includes(domain)):configAllowed,allowed=requestBlocked?narrowed.filter(domain=>!requestBlocked.includes(domain)):narrowed;return{allowedDomains:nonEmptyDomains(unique(allowed))}}if(configBlocked){let blocked=unique([...configBlocked,...requestBlocked??[]]);return requestAllowed?{allowedDomains:nonEmptyDomains(requestAllowed.filter(domain=>!blocked.includes(domain)))}:{blockedDomains:blocked}}return requestAllowed?{allowedDomains:unique(requestAllowed)}:requestBlocked?{blockedDomains:unique(requestBlocked)}:{}}function isJsonObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function getObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function getArray(value2){return Array.isArray(value2)?value2:[]}function getString2(value2){return typeof value2=="string"?value2:void 0}function getNumber(value2){return typeof value2=="number"?value2:void 0}function result2(title,url,snippet,source,score3){if(!title||!url)return null;let item={title,url};return snippet&&(item.snippet=snippet),source&&(item.source=source),score3!==void 0&&(item.score=score3),item}function collect(items,max=50){return items.filter(item=>item!==null).slice(0,max)}function parseObjectPayload(payload){return isJsonObject2(payload)?payload:{}}function buildAnthropicMessagesSearchRequest(ctx,defaultModel){let{config,request:request2,allowedDomains,blockedDomains}=ctx,webSearchTool={type:"web_search_20250305",name:"web_search",max_uses:8};return allowedDomains&&(webSearchTool.allowed_domains=allowedDomains),blockedDomains&&(webSearchTool.blocked_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"x-api-key":config.apiKey??"","anthropic-version":"2023-06-01"})},body:{model:config.model??defaultModel,max_tokens:1024,messages:[{role:"user",content:request2.query}],tools:[webSearchTool]}}}function normalizeAnthropicMessagesSearchPayload(data){let content=getArray(data.content),text2=content.map(getObject).map(item=>getString2(item?.text)).filter(value2=>value2!==void 0).join(`
|
|
@@ -2302,7 +2306,7 @@ ${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",lin
|
|
|
2302
2306
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2303
2307
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2304
2308
|
|
|
2305
|
-
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})}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";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-
|
|
2309
|
+
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})}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";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-J7244EJE.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-J7244EJE.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-BGT65PGC.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-3PUZYQOK.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat8}from"node:fs/promises";import{resolve as resolve35}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve35(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat8(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>
|
|
2306
2310
|
`;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(`
|
|
2307
2311
|
`)}</file>
|
|
2308
2312
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2353,7 +2357,7 @@ Press any key to continue...`)),await new Promise(resolve42=>{process.stdin.setR
|
|
|
2353
2357
|
`))}}return await session.waitForSettledSessionWork(),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()}}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-OHPSU5VU.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 randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync35,mkdirSync as mkdirSync21,renameSync as renameSync16,rmSync as rmSync11}from"node:fs";import{basename as basename23,dirname as dirname41,join as join70,relative as relative17,resolve as resolve37,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve37(path13))}function getQuarantineRoot(packageDir){let current=resolve37(packageDir);for(;;){if(basename23(current).toLowerCase()==="node_modules")return join70(current,QUARANTINE_DIR_NAME);let parent=dirname41(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{rmSync11(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=join70(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync35(loadedFile))continue;let quarantinePath=join70(quarantineRunDir,relative17(resolvedPackageDir,loadedFile));mkdirSync21(dirname41(quarantinePath),{recursive:!0}),renameSync16(loadedFile,quarantinePath),copyFileSync2(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(resolve42=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve42(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:path13,error:error2})=>({type:"warning",message:`Failed to load extension "${path13}": ${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(`
|
|
2354
2358
|
`));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}
|
|
2355
2359
|
`),!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}
|
|
2356
|
-
`),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(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!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 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(path13,sessionDir){try{return SessionManager.open(path13,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 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.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);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-ZIBANFBQ.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(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.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.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}))),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),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(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);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,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}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,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:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),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}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],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");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,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)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}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)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());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 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),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,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-Z62FXPOJ.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}),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-3PACMEHC.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join71(agentDir,"auth.json")),authPath:join71(agentDir,"auth.json"),agentDir,modelsPath:join71(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 selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-57LEAJPU.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{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");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))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-47EVLL6X.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-SLPAGRHH.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,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(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),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")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}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 label2=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:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2360
|
+
`),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(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!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 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(path13,sessionDir){try{return SessionManager.open(path13,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 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.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);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-ZIBANFBQ.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(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.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.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}))),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),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(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);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,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}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,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:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),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}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],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");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,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)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}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)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());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 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),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,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-Z62FXPOJ.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}),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-GFSDQQUJ.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join71(agentDir,"auth.json")),authPath:join71(agentDir,"auth.json"),agentDir,modelsPath:join71(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 selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-57LEAJPU.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{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");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))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-75CRTY24.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-EDJZ4CSY.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,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(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),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")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}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 label2=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:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2357
2361
|
|
|
2358
2362
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2359
2363
|
|
|
@@ -2424,7 +2428,7 @@ The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder
|
|
|
2424
2428
|
`||text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2425
2429
|
`;){cursor+=text2[cursor]==="\r"?2:1;let lineStart=cursor;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;if(text2[cursor]!==`
|
|
2426
2430
|
`&&!(text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2427
|
-
`))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&(key="Tools/summaries",usage3=entry.usage),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._baseToolDefinitions=new Map,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._extensionMode="print",this._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),this._retryRandom=config.retryRandom??Math.random,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env}:{model}}catch{return{model}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),messages=compactedBeforeCallback?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of this._eventListeners)l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID11(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source){try{let messages=source==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||((this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),this._emitQueueUpdate()}return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&!this._overflowRecoveryAttempted}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),event.message.role==="assistant")){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1;let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),this._turnIndex++,this._flushPendingCustomMessages()}else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._sessionFastMode||this._currentServiceTier==="priority"}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID11()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name);this.agent.state.tools=tools,this._baseSystemPrompt=this._rebuildSystemPrompt(validToolNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt,activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name)),withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
2431
|
+
`))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve42){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve42(requested)}}function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&(key="Tools/summaries",usage3=entry.usage),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._baseToolDefinitions=new Map,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._extensionMode="print",this._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),this._retryRandom=config.retryRandom??Math.random,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env}:{model}}catch{return{model}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),messages=compactedBeforeCallback?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of this._eventListeners)l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID11(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source){try{let messages=source==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||((this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),this._emitQueueUpdate()}return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&!this._overflowRecoveryAttempted}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),event.message.role==="assistant")){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1;let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),this._turnIndex++,this._flushPendingCustomMessages()}else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._sessionFastMode||this._currentServiceTier==="priority"}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID11()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name);this.agent.state.tools=tools,this._baseSystemPrompt=this._rebuildSystemPrompt(validToolNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt,activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name)),withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
2428
2432
|
|
|
2429
2433
|
`):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
|
|
2430
2434
|
|
|
@@ -2481,7 +2485,7 @@ ${expandedBody}`,this.getStartupExpansionState());this.loadedResourcesContainer.
|
|
|
2481
2485
|
`),contextCompactList=formatCompactList(contextFiles.map(contextFile=>this.formatContextPath(contextFile.path)),{sort:!1});addLoadedSection("Context",contextCompactList,contextList)}let skills=skillsResult.skills;if(skills.length>0){let groups=this.buildScopeGroups(skills.map(skill=>({path:skill.filePath,sourceInfo:skill.sourceInfo}))),skillList=this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}),skillCompactList=formatCompactList(skills.filter(skill=>!isSystemResource(skill.sourceInfo)).map(skill=>skill.name));addLoadedSection("Skills",skillCompactList,skillList)}let templates=this.session.promptTemplates;if(templates.length>0){let groups=this.buildScopeGroups(templates.map(template=>({path:template.filePath,sourceInfo:template.sourceInfo}))),templateByPath=new Map(templates.map(t=>[t.filePath,t])),templateList=this.formatScopeGroups(groups,{formatPath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)},formatPackagePath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)}}),promptCompactList=formatCompactList(templates.filter(template=>!isSystemResource(template.sourceInfo)).map(template=>`/${template.name}`));addLoadedSection("Prompts",promptCompactList,templateList)}if(extensions.length>0){let groups=this.buildScopeGroups(extensions),extList=this.formatScopeGroups(groups,{formatPath:item=>this.formatExtensionDisplayPath(item.path),formatPackagePath:item=>this.formatExtensionDisplayPath(this.getShortPath(item.path,item.sourceInfo))}),extensionCompactList=formatCompactList(this.getCompactExtensionLabels(extensions.filter(extension=>!isSystemResource(extension.sourceInfo))));addLoadedSection("Extensions",extensionCompactList,extList,"mdHeading")}let customThemes=themesResult.themes.filter(t=>t.sourcePath);if(customThemes.length>0){let groups=this.buildScopeGroups(customThemes.map(loadedTheme=>({path:loadedTheme.sourcePath,sourceInfo:loadedTheme.sourceInfo}))),themeList=this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}),themeCompactList=formatCompactList(customThemes.filter(loadedTheme=>!isSystemResource(loadedTheme.sourceInfo)).map(loadedTheme=>loadedTheme.name??this.getCompactPathLabel(loadedTheme.sourcePath,loadedTheme.sourceInfo)));addLoadedSection("Themes",themeCompactList,themeList)}}if(showDiagnostics){let addDiagnosticNotice=(title,diagnostics)=>{this.loadedResourcesContainer.addChild(buildNoticeBox({title,tone:"warning",why:"Conflicting or invalid loaded resources were found.",extra:this.formatDiagnostics(diagnostics,sourceInfos)},{expanded:this.toolOutputExpanded},theme)),this.loadedResourcesContainer.addChild(new Spacer(1))},skillDiagnostics=skillsResult.diagnostics;skillDiagnostics.length>0&&addDiagnosticNotice("Skill conflicts",skillDiagnostics);let promptDiagnostics=promptsResult.diagnostics;promptDiagnostics.length>0&&addDiagnosticNotice("Prompt conflicts",promptDiagnostics);let extensionDiagnostics=[],extensionErrors=this.session.resourceLoader.getExtensions().errors;if(extensionErrors.length>0)for(let error2 of extensionErrors)extensionDiagnostics.push({type:"error",message:error2.error,path:error2.path});let commandDiagnostics=this.session.extensionRunner.getCommandDiagnostics();extensionDiagnostics.push(...commandDiagnostics),extensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));let shortcutDiagnostics=this.session.extensionRunner.getShortcutDiagnostics();extensionDiagnostics.push(...shortcutDiagnostics),extensionDiagnostics.length>0&&addDiagnosticNotice("Extension issues",extensionDiagnostics);let themeDiagnostics=themesResult.diagnostics;themeDiagnostics.length>0&&addDiagnosticNotice("Theme conflicts",themeDiagnostics)}}async bindCurrentSessionExtensions(){let uiContext=this.createExtensionUIContext();await this.session.bindExtensions({uiContext,mode:"tui",abortHandler:()=>{this.restoreQueuedMessagesToEditor({abort:!0})},commandContextActions:{waitForIdle:()=>this.session.waitForIdle(),newSession:async options=>{this.clearStatusIndicator();try{return await this.runtimeHost.newSession(options)}catch(error2){return this.handleFatalRuntimeError("Failed to create session",error2)}},fork:async(entryId,options)=>{try{let result3=await this.runtimeHost.fork(entryId,options);return result3.cancelled||(this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")),{cancelled:result3.cancelled}}catch(error2){return this.handleFatalRuntimeError("Failed to fork session",error2)}},navigateTree:async(targetId,options)=>{let result3=await this.session.navigateTree(targetId,{summarize:options?.summarize,customInstructions:options?.customInstructions,replaceInstructions:options?.replaceInstructions,label:options?.label,expectedLeafId:options?.expectedLeafId});return result3.cancelled?{cancelled:!0}:(this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus("Navigated to selected point"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1})},editAssistantMessage:async(entryId,text2,options)=>{let result3=await this.session.editAssistantMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced assistant response"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},editUserMessage:async(entryId,text2,options)=>{let result3=await this.session.editUserMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced user prompt"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},switchSession:async(sessionPath,options)=>this.handleResumeSession(sessionPath,options),reload:async()=>{await this.handleReloadCommand()}},shutdownHandler:()=>{this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()},onError:error2=>{this.showExtensionError(error2)}}),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.setupAutocompleteProvider();let extensionRunner=this.session.extensionRunner;this.setupExtensionShortcuts(extensionRunner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0}),this.showStartupNoticesIfNeeded()}applyFullscreenScrollbarSetting(){this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar())}applyRuntimeSettings(){setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides()),configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs()),this.applyFullscreenScrollbarSetting(),this.renderer instanceof TuiAltScreen&&this.renderer.setCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect?.()??!0),this.footer.setSession(this.session),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerDataProvider.setCwd(this.sessionManager.getCwd()),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.applySmoothStreamingRenderFps(),this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());let clearOnShrink=this.settingsManager.getClearOnShrink();this.ui.setClearOnShrink(clearOnShrink),!clearOnShrink&&!this.activeStatusIndicator&&this.statusContainer.clear();let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.defaultEditor.setPaddingX(editorPaddingX),this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible),this.editor!==this.defaultEditor&&(this.editor.setPaddingX?.(editorPaddingX),this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible))}async rebindCurrentSession(options={}){_InteractiveMode.restoreCompactionEscapeOverride(this),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let session=this.session;this.unsubscribe?.(),this.unsubscribe=void 0,this.applyRuntimeSettings(),options.renderBeforeBind&&(this.renderCurrentSessionState(),this.subscribeToAgent()),await this.bindCurrentSessionExtensions(),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err2=>{this.showError(`Shortcut handler error: ${err2 instanceof Error?err2.message:String(err2)}`)}),!0;return!1}}async withBlockedHostDialog(id,label2,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label2,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}async handleHostUiRequest(request2){switch(request2.method){case"select":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionSelector(request2.title??"",request2.options??[]));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"confirm":return{type:"extension_ui_response",id:request2.id,confirmed:await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionConfirm(request2.title??"",request2.message??""))};case"input":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionInput(request2.title??"",request2.placeholder));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"editor":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionEditor(request2.title??"",request2.prefill));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"question":{let questions=request2.questions??[];if(questions.length===0)return{type:"extension_ui_response",id:request2.id,cancelled:!0};let remainingMs2=request2.remainingMs!==void 0&&request2.remainingMs>0?request2.remainingMs:request2.timeout,hostRuntime=this.runtimeHost,progressTimer,lastDraft,waitForAnswer=request2.waitForAnswer??!0,response=await(waitForAnswer?this.showQuestionOverlay:this.showAsyncQuestion).call(this,{requestId:request2.requestId??"",questions,waitForAnswer,timeoutMs:request2.timeout??0},{timeout:remainingMs2,notifyArrival:request2.askedAtMs===void 0||request2.askedAtMs>=this.questionArrivalEpochMs,onProgress:draft=>{lastDraft=draft,progressTimer===void 0&&(progressTimer=setTimeout(()=>{progressTimer=void 0,hostRuntime.sendHostUiProgress?.({type:"extension_ui_progress",id:request2.id,...lastDraft?.answers!==void 0?{answers:lastDraft.answers}:{},...lastDraft?.comment!==void 0?{comment:lastDraft.comment}:{}})},1e3))}});return progressTimer!==void 0&&clearTimeout(progressTimer),response.status==="cancelled"?{type:"extension_ui_response",id:request2.id,cancelled:!0}:response.status==="timed_out"?void 0:{type:"extension_ui_response",id:request2.id,answers:response.answers,...response.comment!==void 0?{comment:response.comment}:{}}}case"notify":this.showExtensionNotify(request2.message??"");return;case"setStatus":this.setExtensionStatus(request2.statusKey??"",request2.statusText);return;case"setTitle":this.extensionTerminalTitle=request2.title??"",this.applyTerminalTitle();return;case"set_editor_text":this.editor.setText(request2.text??"");return;case"setWidget":this.setExtensionWidget(request2.widgetKey??"",request2.widgetLines,{placement:request2.widgetPlacement});return;case"setHeader":this.setExtensionHeader(linesFactory(request2.widgetLines));return;case"setFooter":this.setExtensionFooter(linesFactory(request2.widgetLines));return;case"custom_unsupported":this.showExtensionNotify(`${request2.extensionName??"This extension"} requires the classic TUI; its component widget cannot be rendered in the shared host.`,"warning");return;default:return}}setExtensionStatus(key,text2){this.footerDataProvider.setExtensionStatus(key,text2),this.ui.requestRender()}startToolHookStatusTimer(){if(this.hookStatusIntervalId)return;let intervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS);this.hookStatusIntervalId=setInterval(()=>{this.refreshToolHookStatuses()},intervalMs),this.hookStatusIntervalId.unref()}stopToolHookStatusTimer(){this.hookStatusIntervalId&&(clearInterval(this.hookStatusIntervalId),this.hookStatusIntervalId=void 0)}refreshToolHookStatuses(){if(this.hookStatusContainer.clear(),this.activeToolHooks.size===0){this.stopToolHookStatusTimer(),this.ui.requestRender();return}let now2=Date.now();for(let hook of this.activeToolHooks.values()){let elapsedMs=Math.max(0,now2-hook.startedAt),elapsedSeconds=Math.floor(elapsedMs/1e3);this.hookStatusContainer.addChild(new Text(formatToolHookStatusMessageFrame(hook.hookName,hook.statusMessage,elapsedSeconds,elapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),1,0))}this.ui.requestRender()}handleToolHookStatusEvent(event){if(event.phase==="start"){this.activeToolHooks.set(event.hookRunId,event),this.activeToolTerminalTitle=formatToolHookTerminalTitle(event),this.ui.terminal&&this.applyTerminalTitle(),this.startToolHookStatusTimer(),this.refreshToolHookStatuses();return}if(event.phase==="update"){let existing=this.activeToolHooks.get(event.hookRunId);if(!existing)return;let updated={...existing,statusMessage:event.statusMessage};this.activeToolHooks.set(event.hookRunId,updated),this.activeToolTerminalTitle=formatToolHookTerminalTitle(updated),this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses();return}this.activeToolHooks.delete(event.hookRunId);let nextHook=this.activeToolHooks.values().next().value;this.activeToolTerminalTitle=nextHook?formatToolHookTerminalTitle(nextHook):void 0,this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses()}handleToolExecutionStart(event){let label2=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame2,elapsedMs)=>formatWorkingStatusShimmerText(frame2,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text2=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text2):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label2){this.hiddenThinkingLabel=label2??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing2=map.get(key);existing2?.dispose&&existing2.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container;for(let line of content.slice(0,_InteractiveMode.MAX_WIDGET_LINES))container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new Text(theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing=targetMap.get(key);existing?.dispose&&existing.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state of this.pendingQuestions.values())state.finish({status:"cancelled",answers:{},unanswered:state.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text2)=>this.setExtensionStatus(key,text2),setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label2=>this.setHiddenThinkingLabel(label2),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text2=>this.editor.handleInput(`\x1B[200~${text2}\x1B[201~`),setEditorText:text2=>this.editor.setText(text2),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(resolve42=>{if(opts?.signal?.aborted){resolve42(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve42(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve42(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve42(void 0)},{tui:this.ui,timeout:opts?.timeout,onToggleToolsExpanded:()=>this.toggleToolOutputExpansion()}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionSelector),this.ui.setFocus(this.extensionSelector),this.ui.requestRender()})}hideExtensionSelector(){this.extensionSelector?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionSelector=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}async showExtensionConfirm(title,message,opts){return await this.showExtensionSelector(`${title}
|
|
2482
2486
|
${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){return await this.showExtensionConfirm("Session cwd not found",formatMissingSessionCwdPrompt(error2.issue))?error2.issue.fallbackCwd:void 0}showExtensionInput(title,placeholder,opts){return new Promise(resolve42=>{if(opts?.signal?.aborted){resolve42(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve42(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve42(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve42(void 0)},{tui:this.ui,timeout:opts?.timeout}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()})}hideExtensionInput(){this.extensionInput?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionInput=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showExtensionEditor(title,prefill){return new Promise(resolve42=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve42(value2)},()=>{this.hideExtensionEditor(),resolve42(void 0)},void 0,this.settingsManager.getExternalEditorCommand()),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionEditor),this.ui.setFocus(this.extensionEditor),this.ui.requestRender()})}hideExtensionEditor(){this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionEditor=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showQuestionOverlay(request2,opts){return new Promise(resolve42=>{let settled=!1,previousWorkingMessage=this.workingMessage,finish=response=>{settled||(settled=!0,opts?.signal?.removeEventListener("abort",onAbort),this.workingMessage=previousWorkingMessage,this.updateWorkingIndicatorMessage(),this.blockingQuestionHeader=void 0,this.applyTerminalTitle(),this.hideQuestionOverlay(),resolve42(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve42({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),opts?.notifyArrival!==!1&&this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled()),state={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,opts?.notifyArrival!==!1&&this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}refreshAsyncWidget(){this.syncQuestionMouseCapture(),this.applyTerminalTitle();let state=this.shownQuestion;if(!state||this.questionSurface==="expanded"){this.setExtensionWidget(ASK_USER_WIDGET_KEY,void 0);return}this.setExtensionWidget(ASK_USER_WIDGET_KEY,tui=>new AskUserAsyncWidget({request:state.request,draft:state.draft,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,pendingCount:this.pendingOrder.length,tui,mouseCaptureActive:this.terminalMouseMode!=="off",onExpandClick:()=>this.expandPendingQuestion(state.request.requestId),onNextQuestion:()=>this.cyclePendingQuestion(),onOptionClick:index=>this.clickPendingQuestion(state,index),onOwnAnswerClick:()=>this.clickPendingQuestion(state,"own-answer"),onExpire:()=>state.finish(buildTimedOutResponse(state.request,state.draft,Date.now()-state.askedAtMs))}))}cyclePendingQuestion(){if(this.pendingOrder.length<2)return;let index=this.pendingOrder.indexOf(this.shownQuestionId);this.shownQuestionId=this.pendingOrder[(index+1)%this.pendingOrder.length],this.refreshAsyncWidget()}clickPendingQuestion(state,option){let unanswered=unansweredIds2(state.request,state.draft),index=state.request.questions.findIndex(question=>question.id===unanswered[0]);this.expandPendingQuestion(state.request.requestId,index)&&(option==="own-answer"?this.askUserQuestion.openOwnAnswer():this.askUserQuestion.clickOption(option,!0))}handleAskUserShortcut(data){let state=this.shownQuestion;if(!state||this.askUserQuestion||this.ui.hasOverlay()||this.extensionSelector||this.extensionInput||this.extensionEditor)return!1;if(matchesAskUserAnswerKey(data))return this.expandPendingQuestion();if(this.editor.getText()!==""||this.ui.getFocusedComponent()!==this.editor||this.defaultEditor.isShowingAutocomplete())return!1;if(this.keybindings.matches(data,"app.question.next"))return this.pendingOrder.length<2?!1:(this.cyclePendingQuestion(),!0);let unanswered=unansweredIds2(state.request,state.draft),questionIndex=state.request.questions.findIndex(question2=>question2.id===unanswered[0]),question=state.request.questions[questionIndex];if(/^[1-9]$/.test(data)&&question?.options[Number(data)-1])return this.expandPendingQuestion(state.request.requestId,questionIndex,data),!0;let printable=decodeKittyPrintable(data)??data;return(data.startsWith("\x1B[200~")||printable!==""&&!/[\x00-\x1f\x7f]/.test(printable)&&!/^[/!]/.test(printable))&&this.setComposerReply(state.request.requestId),!1}setComposerReply(requestId){this.composerDestination=requestId===void 0?{kind:"chat"}:{kind:"answer",requestId};let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);this.defaultEditor.setReplyLabel(state?theme.fg("muted",`\u21B3 reply to ${state.request.questions[0].header} \xB7 ${keyText("app.message.followUp")} sends as message`):void 0),this.ui.requestRender()}async handleAnswerCommand(argument){let state=this.shownQuestion;if(!state){this.showStatus("No question is pending.");return}if(argument==="skip"){let response={status:"cancelled",answers:state.draft.answers??{},unanswered:unansweredIds2(state.request,state.draft)};state.finish(response),await state.completion,this.showStatus("The user dismissed the question."),await this.session.sendUserMessage(formatUserMessage(response,state.request.requestId,state.request.questions),{deliverAs:this.session.isStreaming?"steer":"followUp"});return}if(argument!==""){let id=/^[1-9]\d*$/.test(argument)?this.pendingOrder[Number(argument)-1]:void 0;if(id===void 0){this.showStatus("Choose a pending question number or /answer skip.");return}this.expandPendingQuestion(id);return}if(this.pendingOrder.length===1){this.expandPendingQuestion();return}let list3=new SelectList(this.pendingOrder.map(id=>{let pending=this.pendingQuestions.get(id),remaining=(pending.getDeadlineAtMs?.()??pending.askedAtMs+pending.timeoutMs)-Date.now();return{value:id,label:`${pending.request.questions[0].header} \xB7 ${formatCountdownLabel(Date.now()-pending.askedAtMs)} ago \xB7 ${formatCountdownLabel(remaining)} remaining`}}),10,getSelectListTheme()),close=()=>{this.ui.hideOverlay(),this.questionSurface="collapsed"};list3.onCancel=close,list3.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list3,{width:"80%",anchor:"bottom-center"})}expandPendingQuestion(requestId=this.shownQuestionId,initialQuestionIndex,initialInput){let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);if(!state||this.askUserQuestion)return!1;this.shownQuestionId=state.request.requestId;let component=new AskUserQuestionComponent(state.request,response=>{if(this.pendingQuestions.get(state.request.requestId)===state){if(response.status!=="cancelled"){state.finish(response);return}this.hideQuestionOverlay(),this.refreshAsyncWidget()}},{tui:this.ui,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,initialDraft:state.draft,initialQuestionIndex,onProgress:draft=>{state.draft=draft,state.onProgress?.(draft)}});return this.askUserQuestion=component,this.questionSurface="expanded",this.refreshAsyncWidget(),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender(),initialInput!==void 0&&component.handleInput(initialInput),!0}submitAsyncQuestionComment(text2){let destination=this.composerDestination,state=destination.kind==="answer"?this.pendingQuestions.get(destination.requestId):void 0;return state?(this.setComposerReply(),this.editor.addToHistory?.(text2),this.editor.setText(""),state.finish(buildCommentResponse(state.request,state.draft,text2)),!0):!1}getExpandedEditorText(){return expandEditorSubmission(this.editor,this.editor.getText())}setCustomEditorComponent(factory){if(this.editorComponentFactory=factory,!(!factory&&this.editor===this.defaultEditor)){if(this.disposeActiveSelector(),this.editorContainer.clear(),factory){let newEditor=factory(this.ui,this.chrome?this.chrome.getEditorTheme():getEditorTheme(),this.keybindings);newEditor.onSubmit=text2=>{this.defaultEditor.onSubmit?.(expandSubmittedText(newEditor,text2))},newEditor.onChange=this.defaultEditor.onChange,transferEditorContent(this.editor,newEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(newEditor),newEditor.borderColor!==void 0&&(newEditor.borderColor=this.defaultEditor.borderColor),newEditor.setPaddingX!==void 0&&newEditor.setPaddingX(this.defaultEditor.getPaddingX()),newEditor.setAutocompleteMaxVisible!==void 0&&newEditor.setAutocompleteMaxVisible(this.defaultEditor.getAutocompleteMaxVisible()),newEditor.setAutocompleteProvider&&this.autocompleteProvider&&newEditor.setAutocompleteProvider(this.autocompleteProvider);let customEditor=newEditor;if("actionHandlers"in customEditor&&customEditor.actionHandlers instanceof Map){customEditor.onEscape||(customEditor.onEscape=()=>this.defaultEditor.onEscape?.()),customEditor.onCtrlD||(customEditor.onCtrlD=()=>this.defaultEditor.onCtrlD?.()),customEditor.onPasteImage||(customEditor.onPasteImage=()=>this.defaultEditor.onPasteImage?.()),customEditor.onExtensionShortcut||(customEditor.onExtensionShortcut=data=>this.defaultEditor.onExtensionShortcut?.(data));for(let[action,handler]of this.defaultEditor.actionHandlers)customEditor.actionHandlers.set(action,handler)}this.editor=newEditor}else this.editor!==this.defaultEditor&&(transferEditorContent(this.editor,this.defaultEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(this.defaultEditor)),this.editor=this.defaultEditor;this.editorContainer.addChild(this.editor),this.activeStatusIndicator&&(this.statusContainer.clear(),this.activeWorkingIndicatorEmbedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,this.activeStatusIndicator),this.activeWorkingIndicatorEmbedded||this.statusContainer.addChild(this.activeStatusIndicator)),this.ui.setFocus(this.editor),this.ui.requestRender()}}showExtensionNotify(message,type2){type2==="error"?this.showError(message):type2==="warning"?this.showWarning(message):this.showStatus(message)}async showExtensionCustom(factory,options){let savedText=this.editor.getText(),isOverlay=options?.overlay??!1,restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.editor.setText(savedText),this.ui.setFocus(this.editor),this.ui.requestRender()};return new Promise((resolve42,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve42(result3);try{component?.dispose?.()}catch{}}};Promise.resolve(factory(this.ui,theme,this.keybindings,close)).then(c=>{if(!closed)if(component=c,isOverlay){let overlayOptions=(()=>{if(options?.overlayOptions)return typeof options.overlayOptions=="function"?options.overlayOptions():options.overlayOptions;let w=component.width;return w?{width:w}:void 0})(),handle=this.ui.showOverlay(component,overlayOptions);options?.onHandle?.(handle)}else this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}).catch(err2=>{closed||(isOverlay||restoreEditor(),reject(err2))})})}showExtensionError(error2){let errorMsg=formatExtensionErrorHeadline(error2),errorText5=new Text(theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText5),error2.stack){let stackLines=error2.stack.split(`
|
|
2483
2487
|
`).slice(1).map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
|
|
2484
|
-
`);stackLines&&this.chatContainer.addChild(new Text(stackLines,1,0))}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=text2=>{let wasBashMode=this.isBashMode;this.isBashMode=text2.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text2)},this.subscribeImageMarkers(this.defaultEditor),this.defaultEditor.onPasteImage=()=>{this.lastInputWasPaste=!0,this.handleClipboardPaste()};let previousEscapeHandler=this.defaultEditor.onEscape;this.defaultEditor.onEscape=()=>{this.hideShortcutOverlay(),previousEscapeHandler?.()}}async handleRightClickPaste(){let target=this.renderer.getFocusedComponent(),handleInput=target?.handleInput;if(!(!target||!handleInput))try{let text2=await readClipboardText();if(!text2||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text2}\x1B[201~`),this.ui.requestRender()}catch{}}async handleClipboardPaste(){try{let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async text2=>{try{let preResolvedImages=this.preResolvedSubmissionImages;if(this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim(),!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText(""),await this.handleAnswerCommand(text2.slice(7).trim());return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer");return}if(this.session.isStreaming){let images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId2)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId2),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),submission=images.length>0?{text:text2,images,pendingEchoId}:{text:text2,pendingEchoId};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":event.entry.type==="custom"&&(this.addCustomEntryToChat(event.entry),this.ui.requestRender());break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label2=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isNetworkProviderError(errorMessage8)?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`Retry switched models (${event.reason}); the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isNetworkProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isNetworkProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isNetworkProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isNetworkProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isNetworkProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new Text(theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusText.setText(theme.fg("dim",message)),this.ui.requestRender();return}let spacer=new Spacer(1),text2=new Text(theme.fg("dim",message),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(toolName,toolCallId,args){return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message);let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label2=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label2}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label2="Cache miss";miss.modelChanged?label2="Cache miss after model switch":miss.idleMs>=3e5&&(label2=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label2}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve42=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve42(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
|
|
2488
|
+
`);stackLines&&this.chatContainer.addChild(new Text(stackLines,1,0))}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=text2=>{let wasBashMode=this.isBashMode;this.isBashMode=text2.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text2)},this.subscribeImageMarkers(this.defaultEditor),this.defaultEditor.onPasteImage=()=>{this.lastInputWasPaste=!0,this.handleClipboardPaste()};let previousEscapeHandler=this.defaultEditor.onEscape;this.defaultEditor.onEscape=()=>{this.hideShortcutOverlay(),previousEscapeHandler?.()}}async handleRightClickPaste(){let target=this.renderer.getFocusedComponent(),handleInput=target?.handleInput;if(!(!target||!handleInput))try{let text2=await readClipboardText();if(!text2||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text2}\x1B[201~`),this.ui.requestRender()}catch{}}async handleClipboardPaste(){try{let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async text2=>{try{let preResolvedImages=this.preResolvedSubmissionImages;if(this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim(),!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText(""),await this.handleAnswerCommand(text2.slice(7).trim());return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer");return}if(this.session.isStreaming){let images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId2)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId2),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),submission=images.length>0?{text:text2,images,pendingEchoId}:{text:text2,pendingEchoId};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":event.entry.type==="custom"&&(this.addCustomEntryToChat(event.entry),this.ui.requestRender());break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label2=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isNetworkProviderError(errorMessage8)?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`Retry switched models (${event.reason}); the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isNetworkProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isNetworkProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isNetworkProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isNetworkProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isNetworkProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new Text(theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusText.setText(theme.fg("dim",message)),this.ui.requestRender();return}let spacer=new Spacer(1),text2=new Text(theme.fg("dim",message),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(requestedName,toolCallId,args){let toolName=this.session.resolveToolCallName(requestedName);return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message);let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label2=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label2}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label2="Cache miss";miss.modelChanged?label2="Cache miss after model switch":miss.idleMs>=3e5&&(label2=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label2}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve42=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve42(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
|
|
2485
2489
|
`),process.exit(0)}emergencyTerminalExit(crash){this.isShuttingDown=!0;try{appendUncaughtCrashLog(crash.origin,crash.error)}catch{}this.unregisterSignalHandlers(),killTrackedDetachedChildren(),process.exit(129)}uncaughtCrash(error2,origin){if(this.isShuttingDown&&process.exit(1),isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:`dead-terminal ${origin}`,error:error2}),isRecoverableInspectorVmImportError(error2,origin)){this.showWarning(INSPECTOR_VM_IMPORT_WARNING);return}this.isShuttingDown=!0;try{this.unregisterSignalHandlers()}catch{}try{killTrackedDetachedChildren()}catch{}try{this.pauseQuestionMouseCapture(),this.ui.stop()}catch{}try{appendUncaughtCrashLog(origin,error2)}catch{}restoreInteractiveStderr();let storageMessage=storageWriteCrashMessage(error2);storageMessage!==void 0&&console.error(storageMessage),console.error(`${APP_NAME} exiting due to uncaughtException:`),console.error(error2),process.exit(1)}requestExtensionShutdown(){this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()}async checkShutdownRequested(){this.shutdownRequested&&await this.shutdown()}registerSignalHandlers(){this.unregisterSignalHandlers();let signals=["SIGTERM"];if(process.platform!=="win32"&&signals.push("SIGHUP"),process.platform!=="win32"){let resizeHandler=()=>{this.runtimeHost?.setClientInfo?.(this.ui.terminal.columns)};process.on("SIGWINCH",resizeHandler),this.signalCleanupHandlers.push(()=>process.off("SIGWINCH",resizeHandler))}for(let signal of signals){let handler=()=>{killTrackedDetachedChildren(),this.shutdown({fromSignal:!0})};process.prependListener(signal,handler),this.signalCleanupHandlers.push(()=>process.off(signal,handler))}let terminalErrorHandler=error2=>{throw isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:"dead-terminal stdio error",error:error2}),error2};process.stdout.on("error",terminalErrorHandler),process.stderr.on("error",terminalErrorHandler),this.signalCleanupHandlers.push(()=>process.stdout.off("error",terminalErrorHandler)),this.signalCleanupHandlers.push(()=>process.stderr.off("error",terminalErrorHandler));let uncaughtExceptionHandler=(error2,origin)=>this.uncaughtCrash(error2,origin);process.prependListener("uncaughtException",uncaughtExceptionHandler),this.signalCleanupHandlers.push(()=>process.off("uncaughtException",uncaughtExceptionHandler)),consumeEarlyInspectorVmImportRecoveries()>0&&this.showWarning(INSPECTOR_VM_IMPORT_WARNING)}unregisterSignalHandlers(){for(let cleanup of this.signalCleanupHandlers)cleanup();this.signalCleanupHandlers=[]}handleCtrlZ(){if(process.platform==="win32"){this.showStatus("Suspend to background is not supported on Windows");return}let suspendKeepAlive=setInterval(()=>{},2**30),ignoreSigint=()=>{};process.on("SIGINT",ignoreSigint),process.once("SIGCONT",()=>{clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)});try{restoreInteractiveStderr(),this.pauseQuestionMouseCapture(),this.ui.stop(),process.kill(0,"SIGTSTP")}catch(error2){throw clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),error2}}async handleFollowUp(){this.setComposerReply();let text2=this.getExpandedEditorText().trim();if(!text2)return;if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"followUp");return}let images=this.takeSubmissionImages(text2);if(this.session.isStreaming){if(this.editor.addToHistory?.(text2),this.editor.setText(""),this.isExtensionCommand(text2)){await this.session.prompt(text2);return}let pendingEchoId=this.beginUserEcho(text2,images);try{await this.session.prompt(text2,{streamingBehavior:"followUp",...images.length>0?{images}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender()}else this.editor.onSubmit&&(this.preResolvedSubmissionImages=images.length>0?images:void 0,this.editor.setText(""),this.editor.onSubmit(text2))}handleDequeue(){let restored=this.restoreQueuedMessagesToEditor();restored===0?this.showStatus("No queued messages to restore"):this.showStatus(`Restored ${restored} queued message${restored>1?"s":""} to editor`)}updateEditorBorderColor(){if(this.chrome)this.editor.borderColor=this.chrome.getEditorBorderColor({isBashMode:this.isBashMode,thinkingLevel:this.session.thinkingLevel||"off"});else if(this.isBashMode)this.editor.borderColor=theme.getBashModeBorderColor();else{let level=this.session.thinkingLevel||"off";this.editor.borderColor=theme.getThinkingBorderColor(level)}this.activeStatusIndicator?.invalidate(),this.ui.requestRender()}async cycleThinkingLevel(){await this.session.cycleThinkingLevel()===void 0&&this.showStatus("Current model does not support thinking")}async cycleModel(direction){try{let result3=await this.session.cycleModel(direction);if(result3===void 0){let msg=this.session.favoriteModels.length>0?buildFavoriteCycleStatusMessage("single"):buildFavoriteCycleStatusMessage("empty");this.showStatus(msg)}else{if((result3.skippedModels?.length??0)>0&&modelsAreEqual(result3.model,this.session.model)){this.showStatus("No favorite model can fit the current context. Compact the session or start a new one.");return}this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.updateEditorBorderColor();let thinkingStr=result3.model.reasoning&&result3.thinkingLevel!=="off"?` (thinking: ${result3.thinkingLevel})`:"",systemPromptStr=result3.systemPromptChange?.systemPromptName?`, optimized system prompt applied: ${result3.systemPromptChange.systemPromptName}`:"";this.showStatus(`Switched to ${result3.model.name||result3.model.id}${thinkingStr}${systemPromptStr}`),this.showRiskyMainModelWarning(result3.model),this.maybeWarnAboutAnthropicSubscriptionAuth(result3.model)}}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}toggleToolOutputExpansion(){this.setToolsExpanded(!this.toolOutputExpanded)}setToolsExpanded(expanded){if(expanded===this.toolOutputExpanded)return;this.toolOutputExpanded=expanded;let activeHeader=this.customHeader??this.builtInHeader;isExpandable(activeHeader)&&activeHeader.setExpanded(expanded);for(let container of[this.loadedResourcesContainer,this.chatContainer])for(let child of container.children)isExpandable(child)&&child.setExpanded(expanded);this.showStatus(`Tool output: ${expanded?"expanded":"collapsed"}`)}toggleThinkingBlockVisibility(){this.hideThinkingBlock=!this.hideThinkingBlock,this.settingsManager.setHideThinkingBlock(this.hideThinkingBlock),this.rebuildChatFromMessages&&(this.chatContainer.clear(),this.rebuildChatFromMessages()),this.streamingComponent&&this.streamingMessage&&(this.streamingComponent.setHideThinkingBlock(this.hideThinkingBlock),this.streamingReveal.resyncVisibility(),this.chatContainer.addChild(this.streamingComponent)),this.showStatus(`Thinking blocks: ${this.hideThinkingBlock?"hidden":"visible"}`)}async handleOpenExternalEditor(){let editorCmd=this.settingsManager.getExternalEditorCommand(),content=this.getExpandedEditorText();this.pauseQuestionMouseCapture(),this.ui.stop(),restoreInteractiveStderr();try{let result3=await editInExternalEditor({command:editorCmd,content});result3.status==="complete"&&this.editor.setText(result3.content)}finally{takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)}}clearEditor(){this.editor.setText(""),this.ui.requestRender()}showError(errorMessage8){if(isNetworkProviderError(errorMessage8,!0)){this.getProviderErrors().record(errorMessage8,this.toolOutputExpanded),this.ui.requestRender();return}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",`Error: ${sanitizeTuiErrorMessage(errorMessage8)}`),1,0)),this.ui.requestRender()}getProviderErrors(){return this.providerErrors??=new ProviderErrorPresentation(this.chatContainer),this.providerErrors}showNoticeBox(spec){let sanitized={...spec,title:sanitizeTuiErrorMessage(spec.title),why:sanitizeTuiErrorMessage(spec.why),...spec.extra===void 0?{}:{extra:spec.extra.map(line=>({...line,text:sanitizeTuiErrorMessage(line.text)}))},...spec.expandedLine===void 0?{}:{expandedLine:sanitizeTuiErrorMessage(spec.expandedLine)}};this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(buildNoticeBox(sanitized,{expanded:this.toolOutputExpanded},theme)),this.ui.requestRender()}showWarning(warningMessage){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Warning: ${warningMessage}`),1,0)),this.ui.requestRender()}showNewVersionNotification(newVersion){let action=BRAND?.update?.command??`${APP_NAME} update`,changelogUrl=getReleaseChangelogUrl(newVersion),changelogLink=getCapabilities().hyperlinks?hyperlink(changelogUrl,changelogUrl):changelogUrl;this.showNoticeBox({title:"Update Available",tone:"warning",why:`New version ${newVersion} is available.`,extra:[{text:action},{text:`Changelog: ${changelogLink}`,tone:"accent"}]})}showRiskyMainModelWarning(model){!model||!isRiskyMainModel(model)||this.showNoticeBox({title:"Risky model warning",tone:"error",why:RISKY_MAIN_MODEL_WARNING})}showSettingsSourceSelected(event){this.showStatus(`Settings: ${path12.basename(event.path)} (${event.format.toUpperCase()})`)}showHighReasoningWarning(event){let{title,body}=buildHighReasoningWarning({id:event.modelId,provider:event.provider},event.thinkingLevel);this.showNoticeBox({title,tone:"error",why:body[0]??"High reasoning may affect reliability or cost.",extra:body.slice(1).map(text2=>({text:text2,tone:"error"}))})}showPackageUpdateNotification(packages){this.showNoticeBox({title:"Package Updates Available",tone:"warning",why:`Package updates are available. Run ${APP_NAME} update --extensions`,extra:[{text:"Packages:",tone:"dim"},...packages.map(pkg=>({text:`- ${pkg}`,tone:"dim"}))]})}getAllQueuedMessages(){return{steering:[...this.session.getSteeringMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text)],followUp:[...this.session.getFollowUpMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text)]}}clearAllQueues(options={abortWillFollow:!1}){let clearedNative=this.session.clearQueue(options),{steering,followUp}=clearedNative,nativeMessages=clearedNative.ordered??[...steering.map((text2,enqueueOrder)=>({text:text2,mode:"steer",enqueueOrder})),...followUp.map((text2,index)=>({text:text2,mode:"followUp",enqueueOrder:steering.length+index}))],compactionMessages=[...this.compactionInFlightMessages,...this.compactionQueuedMessages],compactionSteering=compactionMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),compactionFollowUp=compactionMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text);for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.compactionQueuedMessages=[];for(let message of compactionMessages)message.pendingEchoId&&this.optimisticUserEchoes?.remove(message.pendingEchoId);let fallbackOrder=nativeMessages.reduce((maximum,message)=>Math.max(maximum,message.enqueueOrder),0),ordered=[...nativeMessages,...compactionMessages.map((message,index)=>({...message,enqueueOrder:message.enqueueOrder??fallbackOrder+index+1}))].sort((a,b)=>a.enqueueOrder-b.enqueueOrder),cleared={steering:[...steering,...compactionSteering],followUp:[...followUp,...compactionFollowUp]};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}updatePendingMessagesDisplay(){this.pendingMessagesContainer.clear();let{steering:steeringMessages,followUp:followUpMessages}=this.getAllQueuedMessages();if(steeringMessages.length>0||followUpMessages.length>0){this.pendingMessagesContainer.addChild(new Spacer(1));for(let message of steeringMessages){let text2=theme.fg("dim",`Steering: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}for(let message of followUpMessages){let text2=theme.fg("dim",`Follow-up: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}let dequeueHint=this.getAppKeyDisplay("app.message.dequeue"),hintText=theme.fg("dim",`\u21B3 ${dequeueHint} to edit all queued messages`);this.pendingMessagesContainer.addChild(new TruncatedText(hintText,1,0))}}restoreQueuedMessagesToEditor(options){let{steering,followUp,ordered}=this.clearAllQueues({abortWillFollow:options?.abort===!0}),allQueued=ordered?.map(message=>message.text)??[...steering,...followUp];if(allQueued.length===0)return this.updatePendingMessagesDisplay(),options?.abort&&this.session.abort(),0;let queuedText=allQueued.join(`
|
|
2486
2490
|
|
|
2487
2491
|
`),currentText=options?.currentText??this.editor.getText(),combinedText=[queuedText,currentText].filter(t=>t.trim()).join(`
|