@code-yeongyu/senpi 2026.9.29-5 → 2026.9.30

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.
Files changed (140) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/bundle/chunks/{anthropic-messages-HEVKB3PL.js → anthropic-messages-ADSIWAJ5.js} +1 -1
  3. package/dist/bundle/chunks/{app-server-command-32AFWZEH.js → app-server-command-B3ZYM2WN.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-2WAKOPNA.js → chunk-4P4DUW66.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-7RVWDN5Z.js → chunk-6GV3L3GZ.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-OUG6SDT7.js → chunk-6JZQLUAJ.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-MJQWYN2W.js → chunk-7MKMDWHC.js} +2 -2
  8. package/dist/bundle/chunks/{chunk-XBGO2JZD.js → chunk-A7AQSA6R.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-BJICJY47.js → chunk-DVVROXLZ.js} +1 -1
  10. package/dist/bundle/chunks/chunk-EIG6K5U3.js +6 -0
  11. package/dist/bundle/chunks/chunk-FAWC2EIR.js +2 -0
  12. package/dist/bundle/chunks/{chunk-WCAKUCN3.js → chunk-FNCILR4E.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-XHEMQA2T.js → chunk-HPESFBMB.js} +2 -2
  14. package/dist/bundle/chunks/{chunk-BBNWT72C.js → chunk-HVBFDRP4.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-63QHOG5A.js → chunk-I77ENHCQ.js} +81 -74
  16. package/dist/bundle/chunks/{chunk-UMLU3I2G.js → chunk-ITXF6FAM.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-77AUUH3Z.js → chunk-IXONH7ML.js} +2 -2
  18. package/dist/bundle/chunks/{chunk-K2SHQNAA.js → chunk-JX2CSKLG.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-4VWWEMCJ.js → chunk-JXZ5LDJP.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-VLTMFAWQ.js → chunk-KWI3KUF2.js} +1 -1
  21. package/dist/bundle/chunks/{chunk-7CQX3QFV.js → chunk-L4QGZJKQ.js} +1 -1
  22. package/dist/bundle/chunks/{chunk-AGVPQLIU.js → chunk-MDXUQDGF.js} +1 -1
  23. package/dist/bundle/chunks/{chunk-2N3BZ5DV.js → chunk-OOA6OL42.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-2POUJCWM.js → chunk-OVGH7VP3.js} +1 -1
  25. package/dist/bundle/chunks/{chunk-ZDNR3YVJ.js → chunk-RMVQ5YRX.js} +1 -1
  26. package/dist/bundle/chunks/{chunk-SH6VUPE4.js → chunk-T5MOQDGL.js} +1 -1
  27. package/dist/bundle/chunks/{chunk-CNYWF72S.js → chunk-VKECIIYV.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-U7BNOE23.js → chunk-VNYUGCC7.js} +1 -1
  29. package/dist/bundle/chunks/{chunk-ZPMJIPQC.js → chunk-YSNNL5HU.js} +1 -1
  30. package/dist/bundle/chunks/cli-main-F6WNYPUT.js +3 -0
  31. package/dist/bundle/chunks/{help-fast-path-ZUNFOE53.js → help-fast-path-34Z6I2PH.js} +1 -1
  32. package/dist/bundle/chunks/{host-command-V2LDNNXB.js → host-command-PUOIPEBI.js} +1 -1
  33. package/dist/bundle/chunks/{host-lifecycle-PFLJRXEN.js → host-lifecycle-4VJUHV5U.js} +1 -1
  34. package/dist/bundle/chunks/host-lifecycle.js +1 -1
  35. package/dist/bundle/chunks/{interactive-mode-J6KGDRR7.js → interactive-mode-KM454JPC.js} +1 -1
  36. package/dist/bundle/chunks/{list-tips-ASETMEFS.js → list-tips-GWRRD5UC.js} +1 -1
  37. package/dist/bundle/chunks/{multi-session-host-IBVJ3WN7.js → multi-session-host-ZFT6RM2S.js} +2 -2
  38. package/dist/bundle/chunks/{native-loader-WM7NDPEO.js → native-loader-HW7GQYPY.js} +1 -1
  39. package/dist/bundle/chunks/{openai-completions-SA2UJW7Q.js → openai-completions-32RTG3Q4.js} +1 -1
  40. package/dist/bundle/chunks/{package-manager-cli-JJ5R7UWV.js → package-manager-cli-LNQOWI3A.js} +1 -1
  41. package/dist/bundle/chunks/{rg-engine-G2YTYL2T.js → rg-engine-LWZA7TRH.js} +1 -1
  42. package/dist/bundle/chunks/{rotation-stream-EX7PWQ4S.js → rotation-stream-DIKK7U57.js} +1 -1
  43. package/dist/bundle/chunks/{rpc-mode-ITND2BVC.js → rpc-mode-H7QGQI4P.js} +1 -1
  44. package/dist/bundle/chunks/{schedule-command-D6JNRP3D.js → schedule-command-BUFJOM5L.js} +1 -1
  45. package/dist/bundle/chunks/session-control-endpoint-QIIA6MFR.js +3 -0
  46. package/dist/bundle/chunks/{session-picker-K5FIKV6C.js → session-picker-P53MTWTS.js} +1 -1
  47. package/dist/bundle/chunks/session-worker.js +110 -103
  48. package/dist/bundle/chunks/{state-store-IIQL55GC.js → state-store-QGLITAI4.js} +1 -1
  49. package/dist/bundle/cli.js +2 -2
  50. package/dist/bundle/index.js +1 -1
  51. package/dist/bundle/rpc-entry.js +1 -1
  52. package/dist/bundle/runtime-manifest.json +1 -1
  53. package/dist/cli.js +1 -1
  54. package/dist/core/dynamic-prompt/build.d.ts +4 -3
  55. package/dist/core/dynamic-prompt/build.js +4 -2
  56. package/dist/core/dynamic-prompt/handoff.d.ts +9 -1
  57. package/dist/core/dynamic-prompt/handoff.js +11 -1
  58. package/dist/core/dynamic-prompt/intent-gate.js +1 -1
  59. package/dist/core/dynamic-prompt/style.js +4 -2
  60. package/dist/core/dynamic-prompt/types.d.ts +7 -1
  61. package/dist/core/dynamic-prompt/types.js +3 -1
  62. package/dist/core/dynamic-prompt/verification.d.ts +1 -1
  63. package/dist/core/dynamic-prompt/verification.js +2 -1
  64. package/dist/core/extensions/builtin/anthropic-subscription/stream-protocol.d.ts +1 -1
  65. package/dist/core/extensions/builtin/anthropic-subscription/tools.d.ts +9 -2
  66. package/dist/core/extensions/builtin/anthropic-subscription/tools.js +9 -4
  67. package/dist/core/extensions/builtin/ask-user/resume.js +20 -9
  68. package/dist/core/extensions/builtin/ask-user/tool.d.ts +9 -0
  69. package/dist/core/extensions/builtin/ask-user/tool.js +1 -1
  70. package/dist/core/extensions/builtin/cache-keepalive/index.js +17 -4
  71. package/dist/core/extensions/builtin/chat-reply-scrub/index.d.ts +16 -0
  72. package/dist/core/extensions/builtin/chat-reply-scrub/index.js +39 -0
  73. package/dist/core/extensions/builtin/chat-reply-scrub/scaffold-strip.d.ts +7 -0
  74. package/dist/core/extensions/builtin/chat-reply-scrub/scaffold-strip.js +125 -0
  75. package/dist/core/extensions/builtin/index.js +3 -0
  76. package/dist/core/extensions/builtin/permission-system/cli.js +1 -0
  77. package/dist/core/extensions/builtin/permission-system/config.d.ts +1 -0
  78. package/dist/core/extensions/builtin/permission-system/config.js +10 -0
  79. package/dist/core/extensions/builtin/permission-system/index.js +2 -2
  80. package/dist/core/extensions/builtin/permission-system/settings.js +1 -1
  81. package/dist/core/extensions/builtin/permission-system/types.d.ts +1 -1
  82. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +5 -5
  83. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +6 -6
  84. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5-5.js +4 -4
  85. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +4 -4
  86. package/dist/core/extensions/builtin/prompt-preset/claude-sonnet-5-5.js +4 -4
  87. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +9 -6
  88. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +10 -7
  89. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +15 -6
  90. package/dist/core/extensions/builtin/prompt-preset/gpt-surface.d.ts +2 -2
  91. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +4 -4
  92. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +4 -4
  93. package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js +3 -3
  94. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +1 -1
  95. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.js +1 -1
  96. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +6 -6
  97. package/dist/core/extensions/builtin/recommended-models/index.d.ts +1 -1
  98. package/dist/core/extensions/builtin/recommended-models/index.js +1 -1
  99. package/dist/core/extensions/builtin/todotools/first-turn.d.ts +6 -4
  100. package/dist/core/extensions/builtin/todotools/first-turn.js +17 -5
  101. package/dist/core/extensions/builtin/todotools/todo-ask.d.ts +1 -0
  102. package/dist/core/extensions/builtin/todotools/todo-ask.js +1 -1
  103. package/dist/core/extensions/builtin/todotools/tools/todo.js +4 -1
  104. package/dist/core/resource-loader.js +7 -3
  105. package/dist/modes/interactive/components/ask-user-async-widget.d.ts +2 -0
  106. package/dist/modes/interactive/components/ask-user-async-widget.js +10 -0
  107. package/dist/modes/interactive/components/ask-user-question-state.js +3 -1
  108. package/dist/modes/interactive/interactive-mode.js +7 -1
  109. package/dist/modes/interactive/session-control-commands.d.ts +2 -1
  110. package/dist/modes/interactive/session-control-commands.js +15 -6
  111. package/dist/modes/rpc/connection-question-bridge.js +5 -5
  112. package/dist/modes/rpc/custom-capability.d.ts +6 -0
  113. package/dist/modes/rpc/custom-capability.js +6 -0
  114. package/dist/modes/rpc/extension-ui-response.d.ts +11 -0
  115. package/dist/modes/rpc/extension-ui-response.js +18 -0
  116. package/dist/modes/rpc/host-lifecycle.d.ts +5 -2
  117. package/dist/modes/rpc/host-lifecycle.js +14 -8
  118. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  119. package/dist/modes/rpc/rpc-input-validation.d.ts +1 -1
  120. package/dist/modes/rpc/rpc-input-validation.js +3 -3
  121. package/dist/modes/rpc/rpc-mode.d.ts +3 -2
  122. package/dist/modes/rpc/rpc-mode.js +3 -2
  123. package/dist/modes/rpc/rpc-types.d.ts +4 -3
  124. package/dist/modes/rpc/session-command-router.js +4 -1
  125. package/dist/runtime-snapshot/enter.d.ts +1 -1
  126. package/dist/runtime-snapshot/enter.js +17 -7
  127. package/dist/runtime-snapshot/file-copier.d.ts +24 -0
  128. package/dist/runtime-snapshot/file-copier.js +76 -0
  129. package/dist/runtime-snapshot/layout.d.ts +8 -4
  130. package/dist/runtime-snapshot/layout.js +137 -70
  131. package/dist/runtime-snapshot/registry.d.ts +7 -0
  132. package/dist/runtime-snapshot/registry.js +63 -1
  133. package/dist/senpi +1 -1
  134. package/docs/providers.md +1 -1
  135. package/docs/rpc.md +34 -11
  136. package/package.json +6 -6
  137. package/dist/bundle/chunks/chunk-AWEAVBCR.js +0 -2
  138. package/dist/bundle/chunks/chunk-YLQTKWEC.js +0 -6
  139. package/dist/bundle/chunks/cli-main-ZPMYM3A3.js +0 -3
  140. package/dist/bundle/chunks/session-control-endpoint-UJJGG4WI.js +0 -3
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-K2SHQNAA.js";import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-ZPMJIPQC.js";import{TIP_DEFINITIONS}from"./chunk-2POUJCWM.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-VLTMFAWQ.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,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-NZRVAZL2.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-YLQTKWEC.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,formatHttpIdleTimeoutMs,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,redactSensitiveOutput,redactSensitiveTokenValues,require_undici,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-ZDNR3YVJ.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-HEKLJWA4.js";import{createFsWatchEventSource}from"./chunk-XHEMQA2T.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-2N3BZ5DV.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-CNYWF72S.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-AWEAVBCR.js";import{recordProcessLifetime}from"./chunk-MJQWYN2W.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-UMLU3I2G.js";import{attachJsonlLineReader,compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom,serializeJsonLine}from"./chunk-AGVPQLIU.js";import{createRgEngine,ensureTool}from"./chunk-XBGO2JZD.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-U7BNOE23.js";import{discoverEnvSlots}from"./chunk-2WAKOPNA.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-SH6VUPE4.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-BBNWT72C.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-OUG6SDT7.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-7CQX3QFV.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-77AUUH3Z.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-VLW22GHJ.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-4VWWEMCJ.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-WCAKUCN3.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-BJICJY47.js";import{hasRefusedForcedToolChoice}from"./chunk-LHYG7TK7.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,describeProviderFailureForUser,estimateContextTokens,getSupportedThinkingLevels,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-Z2N5372Y.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 constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let 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,open9=tokens[token.tokensIndex];open9.type="text",open9.value=literal,open9.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+open9.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 open9={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open9),push(open9);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}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create2(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create2(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(),constants11=require_constants(),isObject5=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=isObject5(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):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 regex2=picomatch4.toRegex(source,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=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=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID14}from"node:crypto";import{existsSync as existsSync50,mkdirSync as mkdirSync29,readFileSync as readFileSync48,writeFileSync as writeFileSync26}from"node:fs";import{rm as rm13}from"node:fs/promises";import{dirname as dirname49}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let 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})}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}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(resolve44=>{let abortHandler=()=>resolve44(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((resolve44,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(()=>resolve44(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(resolve44=>{signal.addEventListener("abort",()=>resolve44(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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic: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,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.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._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),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(resolve44=>{resolvePromise=resolve44});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve44,reject)=>{resolveCompletion=resolve44,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{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-JX2CSKLG.js";import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-YSNNL5HU.js";import{TIP_DEFINITIONS}from"./chunk-OVGH7VP3.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-KWI3KUF2.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,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-NZRVAZL2.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-EIG6K5U3.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,formatHttpIdleTimeoutMs,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,redactSensitiveOutput,redactSensitiveTokenValues,require_undici,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-RMVQ5YRX.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-HEKLJWA4.js";import{createFsWatchEventSource}from"./chunk-HPESFBMB.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-OOA6OL42.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-VKECIIYV.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-FAWC2EIR.js";import{recordProcessLifetime}from"./chunk-7MKMDWHC.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-ITXF6FAM.js";import{attachJsonlLineReader,compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom,serializeJsonLine}from"./chunk-MDXUQDGF.js";import{createRgEngine,ensureTool}from"./chunk-A7AQSA6R.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-VNYUGCC7.js";import{discoverEnvSlots}from"./chunk-4P4DUW66.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-T5MOQDGL.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-HVBFDRP4.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6JZQLUAJ.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-L4QGZJKQ.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-IXONH7ML.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-VLW22GHJ.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-JXZ5LDJP.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-FNCILR4E.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-DVVROXLZ.js";import{hasRefusedForcedToolChoice}from"./chunk-LHYG7TK7.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,describeProviderFailureForUser,estimateContextTokens,getSupportedThinkingLevels,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-Z2N5372Y.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 constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let 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,open9=tokens[token.tokensIndex];open9.type="text",open9.value=literal,open9.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+open9.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 open9={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open9),push(open9);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}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create2(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create2(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(),constants11=require_constants(),isObject5=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=isObject5(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):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 regex2=picomatch4.toRegex(source,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=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=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID14}from"node:crypto";import{existsSync as existsSync50,mkdirSync as mkdirSync29,readFileSync as readFileSync48,writeFileSync as writeFileSync26}from"node:fs";import{rm as rm13}from"node:fs/promises";import{dirname as dirname49}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let 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})}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}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(resolve44=>{let abortHandler=()=>resolve44(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((resolve44,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(()=>resolve44(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(resolve44=>{signal.addEventListener("abort",()=>resolve44(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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic: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,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.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._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),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(resolve44=>{resolvePromise=resolve44});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve44,reject)=>{resolveCompletion=resolve44,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=`
@@ -639,7 +639,9 @@ ${instructions}`}],timestamp:Date.now()}],maxTokens=Math.min(4096,model.maxToken
639
639
  ...[truncated]`,CHARS_PER_TOKEN=4;function cursorAdmissionBudgetBytes(contextWindowTokens){return!Number.isFinite(contextWindowTokens)||contextWindowTokens<=0?0:Math.floor(contextWindowTokens)*CHARS_PER_TOKEN}function capToolResultBodies(messages,maxChars){let segmenter2=new Intl.Segmenter(void 0,{granularity:"grapheme"}),markerChars=[...segmenter2.segment(CURSOR_TRUNCATION_MARKER)].length,result3=messages.slice(),changed=!1;for(let messageIndex=result3.length-1;messageIndex>=0;messageIndex--){let message=result3[messageIndex];if(message.role!=="toolResult"||!Array.isArray(message.content))continue;let content=message.content;for(let partIndex=content.length-1;partIndex>=0;partIndex--){let part=content[partIndex];if(part.type==="image"&&typeof part.data=="string"||part.type!=="text"||typeof part.text!="string")continue;let graphemes=[...segmenter2.segment(part.text)].map(item=>item.segment);if(graphemes.length<=maxChars)continue;let kept=graphemes.slice(0,Math.max(0,maxChars-markerChars)).join("");content=content===message.content?content.slice():content,content[partIndex]={...part,text:kept+CURSOR_TRUNCATION_MARKER},result3[messageIndex]={...message,content},changed=!0}}return{messages:result3,changed}}function emptyToolResult(message){if(message.role!=="toolResult"||!Array.isArray(message.content))return message;let emptiedContent=message.content.map(part=>part.type==="text"?{...part,text:""}:part.type==="image"?{...part,data:""}:part),content=emptiedContent.filter((part,index)=>{if(index===0)return!0;let previous=emptiedContent[index-1],empty=part.type==="text"?part.text==="":part.type==="image"&&part.data==="",previousEmpty=previous.type==="text"?previous.text==="":previous.type==="image"&&previous.data==="";return!empty||!previousEmpty});return{...message,content}}function blankOldestToolResults(messages,fits2){let toolResultIndexes=messages.flatMap((message,index)=>message.role==="toolResult"&&Array.isArray(message.content)?[index]:[]),withEmptyPrefix=count2=>{let candidate=messages.slice();for(let i=0;i<count2;i++)candidate[toolResultIndexes[i]]=emptyToolResult(candidate[toolResultIndexes[i]]);return candidate},low=0,high=toolResultIndexes.length;for(;low<high;){let middle=Math.floor((low+high)/2);fits2(withEmptyPrefix(middle+1))?high=middle:low=middle+1}let count=Math.min(low+1,toolResultIndexes.length);return{messages:count>0?withEmptyPrefix(count):messages,count}}function admitCursorHistory(request2){let{messages,budgetBytes}=request2;if(!Array.isArray(messages)||messages.length===0)return{messages,changed:!1,blankedToolResults:0,bytesBefore:0,bytesAfter:0,overBudget:!1};let convert=request2.convert??(candidate=>convertToLlm2(candidate)),capped=capToolResultBodies(messages,request2.maxChars??CURSOR_TOOL_RESULT_MAX_CHARS),measure=candidate=>{let converted=convert(candidate),activeUserMessageIndex=converted.at(-1)?.role==="user"?converted.length-1:-1;return measureCursorModelInputSerializedBytes(converted,activeUserMessageIndex)},bytesBefore=measure(capped.messages);if(bytesBefore<=budgetBytes)return{messages:capped.changed?capped.messages:messages,changed:capped.changed,blankedToolResults:0,bytesBefore,bytesAfter:bytesBefore,overBudget:!1};let blanked=blankOldestToolResults(capped.messages,candidate=>measure(candidate)<=budgetBytes),bytesAfter=blanked.count>0?measure(blanked.messages):bytesBefore,changed=capped.changed||blanked.count>0;return{messages:changed?blanked.messages:messages,changed,blankedToolResults:blanked.count,bytesBefore,bytesAfter,overBudget:bytesAfter>budgetBytes}}var DEFAULT_THINKING_LEVEL="medium";import{basename as basename3,dirname as dirname4,resolve as resolve4,sep}from"node:path";function getExtensionSourceLabel(extensionPath){return extensionPath.startsWith("<")?`extension:${extensionPath.replace(/[<>]/g,"")}`:`extension:${basename3(extensionPath).replace(/\.(ts|js)$/,"")}`}function resolveDiscoveredResourcePaths(entries,extensions){let contributors=new Map(extensions.map(extension=>[extension.path,extension]));return entries.map(entry=>{let contributor=contributors.get(entry.extensionPath),scope=entry.scope??(contributor!==void 0&&inheritsSystemScope(contributor,entry.path)?"system":"temporary");return{path:entry.path,metadata:{source:getExtensionSourceLabel(entry.extensionPath),scope,origin:"top-level",baseDir:entry.extensionPath.startsWith("<")?void 0:dirname4(entry.extensionPath)}}})}function inheritsSystemScope(contributor,resourcePath){if(contributor.sourceInfo.scope!=="system")return!1;if(contributor.path.startsWith("<builtin:"))return!0;let packageRoot=contributor.sourceInfo.baseDir;return packageRoot!==void 0&&isUnderPath(resolve4(resourcePath),resolve4(packageRoot))}function isUnderPath(target,root){if(target===root)return!0;let prefix=root.endsWith(sep)?root:`${root}${sep}`;return target.startsWith(prefix)}var import_ignore2=__toESM(require_ignore(),1);import{existsSync as existsSync4,readdirSync as readdirSync2,readFileSync as readFileSync4,statSync as statSync3}from"fs";import{basename as basename4,dirname as dirname5,join as join9,relative,resolve as resolve5,sep as sep2}from"path";function createSourceInfo(path13,metadata){return{path:path13,source:metadata.source,scope:metadata.scope,origin:metadata.origin,baseDir:metadata.baseDir}}function createSyntheticSourceInfo(path13,options){return{path:path13,source:options.source,scope:options.scope??"temporary",origin:options.origin??"top-level",baseDir:options.baseDir}}var MAX_NAME_LENGTH2=64,MAX_DESCRIPTION_LENGTH2=1024,IGNORE_FILE_NAMES2=[".gitignore",".ignore",".fdignore"];function toPosixPath(p){return p.split(sep2).join("/")}function prefixIgnorePattern2(line,prefix){let trimmed=line.trim();if(!trimmed||trimmed.startsWith("#")&&!trimmed.startsWith("\\#"))return null;let pattern=line,negated=!1;pattern.startsWith("!")?(negated=!0,pattern=pattern.slice(1)):pattern.startsWith("\\!")&&(pattern=pattern.slice(1)),pattern.startsWith("/")&&(pattern=pattern.slice(1));let prefixed=prefix?`${prefix}${pattern}`:pattern;return negated?`!${prefixed}`:prefixed}function addIgnoreRules2(ig,dir,rootDir){let relativeDir=relative(rootDir,dir),prefix=relativeDir?`${toPosixPath(relativeDir)}/`:"";for(let filename of IGNORE_FILE_NAMES2){let ignorePath=join9(dir,filename);if(existsSync4(ignorePath))try{let patterns=readFileSync4(ignorePath,"utf-8").split(/\r?\n/).map(line=>prefixIgnorePattern2(line,prefix)).filter(line=>!!line);patterns.length>0&&ig.add(patterns)}catch{}}}function validateName2(name){let errors=[];return name.length>MAX_NAME_LENGTH2&&errors.push(`name exceeds ${MAX_NAME_LENGTH2} characters (${name.length})`),/^[a-z0-9-]+$/.test(name)||errors.push("name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)"),(name.startsWith("-")||name.endsWith("-"))&&errors.push("name must not start or end with a hyphen"),name.includes("--")&&errors.push("name must not contain consecutive hyphens"),errors}function validateDescription2(description){let errors=[];return typeof description!="string"||description.trim()===""?errors.push("description is required"):description.length>MAX_DESCRIPTION_LENGTH2&&errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH2} characters (${description.length})`),errors}function createSkillSourceInfo(filePath,baseDir,source){switch(source){case"user":return createSyntheticSourceInfo(filePath,{source:"local",scope:"user",baseDir});case"project":return createSyntheticSourceInfo(filePath,{source:"local",scope:"project",baseDir});case"path":return createSyntheticSourceInfo(filePath,{source:"local",baseDir});default:return createSyntheticSourceInfo(filePath,{source,baseDir})}}function loadSkillsFromDir(options){let{dir,source}=options;return loadSkillsFromDirInternal2(dir,source,!0)}function loadSkillsFromDirInternal2(dir,source,includeRootFiles,ignoreMatcher,rootDir){let skills=[],diagnostics=[];if(!existsSync4(dir))return{skills,diagnostics};let root=rootDir??dir,ig=ignoreMatcher??(0,import_ignore2.default)();addIgnoreRules2(ig,dir,root);try{let entries=readdirSync2(dir,{withFileTypes:!0});for(let entry of entries){if(entry.name!=="SKILL.md")continue;let fullPath=join9(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync3(fullPath).isFile()}catch{continue}let relPath=toPosixPath(relative(root,fullPath));if(!isFile||ig.ignores(relPath))continue;let result3=loadSkillFromFile2(fullPath,source);return result3.skill&&skills.push(result3.skill),diagnostics.push(...result3.diagnostics),{skills,diagnostics}}for(let entry of entries){if(shouldSkipSkillWalkDirectoryName(entry.name))continue;let fullPath=join9(dir,entry.name),isDirectory2=entry.isDirectory(),isFile=entry.isFile();if(entry.isSymbolicLink())try{let stats=statSync3(fullPath);isDirectory2=stats.isDirectory(),isFile=stats.isFile()}catch{continue}let relPath=toPosixPath(relative(root,fullPath)),ignorePath=isDirectory2?`${relPath}/`:relPath;if(ig.ignores(ignorePath))continue;if(isDirectory2){let subResult=loadSkillsFromDirInternal2(fullPath,source,!1,ig,root);skills.push(...subResult.skills),diagnostics.push(...subResult.diagnostics);continue}if(!isFile||!includeRootFiles||!entry.name.endsWith(".md"))continue;let result3=loadSkillFromFile2(fullPath,source);result3.skill&&skills.push(result3.skill),diagnostics.push(...result3.diagnostics)}}catch{}return{skills,diagnostics}}function loadSkillFromFile2(filePath,source){let diagnostics=[],isDeclaredSkill=basename4(filePath)==="SKILL.md",rawContent;try{rawContent=readSkillMarkdownSource(filePath)}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill file";return diagnostics.push({type:"warning",message,path:filePath}),{skill:null,diagnostics}}let frontmatter;try{({frontmatter}=parseFrontmatter3(rawContent))}catch(error2){if(isDeclaredSkill){let message=error2 instanceof Error?error2.message:"failed to parse skill file";diagnostics.push({type:"warning",message,path:filePath})}return{skill:null,diagnostics}}let description=frontmatter.description,hasDescription=typeof description=="string"&&description.trim()!=="";if(!isDeclaredSkill&&!hasDescription)return{skill:null,diagnostics};let skillDir=dirname5(filePath),parentDirName=basename4(skillDir),descErrors=validateDescription2(description);for(let error2 of descErrors)diagnostics.push({type:"warning",message:error2,path:filePath});let name=(typeof frontmatter.name=="string"?frontmatter.name:void 0)||parentDirName,nameErrors=validateName2(name);for(let error2 of nameErrors)diagnostics.push({type:"warning",message:error2,path:filePath});if(!hasDescription)return{skill:null,diagnostics};let argumentHint=frontmatter["argument-hint"];return{skill:{name,description,filePath,baseDir:skillDir,sourceInfo:createSkillSourceInfo(filePath,skillDir,source),disableModelInvocation:frontmatter["disable-model-invocation"]===!0,...typeof argumentHint=="string"&&argumentHint.trim()!==""&&{argumentHint:argumentHint.trim()}},diagnostics}}function formatSkillsForPrompt(skills,fileReadTool="read"){let visibleSkills=skills.filter(s=>!s.disableModelInvocation);if(visibleSkills.length===0)return"";let rootByPath=new Map;for(let skill of visibleSkills){let dir=skill.filePath.split("/").slice(0,-2).join("/");rootByPath.has(dir)||rootByPath.set(dir,`r${rootByPath.size}`)}let lines=[`
640
640
 
641
641
  The following skills provide specialized instructions for specific tasks.`,fileReadTool==="read"?"Use the read tool to load a skill's file whenever its description even loosely matches the task - loading an irrelevant skill costs little; missing a relevant one degrades the work.":"Use bash to load a skill's file whenever its description even loosely matches the task - loading an irrelevant skill costs little; missing a relevant one degrades the work.","When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.","","<skill_roots>"];for(let[dir,alias]of rootByPath)lines.push(` <${alias}>${escapeXml2(dir)}</${alias}>`);lines.push("</skill_roots>","A location's `rN/` prefix expands to the matching root above.","","<available_skills>");for(let skill of visibleSkills){let dir=skill.filePath.split("/").slice(0,-2).join("/"),alias=rootByPath.get(dir),relative21=skill.filePath.startsWith(`${dir}/`)?skill.filePath.slice(dir.length+1):skill.filePath;lines.push(" <skill>"),lines.push(` <name>${escapeXml2(skill.name)}</name>`),lines.push(` <description>${escapeXml2(skill.description)}</description>`),lines.push(` <location>${escapeXml2(`${alias}/${relative21}`)}</location>`),lines.push(" </skill>")}return lines.push("</available_skills>"),lines.join(`
642
- `)}function escapeXml2(str3){return str3.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function loadSkills2(options){let{agentDir,skillPaths,includeDefaults}=options,resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(agentDir??getAgentDir()),skillMap=new Map,realPathSet=new Set,allDiagnostics=[],collisionDiagnostics=[];function addSkills(result3){allDiagnostics.push(...result3.diagnostics);for(let skill of result3.skills){let realPath=canonicalizePath(skill.filePath);if(realPathSet.has(realPath))continue;let existing=skillMap.get(skill.name);existing?collisionDiagnostics.push({type:"collision",message:`name "${skill.name}" collision`,path:skill.filePath,collision:{resourceType:"skill",name:skill.name,winnerPath:existing.filePath,loserPath:skill.filePath}}):(skillMap.set(skill.name,skill),realPathSet.add(realPath))}}includeDefaults&&(addSkills(loadSkillsFromDirInternal2(join9(resolvedAgentDir,"skills"),"user",!0)),addSkills(loadSkillsFromDirInternal2(resolve5(resolvedCwd,CONFIG_DIR_NAME,"skills"),"project",!0)));let userSkillsDir=join9(resolvedAgentDir,"skills"),projectSkillsDir=resolve5(resolvedCwd,CONFIG_DIR_NAME,"skills"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve5(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return target.startsWith(prefix)},getSource=resolvedPath=>{if(!includeDefaults){if(isUnderPath2(resolvedPath,userSkillsDir))return"user";if(isUnderPath2(resolvedPath,projectSkillsDir))return"project"}return"path"};for(let rawPath of skillPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(!existsSync4(resolvedPath)){allDiagnostics.push({type:"warning",message:"skill path does not exist",path:resolvedPath});continue}try{let stats=statSync3(resolvedPath),source=getSource(resolvedPath);if(stats.isDirectory())addSkills(loadSkillsFromDirInternal2(resolvedPath,source,!0));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadSkillFromFile2(resolvedPath,source);result3.skill?addSkills({skills:[result3.skill],diagnostics:result3.diagnostics}):allDiagnostics.push(...result3.diagnostics)}else allDiagnostics.push({type:"warning",message:"skill path is not a markdown file",path:resolvedPath})}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill path";allDiagnostics.push({type:"warning",message,path:resolvedPath})}}return{skills:Array.from(skillMap.values()),diagnostics:[...allDiagnostics,...collisionDiagnostics]}}var HANDOFF_LANGUAGE_RULE="Keep the labels Ask, wanted, For you, Now, and Next exactly as written; write everything else - the routing line, slot contents, todo labels, and the reply itself - in the user's language (the one their instructions name, else the one they write in), with Now and Next repeating the todo labels verbatim.",APP_HANDOFF_LANGUAGE_RULE=HANDOFF_LANGUAGE_RULE.replace("the routing line, ",""),HANDOFF_MOMENTS={terminal:"A handoff is the todo list's creation (in the message that creates it, after the routing line, or the next one), each todo phase change, a blocker or plan change, and the final message; the routing line is not one.",app:"A handoff is the todo list's creation (in the message that creates it or the next one), each todo phase change, a blocker or plan change, and the final message."};function buildHandoffSection(options={}){let nextRule=options.turnEndRuleStatedElsewhere?"The Next you name is executed in this same response with tool calls.":"The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.",betweenRule=options.briefUpdatesBetweenHandoffs?"Between handoffs, a one-line update on what you just found, ending with `Now: [task]. Next: [task].`, helps the user follow along.":"Between handoffs, work without narration.",surface=options.surface??"terminal",languageRule=surface==="app"?APP_HANDOFF_LANGUAGE_RULE:HANDOFF_LANGUAGE_RULE;return`## Handoff
642
+ `)}function escapeXml2(str3){return str3.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function loadSkills2(options){let{agentDir,skillPaths,includeDefaults}=options,resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(agentDir??getAgentDir()),skillMap=new Map,realPathSet=new Set,allDiagnostics=[],collisionDiagnostics=[];function addSkills(result3){allDiagnostics.push(...result3.diagnostics);for(let skill of result3.skills){let realPath=canonicalizePath(skill.filePath);if(realPathSet.has(realPath))continue;let existing=skillMap.get(skill.name);existing?collisionDiagnostics.push({type:"collision",message:`name "${skill.name}" collision`,path:skill.filePath,collision:{resourceType:"skill",name:skill.name,winnerPath:existing.filePath,loserPath:skill.filePath}}):(skillMap.set(skill.name,skill),realPathSet.add(realPath))}}includeDefaults&&(addSkills(loadSkillsFromDirInternal2(join9(resolvedAgentDir,"skills"),"user",!0)),addSkills(loadSkillsFromDirInternal2(resolve5(resolvedCwd,CONFIG_DIR_NAME,"skills"),"project",!0)));let userSkillsDir=join9(resolvedAgentDir,"skills"),projectSkillsDir=resolve5(resolvedCwd,CONFIG_DIR_NAME,"skills"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve5(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return target.startsWith(prefix)},getSource=resolvedPath=>{if(!includeDefaults){if(isUnderPath2(resolvedPath,userSkillsDir))return"user";if(isUnderPath2(resolvedPath,projectSkillsDir))return"project"}return"path"};for(let rawPath of skillPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(!existsSync4(resolvedPath)){allDiagnostics.push({type:"warning",message:"skill path does not exist",path:resolvedPath});continue}try{let stats=statSync3(resolvedPath),source=getSource(resolvedPath);if(stats.isDirectory())addSkills(loadSkillsFromDirInternal2(resolvedPath,source,!0));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadSkillFromFile2(resolvedPath,source);result3.skill?addSkills({skills:[result3.skill],diagnostics:result3.diagnostics}):allDiagnostics.push(...result3.diagnostics)}else allDiagnostics.push({type:"warning",message:"skill path is not a markdown file",path:resolvedPath})}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill path";allDiagnostics.push({type:"warning",message,path:resolvedPath})}}return{skills:Array.from(skillMap.values()),diagnostics:[...allDiagnostics,...collisionDiagnostics]}}var HANDOFF_LANGUAGE_RULE="Keep the labels Ask, wanted, For you, Now, and Next exactly as written; write everything else - the routing line, slot contents, todo labels, and the reply itself - in the user's language (the one their instructions name, else the one they write in), with Now and Next repeating the todo labels verbatim.",APP_HANDOFF_LANGUAGE_RULE=HANDOFF_LANGUAGE_RULE.replace("the routing line, ",""),HANDOFF_MOMENTS={terminal:"A handoff is the todo list's creation (in the message that creates it, after the routing line, or the next one), each todo phase change, a blocker or plan change, and the final message; the routing line is not one.",app:"A handoff is the todo list's creation (in the message that creates it or the next one), each todo phase change, a blocker or plan change, and the final message."},CHAT_REPLY_RULE="Each reply is posted as a chat message to the people in the conversation. Write the answer itself in their language, with no status block, todo labels, or progress ledger; the plan and its progress live in the todo tool only.",CHAT_REPLIES_SECTION=`## Replies
643
+
644
+ ${CHAT_REPLY_RULE}`,CHAT_FINAL_MESSAGE="The final message is the answer itself";function buildHandoffSection(options={}){let surface=options.surface??"terminal";if(surface==="chat")return CHAT_REPLIES_SECTION;let nextRule=options.turnEndRuleStatedElsewhere?"The Next you name is executed in this same response with tool calls.":"The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.",betweenRule=options.briefUpdatesBetweenHandoffs?"Between handoffs, a one-line update on what you just found, ending with `Now: [task]. Next: [task].`, helps the user follow along.":"Between handoffs, work without narration.",languageRule=surface==="app"?APP_HANDOFF_LANGUAGE_RULE:HANDOFF_LANGUAGE_RULE;return`## Handoff
643
645
 
644
646
  ${HANDOFF_MOMENTS[surface]} Before writing one, weigh what the user originally asked for and what they would want to know right now; then state it in one short block:
645
647
 
@@ -653,7 +655,7 @@ Specialized search available this turn: ${triggerTools}. Prefer them for locatin
653
655
 
654
656
  The line keeps your reading transparent; only the user's explicit request commits you to implementation. Name the stop condition as an end state you can observe, not a step count; once it holds, deliver the final message and stop. Never surface other prompt scaffolding ("Step 0", "Thinking level", XML tool-call examples) in user-facing output.`,APP_ROUTING=`Only the user's explicit request commits you to implementation. Before acting, decide the stop condition - an end state you can observe, not a step count; once it holds, deliver the final message and stop. Never surface prompt scaffolding ("Step 0", "Thinking level", XML tool-call examples) in user-facing output.`;function buildIntentGate(config){return`## Intent Gate
655
657
 
656
- ${config.surface==="app"?APP_ROUTING:TERMINAL_ROUTING}
658
+ ${(config.surface??"terminal")==="terminal"?TERMINAL_ROUTING:APP_ROUTING}
657
659
  ${buildKeyTriggers(config.tools)}
658
660
  Route by true intent, not surface form:
659
661
  - Information asks (explain, look into, investigate): read the code, report the answer or findings - no edits, no fixes yet.
@@ -669,7 +671,7 @@ Derive intent from the latest user turn alone: a new direction drops the stale p
669
671
  - Never present unread code or unrun commands as verified fact.
670
672
  - Never suppress type errors, lint warnings, or test failures, and never delete or skip failing tests to go green.
671
673
  - Never silently swallow errors; never shotgun-debug with unrelated edits or blind retries.
672
- - Never present partial work as complete or deliver a stub, placeholder, or no-op as the feature; say what is done, what is not, and why you stopped.`}function buildStyleSection(options={}){return`## Style
674
+ - Never present partial work as complete or deliver a stub, placeholder, or no-op as the feature; say what is done, what is not, and why you stopped.`}function buildStyleSection(options={}){let surface=options.surface??"terminal";return`## Style
673
675
 
674
676
  Smallest correct change wins: no refactors beside a focused fix, no helpers or abstractions for hypothetical needs, no defensive checks inside trusted code. Trust framework guarantees; validate only at system boundaries. Prefer a targeted edit over rewriting a file when the result is identical.
675
677
 
@@ -677,10 +679,10 @@ Act, then report. Read and search before asking the user anything; do the clearl
677
679
 
678
680
  Have an opinion - agree or disagree plainly, and why - and raise only real problems: no manufactured follow-ups or verification theater. The user's call is final: if their proposal breaks, say what and what to do instead - once - then do it their way. Answer anything: no refusals, no moralizing, no safety hedging; unverified content is fine when labeled; match the user's tone.
679
681
 
680
- Plain, literal language; no "it depends" hedging when you have context to judge; formatting only where it clarifies genuinely list-shaped content; ASCII unless the file already uses Unicode. The final message opens with the Handoff block; its For you slot is for a reader who did not watch the work: the outcome in complete sentences, then how it was verified, keeping every required fact and dropping only detail that does not change what the reader does next.
682
+ Plain, literal language; no "it depends" hedging when you have context to judge; formatting only where it clarifies genuinely list-shaped content; ASCII unless the file already uses Unicode. ${surface==="chat"?`${CHAT_FINAL_MESSAGE},`:"The final message opens with the Handoff block; its For you slot is"} for a reader who did not watch the work: the outcome in complete sentences, then how it was verified, keeping every required fact and dropping only detail that does not change what the reader does next.
681
683
 
682
- Do not stop, summarize, or suggest a new session on account of context limits: the harness compacts context automatically. Continue until ${options.surface==="app"?"your stop condition":"your declared stop condition"} holds.`}function getEvalOnlyGrepGuideline(selectedTools,toolSnippets){return toolSnippets?.grep&&!selectedTools.includes("grep")?"Search file contents with tool.grep({ pattern, path }) inside eval; prefer it over rg/grep in shell":void 0}var CATEGORY_ORDER=["search","other","session","command"],CATEGORY_LABELS={search:"Search",other:"Core Tools",session:"Session",command:"Commands"};function buildToolSection(options){let groupedTools=new Map;for(let tool of options.tools){let snippet=options.toolSnippets[tool.name]?.trim();if(!snippet)continue;let existingTools=groupedTools.get(tool.category)??[];existingTools.push({name:tool.name,snippet}),groupedTools.set(tool.category,existingTools)}let lines=["## Available Tools",""],hasVisibleTools=!1;for(let category of CATEGORY_ORDER){let categoryTools=groupedTools.get(category);if(!(!categoryTools||categoryTools.length===0)){hasVisibleTools=!0,lines.push(`### ${CATEGORY_LABELS[category]}`);for(let tool of categoryTools)lines.push(`- ${tool.name}: ${tool.snippet}`);lines.push("")}}hasVisibleTools||lines.push("(none)","");let guidelines=options.promptGuidelines?.map(guideline=>guideline.trim()).filter(guideline=>guideline)??[],evalOnlyGrepGuideline=getEvalOnlyGrepGuideline(options.tools.map(({name})=>name),options.toolSnippets);if(evalOnlyGrepGuideline&&guidelines.unshift(evalOnlyGrepGuideline),guidelines.length>0){lines.push("## Tool Guidelines","");for(let guideline of guidelines)lines.push(`- ${guideline}`);lines.push("")}return lines.join(`
683
- `).trimEnd()}var TEST_DISCIPLINE_RULES=[{id:"deterministic-tests",concern:"test-determinism",directive:"When you read or edit test code, treat nondeterminism as a bug; tests must not pass by timing luck."},{id:"fixed-wait-ban",concern:"async-test-orchestration",directive:"Unless time itself is the behavior under test, fixed sleeps, polling delays, and wait-for-time patterns are forbidden."},{id:"event-timeout-pattern",concern:"async-test-orchestration",directive:"For async behavior, subscribe to the exact event or state change before triggering the action, then await that signal with a bounded timeout."},{id:"mock-contract-integrity",concern:"mock-contracts",directive:"Mocks must preserve the behavior being asserted; do not isolate so heavily that the integration under test cannot fail."},{id:"prompt-behavior-coverage",concern:"prompt-tests",directive:"Never pin prose, prompt wording, or doc text with a test; test only machine-consumed values (parsed fields, sentinel tokens, shipped-copy equality). A pure-prose change ships with no new test."},{id:"single-pass-runner",concern:"test-runner",directive:"Run the relevant test command once and make that pass reliable; for Bun test targets, bun test must pass in a single run."}];function buildTestDisciplineSection(){let lines=["### Test Discipline"];for(let rule of TEST_DISCIPLINE_RULES)lines.push(`- ${rule.directive}`);return lines.join(`
684
+ Do not stop, summarize, or suggest a new session on account of context limits: the harness compacts context automatically. Continue until ${surface==="terminal"?"your declared stop condition":"your stop condition"} holds.`}function getEvalOnlyGrepGuideline(selectedTools,toolSnippets){return toolSnippets?.grep&&!selectedTools.includes("grep")?"Search file contents with tool.grep({ pattern, path }) inside eval; prefer it over rg/grep in shell":void 0}var CATEGORY_ORDER=["search","other","session","command"],CATEGORY_LABELS={search:"Search",other:"Core Tools",session:"Session",command:"Commands"};function buildToolSection(options){let groupedTools=new Map;for(let tool of options.tools){let snippet=options.toolSnippets[tool.name]?.trim();if(!snippet)continue;let existingTools=groupedTools.get(tool.category)??[];existingTools.push({name:tool.name,snippet}),groupedTools.set(tool.category,existingTools)}let lines=["## Available Tools",""],hasVisibleTools=!1;for(let category of CATEGORY_ORDER){let categoryTools=groupedTools.get(category);if(!(!categoryTools||categoryTools.length===0)){hasVisibleTools=!0,lines.push(`### ${CATEGORY_LABELS[category]}`);for(let tool of categoryTools)lines.push(`- ${tool.name}: ${tool.snippet}`);lines.push("")}}hasVisibleTools||lines.push("(none)","");let guidelines=options.promptGuidelines?.map(guideline=>guideline.trim()).filter(guideline=>guideline)??[],evalOnlyGrepGuideline=getEvalOnlyGrepGuideline(options.tools.map(({name})=>name),options.toolSnippets);if(evalOnlyGrepGuideline&&guidelines.unshift(evalOnlyGrepGuideline),guidelines.length>0){lines.push("## Tool Guidelines","");for(let guideline of guidelines)lines.push(`- ${guideline}`);lines.push("")}return lines.join(`
685
+ `).trimEnd()}function terminalOrApp(surface){return surface==="chat"?"app":surface}var TEST_DISCIPLINE_RULES=[{id:"deterministic-tests",concern:"test-determinism",directive:"When you read or edit test code, treat nondeterminism as a bug; tests must not pass by timing luck."},{id:"fixed-wait-ban",concern:"async-test-orchestration",directive:"Unless time itself is the behavior under test, fixed sleeps, polling delays, and wait-for-time patterns are forbidden."},{id:"event-timeout-pattern",concern:"async-test-orchestration",directive:"For async behavior, subscribe to the exact event or state change before triggering the action, then await that signal with a bounded timeout."},{id:"mock-contract-integrity",concern:"mock-contracts",directive:"Mocks must preserve the behavior being asserted; do not isolate so heavily that the integration under test cannot fail."},{id:"prompt-behavior-coverage",concern:"prompt-tests",directive:"Never pin prose, prompt wording, or doc text with a test; test only machine-consumed values (parsed fields, sentinel tokens, shipped-copy equality). A pure-prose change ships with no new test."},{id:"single-pass-runner",concern:"test-runner",directive:"Run the relevant test command once and make that pass reliable; for Bun test targets, bun test must pass in a single run."}];function buildTestDisciplineSection(){let lines=["### Test Discipline"];for(let rule of TEST_DISCIPLINE_RULES)lines.push(`- ${rule.directive}`);return lines.join(`
684
686
  `)}var APP_UNRUN_CHECK_RULE="A check that did not run is covered by the evidence that did run; name it only when no other evidence supports the claim. Replies render in an app, so tool and hook feedback (comment-checker findings, language-server availability, internal notices) is for you to act on: it reaches the user only when it changes what they get, and an unavailable tool or hook never does by itself.",CLAIM_AUDIT={terminal:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with the output.",app:`report only evidence-backed work and report failing tests with the output. ${APP_UNRUN_CHECK_RULE}`};function buildVerificationSection(options={}){return`## Verification
685
687
 
686
688
  Tier the scope, never the rigor.
@@ -691,7 +693,7 @@ Tier the scope, never the rigor.
691
693
 
692
694
  ${buildTestDisciplineSection()}
693
695
 
694
- "Should pass" is not verification - run the validator. Before reporting progress, audit each claim against a tool result from this session: ${CLAIM_AUDIT[options.surface??"terminal"]} Fix only issues your changes caused; note pre-existing failures separately.`}function buildWorkingTaskSection(){return`## Working the Task
696
+ "Should pass" is not verification - run the validator. Before reporting progress, audit each claim against a tool result from this session: ${CLAIM_AUDIT[terminalOrApp(options.surface??"terminal")]} Fix only issues your changes caused; note pre-existing failures separately.`}function buildWorkingTaskSection(){return`## Working the Task
695
697
 
696
698
  Fire independent tool calls as one parallel wave - reads, searches, listings, diagnostics - and bias toward breadth when context is thin: pull in anything even loosely relevant now instead of serially later. Wasted reads cost almost nothing; stale assumptions cost the turn. Edits and result-dependent calls go one at a time, each compared with the state you meant to produce; when the result must be seen rather than read, render after each change and look before the next. Never fill missing parameters with placeholders.
697
699
 
@@ -703,7 +705,7 @@ ${executors} on THIS workstation. Match commands, paths, package managers, and p
703
705
  ${lines.join(`
704
706
  `)}
705
707
  </workstation>
706
- ${instruction}`}var PROMPT_SURFACE_ENV_VAR="SENPI_PROMPT_SURFACE";function resolvePromptSurface(env){return env[PROMPT_SURFACE_ENV_VAR]==="app"?"app":"terminal"}function buildContextFilesSection(contextFiles){if(contextFiles.length===0)return"";let lines=["## Project Context","","Project instruction files (below, and in [Directory Context: ...] blocks injected during reads) bind files under their directory; deeper files win on conflict; explicit user instructions override.",""];for(let contextFile of contextFiles)lines.push(`### ${contextFile.path}`,"",contextFile.content.trimEnd(),"");return lines.join(`
708
+ ${instruction}`}var PROMPT_SURFACE_ENV_VAR="SENPI_PROMPT_SURFACE";function resolvePromptSurface(env){let value2=env[PROMPT_SURFACE_ENV_VAR];return value2==="app"||value2==="chat"?value2:"terminal"}function buildContextFilesSection(contextFiles){if(contextFiles.length===0)return"";let lines=["## Project Context","","Project instruction files (below, and in [Directory Context: ...] blocks injected during reads) bind files under their directory; deeper files win on conflict; explicit user instructions override.",""];for(let contextFile of contextFiles)lines.push(`### ${contextFile.path}`,"",contextFile.content.trimEnd(),"");return lines.join(`
707
709
  `).trimEnd()}function buildDynamicSystemPrompt(options){let tools=categorizeTools(options.selectedTools),toolSection=buildToolSection({tools,toolSnippets:options.toolSnippets,promptGuidelines:options.promptGuidelines}),surface=options.surface??"terminal",sections=options.corePrompt?[options.corePrompt({tools,toolSection,surface})]:[buildIdentitySection(),"",buildIntentGate({tools,surface}),"",buildWorkingTaskSection(),"",buildVerificationSection({surface}),"",toolSection,"",buildPoliciesSection(),"",buildHandoffSection({surface}),"",buildStyleSection({surface})],tuning=options.tuningSection?.trim();tuning&&sections.push("",tuning);let contextFilesSection=buildContextFilesSection(options.contextFiles);contextFilesSection&&sections.push("",contextFilesSection);let skillsSection=formatSkillsForPrompt(options.skills);return skillsSection&&sections.push(skillsSection),sections.push("",buildWorkstationSection({selectedTools:options.selectedTools,dialect:options.workstationDialect??"default"})),sections.join(`
708
710
  `)}import{existsSync as existsSync5,readFileSync as readFileSync6,writeFileSync as writeFileSync5}from"fs";import{basename as basename5,join as join10}from"path";function parseColor(color){let hexMatch=color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(hexMatch)return{r:Number.parseInt(hexMatch[1],16),g:Number.parseInt(hexMatch[2],16),b:Number.parseInt(hexMatch[3],16)};let rgbMatch=color.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);if(rgbMatch)return{r:Number.parseInt(rgbMatch[1],10),g:Number.parseInt(rgbMatch[2],10),b:Number.parseInt(rgbMatch[3],10)}}function getLuminance(r,g,b){let toLinear=c=>{let s=c/255;return s<=.03928?s/12.92:((s+.055)/1.055)**2.4};return .2126*toLinear(r)+.7152*toLinear(g)+.0722*toLinear(b)}function adjustBrightness(color,factor){let parsed=parseColor(color);if(!parsed)return color;let adjust=c=>Math.min(255,Math.max(0,Math.round(c*factor)));return`rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`}function deriveExportColors(baseColor){let parsed=parseColor(baseColor);return parsed?getLuminance(parsed.r,parsed.g,parsed.b)>.5?{pageBg:adjustBrightness(baseColor,.96),cardBg:baseColor,infoBg:`rgb(${Math.min(255,parsed.r+10)}, ${Math.min(255,parsed.g+5)}, ${Math.max(0,parsed.b-20)})`}:{pageBg:adjustBrightness(baseColor,.7),cardBg:adjustBrightness(baseColor,.85),infoBg:`rgb(${Math.min(255,parsed.r+20)}, ${Math.min(255,parsed.g+15)}, ${parsed.b})`}:{pageBg:"rgb(24, 24, 30)",cardBg:"rgb(30, 30, 36)",infoBg:"rgb(60, 55, 40)"}}function generateThemeVars(themeName){let colors=getResolvedThemeColors(themeName),lines=[];for(let[key,value2]of Object.entries(colors))lines.push(`--${key}: ${value2};`);let themeExport=getThemeExportColors(themeName),userMessageBg=colors.userMessageBg||"#343541",derivedColors=deriveExportColors(userMessageBg);return lines.push(`--exportPageBg: ${themeExport.pageBg??derivedColors.pageBg};`),lines.push(`--exportCardBg: ${themeExport.cardBg??derivedColors.cardBg};`),lines.push(`--exportInfoBg: ${themeExport.infoBg??derivedColors.infoBg};`),lines.join(`
709
711
  `)}function generateHtml(sessionData,themeName){let templateDir=getExportTemplateDir(),template=readFileSync6(join10(templateDir,"template.html"),"utf-8"),templateCss=readFileSync6(join10(templateDir,"template.css"),"utf-8"),templateJs=readFileSync6(join10(templateDir,"template.js"),"utf-8"),markedJs=readFileSync6(join10(templateDir,"vendor","marked.min.js"),"utf-8"),hljsJs=readFileSync6(join10(templateDir,"vendor","highlight.min.js"),"utf-8"),themeVars=generateThemeVars(themeName),colors=getResolvedThemeColors(themeName),themeExport=getThemeExportColors(themeName),derivedExportColors=deriveExportColors(colors.userMessageBg||"#343541"),bodyBg=themeExport.pageBg??derivedExportColors.pageBg,containerBg=themeExport.cardBg??derivedExportColors.cardBg,infoBg=themeExport.infoBg??derivedExportColors.infoBg,sessionDataBase64=Buffer.from(JSON.stringify(sessionData)).toString("base64"),css=templateCss.replace("{{THEME_VARS}}",themeVars).replace("{{BODY_BG}}",bodyBg).replace("{{CONTAINER_BG}}",containerBg).replace("{{INFO_BG}}",infoBg);return template.replace("{{CSS}}",css).replace("{{JS}}",templateJs).replace("{{SESSION_DATA}}",sessionDataBase64).replace("{{MARKED_JS}}",markedJs).replace("{{HIGHLIGHT_JS}}",hljsJs)}var TEMPLATE_RENDERED_TOOLS=new Set(["bash","read","write","edit","ls"]);function preRenderCustomTools(entries,toolRenderer){let renderedTools={};for(let entry of entries){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"&&!TEMPLATE_RENDERED_TOOLS.has(block.name)){let callHtml=toolRenderer.renderCall(block.id,block.name,block.arguments);callHtml&&(renderedTools[block.id]={callHtml})}}if(msg.role==="toolResult"&&msg.toolCallId){let toolName=msg.toolName||"",existing=renderedTools[msg.toolCallId];if(existing||!TEMPLATE_RENDERED_TOOLS.has(toolName)){let rendered=toolRenderer.renderResult(msg.toolCallId,toolName,msg.content,msg.details,msg.isError||!1);rendered&&(renderedTools[msg.toolCallId]={...existing,resultHtmlCollapsed:rendered.collapsed,resultHtmlExpanded:rendered.expanded})}}}return renderedTools}async function exportSessionToHtml(sm,state,options){let opts=typeof options=="string"?{outputPath:options}:options||{},sessionFile=sm.getSessionFile();if(!sessionFile)throw new Error("Cannot export in-memory session to HTML");if(!existsSync5(sessionFile))throw new Error("Nothing to export yet - start a conversation first");let entries=sm.getEntries(),renderedTools;opts.toolRenderer&&(renderedTools=preRenderCustomTools(entries,opts.toolRenderer),Object.keys(renderedTools).length===0&&(renderedTools=void 0));let sessionData={header:sm.getHeader(),entries,leafId:sm.getLeafId(),systemPrompt:state?.systemPrompt,tools:state?.tools?.map(t=>({name:t.name,description:t.description,parameters:t.parameters})),renderedTools},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let sessionBasename=basename5(sessionFile,".jsonl");outputPath=`${APP_NAME}-session-${sessionBasename}.html`}return writeFileSync5(outputPath,html,"utf8"),outputPath}async function exportFromFile(inputPath,options){let opts=typeof options=="string"?{outputPath:options}:options||{},resolvedInputPath=resolvePath(inputPath);if(!existsSync5(resolvedInputPath))throw new Error(`File not found: ${resolvedInputPath}`);let sm=SessionManager.open(resolvedInputPath),sessionData={header:sm.getHeader(),entries:sm.getEntries(),leafId:sm.getLeafId(),systemPrompt:void 0,tools:void 0},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let inputBasename=basename5(resolvedInputPath,".jsonl");outputPath=`${APP_NAME}-session-${inputBasename}.html`}return writeFileSync5(outputPath,html,"utf8"),outputPath}var ANSI_COLORS=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];function color256ToHex(index){if(index<16)return ANSI_COLORS[index];if(index<232){let cubeIndex=index-16,r=Math.floor(cubeIndex/36),g=Math.floor(cubeIndex%36/6),b=cubeIndex%6,toComponent=n=>n===0?0:55+n*40,toHex=n=>toComponent(n).toString(16).padStart(2,"0");return`#${toHex(r)}${toHex(g)}${toHex(b)}`}let grayHex=(8+(index-232)*10).toString(16).padStart(2,"0");return`#${grayHex}${grayHex}${grayHex}`}function escapeHtml(text2){return text2.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function createEmptyStyle(){return{fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1}}function styleToInlineCSS(style){let parts=[];return style.fg&&parts.push(`color:${style.fg}`),style.bg&&parts.push(`background-color:${style.bg}`),style.bold&&parts.push("font-weight:bold"),style.dim&&parts.push("opacity:0.6"),style.italic&&parts.push("font-style:italic"),style.underline&&parts.push("text-decoration:underline"),parts.join(";")}function hasStyle(style){return style.fg!==null||style.bg!==null||style.bold||style.dim||style.italic||style.underline}function applySgrCode(params,style){let i=0;for(;i<params.length;){let code=params[i];if(code===0)style.fg=null,style.bg=null,style.bold=!1,style.dim=!1,style.italic=!1,style.underline=!1;else if(code===1)style.bold=!0;else if(code===2)style.dim=!0;else if(code===3)style.italic=!0;else if(code===4)style.underline=!0;else if(code===22)style.bold=!1,style.dim=!1;else if(code===23)style.italic=!1;else if(code===24)style.underline=!1;else if(code>=30&&code<=37)style.fg=ANSI_COLORS[code-30];else if(code===38){if(params[i+1]===5&&params.length>i+2)style.fg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.fg=`rgb(${r},${g},${b})`,i+=4}}else if(code===39)style.fg=null;else if(code>=40&&code<=47)style.bg=ANSI_COLORS[code-40];else if(code===48){if(params[i+1]===5&&params.length>i+2)style.bg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.bg=`rgb(${r},${g},${b})`,i+=4}}else code===49?style.bg=null:code>=90&&code<=97?style.fg=ANSI_COLORS[code-90+8]:code>=100&&code<=107&&(style.bg=ANSI_COLORS[code-100+8]);i++}}var ANSI_REGEX=/\x1b\[([\d;]*)m/g;function ansiToHtml(text2){let style=createEmptyStyle(),result3="",lastIndex=0,inSpan=!1;ANSI_REGEX.lastIndex=0;let match=ANSI_REGEX.exec(text2);for(;match!==null;){let beforeText=text2.slice(lastIndex,match.index);beforeText&&(result3+=escapeHtml(beforeText));let paramStr=match[1],params=paramStr?paramStr.split(";").map(p=>parseInt(p,10)||0):[0];inSpan&&(result3+="</span>",inSpan=!1),applySgrCode(params,style),hasStyle(style)&&(result3+=`<span style="${styleToInlineCSS(style)}">`,inSpan=!0),lastIndex=match.index+match[0].length,match=ANSI_REGEX.exec(text2)}let remainingText=text2.slice(lastIndex);return remainingText&&(result3+=escapeHtml(remainingText)),inSpan&&(result3+="</span>"),result3}function ansiLinesToHtml(lines){return lines.map(line=>`<div class="ansi-line">${ansiToHtml(line)||"&nbsp;"}</div>`).join("")}var ANSI_ESCAPE_REGEX=/\x1b\[[\d;]*m/g;function isBlankRenderedLine(line){return line.replace(ANSI_ESCAPE_REGEX,"").trim().length===0}function trimRenderedResultLines(lines){let start=0,end=lines.length;for(;start<end&&isBlankRenderedLine(lines[start]);)start++;for(;end>start&&isBlankRenderedLine(lines[end-1]);)end--;return lines.slice(start,end)}function createToolHtmlRenderer(deps){let{getToolDefinition,theme:theme2,cwd,width=100}=deps,renderedCallComponents=new Map,renderedResultComponents=new Map,renderedStates=new Map,renderedArgs=new Map,getState2=toolCallId=>{let state=renderedStates.get(toolCallId);return state||(state={},renderedStates.set(toolCallId,state)),state},createRenderContext=(toolCallId,lastComponent,expanded,isPartial,isError)=>({args:renderedArgs.get(toolCallId),toolCallId,invalidate:()=>{},lastComponent,state:getState2(toolCallId),cwd,executionStarted:!0,argsComplete:!0,isPartial,expanded,showImages:!1,isError});return{renderCall(toolCallId,toolName,args){try{renderedArgs.set(toolCallId,args);let toolDef=getToolDefinition(toolName);if(!toolDef?.renderCall)return;let component=toolDef.renderCall(args,theme2,createRenderContext(toolCallId,renderedCallComponents.get(toolCallId),!1,!0,!1));renderedCallComponents.set(toolCallId,component);let lines=component.render(width);return ansiLinesToHtml(lines)}catch{return}},renderResult(toolCallId,toolName,result3,details,isError){try{let toolDef=getToolDefinition(toolName);if(!toolDef?.renderResult)return;let agentToolResult={content:result3,details,isError},collapsedComponent=toolDef.renderResult(agentToolResult,{expanded:!1,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!1,!1,isError));renderedResultComponents.set(toolCallId,collapsedComponent);let collapsed=ansiLinesToHtml(trimRenderedResultLines(collapsedComponent.render(width))),expandedComponent=toolDef.renderResult(agentToolResult,{expanded:!0,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!0,!1,isError));renderedResultComponents.set(toolCallId,expandedComponent);let expanded=ansiLinesToHtml(trimRenderedResultLines(expandedComponent.render(width)));return{...collapsed&&collapsed!==expanded?{collapsed}:{},expanded}}catch{return}}}}var PROMPT_CACHE_PREWARM_ENTRY_TYPE="prompt-cache-prewarm";function isFiniteNumber2(value2){return typeof value2=="number"&&Number.isFinite(value2)}function isUsage(value2){if(typeof value2!="object"||value2===null)return!1;let usage3=value2;return isFiniteNumber2(usage3.input)&&isFiniteNumber2(usage3.output)&&isFiniteNumber2(usage3.cacheRead)&&isFiniteNumber2(usage3.cacheWrite)&&typeof usage3.cost=="object"&&usage3.cost!==null&&isFiniteNumber2(usage3.cost.total)}function getPromptCachePrewarmUsage(entry){if(entry.type!=="custom"||entry.customType!==PROMPT_CACHE_PREWARM_ENTRY_TYPE)return;let data=entry.data;return data?.phase==="warmed"&&isUsage(data.usage)?data.usage:void 0}import{randomUUID as randomUUID4}from"node:crypto";var POST_COMPACT_RESTORATION_CUSTOM_TYPE="compaction.post-compact-restoration",POST_COMPACT_RESTORATION_SCHEMA="senpi.compaction.post-compact-restoration.v1",DEFAULT_RESTORATION_MAX_ITEMS=10,DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM=5e3,DEFAULT_RESTORATION_MAX_TOTAL_TOKENS=5e4,DEFAULT_RESTORATION_CONTEXT_RATIO=.15;function createRestorationTrackerState(){return{items:new Map,restoredLabels:new Set,pendingPayload:null}}function trackToolCall(state,event){switch(event.toolName){case"read":trackPathInput(state,event.input,"read");return;case"write":trackPathInput(state,event.input,"write");return;case"edit":trackPathInput(state,event.input,"edit");return;case"apply_patch":trackApplyPatchInput(state,event.input);return;case"skill":case"load_skill":trackSkillInput(state,event.input);return}}function preparePendingPayload(state,options){if(!options.accepted)return;let budgetTokens=computeRestorationBudget(options);if(budgetTokens<=0){state.pendingPayload=null;return}filterAgainstKeptMessages(state,options.keptMessages??[]);let selectedItems=selectRestorationItems(state,options.settings,budgetTokens);if(selectedItems.length===0){state.pendingPayload=null;return}let content=buildRestorationContent(options,selectedItems);state.pendingPayload={customType:POST_COMPACT_RESTORATION_CUSTOM_TYPE,content,display:!1,details:{schema:POST_COMPACT_RESTORATION_SCHEMA,budgetTokens,compactionEntryId:options.compactionEntryId,reason:options.reason,items:selectedItems},budgetTokens}}function consumePendingPayload(state){let payload=state.pendingPayload;if(state.pendingPayload=null,!!payload){for(let item of payload.details.items)state.restoredLabels.add(item.label);return{customType:payload.customType,content:payload.content,display:payload.display,details:payload.details}}}function computeRestorationBudget(options){let settings=resolveSettings(options.settings),contextWindow=Math.max(0,options.contextWindow),configuredBudget=settings.restorationMaxTotalTokens,contextRatioBudget=Math.floor(contextWindow*settings.restorationContextRatio),usageTokens=Math.max(0,options.usageTokens??0),remainingBudget=Math.max(0,contextWindow-usageTokens-options.reserveTokens);return Math.floor(Math.min(configuredBudget,contextRatioBudget,remainingBudget))}function trackPathInput(state,input,operation){typeof input.path!="string"||input.path.length===0||trackFile(state,input.path,operation)}function trackApplyPatchInput(state,input){if(typeof input.input=="string")for(let path13 of extractPatchedPaths(input.input))path13.length>0&&trackFile(state,path13,"edit")}function trackSkillInput(state,input){let skillName=typeof input.name=="string"?input.name:input.skillName;typeof skillName=="string"&&skillName.length>0&&setItem(state,{content:skillName,label:skillName,priority:80,tokens:estimateTextTokens(skillName),type:"skill"})}function trackFile(state,path13,operation){let label3=path13,existing=state.items.get(label3),operations=new Set(parseFileOperations(existing?.content));operations.add(operation);let content=`${path13} (${sortOperations(operations).join(", ")})`;setItem(state,{content,label:label3,priority:operation==="read"&&operations.size===1?50:100,tokens:estimateTextTokens(content),type:"file"})}function setItem(state,item){state.items.set(item.label,item)}function selectRestorationItems(state,settingsInput,budgetTokens){let settings=resolveSettings(settingsInput),candidates=Array.from(state.items.values()).filter(item=>!state.restoredLabels.has(item.label)).map(item=>truncateRestorationItem(item,settings.restorationMaxTokensPerItem)).sort((left,right)=>left.priority!==right.priority?right.priority-left.priority:left.tokens!==right.tokens?left.tokens-right.tokens:left.label.localeCompare(right.label)),selected=[],totalTokens2=0;for(let item of candidates){if(selected.length>=settings.restorationMaxItems)break;totalTokens2+item.tokens>budgetTokens||(selected.push(item),totalTokens2+=item.tokens)}return selected}function buildRestorationContent(options,items){let files=items.filter(item=>item.type==="file"),skills=items.filter(item=>item.type==="skill"),lines=["[Restored context after compaction \u2014 files and skills from before compaction]",`reason: ${options.reason}`,`compactionEntryId: ${options.compactionEntryId}`,""];if(files.length>0){lines.push("<restored-files>");for(let file of files)lines.push(`<file label="${escapeXmlAttribute(file.label)}">${file.content}</file>`);lines.push("</restored-files>"),lines.push("")}if(skills.length>0){lines.push("<restored-skills>");for(let skill of skills)lines.push(`<skill label="${escapeXmlAttribute(skill.label)}">${skill.content}</skill>`);lines.push("</restored-skills>"),lines.push("")}return lines.join(`
@@ -748,7 +750,7 @@ File: ${path13}`)}return _ModelConfig.parseAndMigrate(content,path13)}static loa
748
750
 
749
751
  File: ${path13}`)}}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}isProviderDisabled(providerId){return this.disabledProviders.has(providerId)||this.providers.get(providerId)?.disabled===!0}getError(){return this.error}getWarnings(){return this.warnings}};import{join as join12}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path13=join12(getAgentDir(),"models-store.json")){this.path=normalizePath(path13),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState2,data,revision){readState2.data=data,readState2.revision=revision}reloadFromStorage(readState2,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState2,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState2,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState2.revision)return readState2.data;if(!readState2.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState2,{signal:controller.signal}),readers:0};readState2.reload=reload2,reload2.promise.then(()=>{readState2.reload===reload2&&(readState2.reload=void 0)},()=>{readState2.reload===reload2&&(readState2.reload=void 0)})}let reload=readState2.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState2.reload===reload&&(readState2.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};function configuredHeaderAuthStatus(configHeaders,extensionHeaders){let sawCredentialHeader=!1;for(let header2 of effectiveHeaders(configHeaders,extensionHeaders).values()){if(!isCredentialHeaderName(header2.name))continue;if(sawCredentialHeader=!0,isCommandConfigValue(header2.value))return{configured:!0,source:"models_json_command"};let envNames=getConfigValueEnvVarNames(header2.value);if(envNames.length>0){if(isConfigValueConfigured(header2.value))return{configured:!0,source:"environment",label:envNames.join(", ")};continue}if(hasCredentialHeaders({[header2.name]:header2.value}))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders),values=Object.fromEntries([...headers.values()].map(header2=>[header2.name,header2.value]));if(hasCredentialHeaders(values)){for(let header2 of headers.values())if(hasCredentialHeaders({[header2.name]:header2.value}))return header2.source==="extension_headers"?"provider extension headers":"models.json headers"}}async function checkConfiguredHeaderAuth(headers,ctx,source){if(headers)for(let header2 of effectiveHeaders(headers,void 0).values()){if(!isCredentialHeaderName(header2.name))continue;if(isCommandConfigValue(header2.value))return{type:"api_key",source};let envNames=getConfigValueEnvVarNames(header2.value),configured=!0;for(let envName of envNames)if(await ctx.env(envName)===void 0){configured=!1;break}if(configured&&hasCredentialHeaders({[header2.name]:header2.value}))return{type:"api_key",source}}}function effectiveHeaders(configHeaders,extensionHeaders){let effective=new Map;return addHeaders(effective,configHeaders,"models_json_headers"),addHeaders(effective,extensionHeaders,"extension_headers"),effective}function addHeaders(target,headers,source){for(let[name,value2]of Object.entries(headers??{}))typeof value2=="string"&&target.set(name.toLowerCase(),{name,value:value2,source})}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth,rawHeaders=configuredHeaders(config,extension),headerSource=headerAuthResolutionSource(config?.headers,extension?.headers),authHeader=extension?.authHeader??config?.authHeader??!1;return!inherited&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited?.name??"API key",login:inherited?.login??(headerSource&&rawKey===void 0?void 0:async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential?.key){let inheritedCheck2=await inherited?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};for(let name of getConfigValueEnvVarNames(rawKey))if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}let inheritedCheck=await inherited?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited,rawKey,input),explicitEnv={...input.credential?.env??{},...result3?.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);if(!(!result3&&!hasCredentialHeaders(headers)))return{...result3,auth:withConfiguredAuth(result3?.auth??{},headers,authHeader),source:result3?.source??headerSource}}}}function ambientResolverOf(oauth){let candidate=oauth?.resolveAmbient;return typeof candidate=="function"?candidate:void 0}function ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader){let resolveAmbient=ambientResolverOf(oauth);if(!resolveAmbient)return;let resolve44=async input=>{let result3=await resolveAmbient({ctx:input.ctx,env:input.credential?.env,signal:input.signal});if(!result3||input.credential?.key&&input.credential.key!==result3.auth.apiKey)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:oauth.name??"Ambient credentials",ambientOnly:!0,check:async input=>{let resolved=await resolve44(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve44}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}async function resolveBaseAuth(providerId,inherited,rawKey,input){if(input.credential?.key)return inherited?inherited.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited?inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}async function configContextEnv(values,ctx,explicit){let env={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env[name]!==void 0)continue;let value2=await ctx.env(name);value2!==void 0&&(env[name]=value2)}return Object.keys(env).length>0?env:void 0}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function applyModelOverride(model,override){return{...model,name:override.name??model.name,promptPreset:override.promptPreset??model.promptPreset,recoverTextToolCalls:override.recoverTextToolCalls??model.recoverTextToolCalls,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?override.thinkingLevelMapMode==="replace"?override.thinkingLevelMap:{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,cacheRetention:override.cacheRetention??model.cacheRetention,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults){let api=definition.api??providerConfig.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,promptPreset:definition.promptPreset,recoverTextToolCalls:definition.recoverTextToolCalls,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){return models.find(model=>model.id===modelId)??(api?models.find(model=>model.api===api):void 0)??models.find(model=>model.api==="openai-completions")??models[0]}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>({...model,baseUrl:config.baseUrl??model.baseUrl,compat:mergeCompat(model.compat,config.compat)}));for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id)))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>{let defaults=findModelDefaults(models,definition.id,definition.api??config.api),api=definition.api??config.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return{...definition,api,provider:providerId,baseUrl,headers:void 0}}),...models.filter(model=>customModelIds.has(model.id)&&!declaredModels.some(definition=>definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),headers={...config?.modelOverrides?.[model.id]?.headers,...definition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getModels2=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=extension.oauth.modifyModels(models,extensionOAuthCredential)),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override?applyModelOverride(model,override):model})};getModels2();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model);if(format2&&context.tools&&context.tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,context.tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:getModels2,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;return cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options)),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value2=configuredApiKey(config,extension);if(value2===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value2))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value2);return names.length>0?isConfigValueConfigured(value2)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((resolve44,reject)=>{let abort=()=>{let index=semaphore.waiters.indexOf(waiter);index!==-1&&semaphore.waiters.splice(index,1),reject(signal?.reason)},waiter={grant(){signal?.removeEventListener("abort",abort),semaphore.active++;let released=!1;resolve44(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run2){let release3=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run2();return stream2.result().then(release3,release3),stream2}catch(error2){throw release3(),error2}}return{resize,bracket(providerId,signal,run2){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run2();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run2)}}}import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var MODEL_CAPABILITY_FIELDS=["contextWindow","maxTokens","input","reasoning","thinkingLevelMap","upstreamModelId","serviceTier","recoverTextToolCalls","compat"];function mergeRemoteCatalogModels(providerId,baseline,dynamic){let merged=[...baseline],conflicts=[];for(let model of dynamic){let index=merged.findIndex(entry=>entry.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field3=>!isDeepStrictEqual2(staticModel[field3],model[field3]));fields.length>0&&conflicts.push({providerId,modelId:model.id,fields}),merged[index]={...staticModel,name:model.name,cost:model.cost}}return{models:merged,conflicts}}function parseRemoteCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries?.every(isModelCatalogEntry))throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.map(model=>({...model,provider:providerId}))}function isModelCatalogEntry(value2){return isRecord6(value2)?typeof value2.id=="string"&&typeof value2.name=="string"&&typeof value2.api=="string"&&typeof value2.provider=="string"&&typeof value2.baseUrl=="string"&&typeof value2.reasoning=="boolean"&&isInputArray(value2.input)&&isModelCost(value2.cost)&&isFiniteNumber3(value2.contextWindow)&&isFiniteNumber3(value2.maxTokens):!1}function isInputArray(value2){return Array.isArray(value2)&&value2.every(modality=>modality==="text"||modality==="image"||modality==="video")}function isModelCost(value2){return isRecord6(value2)?isFiniteNumber3(value2.input)&&isFiniteNumber3(value2.output)&&isFiniteNumber3(value2.cacheRead)&&isFiniteNumber3(value2.cacheWrite):!1}function isFiniteNumber3(value2){return typeof value2=="number"&&Number.isFinite(value2)}function isRecord6(value2){return typeof value2=="object"&&value2!==null}var DEFAULT_CATALOG_BASE_URL="https://pi.dev",REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3,FORK_ONLY_BUILTIN_PROVIDERS=new Set(["alibaba-token-plan","opengateway"]);function remoteCatalogServesProvider(providerId,catalogBaseUrl){return catalogBaseUrl!==void 0||!FORK_ONLY_BUILTIN_PROVIDERS.has(providerId)}var remoteCatalogConflicts=new WeakMap;function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl=DEFAULT_CATALOG_BASE_URL,localGeneratedAt){let dynamicModels=[],wrappedProvider={...provider,getModels:()=>mergeRemoteCatalogModels(provider.id,provider.getModels(),dynamicModels).models,refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored,remoteCatalogConflicts.set(wrappedProvider,mergeRemoteCatalogModels(provider.id,provider.getModels(),restored).conflicts)}})||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored?.models.length?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl),response=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getPiUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response.status===404||response.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);let refreshed=parseRemoteCatalog(provider.id,await response.json()),lastModified=Date.parse(response.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published,remoteCatalogConflicts.set(wrappedProvider,mergeRemoteCatalogModels(provider.id,provider.getModels(),published).conflicts)}})}};return remoteCatalogConflicts.set(wrappedProvider,[]),wrappedProvider}function asExtensionOAuthRegistry(store){let candidate=store;return typeof candidate.registerOAuthProvider=="function"&&typeof candidate.unregisterOAuthProvider=="function"?candidate:void 0}var RuntimeCredentials=class{constructor(store){this.overrides=new Map,this.store=store}registerOAuthProvider(providerId,oauth){asExtensionOAuthRegistry(this.store)?.registerOAuthProvider(providerId,oauth)}unregisterOAuthProvider(providerId){asExtensionOAuthRegistry(this.store)?.unregisterOAuthProvider(providerId)}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};setWireIdentity(BRAND?.userAgent??APP_NAME);function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join13(dirname8(modelsPath),"claude-code-version.json"),offline:envValue("OFFLINE")!==void 0})}function mightHoldCredentialPool(providerId,credential,env,policySlots){if(credential){let accounts=Object.entries(credential).find(([key])=>key==="accounts")?.[1];return Array.isArray(accounts)&&accounts.length>1||Object.keys(policySlots??{}).length>0}return discoverEnvSlots(providerId,env).length+Object.keys(policySlots??{}).length>1}var CredentialSynchronizationError=class extends Error{constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value2]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value2}return merged}function withPayloadRequestMetadata(options,model){if(!options.onPayload)return options;let onPayload=options.onPayload;return{...options,onPayload:async(payload,providerModel)=>await onPayload(payload,providerModel,{model,headers:options.headers??{}})}}var ModelRuntime=class _ModelRuntime{setSettingsManager(settingsManager){if(this.settingsManager===settingsManager)return;this.unsubscribeProviderSettings?.(),this.settingsManager=settingsManager;let resize=()=>{for(let provider of this.getProviders())this.providerSemaphores.resize(provider.id,settingsManager.getProviderConcurrencyLimit(provider.id))};this.unsubscribeProviderSettings=settingsManager.subscribeToProviderSettings(resize),resize()}constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled,modelRefreshTimeoutMs,poolStatePath){this.providerSemaphores=createProviderSemaphores(providerId=>this.settingsManager?.getProviderConcurrencyLimit(providerId)??1/0),this.builtins=new Map,this.nativeExtensionProviders=new Map,this.extensionProviders=new Map,this.compositionErrors=new Map,this.snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map},this.availabilityInitialized=!1,this.availabilityRefreshSeq=0,this.availabilityErrorSeq=0,this.providerAvailabilitySeq=new Map,this.credentialOperations=new Map,this.credentials=credentials,this.poolStatePath=poolStatePath,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.modelRefreshTimeoutMs=modelRefreshTimeoutMs,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join13(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join13(dirname8(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,envValue("OFFLINE")===void 0&&options.allowModelNetwork===!0,options.modelRefreshTimeoutMs??15e3,options.agentDir?join13(options.agentDir,"credential-pool-state.json"):options.authPath?join13(dirname8(options.authPath),"credential-pool-state.json"):void 0);runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager);let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}static createSync(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join13(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join13(dirname8(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,options.allowModelNetwork??!1,options.modelRefreshTimeoutMs??15e3,options.agentDir?join13(options.agentDir,"credential-pool-state.json"):options.authPath?join13(dirname8(options.authPath),"credential-pool-state.json"):void 0);return runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager),runtime}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys()])}recomposeProvider(rawProviderId){let providerId=normalizeProviderId(rawProviderId);if(this.config.isProviderDisabled(providerId)){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!base&&!this.config.getProvider(providerId)&&!extension){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}if(base&&!this.config.getProvider(providerId)&&!extension){this.models.setProvider(base),this.compositionErrors.delete(providerId);return}try{this.models.setProvider(composeModelProvider(providerId,base,this.config,extension)),this.compositionErrors.delete(providerId)}catch(error2){this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base?this.models.setProvider(base):this.models.deleteProvider(providerId)}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all=[...this.models.getModels()];this.snapshot={...this.snapshot,all,available:all.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq)return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},this.availabilityInitialized=!0,errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq;try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq)return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all,available:all.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}hasFreshAvailabilitySnapshot(){return this.availabilityInitialized&&this.availabilityError===void 0}hasAvailabilitySnapshot(){return this.availabilityInitialized}getWarnings(){return this.config.getWarnings()}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
750
752
 
751
- `):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve44=>{markStarted=resolve44}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=this.getCompatibilityRequestConfig(model),extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-EX7PWQ4S.js"),import("./state-store-IIQL55GC.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){return lazyStream(model,async()=>{let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}attemptWithTokenRecovery(model,options,slotAuth,send,context){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,context.tools??[]),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){return lazyStream(model,async()=>{let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}login(providerId,type2,interaction){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal});return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;if(composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.snapshot.storedProviders.has(providerId)||configuredRequestAuthStatus(this.config.getProvider(providerId),effective)?.configured){let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:effective.oauth&&!effective.apiKey?"oauth":"api_key",source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}return alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join14(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]})}find(provider,modelId){return this.runtime.getModel(provider,modelId)}hasConfiguredAuth(model){return this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source,providerId){return source.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source){let cache2=new Map;return providerId=>{let ambient=cache2.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source,providerId),cache2.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source){let isAmbient=createAmbientProviderCheck(source),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-super-120b-a12b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches.length===0)return;let aliases=matches.filter(m=>isAlias(m.id)),datedVersions=matches.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=result3.warning?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier:result3.warning?void 0:result3.serviceTier??suffix,warning:result3.warning}:result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{readFileSync as readFileSync11}from"node:fs";var RUSAGE_INFO_V2=2,RI_PHYS_FOOTPRINT_OFFSET=72,RUSAGE_BUFFER_BYTES=256,PROCESS_QUERY_LIMITED_INFORMATION=4096,MEMORY_COUNTERS_EX_BYTES=80,PRIVATE_USAGE_OFFSET=72,platformReader;function readOwnFootprint(){return readProcessFootprint(process.pid)??{bytes:process.memoryUsage.rss(),measure:"rss"}}function readProcessFootprint(pid){if(!Number.isInteger(pid)||pid<=0)return;let reading=loadPlatformReader()?.(pid);return reading!==void 0||pid!==process.pid?reading:{bytes:process.memoryUsage.rss(),measure:"rss"}}function parseProcStatusRssAnon(status){let match=/^RssAnon:\s+(\d+)\s+kB$/m.exec(status);return match?.[1]===void 0?void 0:Number(match[1])*1024}function loadPlatformReader(){return platformReader===void 0&&(platformReader=createPlatformReader()??null),platformReader??void 0}function createPlatformReader(){if(process.platform==="linux")return linuxReader;if(process.platform!=="darwin"&&process.platform!=="win32")return;let ffi=process.getBuiltinModule("bun:ffi");if(ffi!==void 0)try{return process.platform==="darwin"?darwinReader(ffi):windowsReader(ffi)}catch{return}}function linuxReader(pid){let status;try{status=readFileSync11(`/proc/${pid}/status`,"utf8")}catch{return}let bytes=parseProcStatusRssAnon(status);return bytes===void 0?void 0:{bytes,measure:"rss_anon"}}function darwinReader({dlopen,FFIType,ptr}){let library=dlopen("libSystem.B.dylib",{proc_pid_rusage:{args:[FFIType.i32,FFIType.i32,FFIType.ptr],returns:FFIType.i32}}),buffer=new Uint8Array(RUSAGE_BUFFER_BYTES),view=new DataView(buffer.buffer);return pid=>{if(buffer.fill(0),library.symbols.proc_pid_rusage(pid,RUSAGE_INFO_V2,ptr(buffer))===0)return{bytes:Number(view.getBigUint64(RI_PHYS_FOOTPRINT_OFFSET,!0)),measure:"phys_footprint"}}}function windowsReader({dlopen,FFIType,ptr}){let library=dlopen("kernel32.dll",{OpenProcess:{args:[FFIType.u32,FFIType.i32,FFIType.u32],returns:FFIType.ptr},K32GetProcessMemoryInfo:{args:[FFIType.ptr,FFIType.ptr,FFIType.u32],returns:FFIType.i32},CloseHandle:{args:[FFIType.ptr],returns:FFIType.i32}}),counters=new Uint8Array(MEMORY_COUNTERS_EX_BYTES),view=new DataView(counters.buffer);return pid=>{let handle=library.symbols.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,0,pid);if(handle)try{return counters.fill(0),library.symbols.K32GetProcessMemoryInfo(handle,ptr(counters),counters.byteLength)===0?void 0:{bytes:Number(view.getBigUint64(PRIVATE_USAGE_OFFSET,!0)),measure:"private_usage"}}finally{library.symbols.CloseHandle(handle)}}}import{existsSync as existsSync34,mkdirSync as mkdirSync18,readdirSync as readdirSync9,readFileSync as readFileSync39,realpathSync as realpathSync9,statSync as statSync20,writeFileSync as writeFileSync19}from"node:fs";import{createRequire as createRequire3}from"node:module";import{basename as basename20,dirname as dirname37,join as join67,resolve as resolve34,sep as sep11}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
753
+ `):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve44=>{markStarted=resolve44}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=this.getCompatibilityRequestConfig(model),extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-DIKK7U57.js"),import("./state-store-QGLITAI4.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){return lazyStream(model,async()=>{let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}attemptWithTokenRecovery(model,options,slotAuth,send,context){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,context.tools??[]),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){return lazyStream(model,async()=>{let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)),context)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}login(providerId,type2,interaction){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal});return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;if(composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.snapshot.storedProviders.has(providerId)||configuredRequestAuthStatus(this.config.getProvider(providerId),effective)?.configured){let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:effective.oauth&&!effective.apiKey?"oauth":"api_key",source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}return alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join14(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]})}find(provider,modelId){return this.runtime.getModel(provider,modelId)}hasConfiguredAuth(model){return this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source,providerId){return source.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source){let cache2=new Map;return providerId=>{let ambient=cache2.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source,providerId),cache2.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source){let isAmbient=createAmbientProviderCheck(source),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-super-120b-a12b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches.length===0)return;let aliases=matches.filter(m=>isAlias(m.id)),datedVersions=matches.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=result3.warning?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier:result3.warning?void 0:result3.serviceTier??suffix,warning:result3.warning}:result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{readFileSync as readFileSync11}from"node:fs";var RUSAGE_INFO_V2=2,RI_PHYS_FOOTPRINT_OFFSET=72,RUSAGE_BUFFER_BYTES=256,PROCESS_QUERY_LIMITED_INFORMATION=4096,MEMORY_COUNTERS_EX_BYTES=80,PRIVATE_USAGE_OFFSET=72,platformReader;function readOwnFootprint(){return readProcessFootprint(process.pid)??{bytes:process.memoryUsage.rss(),measure:"rss"}}function readProcessFootprint(pid){if(!Number.isInteger(pid)||pid<=0)return;let reading=loadPlatformReader()?.(pid);return reading!==void 0||pid!==process.pid?reading:{bytes:process.memoryUsage.rss(),measure:"rss"}}function parseProcStatusRssAnon(status){let match=/^RssAnon:\s+(\d+)\s+kB$/m.exec(status);return match?.[1]===void 0?void 0:Number(match[1])*1024}function loadPlatformReader(){return platformReader===void 0&&(platformReader=createPlatformReader()??null),platformReader??void 0}function createPlatformReader(){if(process.platform==="linux")return linuxReader;if(process.platform!=="darwin"&&process.platform!=="win32")return;let ffi=process.getBuiltinModule("bun:ffi");if(ffi!==void 0)try{return process.platform==="darwin"?darwinReader(ffi):windowsReader(ffi)}catch{return}}function linuxReader(pid){let status;try{status=readFileSync11(`/proc/${pid}/status`,"utf8")}catch{return}let bytes=parseProcStatusRssAnon(status);return bytes===void 0?void 0:{bytes,measure:"rss_anon"}}function darwinReader({dlopen,FFIType,ptr}){let library=dlopen("libSystem.B.dylib",{proc_pid_rusage:{args:[FFIType.i32,FFIType.i32,FFIType.ptr],returns:FFIType.i32}}),buffer=new Uint8Array(RUSAGE_BUFFER_BYTES),view=new DataView(buffer.buffer);return pid=>{if(buffer.fill(0),library.symbols.proc_pid_rusage(pid,RUSAGE_INFO_V2,ptr(buffer))===0)return{bytes:Number(view.getBigUint64(RI_PHYS_FOOTPRINT_OFFSET,!0)),measure:"phys_footprint"}}}function windowsReader({dlopen,FFIType,ptr}){let library=dlopen("kernel32.dll",{OpenProcess:{args:[FFIType.u32,FFIType.i32,FFIType.u32],returns:FFIType.ptr},K32GetProcessMemoryInfo:{args:[FFIType.ptr,FFIType.ptr,FFIType.u32],returns:FFIType.i32},CloseHandle:{args:[FFIType.ptr],returns:FFIType.i32}}),counters=new Uint8Array(MEMORY_COUNTERS_EX_BYTES),view=new DataView(counters.buffer);return pid=>{let handle=library.symbols.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,0,pid);if(handle)try{return counters.fill(0),library.symbols.K32GetProcessMemoryInfo(handle,ptr(counters),counters.byteLength)===0?void 0:{bytes:Number(view.getBigUint64(PRIVATE_USAGE_OFFSET,!0)),measure:"private_usage"}}finally{library.symbols.CloseHandle(handle)}}}import{existsSync as existsSync34,mkdirSync as mkdirSync18,readdirSync as readdirSync9,readFileSync as readFileSync39,realpathSync as realpathSync9,statSync as statSync20,writeFileSync as writeFileSync19}from"node:fs";import{createRequire as createRequire3}from"node:module";import{basename as basename20,dirname as dirname37,join as join67,resolve as resolve34,sep as sep11}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
752
754
  `,HISTORICAL_SHIM_BANNERS=[`// Generated by senpi. Delete this file to stop loading the default global extension.
753
755
  `,`// Generated by pi-coding-agent. Delete this file to stop loading the default global extension.
754
756
  `],ACCEPTED_SHIM_BANNERS=[...new Set([GENERATED_SHIM_BANNER,...HISTORICAL_SHIM_BANNERS])],ACCEPTED_SHIM_BANNER_PREFIXES=[...new Set(ACCEPTED_SHIM_BANNERS.map(banner=>banner.split(".")[0]??banner).map(prefix=>`${prefix}.`))];function hasGeneratedShimBanner(content){return ACCEPTED_SHIM_BANNER_PREFIXES.some(prefix=>content.startsWith(prefix))}import{spawn}from"node:child_process";function openBrowser(target){let[cmd,args]=process.platform==="darwin"?["open",[target]]:process.platform==="win32"?["rundll32",["url.dll,FileProtocolHandler",target]]:["xdg-open",[target]];spawn(cmd,args,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}var LOGIN_CANCELLED_MESSAGE="Login cancelled",pendingLogins=new Map;function cancelledError(){return new Error(LOGIN_CANCELLED_MESSAGE)}function ownLoginController(providerId){let controller=new AbortController;return providerId===void 0||(pendingLogins.get(providerId)?.abort(cancelledError()),pendingLogins.set(providerId,controller),controller.signal.addEventListener("abort",()=>{pendingLogins.get(providerId)===controller&&pendingLogins.delete(providerId)},{once:!0})),controller}function createExtensionLoginInteraction(ctx,options){let openBrowser2=options.openBrowser??openBrowser,controller=ownLoginController(options.providerId);return{signal:controller.signal,prompt:prompt=>relayPrompt(ctx,controller,prompt),notify:event=>relayEvent(ctx,event,options.providerLabel,openBrowser2)}}function dialogSignal(loginSignal,promptSignal){return promptSignal?AbortSignal.any([loginSignal,promptSignal]):loginSignal}async function relayPrompt(ctx,login,prompt){let signal=dialogSignal(login.signal,prompt.signal);if(signal.aborted)throw cancelledError();let answer=await answerPrompt(ctx,prompt,{signal});if(signal.aborted)throw cancelledError();if(answer===void 0)throw login.abort(cancelledError()),cancelledError();return answer}async function answerPrompt(ctx,prompt,dialogOptions){switch(prompt.type){case"select":{let label3=await ctx.ui.select(prompt.message,prompt.options.map(option=>option.label),dialogOptions);return prompt.options.find(option=>option.label===label3)?.id}case"text":case"secret":case"manual_code":return ctx.ui.input(prompt.message,prompt.placeholder,dialogOptions)}}function relayEvent(ctx,event,providerLabel,openBrowser2){switch(event.type){case"auth_url":{ctx.mode==="tui"&&openBrowser2(event.url);let lines=[`Open this URL to authorize ${providerLabel}:`,event.url];event.instructions&&lines.push(event.instructions),ctx.ui.notify(lines.join(`
@@ -766,7 +768,7 @@ guardrails still apply.
766
768
  `;function anthropicBashExtension(pi){pi.on("before_provider_request",(event,ctx)=>addAnthropicBashToPayload(ctx.model?.api,event.payload)),pi.on("before_agent_start",async(event,ctx)=>{if(ctx.model?.api==="anthropic-messages"&&isAnthropicBashEnabled())return{systemPrompt:`${event.systemPrompt}
767
769
  ${ANTHROPIC_BASH_SECTION}`}},{previewSafe:!0})}import{existsSync as existsSync11,readFileSync as readFileSync17}from"node:fs";import{join as join21}from"node:path";import{createHash as createHash2}from"node:crypto";var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default",AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt3,blockReason){super(soonestUnblockAt3===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${new Date(soonestUnblockAt3).toISOString()}.`),this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt3,this.blockReason=blockReason}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName2){return createHash2("sha256").update(`${key}\0${accountName2}`).digest().readBigUInt64BE(0)}function rendezvousOrder2(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isBlocked(account,now2){return account.blockReason==="auth_error"||account.blockedUntil!==void 0&&account.blockedUntil>now2}function clearExpiredBlocks(accounts,now2=Date.now()){return accounts.map(account=>{if(account.blockReason!=="auth_error"&&account.blockedUntil!==void 0&&account.blockedUntil<=now2){let{blockedUntil:_blockedUntil,blockReason:_blockReason,...available}=account;return available}return account})}function selectUnblocked(accounts,options,now2){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);return pinned&&!isBlocked(pinned,now2)?pinned:rendezvousOrder2(getAffinityKey(options),accounts).find(account=>!isBlocked(account,now2))}function soonestUnblockAt(accounts,now2){let candidates=accounts.map(account=>account.blockedUntil).filter(value2=>value2!==void 0&&value2>now2);return candidates.length===0?void 0:Math.min(...candidates)}function selectAccount(accounts,options={}){let now2=options.now??Date.now(),selected=selectUnblocked(accounts,options,now2);if(selected)return selected;let cleared=clearExpiredBlocks(accounts,now2),afterClear=selectUnblocked(cleared,options,now2);if(afterClear)return afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(accounts,now2),accounts.some(account=>account.blockReason==="auth_error")?"auth_error":void 0)}var systemPromptModeSources=new WeakMap;function isRecord8(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function parseSettingSources(value2){if(Array.isArray(value2)&&value2.every(source=>source==="user"||source==="project"||source==="local"))return[...value2]}function parseEnvironmentSettingSources(value2){if(value2!==void 0)return value2===""?[]:parseSettingSources(value2.split(",").map(source=>source.trim()))}function parseSystemPromptMode(value2){return value2==="preset-append"||value2==="full"||value2==="override"?value2:void 0}function parseResumeMode(value2){return value2==="auto"||value2==="off"?value2:void 0}function parseTokenInjection(value2){return value2==="oauth-slots"||value2==="config-dir"||value2==="ambient"?value2:void 0}function parseEnvironmentBoolean(value2){if(value2!==void 0)switch(value2.toLowerCase()){case"1":case"true":return!0;case"0":case"false":return!1;default:return}}function parseNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function parseProviderSettings(value2){if(!isRecord8(value2))return{};let enabled=typeof value2.enabled=="boolean"?value2.enabled:void 0,appendSystemPrompt=typeof value2.appendSystemPrompt=="boolean"?value2.appendSystemPrompt:void 0,systemPromptMode=parseSystemPromptMode(value2.systemPromptMode),systemPromptFile=parseNonEmptyString(value2.systemPromptFile),resumeMode=parseResumeMode(value2.resumeMode),settingSources=parseSettingSources(value2.settingSources),strictMcpConfig=typeof value2.strictMcpConfig=="boolean"?value2.strictMcpConfig:void 0,pinnedAccount=parseNonEmptyString(value2.pinnedAccount),tokenInjection=parseTokenInjection(value2.tokenInjection);return{...enabled!==void 0?{enabled}:{},...appendSystemPrompt!==void 0?{appendSystemPrompt}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...settingSources!==void 0?{settingSources}:{},...strictMcpConfig!==void 0?{strictMcpConfig}:{},...pinnedAccount!==void 0?{pinnedAccount}:{},...tokenInjection!==void 0?{tokenInjection}:{}}}function parseEnvironmentSettings(environment){let enabled=parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ENABLED),systemPromptMode=parseSystemPromptMode(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_MODE),systemPromptFile=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_FILE),resumeMode=parseResumeMode(environment.SENPI_CLAUDE_SDK_OAUTH_RESUME),tokenInjection=parseTokenInjection(environment.SENPI_CLAUDE_SDK_OAUTH_TOKEN_INJECTION),settingSources=parseEnvironmentSettingSources(environment.SENPI_CLAUDE_SDK_OAUTH_SETTING_SOURCES),pinnedAccount=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT);return{...enabled!==void 0?{enabled}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...tokenInjection!==void 0?{tokenInjection}:{},...settingSources!==void 0?{settingSources}:{},...pinnedAccount!==void 0?{pinnedAccount}:{}}}function resolveSystemPromptMode(settings){return settings.systemPromptMode!==void 0?{mode:settings.systemPromptMode,source:systemPromptModeSources.get(settings)??"setting",conflict:settings.appendSystemPrompt!==void 0}:settings.appendSystemPrompt!==void 0?{mode:settings.appendSystemPrompt?"full":"preset-append",source:"legacy",conflict:!1}:{mode:"full",source:"default",conflict:!1}}function loadAnthropicSubscriptionProviderSettings(settingsManager,environment=process.env){let global=settingsManager.getGlobalSettings(),project=settingsManager.getProjectSettings(),environmentSettings=parseEnvironmentSettings(environment),settings={...parseProviderSettings(global.anthropicSubscriptionProvider??global.claudeSdkOauthProvider),...parseProviderSettings(project.anthropicSubscriptionProvider??project.claudeSdkOauthProvider),...environmentSettings};return environmentSettings.systemPromptMode!==void 0&&systemPromptModeSources.set(settings,"env"),settings}function settingsFingerprint(path13){return getFileContentRevision(path13)??"missing"}var cachedAnthropicSubscriptionManager;function loadAnthropicSubscriptionProviderSettingsFromDisk(cwd){let agentDir=getAgentDir(),key=`${cwd}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"global"))}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"project"))}`,settingsManager=cachedAnthropicSubscriptionManager?.cwd===cwd&&cachedAnthropicSubscriptionManager.key===key?cachedAnthropicSubscriptionManager.manager:void 0;return settingsManager||(settingsManager=SettingsManager.create(cwd,agentDir),cachedAnthropicSubscriptionManager={cwd,key,manager:settingsManager}),loadAnthropicSubscriptionProviderSettings(settingsManager)}var cliPinsBySession=new Map,ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL="Anthropic Subscription";function asCredential(value2){return value2?.type==="oauth"?value2:void 0}function slotStatus(slot){return slot.blockReason==="auth_error"?"blocked until re-login":slot.blockedUntil!==void 0&&slot.blockedUntil>Date.now()?`blocked until ${new Date(slot.blockedUntil).toISOString()}`:"available"}function readAccounts(ctx,environment){let credential=asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID));return{credential,accounts:listAccounts(credential??emptyCredential(),environment)}}function accountError(ctx,name){ctx.ui.notify(`Anthropic Subscription account '${name}' does not exist.`,"error")}function parseArgs3(rawArgs){return rawArgs.trim().split(/\s+/).filter(Boolean)}function getSessionClaudeAccountPin(sessionId){return sessionId===void 0?void 0:cliPinsBySession.get(sessionId)}function resolveClaudeAccountPin(cliPinnedAccount,settingsPinnedAccount,storedPinnedAccount){return cliPinnedAccount??settingsPinnedAccount??storedPinnedAccount}function registerClaudeAccountCommand(pi,deps={}){let loadSettings=deps.loadSettings??loadAnthropicSubscriptionProviderSettingsFromDisk,environment=deps.environment??(name=>process.env[name]);pi.registerFlag("claude-account",{type:"string",description:"Pin Anthropic Subscription account for this session."}),pi.on("session_start",(_event,ctx)=>{let flag=pi.getFlag("claude-account"),sessionId=ctx.sessionManager.getSessionId();typeof flag=="string"&&flag.length>0?cliPinsBySession.set(sessionId,flag):cliPinsBySession.delete(sessionId)}),pi.on("session_shutdown",(_event,ctx)=>{cliPinsBySession.delete(ctx.sessionManager.getSessionId())}),pi.registerCommand("claude-account",{description:"List and manage Anthropic Subscription accounts.",argumentHint:"[add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]",handler:async(rawArgs,ctx)=>{if(await accountDisplayNameCommand(ctx,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,rawArgs))return;let args=parseArgs3(rawArgs),action=args[0]??"list";if(action==="list"){showAccounts2(ctx,loadSettings(ctx.cwd),environment);return}if(action==="add"){await addAccount2(ctx,deps);return}if(action==="remove"){await removeNamedAccount(ctx,args[1],environment);return}if(action==="pin"&&args[1]!=="unpin"){await pinNamedAccount(ctx,args[1],environment);return}if(action==="unpin"||action==="pin"&&args[1]==="unpin"){await unpinAccount(ctx);return}ctx.ui.notify("Usage: /claude-account [add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]","error")}})}function showAccounts2(ctx,settings,environment){let{credential,accounts}=readAccounts(ctx,environment),cliPin=getSessionClaudeAccountPin(ctx.sessionManager.getSessionId()),pinned=resolveClaudeAccountPin(cliPin,settings.pinnedAccount,credential?.pinned),pinSource=cliPin!==void 0?"CLI":settings.pinnedAccount!==void 0?"settings":"stored",affinityPick,affinityError;if(accounts.length>0)try{affinityPick=selectAccount(accounts,{sessionId:ctx.sessionManager.getSessionId(),pinnedAccount:pinned}).name}catch(error2){affinityError=error2 instanceof Error?error2.message:String(error2)}let lines=["Anthropic Subscription accounts:"];accounts.length===0&&lines.push(" (none)");for(let account of accounts){let states2=[accountLabel(account),account.source,slotStatus(account)];account.name===pinned&&states2.push("pinned"),account.name===affinityPick&&states2.push("affinity pick"),lines.push(` ${states2.join(" | ")}`)}let labelFor=name=>accountLabel(accounts.find(account=>account.name===name)??{name});lines.push(`Pinned account: ${pinned===void 0?"none":`${labelFor(pinned)} (${pinSource.toLowerCase()})`}`),lines.push(`Affinity pick: ${affinityPick===void 0?affinityError?`unavailable - ${affinityError}`:"none":labelFor(affinityPick)}`),ctx.ui.notify(lines.join(`
768
770
  `),"info")}async function addAccount2(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/claude-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("Anthropic Subscription account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!==LOGIN_CANCELLED_MESSAGE&&ctx.ui.notify(`Failed to add Anthropic Subscription account: ${message}`,"error")}}async function removeNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account remove <name>","error");return}let{accounts}=readAccounts(ctx,environment),target=accounts.find(account=>account.name===name);if(!target)return accountError(ctx,name);if(target.source==="env"){ctx.ui.notify(`Anthropic Subscription account '${name}' comes from the environment and cannot be removed.`,"error");return}try{await removeProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function pinNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account pin <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unpinAccount(ctx){if(!asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID))?.pinned){ctx.ui.notify("No stored Anthropic Subscription account pin is set.","info");return}await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned Anthropic Subscription account.","info")}var CLAUDE_SDK_OAUTH_API_ID="claude-sdk-oauth";import{spawn as spawn2}from"node:child_process";import{readFileSync as readFileSync14,statSync as statSync6}from"node:fs";import{createRequire as createRequire2}from"node:module";import{posix as posix2,win32 as win322}from"node:path";import{createHash as createHash3}from"crypto";import{chmodSync as chmodSync3,existsSync as existsSync8,lstatSync,mkdirSync as mkdirSync6,readFileSync as readFileSync12,renameSync as renameSync7,unlinkSync,writeFileSync as writeFileSync9}from"fs";import{tmpdir as osTmpdir}from"os";import{basename as basename7,join as join15}from"path";function tmpdir2(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join15(tmpdir2(),process.platform==="win32"?"claude":`claude-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync6(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync3(dir,448)}else try{mkdirSync6(dir,{recursive:!0,mode:448})}catch{}return dir}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync12(embeddedPath),hash=createHash3("sha256").update(content).digest("hex").slice(0,16),tmpDir=join15(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename7(embeddedPath),tmpPath=join15(tmpDir,fileName);if(mkdirSync6(tmpDir,{recursive:!0,mode:448}),existsSync8(tmpPath))return tmpPath;let tmpFile=join15(tmpDir,`${fileName}.tmp.${process.pid}`);writeFileSync9(tmpFile,content),chmodSync3(tmpFile,493);try{renameSync7(tmpFile,tmpPath)}catch(e){if((e.code==="EPERM"||e.code==="EBUSY")&&existsSync8(tmpPath)){try{unlinkSync(tmpFile)}catch{}return tmpPath}throw e}return tmpPath}catch(err2){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err2.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text2=deps.readText?.(batchPath),match=text2===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text2);if(!match?.[1])return;let target=win32.join(win32.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform4,pathext){return platform4!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform4,path13){if(path13===void 0)return[];let delimiter2=platform4==="win32"?";":":";return path13.split(delimiter2).map(entry=>platform4==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join94=deps.platform==="win32"?win32.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path13=join94(directory,candidate);if(!deps.isFile(path13))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win32.extname(path13).toLowerCase()))return path13;let target=nativeTargetOfBatchFile(path13,deps);if(target!==void 0)return target;deps.onSkip?.(path13)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync13}from"node:fs";import{dirname as dirname9,join as join16}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text2){let match=text2===void 0?null:VERSION_PATTERN.exec(text2);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath2(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync13(join16(dirname9(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform4,arch3,preferMusl=!1){let ext=platform4==="win32"?".exe":"";if(platform4==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch3}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch3}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform4}-${arch3}/claude${ext}`]}function spawnableSpelling(platform4,candidate){return platform4==="win32"?win322.toNamespacedPath(win322.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source)=>({executable,source,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
769
- `))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path13){try{return readFileSync14(path13,"utf8")}catch{return}}function isRegularFile(path13){try{return statSync6(path13).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,resolve:spec=>(defaultRequire||(defaultRequire=createRequire2(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var AMBIENT_STATUS_TTL_MS=3e4,AMBIENT_PROBE_TIMEOUT_MS=1e4;function createAmbientAuthStatusReader(probe,now2=Date.now,ttlMs=AMBIENT_STATUS_TTL_MS){let cached,inFlight,startProbe=()=>{let status=probe().then(value2=>(cached={at:now2(),value:value2},value2));inFlight=status;let clear=()=>{inFlight===status&&(inFlight=void 0)};return status.then(clear,clear),status};return signal=>signal?.aborted?Promise.reject(signal.reason):cached&&now2()-cached.at<ttlMs?Promise.resolve(cached.value):untilAborted(inFlight??startProbe(),signal)}function untilAborted(status,signal){if(signal===void 0)return status;if(signal.aborted)return Promise.reject(signal.reason);let abortController=new AbortController,aborted=new Promise((_resolve,reject)=>{signal.addEventListener("abort",()=>reject(signal.reason),{once:!0,signal:abortController.signal})});return Promise.race([status,aborted]).finally(()=>abortController.abort())}async function probeAmbientClaudeAuthStatus(options={}){let timeoutMs=options.timeoutMs??AMBIENT_PROBE_TIMEOUT_MS,spawnProbe=options.spawnProbe??((command,args)=>spawn2(command,[...args],{stdio:"ignore",windowsHide:!0})),executable;try{executable=resolveClaudeCodeExecutable(defaultExecutableDeps())}catch{return!1}return new Promise(resolve44=>{let settled=!1,finish=available=>{settled||(settled=!0,clearTimeout(deadline),resolve44(available))},child=spawnProbe(executable,["auth","status"]),deadline=setTimeout(()=>{child.kill("SIGKILL"),finish(!1)},timeoutMs);deadline.unref?.(),child.once("error",()=>finish(!1)),child.once("close",code=>finish(code===0))})}var readAmbientClaudeAuthStatus=createAmbientAuthStatusReader(probeAmbientClaudeAuthStatus);var ANTHROPIC_SUBSCRIPTION_NAME="Anthropic Subscription (Claude Pro/Max)",ENV_TOKEN_NAMES=["CLAUDE_CODE_OAUTH_TOKEN",...Array.from({length:15},(_,index)=>`CLAUDE_CODE_OAUTH_TOKEN_${index+2}`)],ENV_TOKEN_NAME_SET=new Set(ENV_TOKEN_NAMES),AUTH_CHECK={source:"Anthropic Subscription",type:"oauth"};function requestClaudeEnvironment(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let environment={};for(let[name,entry]of Object.entries(value2))ENV_TOKEN_NAME_SET.has(name)&&typeof entry=="string"&&(environment[name]=entry);return environment}function toSlot(credential,name,source){return{name,access:credential.access,refresh:credential.refresh,expires:credential.expires,source}}function recoveryTargetName(existing){if(existing.length===1)return existing[0]?.name;let authBlocked=existing.filter(slot=>slot.blockReason==="auth_error");if(authBlocked.length===1)return authBlocked[0]?.name}async function promptAccountName(callbacks,existing){if(existing.length===0)return"default";let recovery=recoveryTargetName(existing),fallback=`account-${existing.length+1}`;if(!callbacks.onPrompt)return recovery??fallback;let names=existing.map(slot=>slot.name).join(", "),message=recovery===void 0?`Name for this account (existing: ${names}; press Enter to add ${fallback}, or type an existing name to refresh it)`:`Name for this account (existing: ${names}; press Enter to refresh '${recovery}' with this login)`;return(await callbacks.onPrompt({message,placeholder:recovery??fallback})).trim()||recovery||fallback}function createOAuthConfig(deps){let claudeEnvironment=async ctx=>{let entries=await Promise.all(ENV_TOKEN_NAMES.map(async name=>[name,await ctx.env(name)]));return Object.fromEntries(entries.filter(entry=>entry[1]!==void 0))},configuredFor=async(ctx,stored,signal,environment)=>{let storedAccounts2=stored?.type==="oauth"&&Array.isArray(stored.accounts)?stored.accounts:[],selectedStoredAccount=stored?.type==="oauth"&&stored.access!==SENTINEL_OAUTH_FIELDS.access&&stored.refresh!==SENTINEL_OAUTH_FIELDS.refresh,effectiveEnvironment=environment??await claudeEnvironment(ctx),environmentTokenCount=Object.values(effectiveEnvironment).filter(Boolean).length,accountCount=storedAccounts2.length+(selectedStoredAccount?1:0)+environmentTokenCount,settings=deps.readSettings?.();return(settings?.tokenInjection??(accountCount>0?"oauth-slots":"ambient"))==="ambient"?environmentTokenCount>0?!0:settings?.enabled!==!0?!1:(deps.readAmbientAuthStatus??readAmbientClaudeAuthStatus)(signal):accountCount>0};return{name:ANTHROPIC_SUBSCRIPTION_NAME,async check({ctx,credential,signal}){let requestEnvironment=requestClaudeEnvironment(credential?.env);return await configuredFor(ctx,credential,signal,Object.keys(requestEnvironment).length>0?requestEnvironment:void 0)?AUTH_CHECK:void 0},async resolveAmbient({ctx,env,signal}){let requestEnvironment=requestClaudeEnvironment(env),environment=Object.keys(requestEnvironment).length>0?requestEnvironment:await claudeEnvironment(ctx);if(await configuredFor(ctx,void 0,signal,environment))return{auth:{apiKey:SENTINEL_OAUTH_FIELDS.access},...Object.keys(environment).length>0?{env:environment}:{},source:AUTH_CHECK.source}},async login(callbacks){let current=await deps.readCurrent()??emptyCredential();if(listAccounts(current).length===0&&deps.readAnthropicCredential&&callbacks.onPrompt){let imported=await deps.readAnthropicCredential();if(imported){let answer=(await callbacks.onPrompt({message:"An Anthropic OAuth login already exists. Move it here (the anthropic provider is logged out) instead of a new login? [y/N]"})).trim().toLowerCase();if(answer==="y"||answer==="yes")return await deps.removeAnthropicCredential?.(),addAccount(current,toSlot(imported,"imported-anthropic","import"))}}let interaction={signal:callbacks.signal??new AbortController().signal,prompt:async prompt=>prompt.type==="select"?"":callbacks.onPrompt?callbacks.onPrompt({message:prompt.message}):"",notify:event=>{event.type==="auth_url"&&callbacks.onAuth&&callbacks.onAuth({url:event.url}),event.type==="progress"&&callbacks.onProgress&&callbacks.onProgress(event.message)}},credential=await(deps.loginFlow??await loadAnthropicOAuth()).login(interaction),existingAfter=listAccounts(current),name=await promptAccountName(callbacks,existingAfter);return upsertAccount(current,toSlot(credential,name,"login"))},async refreshToken(credentials){return credentials},getApiKey(_credentials){return SENTINEL_OAUTH_FIELDS.access}}}import{createHash as createHash4}from"node:crypto";var IMAGE_MEDIA_TYPES=["image/jpeg","image/png","image/gif","image/webp"];function appendSdkContentBlocks(blocks,content){if(typeof content=="string")return content.length>0&&blocks.push({type:"text",text:content}),content.trim().length>0;let hasText=!1;for(let entry of content)hasText=appendEntry(blocks,entry)||hasText;return hasText}function isRecord9(value2){return typeof value2=="object"&&value2!==null}function parseImageMediaType(value2){for(let mediaType of IMAGE_MEDIA_TYPES)if(mediaType===value2)return mediaType}function omittedPlaceholder(entry){return isRecord9(entry)&&typeof entry.type=="string"?entry.type==="image"?typeof entry.mimeType=="string"&&typeof entry.data=="string"?`[image block omitted: unsupported media type ${entry.mimeType}]`:"[image block omitted: missing data]":`[unsupported content block omitted: ${entry.type}]`:"[unsupported content block omitted]"}function imageFromEntry(entry){if(typeof entry.mimeType!="string"||typeof entry.data!="string")return;let mediaType=parseImageMediaType(entry.mimeType);if(mediaType!==void 0)return{type:"image",source:{type:"base64",media_type:mediaType,data:entry.data}}}function appendEntry(blocks,entry){if(typeof entry=="string")return blocks.push({type:"text",text:entry}),entry.trim().length>0;if(!isRecord9(entry))return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0;if(entry.type==="text")return typeof entry.text=="string"?(blocks.push({type:"text",text:entry.text}),entry.text.trim().length>0):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0);if(entry.type==="image"){let image=imageFromEntry(entry);return image?(blocks.push(image),!1):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0)}return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0}var SDK_TO_PI_TOOL_NAME={read:"read",write:"write",edit:"edit",bash:"bash",grep:"grep",glob:"find"},PI_TO_SDK_TOOL_NAME={read:"Read",write:"Write",edit:"Edit",bash:"Bash",grep:"Grep",find:"Glob",glob:"Glob"},HOST_TOOL_POLICY_FINGERPRINT="host-tool-denial-v2",BUILTIN_SDK_TOOLS=["Read","Write","Edit","Bash","Grep","Glob"],TOOL_EXECUTION_DENIED_MESSAGE="Senpi executes this tool on the host and returns its result as the next user message. Wait for that result; this denial is not a failure.",HOST_TOOL_EXECUTION_DENIED_MESSAGE=TOOL_EXECUTION_DENIED_MESSAGE,CUSTOM_TOOLS_MCP_SERVER_NAME="custom-tools",CUSTOM_TOOLS_MCP_PREFIX=`mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`,HOST_CAPTURED_SDK_TOOL_MATCHER="Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*",HOST_TOOL_DENIAL_HOOKS={PreToolUse:[{matcher:HOST_CAPTURED_SDK_TOOL_MATCHER,hooks:[async()=>({continue:!1,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:HOST_TOOL_EXECUTION_DENIED_MESSAGE}})]}]};function pascalCase(value2){return value2.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(part=>`${part[0]?.toUpperCase()??""}${part.slice(1)}`).join("")}function mapPiToolNameToSdk(name,customToolNameToSdk){let normalized2=name.toLowerCase();return customToolNameToSdk?.get(name)??customToolNameToSdk?.get(normalized2)??PI_TO_SDK_TOOL_NAME[normalized2]??pascalCase(name)}function mapSdkToolNameToPi(name,customToolNameToPi){let normalized2=name.toLowerCase();return SDK_TO_PI_TOOL_NAME[normalized2]??customToolNameToPi?.get(name)??customToolNameToPi?.get(normalized2)??(normalized2.startsWith(CUSTOM_TOOLS_MCP_PREFIX)?name.slice(CUSTOM_TOOLS_MCP_PREFIX.length):name)}function mapToolArgs(toolName,args){let input=args??{};switch(toolName.toLowerCase()){case"read":return{path:input.file_path??input.path,offset:input.offset,limit:input.limit};case"write":return{path:input.file_path??input.path,content:input.content};case"edit":return{path:input.file_path??input.path,edits:Array.isArray(input.edits)?input.edits:[{oldText:input.old_string??input.oldText??input.old_text,newText:input.new_string??input.newText??input.new_text}]};case"bash":return{command:input.command,timeout:typeof input.timeout=="number"?input.timeout/1e3:input.timeout};case"grep":return{pattern:input.pattern,path:input.path,glob:input.glob,ignoreCase:input["-i"]??input.ignoreCase,context:input.context??input["-C"],limit:input.head_limit??input.limit};case"glob":case"find":return{pattern:input.pattern,path:input.path,limit:input.limit};default:return{...input}}}function resolveSdkTools(context){if(!context.tools)return{sdkTools:[...BUILTIN_SDK_TOOLS],customTools:[],customToolNameToSdk:new Map,customToolNameToPi:new Map};let sdkTools2=new Set,customTools=[],customToolNameToSdk=new Map,customToolNameToPi=new Map;for(let tool of context.tools){let normalized2=tool.name.toLowerCase(),sdkName=PI_TO_SDK_TOOL_NAME[normalized2];if(sdkName){sdkTools2.add(sdkName);continue}let customSdkName=`${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;customTools.push(tool),customToolNameToSdk.set(tool.name,customSdkName),customToolNameToSdk.set(normalized2,customSdkName),customToolNameToPi.set(customSdkName,tool.name),customToolNameToPi.set(customSdkName.toLowerCase(),tool.name)}return{sdkTools:[...sdkTools2],customTools,customToolNameToSdk,customToolNameToPi}}var canUseTool=async()=>({behavior:"deny",message:TOOL_EXECUTION_DENIED_MESSAGE});var sentHashesByEntry=new WeakMap;function stableValue(value2,seen=new WeakSet){if(typeof value2=="function")return`[function:${value2.name}:${value2.toString()}]`;if(typeof value2=="bigint")return value2.toString();if(value2===null||typeof value2!="object")return value2;if(seen.has(value2))return"[circular]";seen.add(value2);let normalized2=Array.isArray(value2)?value2.map(item=>stableValue(item,seen)):Object.fromEntries(Object.entries(value2).filter(([,item])=>item!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key,item])=>[key,stableValue(item,seen)]));return seen.delete(value2),normalized2}function digest(value2){return createHash4("sha256").update(JSON.stringify(stableValue(value2))).digest("hex")}function sessionSyncDigest(value2){return digest(value2)}function isContentlessUserMessage(message){return message.role!=="user"?!1:Array.isArray(message.content)&&message.content.length===0}function sentMessages(context){return context.messages.filter(isTransmittedMessage)}function isTransmittedMessage(message){return message.role!=="user"&&message.role!=="toolResult"?!1:!isContentlessUserMessage(message)}function sentMessageHashes(messages){return messages.filter(isTransmittedMessage).map(message=>digest(message.role==="user"?{role:message.role,content:message.content}:{role:message.role,toolCallId:message.toolCallId,toolName:message.toolName,content:message.content}))}function sentHashPrefixDigest(hashes,count=hashes.length){return digest(hashes.slice(0,count))}function sentHashesForEntry(entry){return sentHashesByEntry.get(entry)}function recordSyncedStream(entry,hashes){let copy=[...hashes];sentHashesByEntry.set(entry,copy),entry.sentCount=copy.length,entry.syncedPrefixHash=sentHashPrefixDigest(copy),entry.branchInfo=null}function configFingerprint(options,context,authLane,accountName2){return{systemPromptHash:digest(options.systemPrompt??null),toolsetHash:digest({tools:options.tools??[],reasoning:{thinking:options.thinking,effort:options.effort,maxThinkingTokens:options.maxThinkingTokens},contextTools:(context.tools??[]).map(tool=>({name:tool.name,description:tool.description,parameters:tool.parameters})),cwd:options.cwd,authLane,accountName:accountName2,permissionMode:options.permissionMode,hostToolPolicy:HOST_TOOL_POLICY_FINGERPRINT,settingSources:options.settingSources,extraArgs:options.extraArgs,pathToClaudeCodeExecutable:options.pathToClaudeCodeExecutable,includePartialMessages:options.includePartialMessages})}}function appendContent(blocks,content){if(content===""){blocks.push({type:"text",text:""});return}appendSdkContentBlocks(blocks,content)}function buildDeltaPromptBlocks(messages,customToolNameToSdk){let blocks=[];for(let[index,message]of messages.entries())index>0&&blocks.push({type:"text",text:`
771
+ `))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path13){try{return readFileSync14(path13,"utf8")}catch{return}}function isRegularFile(path13){try{return statSync6(path13).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,resolve:spec=>(defaultRequire||(defaultRequire=createRequire2(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var AMBIENT_STATUS_TTL_MS=3e4,AMBIENT_PROBE_TIMEOUT_MS=1e4;function createAmbientAuthStatusReader(probe,now2=Date.now,ttlMs=AMBIENT_STATUS_TTL_MS){let cached,inFlight,startProbe=()=>{let status=probe().then(value2=>(cached={at:now2(),value:value2},value2));inFlight=status;let clear=()=>{inFlight===status&&(inFlight=void 0)};return status.then(clear,clear),status};return signal=>signal?.aborted?Promise.reject(signal.reason):cached&&now2()-cached.at<ttlMs?Promise.resolve(cached.value):untilAborted(inFlight??startProbe(),signal)}function untilAborted(status,signal){if(signal===void 0)return status;if(signal.aborted)return Promise.reject(signal.reason);let abortController=new AbortController,aborted=new Promise((_resolve,reject)=>{signal.addEventListener("abort",()=>reject(signal.reason),{once:!0,signal:abortController.signal})});return Promise.race([status,aborted]).finally(()=>abortController.abort())}async function probeAmbientClaudeAuthStatus(options={}){let timeoutMs=options.timeoutMs??AMBIENT_PROBE_TIMEOUT_MS,spawnProbe=options.spawnProbe??((command,args)=>spawn2(command,[...args],{stdio:"ignore",windowsHide:!0})),executable;try{executable=resolveClaudeCodeExecutable(defaultExecutableDeps())}catch{return!1}return new Promise(resolve44=>{let settled=!1,finish=available=>{settled||(settled=!0,clearTimeout(deadline),resolve44(available))},child=spawnProbe(executable,["auth","status"]),deadline=setTimeout(()=>{child.kill("SIGKILL"),finish(!1)},timeoutMs);deadline.unref?.(),child.once("error",()=>finish(!1)),child.once("close",code=>finish(code===0))})}var readAmbientClaudeAuthStatus=createAmbientAuthStatusReader(probeAmbientClaudeAuthStatus);var ANTHROPIC_SUBSCRIPTION_NAME="Anthropic Subscription (Claude Pro/Max)",ENV_TOKEN_NAMES=["CLAUDE_CODE_OAUTH_TOKEN",...Array.from({length:15},(_,index)=>`CLAUDE_CODE_OAUTH_TOKEN_${index+2}`)],ENV_TOKEN_NAME_SET=new Set(ENV_TOKEN_NAMES),AUTH_CHECK={source:"Anthropic Subscription",type:"oauth"};function requestClaudeEnvironment(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let environment={};for(let[name,entry]of Object.entries(value2))ENV_TOKEN_NAME_SET.has(name)&&typeof entry=="string"&&(environment[name]=entry);return environment}function toSlot(credential,name,source){return{name,access:credential.access,refresh:credential.refresh,expires:credential.expires,source}}function recoveryTargetName(existing){if(existing.length===1)return existing[0]?.name;let authBlocked=existing.filter(slot=>slot.blockReason==="auth_error");if(authBlocked.length===1)return authBlocked[0]?.name}async function promptAccountName(callbacks,existing){if(existing.length===0)return"default";let recovery=recoveryTargetName(existing),fallback=`account-${existing.length+1}`;if(!callbacks.onPrompt)return recovery??fallback;let names=existing.map(slot=>slot.name).join(", "),message=recovery===void 0?`Name for this account (existing: ${names}; press Enter to add ${fallback}, or type an existing name to refresh it)`:`Name for this account (existing: ${names}; press Enter to refresh '${recovery}' with this login)`;return(await callbacks.onPrompt({message,placeholder:recovery??fallback})).trim()||recovery||fallback}function createOAuthConfig(deps){let claudeEnvironment=async ctx=>{let entries=await Promise.all(ENV_TOKEN_NAMES.map(async name=>[name,await ctx.env(name)]));return Object.fromEntries(entries.filter(entry=>entry[1]!==void 0))},configuredFor=async(ctx,stored,signal,environment)=>{let storedAccounts2=stored?.type==="oauth"&&Array.isArray(stored.accounts)?stored.accounts:[],selectedStoredAccount=stored?.type==="oauth"&&stored.access!==SENTINEL_OAUTH_FIELDS.access&&stored.refresh!==SENTINEL_OAUTH_FIELDS.refresh,effectiveEnvironment=environment??await claudeEnvironment(ctx),environmentTokenCount=Object.values(effectiveEnvironment).filter(Boolean).length,accountCount=storedAccounts2.length+(selectedStoredAccount?1:0)+environmentTokenCount,settings=deps.readSettings?.();return(settings?.tokenInjection??(accountCount>0?"oauth-slots":"ambient"))==="ambient"?environmentTokenCount>0?!0:settings?.enabled!==!0?!1:(deps.readAmbientAuthStatus??readAmbientClaudeAuthStatus)(signal):accountCount>0};return{name:ANTHROPIC_SUBSCRIPTION_NAME,async check({ctx,credential,signal}){let requestEnvironment=requestClaudeEnvironment(credential?.env);return await configuredFor(ctx,credential,signal,Object.keys(requestEnvironment).length>0?requestEnvironment:void 0)?AUTH_CHECK:void 0},async resolveAmbient({ctx,env,signal}){let requestEnvironment=requestClaudeEnvironment(env),environment=Object.keys(requestEnvironment).length>0?requestEnvironment:await claudeEnvironment(ctx);if(await configuredFor(ctx,void 0,signal,environment))return{auth:{apiKey:SENTINEL_OAUTH_FIELDS.access},...Object.keys(environment).length>0?{env:environment}:{},source:AUTH_CHECK.source}},async login(callbacks){let current=await deps.readCurrent()??emptyCredential();if(listAccounts(current).length===0&&deps.readAnthropicCredential&&callbacks.onPrompt){let imported=await deps.readAnthropicCredential();if(imported){let answer=(await callbacks.onPrompt({message:"An Anthropic OAuth login already exists. Move it here (the anthropic provider is logged out) instead of a new login? [y/N]"})).trim().toLowerCase();if(answer==="y"||answer==="yes")return await deps.removeAnthropicCredential?.(),addAccount(current,toSlot(imported,"imported-anthropic","import"))}}let interaction={signal:callbacks.signal??new AbortController().signal,prompt:async prompt=>prompt.type==="select"?"":callbacks.onPrompt?callbacks.onPrompt({message:prompt.message}):"",notify:event=>{event.type==="auth_url"&&callbacks.onAuth&&callbacks.onAuth({url:event.url}),event.type==="progress"&&callbacks.onProgress&&callbacks.onProgress(event.message)}},credential=await(deps.loginFlow??await loadAnthropicOAuth()).login(interaction),existingAfter=listAccounts(current),name=await promptAccountName(callbacks,existingAfter);return upsertAccount(current,toSlot(credential,name,"login"))},async refreshToken(credentials){return credentials},getApiKey(_credentials){return SENTINEL_OAUTH_FIELDS.access}}}import{createHash as createHash4}from"node:crypto";var IMAGE_MEDIA_TYPES=["image/jpeg","image/png","image/gif","image/webp"];function appendSdkContentBlocks(blocks,content){if(typeof content=="string")return content.length>0&&blocks.push({type:"text",text:content}),content.trim().length>0;let hasText=!1;for(let entry of content)hasText=appendEntry(blocks,entry)||hasText;return hasText}function isRecord9(value2){return typeof value2=="object"&&value2!==null}function parseImageMediaType(value2){for(let mediaType of IMAGE_MEDIA_TYPES)if(mediaType===value2)return mediaType}function omittedPlaceholder(entry){return isRecord9(entry)&&typeof entry.type=="string"?entry.type==="image"?typeof entry.mimeType=="string"&&typeof entry.data=="string"?`[image block omitted: unsupported media type ${entry.mimeType}]`:"[image block omitted: missing data]":`[unsupported content block omitted: ${entry.type}]`:"[unsupported content block omitted]"}function imageFromEntry(entry){if(typeof entry.mimeType!="string"||typeof entry.data!="string")return;let mediaType=parseImageMediaType(entry.mimeType);if(mediaType!==void 0)return{type:"image",source:{type:"base64",media_type:mediaType,data:entry.data}}}function appendEntry(blocks,entry){if(typeof entry=="string")return blocks.push({type:"text",text:entry}),entry.trim().length>0;if(!isRecord9(entry))return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0;if(entry.type==="text")return typeof entry.text=="string"?(blocks.push({type:"text",text:entry.text}),entry.text.trim().length>0):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0);if(entry.type==="image"){let image=imageFromEntry(entry);return image?(blocks.push(image),!1):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0)}return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0}var SDK_TO_PI_TOOL_NAME={read:"read",write:"write",edit:"edit",bash:"bash",grep:"grep",glob:"find"},PI_TO_SDK_TOOL_NAME={read:"Read",bash:"Bash",grep:"Grep",find:"Glob",glob:"Glob"},HOST_TOOL_POLICY_FINGERPRINT="host-tool-denial-v3",BUILTIN_SDK_TOOLS=["Read","Bash","Grep","Glob"],TOOL_EXECUTION_DENIED_MESSAGE="Senpi executes this tool on the host and returns its result as the next user message. Wait for that result; this denial is not a failure.",HOST_TOOL_EXECUTION_DENIED_MESSAGE=TOOL_EXECUTION_DENIED_MESSAGE,CUSTOM_TOOLS_MCP_SERVER_NAME="custom-tools",CUSTOM_TOOLS_MCP_PREFIX=`mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`,HOST_CAPTURED_SDK_TOOL_MATCHER="Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*",HOST_TOOL_DENIAL_HOOKS={PreToolUse:[{matcher:HOST_CAPTURED_SDK_TOOL_MATCHER,hooks:[async()=>({continue:!1,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:HOST_TOOL_EXECUTION_DENIED_MESSAGE}})]}]};function pascalCase(value2){return value2.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(part=>`${part[0]?.toUpperCase()??""}${part.slice(1)}`).join("")}function mapPiToolNameToSdk(name,customToolNameToSdk){let normalized2=name.toLowerCase();return customToolNameToSdk?.get(name)??customToolNameToSdk?.get(normalized2)??PI_TO_SDK_TOOL_NAME[normalized2]??pascalCase(name)}function mapSdkToolNameToPi(name,customToolNameToPi){let normalized2=name.toLowerCase();return SDK_TO_PI_TOOL_NAME[normalized2]??customToolNameToPi?.get(name)??customToolNameToPi?.get(normalized2)??(normalized2.startsWith(CUSTOM_TOOLS_MCP_PREFIX)?name.slice(CUSTOM_TOOLS_MCP_PREFIX.length):name)}function mapToolArgs(toolName,args){let input=args??{};switch(toolName.toLowerCase()){case"read":return{path:input.file_path??input.path,offset:input.offset,limit:input.limit};case"write":return{path:input.file_path??input.path,content:input.content};case"edit":return{path:input.file_path??input.path,edits:Array.isArray(input.edits)?input.edits:[{oldText:input.old_string??input.oldText??input.old_text,newText:input.new_string??input.newText??input.new_text}]};case"bash":return{command:input.command,timeout:typeof input.timeout=="number"?input.timeout/1e3:input.timeout};case"grep":return{pattern:input.pattern,path:input.path,glob:input.glob,ignoreCase:input["-i"]??input.ignoreCase,context:input.context??input["-C"],limit:input.head_limit??input.limit};case"glob":case"find":return{pattern:input.pattern,path:input.path,limit:input.limit};default:return{...input}}}function resolveSdkTools(context){if(!context.tools)return{sdkTools:[...BUILTIN_SDK_TOOLS],customTools:[],customToolNameToSdk:new Map,customToolNameToPi:new Map};let sdkTools2=new Set,customTools=[],customToolNameToSdk=new Map,customToolNameToPi=new Map;for(let tool of context.tools){let normalized2=tool.name.toLowerCase(),sdkName=PI_TO_SDK_TOOL_NAME[normalized2];if(sdkName){sdkTools2.add(sdkName);continue}let customSdkName=`${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;customTools.push(tool),customToolNameToSdk.set(tool.name,customSdkName),customToolNameToSdk.set(normalized2,customSdkName),customToolNameToPi.set(customSdkName,tool.name),customToolNameToPi.set(customSdkName.toLowerCase(),tool.name)}return{sdkTools:[...sdkTools2],customTools,customToolNameToSdk,customToolNameToPi}}var canUseTool=async()=>({behavior:"deny",message:TOOL_EXECUTION_DENIED_MESSAGE});var sentHashesByEntry=new WeakMap;function stableValue(value2,seen=new WeakSet){if(typeof value2=="function")return`[function:${value2.name}:${value2.toString()}]`;if(typeof value2=="bigint")return value2.toString();if(value2===null||typeof value2!="object")return value2;if(seen.has(value2))return"[circular]";seen.add(value2);let normalized2=Array.isArray(value2)?value2.map(item=>stableValue(item,seen)):Object.fromEntries(Object.entries(value2).filter(([,item])=>item!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key,item])=>[key,stableValue(item,seen)]));return seen.delete(value2),normalized2}function digest(value2){return createHash4("sha256").update(JSON.stringify(stableValue(value2))).digest("hex")}function sessionSyncDigest(value2){return digest(value2)}function isContentlessUserMessage(message){return message.role!=="user"?!1:Array.isArray(message.content)&&message.content.length===0}function sentMessages(context){return context.messages.filter(isTransmittedMessage)}function isTransmittedMessage(message){return message.role!=="user"&&message.role!=="toolResult"?!1:!isContentlessUserMessage(message)}function sentMessageHashes(messages){return messages.filter(isTransmittedMessage).map(message=>digest(message.role==="user"?{role:message.role,content:message.content}:{role:message.role,toolCallId:message.toolCallId,toolName:message.toolName,content:message.content}))}function sentHashPrefixDigest(hashes,count=hashes.length){return digest(hashes.slice(0,count))}function sentHashesForEntry(entry){return sentHashesByEntry.get(entry)}function recordSyncedStream(entry,hashes){let copy=[...hashes];sentHashesByEntry.set(entry,copy),entry.sentCount=copy.length,entry.syncedPrefixHash=sentHashPrefixDigest(copy),entry.branchInfo=null}function configFingerprint(options,context,authLane,accountName2){return{systemPromptHash:digest(options.systemPrompt??null),toolsetHash:digest({tools:options.tools??[],reasoning:{thinking:options.thinking,effort:options.effort,maxThinkingTokens:options.maxThinkingTokens},contextTools:(context.tools??[]).map(tool=>({name:tool.name,description:tool.description,parameters:tool.parameters})),cwd:options.cwd,authLane,accountName:accountName2,permissionMode:options.permissionMode,hostToolPolicy:HOST_TOOL_POLICY_FINGERPRINT,settingSources:options.settingSources,extraArgs:options.extraArgs,pathToClaudeCodeExecutable:options.pathToClaudeCodeExecutable,includePartialMessages:options.includePartialMessages})}}function appendContent(blocks,content){if(content===""){blocks.push({type:"text",text:""});return}appendSdkContentBlocks(blocks,content)}function buildDeltaPromptBlocks(messages,customToolNameToSdk){let blocks=[];for(let[index,message]of messages.entries())index>0&&blocks.push({type:"text",text:`
770
772
 
771
773
  `}),message.role==="toolResult"&&blocks.push({type:"text",text:`Tool result (${mapPiToolNameToSdk(message.toolName,customToolNameToSdk)}, id=${message.toolCallId}):
772
774
  `}),appendContent(blocks,message.content);return blocks}function semanticContentBlock(block){switch(block.type){case"text":return{type:block.type,text:block.text};case"thinking":return{type:block.type,thinking:block.thinking,thinkingSignature:block.thinkingSignature};case"toolCall":return{type:block.type,id:block.id,name:block.name,arguments:block.arguments};default:return block}}function assistantContentHash(message){return sessionSyncDigest({role:message.role,api:message.api,provider:message.provider,model:message.model,content:message.content.map(semanticContentBlock)})}function isResidentAssistant(message,modelId){return message.api===CLAUDE_SDK_OAUTH_API_ID&&message.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.model===modelId}function isTerminalFailure(message){return message.stopReason==="error"||message.stopReason==="aborted"}var AssistantCommitBoundary=class{constructor(){this.providerFinalByKey=new Map}captureProviderFinal(key,message){this.providerFinalByKey.set(key,assistantContentHash(message))}commit(key,message,modelId){let providerFinal=this.providerFinalByKey.get(key);return this.providerFinalByKey.delete(key),isResidentAssistant(message,modelId)?providerFinal===void 0||providerFinal===assistantContentHash(message)?"clean":"rewritten":"not-resident"}forget(key){this.providerFinalByKey.delete(key)}};var BINDING_ENTRY_TYPE="claude-sdk-oauth-binding",BINDING_MARKER={schemaVersion:2,marker:!0};function storedBindingFromEntry(entry,hashes,anchor){return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:entry.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:entry.assistantUuidByIndex.get(hashes.length)??null,accountName:entry.accountName,modelId:entry.modelId,systemPromptHash:entry.systemPromptHash,toolsetHash:entry.toolsetHash}}function storedBindingFromBinding(binding,hashes,anchor){if(binding.sdkSessionIdConfirmed===!1||binding.sentCount!==hashes.length)return;let expectedDigest=sentHashPrefixDigest(hashes),bindingDigest=binding.sentPrefixHash??(binding.sentHashes.length>0?sentHashPrefixDigest(binding.sentHashes):void 0);if(!(bindingDigest===void 0||bindingDigest!==expectedDigest))return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:binding.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:binding.lastAssistantUuid,accountName:binding.accountName,modelId:binding.modelId,systemPromptHash:binding.systemPromptHash,toolsetHash:binding.toolsetHash}}function invalidationReasonFromBranch(branch){let index=newestBindingEntryIndex(branch);if(index<0)return;let data=branch[index]?.data;return isBindingInvalidation(data)?data.reason:void 0}function isBindingInvalidation(value2){return typeof value2!="object"||value2===null?!1:"invalidated"in value2&&value2.invalidated===!0&&"reason"in value2&&typeof value2.reason=="string"}function bindingFromStoredBranch(branch,stored){let markerIndex=newestBindingEntryIndex(branch);if(markerIndex<0)return;let marker=branch[markerIndex];if(marker?.id!==stored.markerEntryId||!isBindingMarker(marker.data))return;let assistantIndex=committedAssistantIndex(branch,markerIndex+1);if(assistantIndex<0||!branch.slice(assistantIndex+1).every(isAppendOnlyTailEntry))return;let committedAssistant=branch[assistantIndex]?.message;if(isAssistantMessage(committedAssistant)&&assistantContentHash(committedAssistant)===stored.assistantContentHash)return bindingFromStored(stored)}function committedAssistantIndex(branch,from){for(let index=from;index<branch.length;index+=1){let entry=branch[index];if(entry?.type==="message")return index;if(!entry||!isLedgerOnlyEntry(entry))return-1}return-1}var LEDGER_ONLY_ENTRY_TYPES=new Set(["custom","label","session_info","thinking_level_change","model_change","model_change_rejected","configuration_update"]);function isLedgerOnlyEntry(entry){return entry.type==="custom_message"?entry.customType===GOAL_CONTINUATION_MESSAGE_TYPE:LEDGER_ONLY_ENTRY_TYPES.has(entry.type)}function isAppendOnlyTailEntry(entry){if(isLedgerOnlyEntry(entry)||entry.type==="custom_message")return!0;if(entry.type!=="message")return!1;let message=entry.message;return typeof message!="object"||message===null||!("role"in message)?!1:message.role==="user"||message.role==="toolResult"}function newestBindingEntryIndex(branch){for(let index=branch.length-1;index>=0;index-=1){let entry=branch[index];if(entry?.type==="custom"&&entry.customType===BINDING_ENTRY_TYPE)return index}return-1}function isBindingMarker(value2){return typeof value2!="object"||value2===null?!1:"schemaVersion"in value2&&value2.schemaVersion===2&&"marker"in value2&&value2.marker===!0}function isAssistantMessage(value2){return typeof value2!="object"||value2===null?!1:"role"in value2&&value2.role==="assistant"&&"api"in value2&&typeof value2.api=="string"&&"provider"in value2&&typeof value2.provider=="string"&&"model"in value2&&typeof value2.model=="string"&&"content"in value2&&Array.isArray(value2.content)}function bindingFromStored(stored){return{senpiSessionId:stored.sessionId,sdkSessionId:stored.sdkSessionId,sentCount:stored.sentCount,sentHashes:[],sentPrefixHash:stored.sentPrefixHash,lastAssistantUuid:stored.lastAssistantUuid,assistantUuidByIndex:stored.lastAssistantUuid===null?[]:[[stored.sentCount,stored.lastAssistantUuid]],accountName:stored.accountName,modelId:stored.modelId,systemPromptHash:stored.systemPromptHash,toolsetHash:stored.toolsetHash}}import{randomUUID as randomUUID5}from"node:crypto";import{realpathSync as realpathSync2}from"node:fs";import{readFile as readFile3,rename as rename3,rm as rm6,stat as stat3,writeFile as writeFile3}from"node:fs/promises";import{basename as basename8,dirname as dirname10,join as join17,resolve as resolve6}from"node:path";var SHA256_HEX=/^[0-9a-f]{64}$/,MAX_RECORD_BYTES=16*1024,storedBindingSchema=external_exports.strictObject({schemaVersion:external_exports.literal(1),sessionPath:external_exports.string().min(1).max(4096),sessionId:external_exports.string().min(1).max(256),markerEntryId:external_exports.string().min(1).max(256),sdkSessionId:external_exports.string().min(1).max(256),sentCount:external_exports.number().int().nonnegative().safe(),sentPrefixHash:external_exports.string().regex(SHA256_HEX),assistantContentHash:external_exports.string().regex(SHA256_HEX),lastAssistantUuid:external_exports.string().min(1).max(256).nullable(),accountName:external_exports.string().min(1).max(256),modelId:external_exports.string().min(1).max(256),systemPromptHash:external_exports.string().regex(SHA256_HEX),toolsetHash:external_exports.string().regex(SHA256_HEX)});function bindingSidecarPath(sessionFile){return`${canonicalSessionPath(sessionFile)}.claude-sdk-oauth-binding.json`}function canonicalSessionPath(sessionFile){let resolved=resolve6(sessionFile);try{return realpathSync2(resolved)}catch{try{return join17(realpathSync2(dirname10(resolved)),basename8(resolved))}catch{return resolved}}}async function readStoredBinding(sessionFile){let path13=bindingSidecarPath(sessionFile),metadata;try{metadata=await stat3(path13)}catch(error2){if(isNotFoundError(error2))return;throw error2}if(metadata.size>MAX_RECORD_BYTES)return;let value2;try{value2=JSON.parse(await readFile3(path13,"utf8"))}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}let parsed=storedBindingSchema.safeParse(value2);if(!(!parsed.success||parsed.data.sessionPath!==canonicalSessionPath(sessionFile)))return parsed.data}async function writeStoredBinding(sessionFile,record7){let sessionPath=canonicalSessionPath(sessionFile),parsed=storedBindingSchema.parse(record7);if(canonicalSessionPath(parsed.sessionPath)!==sessionPath)throw new StoredBindingPathError(sessionPath,parsed.sessionPath);let canonical={...parsed,sessionPath},serialized=`${JSON.stringify(canonical)}
@@ -810,7 +812,7 @@ ${ANTHROPIC_WEB_SEARCH_SECTION}`}},{previewSafe:!0})}function pickVariant(model)
810
812
  `)}case"timed_out":{let lines=[`The user did not answer within ${Math.round((response.autoResolvedAfterMs??DEFAULT_ASK_USER_TIMEOUT_MS)/6e4)} minutes. (\uC0AC\uC6A9\uC790\uAC00 \uB2F5\uBCC0\uC744 \uC548\uD558\uACE0 timeout \uC73C\uB85C \uC885\uB8CC\uB428)`],selected=answeredLines(response,questions);return selected.length>0&&lines.push(`Before going idle the user had selected: ${selected.join("; ")}`),lines.push("Continue the work to completion on your best judgment; do not ask this question again this turn."),lines.join(`
811
813
  `)}case"cancelled":return"The user dismissed the question.";case"orphaned-after-restart":return"The pending question could not be resumed after a restart; continue on best judgment.";case"unavailable":return"This session has no user attached (subagent or headless); decide on best judgment."}}function formatResultText(_variant,response,questions=[]){return formatBody(response,questions)}function formatUserMessage(response,requestId,questions=[]){return`[Answer to question ${requestId}]
812
814
  ${formatBody(response,questions)}`}function parseAskUserAnswerFrame(text2){let match=/^\[Answer to question ([^\]\r\n]+)\]\r?\n([\s\S]*)$/.exec(text2);return match?{requestId:match[1],body:match[2]}:void 0}function selectedAnswers(answer){if(answer.selected.length>0)return answer.selected;let text2=answer.text?.trim();return text2===void 0||text2.length===0?[]:[text2]}function formatResultDetails(variant,response,questions=[]){if(variant==="codex"){let answers2={};for(let[id,answer]of Object.entries(response.answers))answers2[id]={answers:selectedAnswers(answer)};let details2={answers:answers2,unanswered:response.unanswered,status:response.status};return response.comment!==void 0&&(details2.comment=response.comment),details2}let answers={};for(let[id,answer]of Object.entries(response.answers)){let body=answerBody(answer);body!==void 0&&(answers[questionTextFor(id,questions)]=body)}let details={questions,answers,unanswered:response.unanswered.map(id=>questionTextFor(id,questions)),status:response.status};return response.comment!==void 0&&(details.freeText=response.comment),details}var ASK_USER_SETTLED_EVENT="ask-user:settled",ASK_USER_ASKED_EVENT="ask-user:asked",ASK_USER_QUESTION_ENTRY="ask-user:question",ASK_USER_SETTLEMENT_ENTRY="ask-user:settlement";function emitAskUserNotification(pi,ctx,request2,response,variant){response.status!=="cancelled"&&pi.events.emit(ASK_USER_SETTLED_EVENT,{ctx,request:request2,response,variant})}function copyAnswers(answers){let copied={};for(let[id,answer]of Object.entries(answers))copied[id]={selected:[...answer.selected],...answer.text!==void 0?{text:answer.text}:{}};return copied}function hasAnswer(answer){return answer===void 0?!1:answer.selected.length>0?!0:answer.text!==void 0&&answer.text.trim()!==""}function unansweredIds(request2,answers){let unanswered=[];for(let question of request2.questions)hasAnswer(answers[question.id])||unanswered.push(question.id);return unanswered}function isCommentPresent(comment){return comment!==void 0&&comment.trim()!==""}function buildResponse(status,request2,answers,comment,autoResolvedAfterMs){return{status,answers:copyAnswers(answers),...isCommentPresent(comment)?{comment}:{},unanswered:unansweredIds(request2,answers),...autoResolvedAfterMs!==void 0?{autoResolvedAfterMs}:{}}}function createPendingQuestion(options){let createdAtMs=options.now(),hardCapMs=options.hardCapMs??72e5,hardDeadlineAtMs=createdAtMs+hardCapMs,schedule=options.setTimeout??((handler,delayMs)=>setTimeout(handler,delayMs)),unsched=options.clearTimeout??clearTimeout,deadlineAtMs=Math.min(createdAtMs+options.idleTimeoutMs,hardDeadlineAtMs),draftAnswers={},draftComment,terminal,timer,disarm=()=>{timer!==void 0&&(unsched(timer),timer=void 0)},settle=(response,notifyTimeout)=>terminal!==void 0?terminal:(terminal=response,disarm(),notifyTimeout&&options.onTimeout?.(response),response),fireTimeout=()=>{let elapsedMs=Math.max(0,options.now()-createdAtMs);return settle(buildResponse("timed_out",options.request,draftAnswers,draftComment,elapsedMs),!0)},arm=()=>{if(disarm(),terminal!==void 0)return;let delayMs=deadlineAtMs-options.now();if(delayMs<=0){fireTimeout();return}timer=schedule(()=>{timer=void 0,fireTimeout()},delayMs)};return arm(),{touch(draft){terminal===void 0&&(draft!==void 0&&(draftAnswers=copyAnswers(draft.answers),draftComment=draft.comment),deadlineAtMs=Math.min(options.now()+options.idleTimeoutMs,hardDeadlineAtMs),arm())},submit(answers,comment){return terminal!==void 0?terminal:isCommentPresent(comment)?settle(buildResponse("comment-submitted",options.request,answers,comment),!1):unansweredIds(options.request,answers).length===0||Object.keys(answers).length>0?settle(buildResponse("answered",options.request,answers,comment),!1):!1},cancel(reason="cancelled"){return terminal!==void 0?terminal:settle(buildResponse(reason,options.request,draftAnswers,draftComment),!1)},timeout(){return terminal!==void 0?terminal:fireTimeout()},get state(){return terminal?.status??"pending"},get deadlineAtMs(){return deadlineAtMs},remainingMs(now2){return Math.max(0,deadlineAtMs-now2)},get result(){return terminal}}}var renderCall=(args,theme2)=>{let values=typeof args=="object"&&args!==null?args:{},headers="questions"in values&&Array.isArray(values.questions)?values.questions.map(q=>typeof q=="object"&&q!==null&&"header"in q?`[${q.header}]`:"[Question]").join(" "):"Question",wait="waitForAnswer"in values&&values.waitForAnswer===!0||"wait_for_answer"in values&&values.wait_for_answer===!0;return new Text(`${theme2.fg("toolTitle",headers)} ${wait?"wait for answer":"answer later"}`,0,0)},renderResult=result3=>{let details=result3.details,summary="";return typeof details=="object"&&details!==null&&"status"in details&&(summary=String(details.status),"answers"in details&&typeof details.answers=="object"&&details.answers!==null&&(summary+=`; ${Object.keys(details.answers).length} answered`),"unanswered"in details&&Array.isArray(details.unanswered)&&(summary+=`; ${details.unanswered.length} unanswered`)),new Text([summary,...result3.content.flatMap(c=>c.type==="text"?[c.text]:[])].filter(Boolean).join(`
813
- `),0,0)};function askUserRenderers(toolName){return Object.values(TOOL_NAMES).includes(toolName)?{renderCall,renderResult}:void 0}var REASK="The user did not answer the previous question this turn; continue without asking again.";function result(variant,response,request2,text2){return{content:[{type:"text",text:text2??formatResultText(variant,response,request2.questions)}],details:formatResultDetails(variant,response,request2.questions)}}function deliverAnswer(pi,ctx,request2,response,variant){response.status!=="cancelled"&&(pi.sendUserMessage(formatUserMessage(response,request2.requestId,request2.questions),{deliverAs:ctx.isIdle()?"followUp":"steer"}),emitAskUserNotification(pi,ctx,request2,response,variant))}function emitWake(pi,sessionId){let entries=getPendingQuestions(sessionId).filter(e=>!e.request.waitForAnswer),event={source:"ask-user",activeCount:entries.length,items:entries.map(e=>({id:e.request.requestId,deadlineAtMs:e.pending.deadlineAtMs,description:e.request.questions.map(q=>q.header).join(", ")}))};pi.events.emit(WAKE_SOURCE_STATE_EVENT,event)}function startQuestion(initialPi,initialCtx,request2,signal,initialState,variant,{resuming=!1}={}){let pi=initialPi,ctx=initialCtx,state=initialState,notify2=ctx.ui.notify.bind(ctx.ui);if(!ctx.ui.question&&!resuming)throw new Error("Question UI is unavailable");let sessionId=ctx.sessionManager.getSessionId(),existing=getPendingQuestions(sessionId).find(entry=>entry.request.requestId===request2.requestId);if(existing)return existing.completion;let orphaned=()=>({status:"orphaned-after-restart",answers:{},unanswered:request2.questions.map(question2=>question2.id)}),controller=new AbortController,attached=!0,ownerBound=!0,generation2=0,completion=Promise.withResolvers(),settled=!1,unregister=()=>{},publish=(ownerPi,ownerCtx,response)=>{request2.waitForAnswer||ownerPi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:request2.requestId,status:response.status}),(!request2.waitForAnswer||resuming)&&deliverAnswer(ownerPi,ownerCtx,request2,response,variant)},finish=response=>{if(settled)return;settled=!0,response.status==="timed_out"&&(state.timedOut=!0),unregister(),signal?.removeEventListener("abort",abort),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit("herdr:blocked",{active:!1,id:request2.requestId}),ownerBound?publish(pi,ctx,response):(queueQuestionOutcome(sessionId,(nextPi,nextCtx)=>publish(nextPi,nextCtx,response)),response.status!=="cancelled"&&notify2(`Question ${request2.requestId} ended (${response.status}) while reload was incomplete. Its outcome will reach the model when the session starts again.`,"error")),completion.resolve(response);let abortReason3=response.status;controller.abort(abortReason3)},pending=createPendingQuestion({request:request2,now:Date.now,idleTimeoutMs:request2.timeoutMs,onTimeout:finish}),cancel2=(message,reportDetachedLoss=!1)=>{let lost3=!attached&&reportDetachedLoss,response=pending.cancel(lost3?"orphaned-after-restart":"cancelled");finish(message?{...response,comment:message}:response),lost3&&notify2(message??"The pending question could not be restored.","error")},abort=()=>cancel2();unregister=registerPendingQuestion(sessionId,{request:request2,pending,completion:completion.promise,cancel:cancel2,detach(){!attached||settled||(attached=!1,ownerBound=!1,generation2++,controller.abort("reload"))},rebind(nextPi,nextCtx,nextState){pi=nextPi,ctx=nextCtx,state=nextState,notify2=ctx.ui.notify.bind(ctx.ui),ownerBound=!0},reattach(){attached||settled||(attached=!0,controller=new AbortController,attach())}}),pi.appendEntry(ASK_USER_QUESTION_ENTRY,{requestId:request2.requestId,headers:request2.questions.map(question2=>question2.header)}),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit(ASK_USER_ASKED_EVENT,{ctx,request:request2,variant});let first=request2.questions[0];pi.events.emit("herdr:blocked",{active:!0,label:first?`${first.header} \u2014 ${first.question}`:"Question",id:request2.requestId}),signal?.addEventListener("abort",abort,{once:!0});let draft={answers:{}},opts={timeout:request2.timeoutMs,signal:controller.signal,deliver:request2.waitForAnswer?"tool-result":"user-message",hardDeadlineAtMs:Date.now()+72e5,getDeadlineAtMs:()=>pending.deadlineAtMs,onProgress:progress=>{draft={...draft,...progress,answers:progress.answers??draft.answers},pending.touch(draft),request2.waitForAnswer||emitWake(pi,sessionId)}},accept=response=>{if(!settled){if(pending.touch({answers:response.answers,comment:response.comment}),response.status==="timed_out"){finish(response),pending.timeout();return}response.status==="answered"||response.status==="comment-submitted"?(pending.submit(response.answers,response.comment),pending.state==="pending"&&pending.cancel()):pending.cancel(response.status),finish(response)}},fail=error2=>{if(settled)return;let message=`Question UI failed: ${error2 instanceof Error?error2.message:String(error2)}`;if(resuming||generation2>0){accept({...orphaned(),comment:message}),ctx.ui.notify(message,"error");return}cancel2(message),ctx.ui.notify(message,"error")},attach=()=>{let currentGeneration=generation2,currentQuestion=ctx.ui.question;if(!currentQuestion){accept(orphaned()),generation2>0&&ctx.ui.notify("The pending question could not be restored: question UI is unavailable.","error");return}try{currentQuestion.call(ctx.ui,request2,{...opts,signal:controller.signal,timeout:currentGeneration===0?request2.timeoutMs:pending.remainingMs(Date.now()),initialDraft:draft,onProgress:progress=>{attached&&generation2===currentGeneration&&opts.onProgress(progress)}}).then(response=>{attached&&generation2===currentGeneration&&accept(response)},error2=>{attached&&generation2===currentGeneration&&fail(error2)})}catch(error2){fail(error2)}};return signal?.aborted?abort():attach(),completion.promise}function createAskUserTool(variant,pi,state){let flag=variant==="codex"?"wait_for_answer":"waitForAnswer",opener=variant==="codex"?"Request user input for one to three short questions.":"Ask the user one to four concise questions.";return{name:TOOL_NAMES[variant],label:"Ask user",exposure:"direct",allowLazyActivation:!1,parameters:variant==="codex"?CODEX_PARAMS:CLAUDE_PARAMS,promptSnippet:"Ask a material question, explicitly choosing whether to wait or receive the answer later.",description:`${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant==="claude"?" Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option.":""} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,prepareArguments(args){return toCanonical(variant,args),args},async execute(toolCallId,params,signal,_onUpdate,ctx){let request2;try{request2=toCanonical(variant,params,{requestId:toolCallId,timeoutMs:(ctx.getAskUserSettings?.().timeoutMinutes??30)*6e4})}catch(error2){if(!(error2 instanceof AskUserSchemaError))throw error2;return{content:[{type:"text",text:error2.message}],details:{status:"unavailable"}}}let unavailable={status:"unavailable",answers:{},unanswered:request2.questions.map(q=>q.id)};if(state.timedOut)return result(variant,unavailable,request2,REASK);if(state.unavailable||ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0||ctx.mode==="print"||ctx.mode==="json"||!ctx.ui.question)return state.unavailable=!0,pi.setActiveTools(pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name))),result(variant,unavailable,request2);let completion=startQuestion(pi,ctx,request2,signal,state,variant);if(!request2.waitForAnswer)return{content:[{type:"text",text:"Question accepted; the answer will arrive as a user message."}],details:{accepted:!0,requestId:request2.requestId,status:"pending"}};let response=await completion;return response.status!=="cancelled"&&emitAskUserNotification(pi,ctx,request2,response,variant),result(variant,response,request2,response.status==="cancelled"&&response.comment?response.comment:void 0)},renderCall,renderResult}}var ASK_USER_RESUMED_ENTRY="ask-user:resumed";function isRecord12(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function variantFor(name){if(name===TOOL_NAMES.claude)return"claude";if(name===TOOL_NAMES.codex)return"codex"}function findDanglingQuestions(entries){let results=new Set,accepted=new Set,resumed=new Set,settled=new Set;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){let content=entry.message.content,texts=typeof content=="string"?[content]:content.flatMap(part=>part.type==="text"?[part.text]:[]);for(let text2 of texts){let frame2=parseAskUserAnswerFrame(text2);frame2&&settled.add(frame2.requestId)}}if(entry.type==="custom"&&entry.customType===ASK_USER_RESUMED_ENTRY&&isRecord12(entry.data)){let toolCallId=entry.data.toolCallId;typeof toolCallId=="string"&&resumed.add(toolCallId)}if(entry.type==="message"&&entry.message.role==="toolResult"){results.add(entry.message.toolCallId);let details=entry.message.details;!entry.message.isError&&isRecord12(details)&&details.accepted===!0&&details.status==="pending"&&accepted.add(entry.message.toolCallId)}entry.type==="custom"&&entry.customType===ASK_USER_SETTLEMENT_ENTRY&&isRecord12(entry.data)&&typeof entry.data.requestId=="string"&&settled.add(entry.data.requestId)}let dangling=[];for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="message"||entry.message.role!=="assistant")continue;let content=entry.message.content;for(let blockIndex=content.length-1;blockIndex>=0;blockIndex--){let block=content[blockIndex];if(block?.type!=="toolCall"||block.incomplete===!0)continue;let variant=variantFor(block.name);if(!variant||settled.has(block.id))continue;let call={toolCallId:block.id,variant,args:block.arguments},request2=requestFromCall(call,DEFAULT_ASK_USER_TIMEOUT_MS);results.has(block.id)&&(request2.waitForAnswer||!accepted.has(block.id))||resumed.has(block.id)||dangling.push(call)}}return dangling}function requestFromCall(dangling,timeoutMs){try{return toCanonical(dangling.variant,dangling.args,{requestId:dangling.toolCallId,timeoutMs})}catch{return{requestId:dangling.toolCallId,questions:[],waitForAnswer:!1,timeoutMs}}}async function resumeDanglingQuestion(pi,event,ctx){if(event.reason!=="resume"&&event.reason!=="reload")return;let pending=new Set(getPendingQuestions(ctx.sessionManager.getSessionId()).map(entry=>entry.request.requestId)),timeoutMs=(ctx.getAskUserSettings?.().timeoutMinutes??DEFAULT_ASK_USER_TIMEOUT_MS/6e4)*6e4;for(let dangling of findDanglingQuestions(ctx.sessionManager.getBranch())){if(pending.has(dangling.toolCallId))continue;pending.add(dangling.toolCallId),pi.appendEntry(ASK_USER_RESUMED_ENTRY,{toolCallId:dangling.toolCallId});let request2=requestFromCall(dangling,timeoutMs);startQuestion(pi,ctx,request2,ctx.signal,{timedOut:!1,unavailable:!1},dangling.variant,{resuming:!0})}}function askUserExtension(pi){pi.registerFlag("no-ask-user",{description:"Disable the built-in question tool.",type:"boolean",default:!1}),pi.registerCommand("answer",{description:"Open the pending question",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify(`/answer opens the pending question in the TUI; run ${APP_NAME} in TUI mode to use it.`,"info");return}}});let state={timedOut:!1,unavailable:!1},registered=!1,cancelPending=(ctx,message,reportDetachedLoss=!1)=>{for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.cancel(message,reportDetachedLoss)},sync=(ctx,model=ctx.model)=>{let rest=pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name));if(ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0){cancelPending(ctx,"The pending question was cancelled because ask-user is disabled.",!0),pi.setActiveTools(rest);return}registered||(pi.registerTool(createAskUserTool("codex",pi,state)),pi.registerTool(createAskUserTool("claude",pi,state)),registered=!0),pi.setActiveTools(state.unavailable?rest:[...rest,TOOL_NAMES[pickVariant(model)]])};pi.on("session_start",async(event,ctx)=>{state.timedOut=!1,state.unavailable=!1;let sessionId=ctx.sessionManager.getSessionId();for(let entry of getPendingQuestions(sessionId))entry.rebind(pi,ctx,state);deliverQueuedQuestionOutcomes(sessionId,pi,ctx),sync(ctx);for(let entry of getPendingQuestions(sessionId))entry.reattach();resumeDanglingQuestion(pi,event,ctx)}),pi.on("model_select",async(event,ctx)=>{sync(ctx,event.model)}),pi.on("agent_end",async()=>{state.timedOut=!1}),pi.on("session_shutdown",async(event,ctx)=>{if(event.reason==="reload"){for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.detach();return}cancelPending(ctx,"The pending question was cancelled because the session closed.")})}function resolveForegroundWindowSeconds(env){let parsed=Number.parseFloat(env.PI_BASH_FOREGROUND_SECONDS??"");return!Number.isFinite(parsed)||parsed<=0?60:parsed}function parsePositiveInt(value2){if(!value2)return;let parsed=Number.parseInt(value2,10);if(!(!Number.isFinite(parsed)||parsed<=0))return parsed}function resolveBashTimeoutDefaults(env){let{PI_BASH_DEFAULT_TIMEOUT_SECONDS:defaultTimeout,PI_BASH_MAX_TIMEOUT_SECONDS:maxTimeout}=env,defaultSeconds=parsePositiveInt(defaultTimeout)??1800,rawMax=parsePositiveInt(maxTimeout)??1800,maxSeconds=Math.max(rawMax,defaultSeconds);return{defaultSeconds,maxSeconds}}function applyBashTimeout(input,defaults){let current=input.timeout;return current===void 0||current<=0?{...input,timeout:defaults.defaultSeconds}:input}function buildBashTimeoutPrompt(defaults,options={}){let{foregroundWindowSeconds}=options,minutes=seconds=>seconds%60===0?`${seconds/60} min`:`${seconds}s`,detachRules=foregroundWindowSeconds===void 0?"":`
815
+ `),0,0)};function askUserRenderers(toolName){return Object.values(TOOL_NAMES).includes(toolName)?{renderCall,renderResult}:void 0}var REASK="The user did not answer the previous question this turn; continue without asking again.";function result(variant,response,request2,text2){return{content:[{type:"text",text:text2??formatResultText(variant,response,request2.questions)}],details:formatResultDetails(variant,response,request2.questions)}}function deliverAnswer(pi,ctx,request2,response,variant){response.status!=="cancelled"&&(pi.sendUserMessage(formatUserMessage(response,request2.requestId,request2.questions),{deliverAs:ctx.isIdle()?"followUp":"steer"}),emitAskUserNotification(pi,ctx,request2,response,variant))}function emitWake(pi,sessionId){let entries=getPendingQuestions(sessionId).filter(e=>!e.request.waitForAnswer),event={source:"ask-user",activeCount:entries.length,items:entries.map(e=>({id:e.request.requestId,deadlineAtMs:e.pending.deadlineAtMs,description:e.request.questions.map(q=>q.header).join(", ")}))};pi.events.emit(WAKE_SOURCE_STATE_EVENT,event)}function startQuestion(initialPi,initialCtx,request2,signal,initialState,variant,{resuming=!1}={}){let pi=initialPi,ctx=initialCtx,state=initialState,notify2=ctx.ui.notify.bind(ctx.ui);if(!ctx.ui.question&&!resuming)throw new Error("Question UI is unavailable");let sessionId=ctx.sessionManager.getSessionId(),existing=getPendingQuestions(sessionId).find(entry=>entry.request.requestId===request2.requestId);if(existing)return existing.completion;let orphaned=()=>({status:"orphaned-after-restart",answers:{},unanswered:request2.questions.map(question2=>question2.id)}),controller=new AbortController,attached=!0,ownerBound=!0,generation2=0,completion=Promise.withResolvers(),settled=!1,unregister=()=>{},publish=(ownerPi,ownerCtx,response)=>{request2.waitForAnswer||ownerPi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:request2.requestId,status:response.status}),(!request2.waitForAnswer||resuming)&&deliverAnswer(ownerPi,ownerCtx,request2,response,variant)},finish=response=>{if(settled)return;settled=!0,response.status==="timed_out"&&(state.timedOut=!0),unregister(),signal?.removeEventListener("abort",abort),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit("herdr:blocked",{active:!1,id:request2.requestId}),ownerBound?publish(pi,ctx,response):(queueQuestionOutcome(sessionId,(nextPi,nextCtx)=>publish(nextPi,nextCtx,response)),response.status!=="cancelled"&&notify2(`Question ${request2.requestId} ended (${response.status}) while reload was incomplete. Its outcome will reach the model when the session starts again.`,"error")),completion.resolve(response);let abortReason3=response.status;controller.abort(abortReason3)},pending=createPendingQuestion({request:request2,now:Date.now,idleTimeoutMs:request2.timeoutMs,onTimeout:finish}),cancel2=(message,reportDetachedLoss=!1)=>{let lost3=!attached&&reportDetachedLoss,response=pending.cancel(lost3?"orphaned-after-restart":"cancelled");finish(message?{...response,comment:message}:response),lost3&&notify2(message??"The pending question could not be restored.","error")},abort=()=>cancel2();unregister=registerPendingQuestion(sessionId,{request:request2,pending,completion:completion.promise,cancel:cancel2,detach(){!attached||settled||(attached=!1,ownerBound=!1,generation2++,controller.abort("reload"))},rebind(nextPi,nextCtx,nextState){pi=nextPi,ctx=nextCtx,state=nextState,notify2=ctx.ui.notify.bind(ctx.ui),ownerBound=!0},reattach(){attached||settled||(attached=!0,controller=new AbortController,attach())}}),pi.appendEntry(ASK_USER_QUESTION_ENTRY,{requestId:request2.requestId,headers:request2.questions.map(question2=>question2.header)}),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit(ASK_USER_ASKED_EVENT,{ctx,request:request2,variant});let first=request2.questions[0];pi.events.emit("herdr:blocked",{active:!0,label:first?`${first.header} \u2014 ${first.question}`:"Question",id:request2.requestId}),signal?.addEventListener("abort",abort,{once:!0});let draft={answers:{}},opts={timeout:request2.timeoutMs,signal:controller.signal,deliver:request2.waitForAnswer?"tool-result":"user-message",hardDeadlineAtMs:Date.now()+72e5,getDeadlineAtMs:()=>pending.deadlineAtMs,onProgress:progress=>{draft={...draft,...progress,answers:progress.answers??draft.answers},pending.touch(draft),request2.waitForAnswer||emitWake(pi,sessionId)}},accept=response=>{if(!settled){if(pending.touch({answers:response.answers,comment:response.comment}),response.status==="timed_out"){finish(response),pending.timeout();return}response.status==="answered"||response.status==="comment-submitted"?(pending.submit(response.answers,response.comment),pending.state==="pending"&&pending.cancel()):pending.cancel(response.status),finish(response)}},fail=error2=>{if(settled)return;let message=`Question UI failed: ${error2 instanceof Error?error2.message:String(error2)}`;if(resuming||generation2>0){accept({...orphaned(),comment:message}),ctx.ui.notify(message,"error");return}cancel2(message),ctx.ui.notify(message,"error")},attach=()=>{let currentGeneration=generation2,currentQuestion=ctx.ui.question;if(!currentQuestion){accept(orphaned()),generation2>0&&ctx.ui.notify("The pending question could not be restored: question UI is unavailable.","error");return}try{currentQuestion.call(ctx.ui,request2,{...opts,signal:controller.signal,timeout:currentGeneration===0?request2.timeoutMs:pending.remainingMs(Date.now()),initialDraft:draft,onProgress:progress=>{attached&&generation2===currentGeneration&&opts.onProgress(progress)}}).then(response=>{attached&&generation2===currentGeneration&&accept(response)},error2=>{attached&&generation2===currentGeneration&&fail(error2)})}catch(error2){fail(error2)}};return signal?.aborted?abort():attach(),completion.promise}function createAskUserTool(variant,pi,state){let flag=variant==="codex"?"wait_for_answer":"waitForAnswer",opener=variant==="codex"?"Request user input for one to three short questions.":"Ask the user one to four concise questions.";return{name:TOOL_NAMES[variant],label:"Ask user",exposure:"direct",allowLazyActivation:!1,parameters:variant==="codex"?CODEX_PARAMS:CLAUDE_PARAMS,promptSnippet:"Ask a material question, explicitly choosing whether to wait or receive the answer later.",description:`${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant==="claude"?" Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option.":""} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,prepareArguments(args){return toCanonical(variant,args),args},async execute(toolCallId,params,signal,_onUpdate,ctx){let request2;try{request2=toCanonical(variant,params,{requestId:toolCallId,timeoutMs:(ctx.getAskUserSettings?.().timeoutMinutes??30)*6e4})}catch(error2){if(!(error2 instanceof AskUserSchemaError))throw error2;return{content:[{type:"text",text:error2.message}],details:{status:"unavailable"}}}let unavailable={status:"unavailable",answers:{},unanswered:request2.questions.map(q=>q.id)};if(state.timedOut)return result(variant,unavailable,request2,REASK);if(state.unavailable||ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0||ctx.mode==="print"||ctx.mode==="json"||!ctx.ui.question)return state.unavailable=!0,pi.setActiveTools(pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name))),result(variant,unavailable,request2);let completion=startQuestion(pi,ctx,request2,signal,state,variant);if(!request2.waitForAnswer)return{content:[{type:"text",text:"Question accepted; the answer will arrive as a user message."}],details:{accepted:!0,requestId:request2.requestId,status:"pending"}};let response=await completion;return response.status!=="cancelled"&&emitAskUserNotification(pi,ctx,request2,response,variant),result(variant,response,request2,response.status==="cancelled"&&response.comment?response.comment:void 0)},renderCall,renderResult}}var ASK_USER_RESUMED_ENTRY="ask-user:resumed";function isRecord12(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function variantFor(name){if(name===TOOL_NAMES.claude)return"claude";if(name===TOOL_NAMES.codex)return"codex"}function findDanglingQuestions(entries){let results=new Set,accepted=new Set,resumed=new Set,settled=new Set;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){let content=entry.message.content,texts=typeof content=="string"?[content]:content.flatMap(part=>part.type==="text"?[part.text]:[]);for(let text2 of texts){let frame2=parseAskUserAnswerFrame(text2);frame2&&settled.add(frame2.requestId)}}if(entry.type==="custom"&&entry.customType===ASK_USER_RESUMED_ENTRY&&isRecord12(entry.data)){let toolCallId=entry.data.toolCallId;typeof toolCallId=="string"&&resumed.add(toolCallId)}if(entry.type==="message"&&entry.message.role==="toolResult"){results.add(entry.message.toolCallId);let details=entry.message.details;!entry.message.isError&&isRecord12(details)&&details.accepted===!0&&details.status==="pending"&&accepted.add(entry.message.toolCallId)}entry.type==="custom"&&entry.customType===ASK_USER_SETTLEMENT_ENTRY&&isRecord12(entry.data)&&typeof entry.data.requestId=="string"&&settled.add(entry.data.requestId)}let dangling=[];for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="message"||entry.message.role!=="assistant")continue;let content=entry.message.content;for(let blockIndex=content.length-1;blockIndex>=0;blockIndex--){let block=content[blockIndex];if(block?.type!=="toolCall"||block.incomplete===!0)continue;let variant=variantFor(block.name);if(!variant||settled.has(block.id))continue;let call={toolCallId:block.id,variant,args:block.arguments},request2=requestFromCall(call,DEFAULT_ASK_USER_TIMEOUT_MS);results.has(block.id)&&(request2?.waitForAnswer===!0||!accepted.has(block.id))||resumed.has(block.id)||dangling.push(call)}}return dangling}function requestFromCall(dangling,timeoutMs){try{return toCanonical(dangling.variant,dangling.args,{requestId:dangling.toolCallId,timeoutMs})}catch{return}}function settleUnrestorable(pi,ctx,dangling,timeoutMs){let lost3={requestId:dangling.toolCallId,questions:[],waitForAnswer:!1,timeoutMs},response={status:"orphaned-after-restart",answers:{},unanswered:[]};pi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:lost3.requestId,status:response.status}),deliverAnswer(pi,ctx,lost3,response,dangling.variant)}async function resumeDanglingQuestion(pi,event,ctx){if(event.reason!=="resume"&&event.reason!=="reload")return;let pending=new Set(getPendingQuestions(ctx.sessionManager.getSessionId()).map(entry=>entry.request.requestId)),timeoutMs=(ctx.getAskUserSettings?.().timeoutMinutes??DEFAULT_ASK_USER_TIMEOUT_MS/6e4)*6e4;for(let dangling of findDanglingQuestions(ctx.sessionManager.getBranch())){if(pending.has(dangling.toolCallId))continue;pending.add(dangling.toolCallId),pi.appendEntry(ASK_USER_RESUMED_ENTRY,{toolCallId:dangling.toolCallId});let request2=requestFromCall(dangling,timeoutMs);if(!request2){settleUnrestorable(pi,ctx,dangling,timeoutMs);continue}startQuestion(pi,ctx,request2,ctx.signal,{timedOut:!1,unavailable:!1},dangling.variant,{resuming:!0})}}function askUserExtension(pi){pi.registerFlag("no-ask-user",{description:"Disable the built-in question tool.",type:"boolean",default:!1}),pi.registerCommand("answer",{description:"Open the pending question",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify(`/answer opens the pending question in the TUI; run ${APP_NAME} in TUI mode to use it.`,"info");return}}});let state={timedOut:!1,unavailable:!1},registered=!1,cancelPending=(ctx,message,reportDetachedLoss=!1)=>{for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.cancel(message,reportDetachedLoss)},sync=(ctx,model=ctx.model)=>{let rest=pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name));if(ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0){cancelPending(ctx,"The pending question was cancelled because ask-user is disabled.",!0),pi.setActiveTools(rest);return}registered||(pi.registerTool(createAskUserTool("codex",pi,state)),pi.registerTool(createAskUserTool("claude",pi,state)),registered=!0),pi.setActiveTools(state.unavailable?rest:[...rest,TOOL_NAMES[pickVariant(model)]])};pi.on("session_start",async(event,ctx)=>{state.timedOut=!1,state.unavailable=!1;let sessionId=ctx.sessionManager.getSessionId();for(let entry of getPendingQuestions(sessionId))entry.rebind(pi,ctx,state);deliverQueuedQuestionOutcomes(sessionId,pi,ctx),sync(ctx);for(let entry of getPendingQuestions(sessionId))entry.reattach();resumeDanglingQuestion(pi,event,ctx)}),pi.on("model_select",async(event,ctx)=>{sync(ctx,event.model)}),pi.on("agent_end",async()=>{state.timedOut=!1}),pi.on("session_shutdown",async(event,ctx)=>{if(event.reason==="reload"){for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.detach();return}cancelPending(ctx,"The pending question was cancelled because the session closed.")})}function resolveForegroundWindowSeconds(env){let parsed=Number.parseFloat(env.PI_BASH_FOREGROUND_SECONDS??"");return!Number.isFinite(parsed)||parsed<=0?60:parsed}function parsePositiveInt(value2){if(!value2)return;let parsed=Number.parseInt(value2,10);if(!(!Number.isFinite(parsed)||parsed<=0))return parsed}function resolveBashTimeoutDefaults(env){let{PI_BASH_DEFAULT_TIMEOUT_SECONDS:defaultTimeout,PI_BASH_MAX_TIMEOUT_SECONDS:maxTimeout}=env,defaultSeconds=parsePositiveInt(defaultTimeout)??1800,rawMax=parsePositiveInt(maxTimeout)??1800,maxSeconds=Math.max(rawMax,defaultSeconds);return{defaultSeconds,maxSeconds}}function applyBashTimeout(input,defaults){let current=input.timeout;return current===void 0||current<=0?{...input,timeout:defaults.defaultSeconds}:input}function buildBashTimeoutPrompt(defaults,options={}){let{foregroundWindowSeconds}=options,minutes=seconds=>seconds%60===0?`${seconds/60} min`:`${seconds}s`,detachRules=foregroundWindowSeconds===void 0?"":`
814
816
  - Foreground blocking stops at the ~${foregroundWindowSeconds}s window. A command still running then auto-detaches alive to a background session with a \`bash_id\` and keeps running until it exits or hits the kill deadline; the session tools in the terminal section steer or stop it.`;return`
815
817
  ## Bash Tool Timeout Policy
816
818
 
@@ -1049,7 +1051,12 @@ Next: ${anchors.next}
1049
1051
  `}function formatSummary(phases,errors,readOnly=!1,ask){return`${formatAskNowNextHeader(phases,ask)}${formatListSummary(phases,errors,readOnly)}`}function formatListSummary(phases,errors,readOnly){let tasks=phases.flatMap(phase=>phase.tasks);if(tasks.length===0)return errors.length>0?`Errors: ${errors.join("; ")}`:readOnly?"Todo list is empty.":"Todo list cleared.";let remainingTasks=phases.map(phase=>({name:phase.name,tasks:phase.tasks.filter(task=>task.status==="pending"||task.status==="in_progress")})).filter(phase=>phase.tasks.length>0).flatMap(phase=>phase.tasks.map(task=>({...task,phase:phase.name}))),currentIdx=phases.findIndex(phase=>phase.tasks.some(task=>task.status==="pending"||task.status==="in_progress"));currentIdx===-1&&(currentIdx=phases.length-1);let current=phases[currentIdx],done=current.tasks.filter(task=>task.status==="completed"||task.status==="abandoned").length,lines=[];if(errors.length>0&&lines.push(`Errors: ${errors.join("; ")}`),remainingTasks.length===0)lines.push("Remaining items: none.");else{lines.push(`Remaining items (${remainingTasks.length}):`);for(let task of remainingTasks)lines.push(` - ${task.content} [${task.status}] (${task.phase})`)}let closedAll=tasks.filter(task=>task.status==="completed"||task.status==="abandoned").length,workedAhead=phases.some((phase,index)=>index>currentIdx&&phase.tasks.some(task=>task.status==="completed"||task.status==="abandoned"));lines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`),lines.push(`Active phase ${currentIdx+1}/${phases.length} "${current.name}" (${done}/${current.tasks.length})${workedAhead?" \u2014 earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).":"."}`);for(let phase of phases){lines.push(` ${phase.name}:`);for(let task of phase.tasks){let checkbox=task.status==="completed"?"[X]":"[ ]",tag=task.status==="in_progress"?" (in progress)":task.status==="abandoned"?" (dropped)":"";lines.push(` - ${checkbox} ${task.content}${tag}`)}}return lines.join(`
1050
1052
  `)}function sanitizeTodoText(text2){return stripAnsi(text2).replace(/[\r\n]+/g," ").replace(/[\u0000-\u001F\u007F-\u009F]/g," ").replace(/\s+/g," ").trim()}function isTerminalTodoStatus(status){return status==="completed"||status==="abandoned"||status==="cancelled"}function isIncompleteTodo(todo){return!isTerminalTodoStatus(todo.status)}function getTodoMarker(status){return status==="completed"?"[\u2713]":status==="in_progress"?"[\u2022]":status==="abandoned"||status==="cancelled"?"[\xD7]":"[ ]"}var TODO_STATE_ENTRY_TYPE="senpi.todo-state",TODO_RESTORE_REQUEST_TYPE="compaction.todo-restore-request",DEFAULT_INIT_PHASE="Tasks";function isRecord17(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus(value2){return value2==="pending"||value2==="in_progress"||value2==="completed"||value2==="abandoned"}function parseTodoStatus(value2){return value2==="cancelled"?"abandoned":isTodoStatus(value2)?value2:void 0}function parseTodoItem(value2,options){if(!isRecord17(value2)||typeof value2.content!="string")return;let status=parseTodoStatus(value2.status)??(options?.lenient?"pending":void 0);return status?{content:value2.content,status}:void 0}function parseTodoPhase(value2){if(!isRecord17(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks))return;let tasks=[];for(let task of value2.tasks){let parsed=parseTodoItem(task);if(!parsed)return;tasks.push(parsed)}return{name:value2.name,tasks}}function parsePhases(value2){if(!Array.isArray(value2))return;let phases=[];for(let phase of value2){let parsed=parseTodoPhase(phase);if(!parsed)return;phases.push(parsed)}return phases}function parseLegacyTodos(value2){if(!Array.isArray(value2))return;let tasks=[];for(let todo of value2){let parsed=parseTodoItem(todo,{lenient:!0});if(!parsed)return;tasks.push(parsed)}return[{name:DEFAULT_INIT_PHASE,tasks}]}function isTodoAsk(value2){return isRecord17(value2)&&typeof value2.entryId=="string"&&typeof value2.text=="string"&&typeof value2.capturedAt=="number"}function readTodoPayload(value2){if(!isRecord17(value2))return;let phases=value2.schema==="v2"||Array.isArray(value2.phases)?parsePhases(value2.phases):Array.isArray(value2.todos)?parseLegacyTodos(value2.todos):void 0;if(phases)return{phases,ask:isTodoAsk(value2.ask)?{...value2.ask}:void 0}}function cloneTask(task){return{content:task.content,status:task.status}}function clonePhases(phases){return phases.map(phase=>({name:phase.name,tasks:phase.tasks.map(cloneTask)}))}function isTodoItem(value2){return!isRecord17(value2)||typeof value2.content!="string"?!1:isTodoStatus(value2.status)}function isTodoPhase(value2){return!isRecord17(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoItem)}function isTodoPhaseArray(value2){return Array.isArray(value2)&&value2.every(isTodoPhase)}function getLatestTodoStateFromBranchEntries(entries){let state={phases:[],ask:void 0};for(let entry of entries){if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){let parsed2=readTodoPayload(entry.data);parsed2&&(state={phases:clonePhases(parsed2.phases),ask:parsed2.ask});continue}if(entry.type!=="message"||!isRecord17(entry.message)||entry.message.role!=="toolResult"||entry.message.toolName!=="todo"&&entry.message.toolName!=="todowrite")continue;let parsed=readTodoPayload(entry.message.details);parsed&&(state={phases:clonePhases(parsed.phases),ask:parsed.ask})}return state}function getLatestPhasesFromBranchEntries(entries){return getLatestTodoStateFromBranchEntries(entries).phases}var ASK_TEXT_LIMIT=200;function firstTextBlock(content){if(typeof content=="string")return content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&block.type==="text"&&typeof block.text=="string")return block.text}}function truncateAskText(text2){let codePoints=Array.from(text2);return codePoints.length<=ASK_TEXT_LIMIT?text2:`${codePoints.slice(0,ASK_TEXT_LIMIT).join("")}\u2026 (+${codePoints.length-ASK_TEXT_LIMIT} chars)`}function captureListAsk(entries,capturedAt){let lastStateIndex=-1,restore,requests=[];entries.forEach((entry,index)=>{if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){lastStateIndex=index;return}if(entry.type==="custom_message"&&entry.customType===TODO_RESTORE_REQUEST_TYPE){let ask=entry.details?.ask;isTodoAsk(ask)&&(restore={index,ask});return}if(entry.type!=="message"||entry.message.role!=="user")return;let raw=firstTextBlock(entry.message.content);if(raw===void 0||parseAskUserAnswerFrame(raw))return;let text2=sanitizeTodoText(raw);text2&&requests.push({index,entryId:entry.id,text:text2})});let latest=requests.at(-1);if(restore&&restore.index>lastStateIndex&&restore.index>(latest?.index??-1))return{...restore.ask};let chosen=lastStateIndex===-1?requests[0]:latest;return chosen?{entryId:chosen.entryId,text:truncateAskText(chosen.text),capturedAt}:void 0}function normalized(text2){return sanitizeTodoText(text2).toLowerCase()}function diceCoefficient(left,right){if(left===right)return 1;if(left.length<2||right.length<2)return 0;let pairs=new Map;for(let index=0;index<left.length-1;index+=1){let pair=left.slice(index,index+2);pairs.set(pair,(pairs.get(pair)??0)+1)}let overlap=0;for(let index=0;index<right.length-1;index+=1){let pair=right.slice(index,index+2),count=pairs.get(pair)??0;count>0&&(overlap+=1,pairs.set(pair,count-1))}return 2*overlap/(left.length+right.length-2)}function suggestionFor(candidates,query,contentOf){let normalizedQuery=normalized(query);if(!normalizedQuery)return;let suggestion,bestScore=0;for(let candidate of candidates){let content=contentOf(candidate),normalizedContent=normalized(content);if(!normalizedContent)continue;let score3=normalizedContent.includes(normalizedQuery)||normalizedQuery.includes(normalizedContent)?1:diceCoefficient(normalizedContent,normalizedQuery);score3>=.5&&score3>bestScore&&(bestScore=score3,suggestion=content)}return suggestion}function fuzzyResolveTask(phases,query){let candidates=phases.flatMap(phase=>phase.tasks.map(task=>({task,phase}))),exactMatches=candidates.filter(({task})=>task.content===query);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedQuery=normalized(query),normalizedMatches=candidates.filter(({task})=>normalized(task.content)===normalizedQuery);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(candidates,query,({task})=>task.content);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function fuzzyResolvePhase(phases,name){let exactMatches=phases.filter(phase=>phase.name===name);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedName=normalized(name),normalizedMatches=phases.filter(phase=>normalized(phase.name)===normalizedName);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(phases,name,phase=>phase.name);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function resolveTaskOrError(phases,content,errors,corrections){if(!content){errors.push("Missing task content");return}if(!corrections){let hit=findTaskByContent(phases,content);if(!hit)if(/^task-\d+$/.test(content))errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);else{let hint2=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"";errors.push(`Task "${content}" not found${hint2}`)}return hit}let resolution=fuzzyResolveTask(phases,content);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] task "${content}" -> "${resolution.hit.task.content}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;let exactMatches=phases.flatMap(phase=>phase.tasks.filter(task=>task.content===content).map(task=>({task,phase})));if(exactMatches.length>1){let phaseNames=[...new Set(exactMatches.map(match=>match.phase.name))].map(name=>`"${name}"`);errors.push(`Task "${content}" is ambiguous: duplicate task text exists in phases ${phaseNames.join(", ")}. Use /todo edit to make the task text unique.`);return}if(/^task-\d+$/.test(content)){errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);return}let hint=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"",suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Task "${content}" not found${hint}${suggestion}`)}function resolvePhaseOrError(phases,name,errors,corrections){if(!name){errors.push("Missing phase name");return}if(!corrections){let phase=findPhaseByName(phases,name);return phase||errors.push(`Phase "${name}" not found`),phase}let resolution=fuzzyResolvePhase(phases,name);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] phase "${name}" -> "${resolution.hit.name}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;if(phases.filter(phase=>phase.name===name).length>1){errors.push(`Phase "${name}" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`);return}let suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Phase "${name}" not found${suggestion}`)}function getTaskTargets(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit?[hit.task]:[]}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase?[...phase.tasks]:[]}return phases.flatMap(phase=>phase.tasks)}function initPhases(entry,errors,corrections){let list4=entry.list??(entry.items&&entry.items.length>0?[{phase:entry.phase??DEFAULT_INIT_PHASE,items:entry.items}]:void 0);if(!list4)return errors.push("Missing list for init operation"),[];let phases=[],phasesByName=new Map,seenTasks=new Set;for(let listEntry of list4){listEntry.items.length===0&&errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);let phase=phasesByName.get(listEntry.phase);phase?corrections?.push(`[auto-corrected] merged duplicate phase "${listEntry.phase}" in init list`):(phase={name:listEntry.phase,tasks:[]},phasesByName.set(listEntry.phase,phase),phases.push(phase));for(let content of listEntry.items){if(seenTasks.has(content)){corrections?.push(`[auto-corrected] kept first duplicate task "${content}" in init list`);continue}seenTasks.add(content),phase.tasks.push({content,status:"pending"})}}return phases}function appendItems(phases,entry,errors,corrections){if(!entry.items||entry.items.length===0)return errors.push("Missing items for append operation"),phases;let seen=new Set,hasDuplicate=!1;for(let content of entry.items)(seen.has(content)||findTaskByContent(phases,content))&&(errors.push(`Task "${content}" already exists`),hasDuplicate=!0),seen.add(content);if(hasDuplicate)return phases;let phaseName=entry.phase;if(!phaseName){let activeTask=nextActionableTask(phases);phaseName=(activeTask?phases.find(phase2=>phase2.tasks.includes(activeTask)):void 0)?.name??phases[phases.length-1]?.name??DEFAULT_INIT_PHASE,corrections?.push(`[auto-corrected] append had no phase; used "${phaseName}"`)}let phase=findPhaseByName(phases,phaseName);phase||(phase={name:phaseName,tasks:[]},phases.push(phase));for(let content of entry.items)phase.tasks.push({content,status:"pending"});return phases}function removeTasks(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit&&(hit.phase.tasks=hit.phase.tasks.filter(candidate=>candidate!==hit.task)),phases}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase&&(phase.tasks=[]),phases}for(let phase of phases)phase.tasks=[];return phases}function applyEntry(phases,entry,errors,corrections){switch(entry.op){case"init":return initPhases(entry,errors,corrections);case"start":{let hit=resolveTaskOrError(phases,entry.task,errors,corrections);if(!hit)return phases;for(let phase of phases)for(let candidate of phase.tasks)candidate.status==="in_progress"&&candidate!==hit.task&&(candidate.status="pending");return hit.task.status="in_progress",phases}case"done":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="completed";return phases;case"drop":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="abandoned";return phases;case"rm":return removeTasks(phases,entry,errors,corrections);case"append":return appendItems(phases,entry,errors,corrections);case"view":return phases}}function applyParams(phases,params,corrections){if(params.op==="view")return{phases,errors:[]};let original=clonePhases(phases),errors=[],next=applyEntry(phases,params,errors,corrections);return errors.length>0?{phases:original,errors}:(normalizeInProgressTask(next),{phases:next,errors})}function applyOpsToPhases(currentPhases,ops){let errors=[],next=clonePhases(currentPhases);for(let op of ops)next=applyEntry(next,op,errors);return errors.length>0?{phases:clonePhases(currentPhases),errors}:(normalizeInProgressTask(next),{phases:next,errors})}var TODO_WIDGET_MAX_LINES=10,TODO_WIDGET_HEADER_LINES=2,TODO_WIDGET_RECENT_TASKS=2;function getActivePhase(phases){let activeTask=nextActionableTask(phases);if(activeTask)return phases.find(phase=>phase.tasks.includes(activeTask))}function formatOmittedTasks(count,direction){return`... (${count} ${direction} task${count===1?"":"s"})`}function label(text2){return{kind:"label",text:text2}}function taskRow(task){return{kind:"task",task}}function getTodoWidgetModel(phases){let activePhase=getActivePhase(phases);if(!activePhase)return;let header2=[label("Todo"),label(sanitizeTodoText(activePhase.name))],taskRows=activePhase.tasks.map(taskRow);if(header2.length+taskRows.length<=TODO_WIDGET_MAX_LINES)return{phaseName:activePhase.name,rows:[...header2,...taskRows]};let activeTask=nextActionableTask([activePhase]);if(!activeTask)return;let activeIndex=activePhase.tasks.indexOf(activeTask),firstVisibleTask=Math.max(0,activeIndex-TODO_WIDGET_RECENT_TASKS),earlierOmitted=firstVisibleTask,bodyBudget=TODO_WIDGET_MAX_LINES-TODO_WIDGET_HEADER_LINES,recentAndActive=activePhase.tasks.slice(firstVisibleTask,activeIndex+1).map(taskRow),earlierMarkerRows=earlierOmitted>0?1:0,pendingAfterActive=activePhase.tasks.slice(activeIndex+1).filter(todo=>todo.status==="pending"),upcomingBudget=bodyBudget-recentAndActive.length-earlierMarkerRows,visibleUpcomingCount=pendingAfterActive.length>upcomingBudget?Math.max(0,upcomingBudget-1):pendingAfterActive.length,laterOmitted=pendingAfterActive.length-visibleUpcomingCount;return{phaseName:activePhase.name,rows:[...header2,...earlierOmitted>0?[label(formatOmittedTasks(earlierOmitted,"earlier"))]:[],...recentAndActive,...pendingAfterActive.slice(0,visibleUpcomingCount).map(taskRow),...laterOmitted>0?[label(formatOmittedTasks(laterOmitted,"later"))]:[]]}}var TODO_SNAPSHOT_CUSTOM_TYPE="compaction.todo-snapshot",TODO_SNAPSHOT_SCHEMA="senpi.compaction.todo-snapshot.v1",TODO_STATE_ENTRY_TYPE2="senpi.todo-state";function isRecord18(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus2(value2){return value2===void 0||typeof value2=="string"}function isTodoEntry(value2){if(!isRecord18(value2))return!1;let hasId=typeof value2.id=="string",hasContent=typeof value2.content=="string"||typeof value2.text=="string";return(hasId||hasContent)&&isTodoStatus2(value2.status)}function isTodoPhase2(value2){return!isRecord18(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoEntry)}function isCustomTodoEntry(entry){return entry.type==="custom"&&(entry.customType.startsWith("todowrite")||entry.customType===TODO_STATE_ENTRY_TYPE2)}function isLegacyTodoListEntry(entry){return entry.type==="custom"&&entry.customType==="todo-list"}function readTodosFromEntry(entry){let data=entry.data;return isRecord18(data)?Array.isArray(data.todos)?data.todos.filter(isTodoEntry):Array.isArray(data.phases)?data.phases.filter(isTodoPhase2).flatMap(phase=>phase.tasks):[]:[]}function isCustomEntryEnvelope(value2){return isRecord18(value2)&&value2.type==="custom"&&typeof value2.id=="string"&&(value2.parentId===null||typeof value2.parentId=="string")&&typeof value2.timestamp=="string"&&typeof value2.customType=="string"}function normalizeLegacySnapshotEntries(entries){for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(!(!isLegacyTodoListEntry(entry)&&!isCustomTodoEntry(entry)))return entry.customType===TODO_STATE_ENTRY_TYPE2?getLatestPhasesFromBranchEntries(entries.slice(0,index+1)):readTodosFromEntry(entry)}return[]}function normalizeSnapshotItems(value2){return Array.isArray(value2)?value2.every(isTodoPhase2)?value2:value2.every(isCustomEntryEnvelope)?normalizeLegacySnapshotEntries(value2):value2.every(isTodoEntry)?value2:null:null}function getCurrentTodoPhases(ctx){return getLatestPhasesFromBranchEntries(ctx.sessionManager.getBranch())}function findLatestTodoSnapshot(ctx){let entries=ctx.sessionManager.getBranch();for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==TODO_SNAPSHOT_CUSTOM_TYPE)continue;let data=entry.data;if(!isRecord18(data)||data.schema!==TODO_SNAPSHOT_SCHEMA)continue;let todos=normalizeSnapshotItems(data.todos);if(todos)return{schema:TODO_SNAPSHOT_SCHEMA,todos,capturedAt:typeof data.capturedAt=="number"?data.capturedAt:0,...isTodoAsk(data.ask)?{ask:data.ask}:{}}}return null}function createTodoSnapshot(ctx){let{phases,ask}=getLatestTodoStateFromBranchEntries(ctx.sessionManager.getBranch());return{schema:TODO_SNAPSHOT_SCHEMA,todos:phases,capturedAt:Date.now(),...ask?{ask}:{}}}function persistTodoSnapshot(pi,snapshot){pi.appendEntry(TODO_SNAPSHOT_CUSTOM_TYPE,snapshot)}function restoreTodosIfMissing(piOrSnapshot,ctxOrCurrentTodos,_pi){if(Array.isArray(piOrSnapshot)&&Array.isArray(ctxOrCurrentTodos))return ctxOrCurrentTodos.length>0?{applied:!1,restoredTodos:ctxOrCurrentTodos}:{applied:piOrSnapshot.length>0,restoredTodos:piOrSnapshot};let pi=piOrSnapshot,ctx=ctxOrCurrentTodos;if(getCurrentTodoPhases(ctx).length>0)return;let snapshot=findLatestTodoSnapshot(ctx);!snapshot||snapshot.todos.length===0||pi.sendMessage({customType:TODO_RESTORE_REQUEST_TYPE,content:`Restore missing todo tasks from snapshot: ${JSON.stringify(snapshot.todos)}`,display:!1,details:snapshot},{triggerTurn:!0,deliverAs:"nextTurn"})}function createInitialReminderState(){return{lastFiredEpoch:null}}function formatReminderMessage(remaining){return`[context budget] Approximately ${remaining} tokens remain before automatic compaction. Wrap up verbose exploration, prefer concise summaries over full dumps, and front-load conclusions.`}function clearTokenBudgetReminderLease(state){return state.lease?{lastFiredEpoch:state.lastFiredEpoch}:state}function computeTokenBudgetReminder(input){let remaining=input.thresholdTokens-input.contextTokens;if(!(remaining>0&&remaining<=2*input.leadTokens)||input.state.lastFiredEpoch===input.compactionEpoch)return{nextState:clearTokenBudgetReminderLease(input.state)};let message=formatReminderMessage(remaining);return{message,nextState:{lastFiredEpoch:input.compactionEpoch,lease:{compactionEpoch:input.compactionEpoch,message}}}}function isTransientSummarizationFailure(error2,message){return error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError?!0:error2 instanceof SummaryRequestError?error2.transient:error2 instanceof SummarizationOverflowExhaustedError?!0:isRetryableErrorMessage(message)}var DEFAULT_CONTEXT_WINDOW2=2e5,EMERGENCY_COMPACTION_INSTRUCTIONS="EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.",PROACTIVE_COMPACTION_INSTRUCTIONS="Proactively compact before the next agent turn.",MAX_PENDING_METADATA=8;function compactionExtension(pi,remoteCompactionDependencies={}){let state=createInitialState(),lanePolicy=createCompactionLanePolicy(),restorationDirectiveState=createRestorationDirectiveState(),emergencyPruneLatch=createEmergencyPruneLatch(),degradationState=createDegradationMonitorState(),restorationState=state.restoration??createRestorationTrackerState();state={...state,restoration:restorationState};let speculativeGeneration=0,reminderState=createInitialReminderState(),speculativeJob,pendingMetadata=new Map,logger,getLogger=ctx=>logger??=createCompactionLogger(ctx.agentDir);function getSummarizationTools(){if(typeof pi.getAllTools!="function"||typeof pi.getActiveTools!="function")return[];try{let definitionsByName=new Map(pi.getAllTools().map(tool=>[tool.name,tool]));return pi.getActiveTools().flatMap(name=>{let tool=definitionsByName.get(name);return tool?[{name:tool.name,description:tool.description,parameters:tool.parameters}]:[]})}catch{return[]}}let idleWarmupTimer,idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!1;function cancelIdleWarmupRetry(){idleWarmupTimer!==void 0&&(clearTimeout(idleWarmupTimer),idleWarmupTimer=void 0)}function isContextRetired(ctx){try{return ctx.isIdle(),!1}catch{return!0}}function armIdleWarmupRetry(ctx){let job=speculativeJob;job&&job.failure.then(failure2=>{if(failure2===void 0){idleWarmupAttempt=0;return}if(speculativeJob!==job)return;if(isContextRetired(ctx)){cancelIdleWarmupRetry();return}let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),breakerTripped=isTripped(state,Date.now()),retryDecision={attempt:idleWarmupAttempt,transient:isTransientSummarizationFailure(failure2,failure2.message),isIdle:ctx.isIdle(),breakerTripped,stillWarmEligible:shouldWarmAtIdle({willRetry:!1,aborted:!1,settings,usage:usage3,contextWindow,breakerTripped,lastYield:state.lastYield??void 0,mode:ctx.mode})};shouldRetryIdleWarmup(retryDecision)&&(cancelIdleWarmupRetry(),idleWarmupTimer=setTimeout(()=>{idleWarmupTimer=void 0,speculativeJob===job&&(isContextRetired(ctx)||ctx.isIdle()&&(idleWarmupAttempt+=1,getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0,count:idleWarmupAttempt}),invalidateSpeculativeCompaction(ctx),startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx)))},15e3))})}function armIdleApply(ctx){let job=speculativeJob;job&&job.promise.then(async compaction=>{if(!compaction||speculativeJob!==job||!sessionIdleSinceAgentEnd||isContextRetired(ctx)||!ctx.isIdle()||lanePolicy.disablesSenpiCompaction(ctx)||isTripped(state,Date.now())||shouldRejectByCap(state).cancel)return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2;!usage3||!shouldTriggerCompaction(usage3,contextWindow,ctx.getCompactionSettings(),state.lastYield??void 0)||!(await applyGeneratedCompaction(ctx,job.snapshot,()=>speculativeGeneration,compaction)).applied||(speculativeJob===job&&(speculativeJob=void 0),cancelIdleWarmupRetry(),getLogger(ctx).debug("idle_applied",{generation:job.generation,origin:"speculative"}))}).catch(()=>{})}function isSameModelIdentity(left,right){return right!==void 0&&left.api===right.api&&left.provider===right.provider&&left.id===right.id&&left.baseUrl===right.baseUrl&&left.contextWindow===right.contextWindow}function claimWarmSummaryForCoreRoute(event,ctx){let job=speculativeJob;if(!job||event.customInstructions!==void 0||job.snapshot.origin!=="speculative"||job.snapshot.preparation.firstKeptEntryId!==event.preparation.firstKeptEntryId||!isSameModelIdentity(job.snapshot.model,ctx.model))return;let anchor=createWarmAnchorSnapshot(job.snapshot.preparation.firstKeptEntryId,job.snapshot.branchEntries??[]);if(!(!anchor||!isWarmSummaryAnchorValid(anchor,event.branchEntries??ctx.sessionManager.getBranch())))return speculativeJob=void 0,job}function invalidateSpeculativeCompaction(ctx){let previousGeneration=speculativeGeneration;speculativeGeneration++,getLogger(ctx).debug("speculative_invalidated",{generation:previousGeneration}),speculativeJob?.controller.abort(),speculativeJob=void 0}function startSpeculativeCompaction(ctx,customInstructions){if(speculativeJob)return;let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"speculative",tools:getSummarizationTools()});if(!snapshot)return;getLogger(ctx).debug("speculative_started",{generation:generation2,origin:"speculative"});let controller=new AbortController,settled=runExtensionCompaction(ctx,snapshot,controller.signal).then(result3=>({result:result3,error:void 0}),error2=>({result:void 0,error:error2 instanceof Error?error2:new Error(String(error2))}));speculativeJob=trackSpeculativeJob({generation:generation2,snapshot,controller,settled,armedAtTokens:ctx.getContextUsage()?.tokens??0}),settled.then(()=>remoteCompactionDependencies.onSpeculativeJobSettled?.())}function capturePendingMetadata(requestId,ctx){for(pendingMetadata.set(requestId,{checkpoint:captureAgentCheckpoint(pi,ctx),todoSnapshot:createTodoSnapshot(ctx)});pendingMetadata.size>MAX_PENDING_METADATA;){let oldestRequestId=pendingMetadata.keys().next().value;if(oldestRequestId===void 0)break;pendingMetadata.delete(oldestRequestId)}}function persistAcceptedMetadata(requestId){let metadata=pendingMetadata.get(requestId);metadata&&(pendingMetadata.delete(requestId),persistCheckpoint(pi,metadata.checkpoint),persistTodoSnapshot(pi,metadata.todoSnapshot))}function recoverRequiredCompaction(ctx,snapshot,failureKind,cause){let diagnostics={},compaction=createRequiredCompactionFallback(snapshot.preparation,snapshot.contextWindow,failureKind,{taskIntent:resolveInheritedTaskIntent(snapshot.branchEntries??[])},snapshot.branchEntries,diagnostics);return compaction?(ctx.ui.notify(formatRequiredCompactionFallbackNotice(failureKind,cause),"warning"),{compaction}):{rejectionReason:formatRequiredCompactionFallbackRejection(diagnostics)}}async function applyBlockingCompaction(ctx,customInstructions){let provider=ctx.model?.provider;if((provider==="cursor"||provider==="cursor-cli-oauth")&&!ctx.isIdle())return getLogger(ctx).debug("skip_cursor_mid_turn",{route:"blocking"}),{applied:!1,reason:"rejected"};if(isTripped(state,Date.now()))return getLogger(ctx).debug("skip_breaker",{route:"blocking"}),{applied:!1,reason:"rejected"};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{route:"blocking"}),{applied:!1,reason:"rejected"};let feedbackSignal=ctx.beginCompaction?.({reason:"extension"});try{let remoteFallbackReason;if(isOpenAiRemoteCompactionModel(ctx.model)){let remoteGeneration=speculativeGeneration+1,remoteSnapshot=createSpeculativeCompactionSnapshot(ctx,{generation:remoteGeneration,customInstructions,origin:"blocking"});if(getLogger(ctx).debug("blocking_started",{generation:remoteGeneration,origin:"blocking"}),remoteSnapshot){let remoteSignal=feedbackSignal??new AbortController().signal,remoteCompaction=await runOpenAiRemoteCompaction(ctx,createBlockingRemoteCompactionEvent(ctx,remoteSnapshot,customInstructions,remoteSignal),data=>{data?.action==="remote_fallback"&&typeof data.reason=="string"&&(remoteFallbackReason=data.reason),pi.events.emit(SENPI_COMPACTION_EVENT,data)},remoteCompactionDependencies);if(remoteCompaction){if(speculativeGeneration!==remoteGeneration-1){let result5={applied:!1,reason:"stale"};return getLogger(ctx).debug("speculative_stale",{generation:remoteGeneration}),endCompactionFeedback(ctx,feedbackSignal,result5),result5}speculativeGeneration=remoteGeneration,speculativeJob?.controller.abort(),speculativeJob=void 0;let result4=await applyGeneratedCompaction(ctx,remoteSnapshot,()=>speculativeGeneration,remoteCompaction,feedbackSignal);return getLogger(ctx).debug("speculative_applied",{generation:remoteGeneration,origin:"blocking"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4}}}let pendingJob=speculativeJob;if(pendingJob){let unlinkAbort=linkAbortSignal(feedbackSignal,pendingJob.controller),compaction2,inheritedFailure;try{compaction2=await pendingJob.promise,inheritedFailure=await pendingJob.failure,compaction2&&getLogger(ctx).debug("warm_consumed",{generation:pendingJob.generation,route:"speculative"})}finally{unlinkAbort()}if(inheritedFailure!==void 0){speculativeJob=void 0;let failureKind=classifyRequiredCompactionFallbackFailure(inheritedFailure);if(failureKind!==void 0&&!feedbackSignal?.aborted&&pendingJob.snapshot.generation===speculativeGeneration&&pendingJob.snapshot.expectedRevision===ctx.getMessageRevision()){let recovery=recoverRequiredCompaction(ctx,pendingJob.snapshot,failureKind,inheritedFailure);if(compaction2=recovery.compaction,!compaction2){let result5={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result5,recovery.rejectionReason),result5}}else if(failureKind===void 0&&isTransientSummarizationFailure(inheritedFailure,inheritedFailure.message))return ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(inheritedFailure.message)}`}),state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"}}let result4=await applyGeneratedCompaction(ctx,pendingJob.snapshot,()=>speculativeGeneration,compaction2,feedbackSignal);if(result4.applied)return speculativeJob=void 0,getLogger(ctx).debug("speculative_applied",{generation:pendingJob.generation,origin:"speculative"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4;result4.reason==="stale"?getLogger(ctx).debug("speculative_stale",{generation:pendingJob.generation}):result4.reason==="rejected"&&(feedbackSignal=ctx.beginCompaction?.({reason:"extension"})),speculativeJob=void 0}let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"core-route",tools:getSummarizationTools()});if(!snapshot){let result4={applied:!1,reason:"unavailable"};return getLogger(ctx).debug("summary_failed",{reason:"unavailable"}),endCompactionFeedback(ctx,feedbackSignal,result4,remoteFallbackReason),result4}let compaction;try{compaction=await runExtensionCompaction(ctx,snapshot,feedbackSignal,delta=>ctx.updateCompaction?.({reason:"extension",signal:feedbackSignal,delta}))}catch(error2){let failureKind=classifyRequiredCompactionFallbackFailure(error2);if(failureKind!==void 0&&!feedbackSignal?.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);if(compaction=recovery.compaction,!compaction){let result4={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result4,recovery.rejectionReason),result4}}else{if(!(error2 instanceof SummaryGenerationError))throw error2;getLogger(ctx).debug("summary_failed",{reason:error2.kind})}}let result3=await applyGeneratedCompaction(ctx,snapshot,()=>speculativeGeneration,compaction,feedbackSignal);return endCompactionFeedback(ctx,feedbackSignal,result3,remoteFallbackReason),result3}catch(error2){if(feedbackSignal?.aborted)return getLogger(ctx).debug("blocking_aborted",{route:"blocking"}),ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:!0}),{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2);if(ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(message)}`}),isTransientSummarizationFailure(error2,message))return state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"};throw error2}}pi.on("session_before_compact",async(event,ctx)=>{if(event.signal.aborted)return;let claimedWarmJob=claimWarmSummaryForCoreRoute(event,ctx),warmJobConsumed=!1;invalidateSpeculativeCompaction(ctx);let claimedGeneration=speculativeGeneration;try{if(!lanePolicy.ownsCompaction(ctx,event.reason))return{cancel:!0,rejectionCause:"external-owner",reason:SDK_NATIVE_LANE_REJECTION_REASON};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{reason:event.reason,count:state.acceptedAbsolute}),{cancel:!0,rejectionCause:"per-turn-cap",reason:"absolute compaction cap reached for this session"};let now2=Date.now();if(isTripped(state,now2)&&!shouldBypass(state,{reason:event.reason})){let remainingMs2=state.trippedAt!==null?Math.max(0,state.trippedAt+6e4-now2):0;return getLogger(ctx).debug("skip_breaker",{reason:event.reason,remainingSec:Math.ceil(remainingMs2/1e3)}),{cancel:!0,rejectionCause:"circuit-breaker",reason:`compaction circuit breaker cooling down (${Math.ceil(remainingMs2/1e3)}s left)`}}capturePendingMetadata(event.requestId,ctx);let model=ctx.model;if(!model)return;let remoteCompaction;try{remoteCompaction=await runOpenAiRemoteCompaction(ctx,event,data=>pi.events.emit(SENPI_COMPACTION_EVENT,data),remoteCompactionDependencies)}catch(error2){if(!event.signal.aborted)throw error2;getLogger(ctx).debug("remote_aborted",{route:"core-route",requestId:event.requestId});return}if(remoteCompaction)return getLogger(ctx).debug("core_route_generated",{route:"core-route",requestId:event.requestId}),{compaction:remoteCompaction};let inheritedWarmFailure;if(claimedWarmJob){let unlinkAbort=linkAbortSignal(event.signal,claimedWarmJob.controller),warmCompaction,warmFailure;try{warmCompaction=await claimedWarmJob.promise,warmFailure=await claimedWarmJob.failure}finally{unlinkAbort()}if(warmFailure===void 0&&warmCompaction&&!event.signal.aborted)return getLogger(ctx).debug("warm_consumed",{generation:claimedWarmJob.generation,route:"core-route"}),warmJobConsumed=!0,{compaction:warmCompaction};warmFailure!==void 0&&isRequiredCompactionFallbackReason(event.reason)&&classifyRequiredCompactionFallbackFailure(warmFailure)!==void 0&&!event.signal.aborted&&speculativeGeneration===claimedGeneration&&claimedWarmJob.snapshot.expectedRevision===ctx.getMessageRevision()&&(inheritedWarmFailure=warmFailure)}let snapshot={generation:++speculativeGeneration,expectedRevision:ctx.getMessageRevision(),model,contextWindow:ctx.getContextUsage()?.contextWindow??model.contextWindow??DEFAULT_CONTEXT_WINDOW2,preparation:event.preparation,branchEntries:event.branchEntries,promptVariant:getPromptVariant(event),origin:"core-route",customInstructions:event.customInstructions,systemPrompt:ctx.getSystemPrompt(),tools:getSummarizationTools()},compaction;try{if(inheritedWarmFailure)throw inheritedWarmFailure;compaction=await runExtensionCompaction(ctx,snapshot,event.signal,delta=>ctx.updateCompaction?.({reason:event.reason,signal:event.signal,delta}))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2),failureKind=classifyRequiredCompactionFallbackFailure(error2);if(isRequiredCompactionFallbackReason(event.reason)&&failureKind!==void 0&&!event.signal.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);return recovery.compaction?{compaction:recovery.compaction}:(pendingMetadata.delete(event.requestId),{cancel:!0,reason:recovery.rejectionReason})}return pendingMetadata.delete(event.requestId),error2 instanceof SummaryGenerationError?{cancel:!0,reason:stripTurnRetrySuppressionPrefix(error2.message)}:{cancel:!0,reason:`compaction generator failed: ${stripTurnRetrySuppressionPrefix(message)}`}}return compaction?{compaction}:(pendingMetadata.delete(event.requestId),event.signal.aborted?{cancel:!0}:{cancel:!0,reason:"compaction generator returned no summary"})}finally{warmJobConsumed||claimedWarmJob?.controller.abort()}}),pi.on("model_select",(event,ctx)=>handleCompactionModelSelect({event,ctx,state,speculativeSnapshot:speculativeJob?.snapshot,laneOwnsCompaction:lanePolicy.disablesSenpiCompaction(ctx),breakerTripped:isTripped(state,Date.now()),invalidate:()=>invalidateSpeculativeCompaction(ctx),start:()=>startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)})),pi.on("session_compact",async(event,ctx)=>{let compactEvent=event;if(invalidateSpeculativeCompaction(ctx),compactEvent.accepted){persistAcceptedMetadata(compactEvent.requestId);let branchEntries=ctx.sessionManager.getBranch(),firstKeptIndex=branchEntries.findIndex(entry=>entry.id===compactEvent.compactionEntry.firstKeptEntryId),keptEntries=firstKeptIndex===-1?[]:branchEntries.slice(firstKeptIndex);state=incrementAccepted(state),state=recordSuccess(state),reminderState=createInitialReminderState();let sy=compactEvent.compactionEntry.details?.structuralYield;sy&&typeof sy.savedTokens=="number"&&typeof sy.savingsRatio=="number"&&(state={...state,lastYield:{savedTokens:sy.savedTokens,tokensBefore:compactEvent.compactionEntry.tokensBefore}},isIneffectiveCompaction({tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio})&&(state=incrementIneffective(state),getLogger(ctx).debug("ineffective_counted",{tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio}))),resetOnSessionCompact(degradationState),restoreTodosIfMissing(pi,ctx);let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings();(settings.restorationEnabled??!0)&&preparePendingPayload(restorationState,{accepted:!0,reason:compactEvent.reason,compactionEntryId:compactEvent.compactionEntry.id,contextWindow:usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,usageTokens:usage3?.tokens??null,reserveTokens:resolveEffectiveReserveTokens(usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings),settings,keptMessages:keptEntries.flatMap(entry=>entry.type!=="message"?[]:[entry.message])});return}compactEvent.rejectionCause!=="external-owner"&&lanePolicy.ownsCompaction(ctx,compactEvent.reason)&&(state=recordFailure(state,Date.now(),{route:compactEvent.reason}))});let onBeforeAgentStart=async(event,ctx)=>{if(event.preview===!0)return;sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry();let message=attachRestorationDirective(restorationDirectiveState,recentCheckpoint(ctx),consumePendingPayload(restorationState)),usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),pendingPromptTokens=estimatePendingPromptTokens(event),usageWithPendingPrompt=usage3?withAdditionalTokens(usage3,pendingPromptTokens):void 0,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerCoolingDown=isTripped(state,Date.now())||laneOwnsCompaction,{reserveTokens,thresholdTokens,leadTokens}=resolveCompactionGeometry({contextWindow,settings,lastYield:state.lastYield??void 0});!laneOwnsCompaction&&usage3&&isAtHardLimit(usage3,contextWindow,reserveTokens,pendingPromptTokens)?(getLogger(ctx).debug("hard_limit_trigger",{contextWindow,tokens:usage3.tokens??0,threshold:settings.reserveTokens}),await applyBlockingCompaction(ctx,EMERGENCY_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&usageWithPendingPrompt&&shouldTriggerCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0)?(getLogger(ctx).debug("threshold_trigger",{contextWindow,tokens:usageWithPendingPrompt.tokens??0,threshold:settings.reserveTokens}),shouldDeferGraceBand({tokens:usageWithPendingPrompt.tokens??0,thresholdTokens,leadTokens,contextWindow,reserveTokens,compactionInFlight:speculativeJob!==void 0&&!speculativeJob.completed,graceBandEnabled:settings.graceBandEnabled})?getLogger(ctx).debug("grace_deferred",{tokens:usageWithPendingPrompt.tokens??0,threshold:thresholdTokens}):await applyBlockingCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&!isOpenAiRemoteCompactionModel(ctx.model)&&usageWithPendingPrompt&&shouldStartSpeculativeCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0,leadTokens)&&startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS);let reminder=computeTokenBudgetReminder({contextTokens:usageWithPendingPrompt?.tokens??0,contextWindow,thresholdTokens,leadTokens,compactionEpoch:speculativeGeneration,state:reminderState});reminderState=reminder.nextState;let deliveredMessage=resolveBeforeAgentStartMessage({message,reminder:reminder.message,reminderEnabled:settings.reminderEnabled}),reminderSystemPrompt=resolveReminderSystemPrompt({systemPrompt:event.systemPrompt,reminder:message?void 0:reminder.message,reminderEnabled:settings.reminderEnabled});if(!(!deliveredMessage&&!reminderSystemPrompt))return{...deliveredMessage?{message:deliveredMessage}:{},...reminderSystemPrompt?{systemPrompt:reminderSystemPrompt}:{}}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("context",(event,ctx)=>{let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerFallback=!laneOwnsCompaction&&isTripped(state,Date.now())&&usage3?.tokens!==null&&usage3!==void 0&&usage3.tokens>=contextWindow*computeEffectiveThreshold(contextWindow,state.lastYield??void 0);return breakerFallback&&getLogger(ctx).debug("breaker_deterministic_fallback",{route:"context-event",tokens:usage3.tokens??0}),{messages:buildCompactionContext({event,ctx,contextWindow,promptContextWindow:getPromptContextWindow(contextWindow,ctx.model?.maxTokens),toolAdmissionEnabled:settings.toolAdmissionEnabled!==!1,breakerFallback,laneOwnsCompaction,emergencyPruneLatch,logEmergencyPrune:fields=>getLogger(ctx).debug("emergency_prune",fields)})}}),pi.on("before_provider_request",async(event,ctx)=>{let model=event.model??ctx.model;if(!isOpenAiRemoteCompactionModel(model))return;let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok)return;let effectiveModel=auth.upstreamModelId||auth.baseUrl?{...model,...auth.upstreamModelId?{id:auth.upstreamModelId}:{},...auth.baseUrl?{baseUrl:auth.baseUrl}:{}}:model,headers=createOpenAiRemoteCompactionHeaders(effectiveModel,{...auth,headers:event.headers??auth.headers},ctx.sessionManager.getSessionId());if(!headers)return;let origin=openAiRemoteCompactionOrigin(effectiveModel,headers);return rewriteOpenAiPayloadWithRemoteCompaction(event.payload,{model:effectiveModel,branchEntries:ctx.sessionManager.getBranch(),origin},data=>pi.events.emit(SENPI_COMPACTION_EVENT,data))}),pi.on("turn_end",async(_event,ctx)=>{try{if(lanePolicy.disablesSenpiCompaction(ctx)||(handleTurnEnd(degradationState),degradationState.recoveryTriggeredThisCycle))return;state.lastYield&&state.lastYield.savedTokens<=0&&applyBlockingCompaction(ctx,RECOVERY_INSTRUCTIONS).catch(()=>{})}finally{state=resetTurnCounter(state,"")}}),pi.on("agent_end",async(event,ctx)=>{if(state=resetTurnCounter(state,""),lanePolicy.disablesSenpiCompaction(ctx))return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings();if(shouldRunIdleCompaction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode}))getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0}),idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx);else{if(isOpenAiRemoteCompactionModel(ctx.model))return;let warmAction=resolveIdleWarmAction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode},speculativeJob);warmAction==="replace"&&invalidateSpeculativeCompaction(ctx),warmAction!=="none"&&(idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx))}}),pi.on("message_end",async(event,ctx)=>{for(let entry of collectCompactBoundaryEntries(event.message))pi.appendEntry(ANTHROPIC_SUBSCRIPTION_COMPACT_ENTRY_TYPE,entry);isAbortedAssistantMessage(event)&&invalidateSpeculativeCompaction(ctx),isMonitorableMessageEvent(event)&&!lanePolicy.disablesSenpiCompaction(ctx)&&await handleMessageEnd(degradationState,event,{applyCompaction:async options=>await applyBlockingCompaction(ctx,options.customInstructions),notify:message=>ctx.ui.notify(message,"warning")})}),pi.on("tool_call",event=>{trackToolCall(restorationState,event)}),pi.on("session_shutdown",()=>{sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry(),idleWarmupAttempt=0,speculativeJob?.controller.abort(),speculativeJob=void 0})}var SIDE_QUERY_INSTRUCTION=["The user is asking a side question about the conversation so far, outside the main task.","Answer it directly and concisely from the context above.","Do not continue any task, do not modify anything, and do not treat this as new work."].join(" "),DEFAULT_ESTABLISHMENT_TIMEOUT_MS=3e4;function estimateMessagesTokens(messages){return messages.reduce((total,message)=>total+estimateTokens2(message),0)}function estimateSystemPromptTokens(systemPrompt){return estimateTokens2({role:"user",content:systemPrompt,timestamp:0})}function boundSideQueryMessages(messages,systemPrompt,promptContextWindow){if(typeof promptContextWindow!="number"||!Number.isFinite(promptContextWindow)||promptContextWindow<=0)return messages;let messageBudget=promptContextWindow-estimateSystemPromptTokens(systemPrompt),question=messages.at(-1);if(question===void 0||messageBudget<estimateMessagesTokens([question]))throw new Error("/btw question does not fit this model's context window; shorten it or run /compact first.");if(estimateMessagesTokens(messages)<=messageBudget)return messages;let reduced=convertToLlm2(reduceContextMessages(messages,BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages),repaired=repairOrphanedToolResults(reduced),pruned=convertToLlm2(pruneOldMessagesToBudget(repaired,messageBudget)),bounded=repairOrphanedToolResults(pruned);if(estimateMessagesTokens(bounded)>messageBudget)throw new Error("/btw context is too large for this model; run /compact first.");return bounded}function getSideQueryPromptContextWindow(model){return getPromptContextWindow(model.contextWindow,model.maxTokens)}function buildSideQueryContext(input){let systemPrompt=`${input.systemPrompt}
1051
1053
 
1052
- ${SIDE_QUERY_INSTRUCTION}`,messages=boundSideQueryMessages([...input.history,{role:"user",content:input.question,timestamp:Date.now()}],systemPrompt,input.promptContextWindow);return{systemPrompt,messages,tools:[]}}async function runSideQuery(deps,context,callbacks={}){callbacks.signal?.throwIfAborted();let streamFn=deps.streamFn??streamSimple,establishment=new AbortController,signal=callbacks.signal?AbortSignal.any([callbacks.signal,establishment.signal]):establishment.signal,timeoutMs=deps.establishmentTimeoutMs??DEFAULT_ESTABLISHMENT_TIMEOUT_MS,timeoutError=new Error(`/btw provider did not produce an event within ${Math.round(timeoutMs/1e3)}s`),timer;try{let options={apiKey:deps.auth.apiKey,headers:deps.auth.headers,extraBody:deps.auth.extraBody,sessionId:`${deps.sessionId}:btw:${crypto.randomUUID()}`,reasoning:deps.thinkingLevel,signal};timer=setTimeout(()=>establishment.abort(timeoutError),timeoutMs),timer.unref?.();let stream2=await streamFn(deps.model,context,options),established=!1,replyText="";for await(let event of stream2)if(!established&&event.type!=="start"&&(established=!0,clearTimeout(timer),timer=void 0),event.type==="text_delta")replyText+=event.delta,callbacks.onTextDelta?.(event.delta);else{if(event.type==="done")break;if(event.type==="error")throw new Error(event.error.errorMessage||"Side query failed")}return signal.throwIfAborted(),{replyText}}catch(error2){throw establishment.signal.aborted&&!callbacks.signal?.aborted?timeoutError:error2}finally{timer&&clearTimeout(timer)}}var WIDGET_KEY2="btw";function btwExtension(pi){let active;function dismiss(ctx,options){let current=active;current&&(active=void 0,options.abort&&current.controller.abort(),current.unsubscribeEscape?.(),current.panel&&ctx.ui.setWidget(WIDGET_KEY2,void 0))}pi.on("session_before_switch",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_before_fork",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_shutdown",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("input",(_event,ctx)=>{active?.settled&&dismiss(ctx,{abort:!1})}),pi.registerCommand("btw",{description:"Ask a side question in parallel without touching the main session",argumentHint:"<question>",handler:async(args,ctx)=>{let question=args.trim();if(!question){if(active){dismiss(ctx,{abort:!0});return}ctx.ui.notify("Usage: /btw <question>","warning");return}let model=ctx.model;if(!model){ctx.ui.notify("No active model available for /btw.","error");return}let snapshot=buildSessionContext2(ctx.sessionManager.getEntries(),ctx.sessionManager.getLeafId()),history=convertToLlm2(snapshot.messages),systemPrompt=ctx.getSystemPrompt(),thinkingLevel=pi.getThinkingLevel(),sessionId=ctx.sessionManager.getSessionId();dismiss(ctx,{abort:!0});let controller=new AbortController,entry={controller,panel:void 0,unsubscribeEscape:void 0,settled:!1};active=entry,ctx.mode==="tui"&&ctx.hasUI&&(ctx.ui.setWidget(WIDGET_KEY2,(tui,theme2)=>{let panel=new BtwPanel(question,tui,theme2);return entry.panel=panel,panel.component}),entry.unsubscribeEscape=ctx.ui.onTerminalInput(data=>{active!==entry||isKeyRelease(data)||!matchesKey(data,"escape")||dismiss(ctx,{abort:!0})}));let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok){if(active!==entry)return;dismiss(ctx,{abort:!1}),ctx.ui.notify(`/btw: ${auth.error}`,"error");return}try{let context=buildSideQueryContext({systemPrompt,history,question,promptContextWindow:getSideQueryPromptContextWindow(model)}),{replyText}=await runSideQuery({model:auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,auth:{apiKey:auth.apiKey,headers:auth.headers,extraBody:auth.extraBody},sessionId,thinkingLevel:thinkingLevel==="off"?void 0:thinkingLevel,streamFn:(streamModel,streamContext,options)=>ctx.modelRegistry.modelRuntime.streamSimple(streamModel,streamContext,options)},context,{signal:controller.signal,onTextDelta:delta=>{active===entry&&entry.panel?.appendText(delta)}});if(active!==entry)return;entry.settled=!0,entry.panel?entry.panel.markDone():ctx.ui.notify(replyText,"info")}catch(error2){if(active!==entry)return;entry.settled=!0;let message=error2 instanceof Error?error2.message:String(error2);if(controller.signal.aborted){entry.panel?.markAborted();return}entry.panel?entry.panel.markError(message):ctx.ui.notify(`/btw failed: ${message}`,"error")}}})}var GOAL_CACHE_WARMUP_ENTRY_TYPE="goal-cache-warmup",GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS=24e4,GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS=27e4,GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS=3570,GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS=1e3,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS=36e5;function resolveGoalMonitorContinuationDelayMs(goalBackstopMaxSeconds){let configuredMs=typeof goalBackstopMaxSeconds=="number"&&Number.isFinite(goalBackstopMaxSeconds)&&goalBackstopMaxSeconds>0?goalBackstopMaxSeconds*1e3:GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS;return Math.max(GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS,Math.min(configuredMs,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS))}function resolveGoalBackstopMaxSecondsForCache(goalBackstopMaxSeconds,lifetime){return lifetime?.kind!=="best-effort"?goalBackstopMaxSeconds:goalBackstopMaxSeconds===void 0||goalBackstopMaxSeconds*1e3===GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS?GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS:goalBackstopMaxSeconds}function resolveGoalPromptCacheLifetime(model,env){return model===void 0?void 0:resolvePromptCacheLifetime(model,toProviderEnv(env))}function createGoalCacheWarmScheduleData(options){return{goalId:options.goalId,delayMs:options.delayMs,dueAtMs:options.scheduledAtMs+options.delayMs,iteration:options.iteration,activeMonitorCount:options.activeMonitorCount,wakeSources:options.wakeSources,...options.cache!==void 0?{cache:options.cache}:{}}}var TOKENS_PER_PRICE_UNIT=1e6;function estimateCacheWarmMetrics(model,env,lastTurnUsage){let cachedTokens=clampTokens(lastTurnUsage?.cacheRead)+clampTokens(lastTurnUsage?.cacheWrite),lifetime=resolveGoalPromptCacheLifetime(model,env);if(lifetime?.kind==="best-effort")return cachedTokens===0?void 0:{cachedTokens,cacheLifetime:"best-effort"};let ttlSeconds=lifetime?.kind==="ttl"?lifetime.ttlSeconds:void 0;if(ttlSeconds===void 0&&cachedTokens===0)return;let estimatedSavedUsd=model!==void 0&&cachedTokens>0?Math.max(0,model.cost.input-model.cost.cacheRead)*cachedTokens/TOKENS_PER_PRICE_UNIT:void 0;return{cachedTokens,...ttlSeconds!==void 0?{ttlSeconds}:{},...estimatedSavedUsd!==void 0?{estimatedSavedUsd}:{}}}function formatWarmTokenCount(tokens){return tokens>=1e6?`${trimTrailingZero((tokens/1e6).toFixed(1))}M`:tokens>=1e3?`${trimTrailingZero((tokens/1e3).toFixed(1))}K`:String(Math.max(0,Math.trunc(tokens)))}function formatWakeDuration(ms){let seconds=Math.round(ms/1e3);if(seconds<60)return`${seconds}s`;let minutes=Math.floor(seconds/60),restSeconds=seconds%60;if(minutes<60)return restSeconds===0?`${minutes}m`:`${minutes}m ${restSeconds}s`;let hours=Math.floor(minutes/60),restMinutes=minutes%60;return restMinutes===0?`${hours}h`:`${hours}h ${restMinutes}m`}function formatWakeTimestamp(dueAtMs){let date=new Date(dueAtMs),local=formatLocalWakeTimestamp(date);return local!==void 0?local:`${date.toISOString().slice(0,16).replace("T"," ")} UTC`}function formatLocalWakeTimestamp(date){try{let parts=new Intl.DateTimeFormat("en-CA",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23",timeZoneName:"short"}).formatToParts(date),read=type2=>parts.find(part=>part.type===type2)?.value,year=read("year"),month=read("month"),day=read("day"),hour=read("hour"),minute=read("minute");if(year===void 0||month===void 0||day===void 0||hour===void 0||minute===void 0)return;let zone=read("timeZoneName");return`${year}-${month}-${day} ${hour}:${minute}${zone===void 0?"":` ${zone}`}`}catch{return}}function formatCacheTtl(seconds){return seconds%3600===0?`${seconds/3600}h`:seconds%60===0?`${seconds/60}m`:`${seconds}s`}function formatSavedUsd(value2){return value2<5e-4?"<$0.001":value2<1?`$${value2.toFixed(3)}`:`$${value2.toFixed(2)}`}function trimTrailingZero(value2){return value2.endsWith(".0")?value2.slice(0,-2):value2}function clampTokens(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.trunc(value2):0}function toProviderEnv(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}var PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4;function createSessionPrewarm(pi,dependencies){let isPrewarmModel=dependencies.isPrewarmModel??isOpenAIResponsesPromptCacheModel,current;function cancel2(){current?.abort(),current=void 0}async function run2(ctx,model,controller){let{signal}=controller;try{let prefix=await ctx.getPromptCachePrefixRequest?.({signal});if(signal.aborted||prefix===void 0)return;if(prefix.status==="skipped"){append({phase:"skipped",provider:model.provider,model:model.id,reason:prefix.reason});return}let{request:request2}=prefix,result3=await dependencies.warm(request2.model,request2.context,{...request2.options,signal,timeoutMs:PROMPT_CACHE_PREWARM_TIMEOUT_MS});if(signal.aborted||!result3.supported)return;append({phase:"warmed",provider:model.provider,model:model.id,usage:toUsage(model,result3.usage)})}catch(error2){if(signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);append({phase:"failed",provider:model.provider,model:model.id,error:message})}finally{current===controller&&(current=void 0)}}function append(data){pi.appendEntry(PROMPT_CACHE_PREWARM_ENTRY_TYPE,data)}return{start(ctx){cancel2();let model=ctx.model;if(model===void 0||model.cacheRetention==="none"||!isPrewarmModel(model))return;let controller=new AbortController;current=controller,run2(ctx,model,controller)},cancel:cancel2}}function toUsage(model,usage3){let cost=usage3.cost??{input:usage3.input*model.cost.input/1e6,output:usage3.output*model.cost.output/1e6,cacheRead:usage3.cacheRead*model.cost.cacheRead/1e6,cacheWrite:usage3.cacheWrite*model.cost.cacheWrite/1e6,total:0};return{input:usage3.input,output:usage3.output,cacheRead:usage3.cacheRead,cacheWrite:usage3.cacheWrite,totalTokens:usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost:{...cost,total:cost.input+cost.output+cost.cacheRead+cost.cacheWrite}}}var CACHE_KEEPALIVE_ENTRY_TYPE="cache-keepalive",CACHE_WARM_PING_EVENT="cache_warm_ping",renderCacheKeepAliveEntry=noticeEntryRenderer(entry=>{let data=entry.data;if(data?.phase!=="ping")return;let refreshed=data.cacheRead+data.cacheWrite;return{title:`\u26A1 Warm ping #${data.iteration} \xB7 ~${formatWarmTokenCount(refreshed)} tokens refreshed \xB7 ${formatUsd(data.estimatedCostUsd)}`,why:"Refreshed the active Anthropic prompt cache while the session was idle.",expandedLine:`cache read ${data.cacheRead} \xB7 cache write ${data.cacheWrite} \xB7 session total ${formatUsd(data.cumulativeEstimatedUsd)}`}});function createCacheKeepAliveExtension(dependencies={}){let warm=dependencies.warmPromptCache??warmPromptCache;return pi=>{let prewarm=createSessionPrewarm(pi,{warm,isPrewarmModel:dependencies.isPromptCachePrewarmModel}),ctx,timer,inFlight=!1,generation2=0,active=!1,parked=!1,attempts=0,cumulativeEstimatedUsd=0,lastCompletedAtMs,lastMessages=[],lastUsage;pi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE,renderCacheKeepAliveEntry);function append(data){pi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE,data)}function stop(reason,forceEntry=!1){let shouldAppend=active||inFlight||timer!==void 0||forceEntry;generation2+=1,timer!==void 0&&clearTimeout(timer),timer=void 0,active=!1,shouldAppend&&append({phase:"stopped",iterations:attempts,stopReason:reason,cumulativeEstimatedUsd})}function arm(){if(parked||timer!==void 0||inFlight)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(!settings?.enabled||current?.model===void 0||lastCompletedAtMs===void 0||!isWarmSupportedModel(current.model))return;if(!current.isIdle()){stop("agent-busy");return}if(current.hasPendingMessages()){stop("pending-messages");return}let safeWaitSeconds=current.getPromptCacheSafeWaitSeconds?.();if(safeWaitSeconds===void 0||!Number.isFinite(safeWaitSeconds))return;if(attempts>=Math.max(0,settings.maxRequestsPerSession)){stop("max-requests",!0);return}let projectedUsd=projectedPingCost(current.model,lastUsage);if(cumulativeEstimatedUsd+projectedUsd>Math.max(0,settings.maxCostUsdPerSession)){stop("cost-cap",!0);return}active||(active=!0,append({phase:"started"}));let intervalMs=Math.max(0,safeWaitSeconds-Math.max(0,settings.marginSeconds))*1e3,delayMs=Math.max(0,lastCompletedAtMs+intervalMs-Date.now()),scheduledGeneration=generation2;timer=setTimeout(()=>{timer=void 0,ping(scheduledGeneration)},delayMs)}async function ping(scheduledGeneration){if(scheduledGeneration!==generation2)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(current===void 0||settings?.enabled!==!0||current.model===void 0||!isWarmSupportedModel(current.model)||!current.isIdle()||current.hasPendingMessages()||attempts>=Math.max(0,settings.maxRequestsPerSession)||cumulativeEstimatedUsd+projectedPingCost(current.model,lastUsage)>Math.max(0,settings.maxCostUsdPerSession)){arm();return}inFlight=!0,attempts+=1;let iteration=attempts,pingGeneration=generation2;try{let preparation=await current.prepareProviderRequest?.(lastMessages);if(pingGeneration!==generation2){inFlight=!1,arm();return}let preparedMessages=preparation?.messages??lastMessages,activeToolNames=new Set(pi.getActiveTools()),tools=pi.getAllTools().filter(tool=>activeToolNames.has(tool.name)).map(({name,description,parameters})=>({name,description,parameters})),auth=await current.modelRegistry.getApiKeyAndHeaders(current.model);if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!auth.ok)throw new Error(auth.error);let authHeaders=auth.headers??{},headers=preparation?await preparation.transformHeaders(authHeaders):authHeaders,result3=await warm(current.model,{systemPrompt:current.getSystemPrompt(),messages:convertToLlm2(preparedMessages),...tools.length>0?{tools}:{}},{apiKey:auth.apiKey,headers,sessionId:current.sessionManager.getSessionId(),cacheRetention:current.model.cacheRetention,onPayload:preparation?async payload=>await preparation.transformPayload(payload):void 0});if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!result3.supported){inFlight=!1,stop("unsupported-model");return}let estimatedCostUsd=actualPingCost(current.model,result3.usage);cumulativeEstimatedUsd+=estimatedCostUsd,lastCompletedAtMs=Date.now();let cachedTokens=result3.usage.cacheRead+result3.usage.cacheWrite,ttlSeconds=resolvePromptCacheTtlSeconds(current.model)??0;pi.events?.emit(CACHE_WARM_PING_EVENT,{iteration,cachedTokens,ttlSeconds,estimatedCostUsd}),append({phase:"ping",iteration,cacheRead:result3.usage.cacheRead,cacheWrite:result3.usage.cacheWrite,estimatedCostUsd,cumulativeEstimatedUsd}),inFlight=!1,arm()}catch{inFlight=!1,pingGeneration===generation2?stop("provider-error"):arm()}}pi.on("session_start",(_event,nextCtx)=>{stop("session-restart"),ctx=nextCtx,attempts=0,cumulativeEstimatedUsd=0,lastMessages=nextCtx.sessionManager.buildSessionContext().messages,lastUsage=lastAssistantUsage(lastMessages),lastCompletedAtMs=lastAssistantTimestamp(lastMessages),arm(),prewarm.start(nextCtx)}),pi.on("agent_end",(event,nextCtx)=>{ctx=nextCtx;let usage3=lastAssistantUsage(event.messages);if(usage3?.stopReason==="error"){stop("provider-error");return}lastMessages=[...event.messages],lastUsage=usage3,lastCompletedAtMs=Date.now(),arm()}),pi.on("model_select",(_event,nextCtx)=>{ctx=nextCtx,stop("model-changed"),arm()}),pi.on("session_parked",()=>{parked=!0,stop("session-parked")}),pi.on("session_resumed",(_event,nextCtx)=>{parked=!1,ctx=nextCtx,arm()}),pi.on("agent_start",()=>stop("agent-busy")),pi.on("input",()=>stop("user-input")),pi.on("session_shutdown",()=>{stop("session-dispose"),prewarm.cancel(),ctx=void 0})}}function isWarmSupportedModel(model){return model.api==="anthropic-messages"&&isAnthropicApiBaseUrl(model.baseUrl)}function lastAssistantUsage(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant")return{input:finiteTokens(message.usage.input),cacheRead:finiteTokens(message.usage.cacheRead),cacheWrite:finiteTokens(message.usage.cacheWrite),stopReason:message.stopReason}}}function lastAssistantTimestamp(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant"&&Number.isFinite(message.timestamp))return message.timestamp}}function projectedPingCost(model,usage3){return((usage3?.input??0)+(usage3?.cacheRead??0)+(usage3?.cacheWrite??0))*Math.max(model.cost.cacheRead,model.cost.cacheWrite)/1e6}function actualPingCost(model,usage3){return(usage3.cacheRead*model.cost.cacheRead+usage3.cacheWrite*model.cost.cacheWrite+usage3.input*model.cost.input)/1e6}function finiteTokens(value2){return Number.isFinite(value2)&&value2>0?value2:0}function formatUsd(value2){return`$${value2.toFixed(3)}`}var cache_keepalive_default=createCacheKeepAliveExtension();import{existsSync as existsSync13,lstatSync as lstatSync3,readFileSync as readFileSync22}from"node:fs";import{basename as basename10,dirname as dirname16,relative as relative5,resolve as resolve12,sep as sep5}from"node:path";import{existsSync as existsSync12,readFileSync as readFileSync18}from"node:fs";import{join as join23,relative as relative3,resolve as resolve8,sep as sep3}from"node:path";var SUBDIRECTORY_ENTRY_NAMES=["index.ts","index.js","package.json"];function isExtensionSource(name){return name.endsWith(".ts")||name.endsWith(".js")}function isWithinPackage(relativePath){return relativePath!==""&&!relativePath.startsWith("..")&&!relativePath.startsWith(sep3)}function manifestEntryPaths(extensionsDir,packageName){let packageDir=join23(extensionsDir,packageName),packageJsonPath=join23(packageDir,"package.json");if(!existsSync12(packageJsonPath))return[];try{let parsed=JSON.parse(readFileSync18(packageJsonPath,"utf-8"));if(typeof parsed!="object"||parsed===null)return[];let pi=parsed.pi;if(typeof pi!="object"||pi===null)return[];let declared=pi.extensions;return Array.isArray(declared)?declared.filter(entry=>typeof entry=="string").map(entry=>relative3(extensionsDir,resolve8(packageDir,entry))).filter(isWithinPackage):[]}catch{return[]}}function isLoadableExtensionEntry(extensionsDir,relativePath){let segments=relativePath.split(sep3).filter(segment2=>segment2!==""),[first,second]=segments;return first===void 0?!1:segments.length===1?isExtensionSource(first):segments.length===2&&SUBDIRECTORY_ENTRY_NAMES.some(entryName=>entryName===second)?!0:manifestEntryPaths(extensionsDir,first).includes(relativePath)}function isScannableExtensionDirectory(extensionsDir,relativePath){if(relativePath==="")return!0;let segments=relativePath.split(sep3).filter(segment2=>segment2!==""),[first]=segments;return first===void 0?!1:segments.length===1?!0:manifestEntryPaths(extensionsDir,first).some(entryPath=>entryPath===relativePath||entryPath.startsWith(`${relativePath}${sep3}`))}import{readFileSync as readFileSync19}from"node:fs";import{dirname as dirname14,resolve as resolve9}from"node:path";function isInsideExtensionsDirectory(path13,agentDir){return resolve9(dirname14(path13))===resolve9(agentDir,"extensions")}function isGeneratedShim(path13){try{return hasGeneratedShimBanner(readFileSync19(path13,"utf-8"))}catch{return!1}}function excludeGeneratedExtensionShims(paths,agentDir){return paths.filter(path13=>!(isInsideExtensionsDirectory(path13,agentDir)&&isGeneratedShim(path13)))}import{chmodSync as chmodSync6,closeSync as closeSync6,mkdirSync as mkdirSync10,openSync as openSync6,renameSync as renameSync11,rmSync as rmSync9,statSync as statSync9,writeSync as writeSync3}from"node:fs";import{dirname as dirname15,join as join24}from"node:path";var DEFAULT_MAX_BYTES6=5*1024*1024,MAX_TEXT_LENGTH=200,SENSITIVE_PATH=/(^|[/\\])(?:auth\.json|credentials?(?:\.[^/\\]+)?)$/i,SENSITIVE_TEXT2=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createConfigReloadLogger(agentDir,options={}){let filePath=join24(agentDir,"logs","config-reload.log"),maxBytes=validMaxBytes3(options.maxBytes),disabled2=!1;function log(level,event,details){if(disabled2)return{written:!1,disabled:!0};try{return writeLine3(filePath,JSON.stringify(formatEntry(level,event,details)),maxBytes),{written:!0,disabled:!1}}catch{return disabled2=!0,{written:!1,disabled:!0}}}return{debug:(event,details)=>log("debug",event,details),info:(event,details)=>log("info",event,details),warn:(event,details)=>log("warn",event,details),error:(event,details)=>log("error",event,details)}}function validMaxBytes3(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES6}function formatEntry(level,event,details){let entry={ts:new Date().toISOString(),level,event};switch(event){case"watcher_started":{let eventDetails=details;entry.targetCount=finiteNumber(eventDetails.targetCount);break}case"change_detected":{let eventDetails=details;entry.registrationId=safeText2(eventDetails.registrationId),entry.paths=safePaths(eventDetails.paths),entry.deferred=eventDetails.deferred===!0;break}case"self_write_suppressed":addSafePath(entry,details.path);break;case"routine_settings_change_suppressed":addSafePath(entry,details.path);break;case"generated_shim_change_suppressed":addSafePath(entry,details.path);break;case"reload_requested":{let eventDetails=details;entry.reason=safeText2(eventDetails.reason),entry.paths=safePaths(eventDetails.paths);break}case"reload_deferred":entry.reason=safeText2(details.reason);break;case"reload_completed":entry.durationMs=finiteNumber(details.durationMs);break;case"validation_rejected":case"registration_rejected":{let eventDetails=details;entry.registrationId=safeText2(eventDetails.registrationId),entry.errorCount=finiteNumber(eventDetails.errorCount);break}case"watcher_error":{let eventDetails=details;addSafePath(entry,eventDetails.path),entry.message=safeText2(eventDetails.message);break}case"registration_added":case"registration_removed":entry.id=safeText2(details.id);break}return entry}function finiteNumber(value2){return Number.isFinite(value2)?value2:0}function addSafePath(entry,path13){SENSITIVE_PATH.test(path13)||(entry.path=safeText2(path13))}function safePaths(paths){return paths.filter(path13=>!SENSITIVE_PATH.test(path13)).map(safeText2)}function safeText2(value2){let redacted=value2.replace(SENSITIVE_TEXT2,"$1[redacted]");return redacted.length<=MAX_TEXT_LENGTH?redacted:`${redacted.slice(0,MAX_TEXT_LENGTH-3)}...`}function writeLine3(filePath,line,maxBytes){mkdirSync10(dirname15(filePath),{recursive:!0,mode:448});let text2=`${line}
1054
+ ${SIDE_QUERY_INSTRUCTION}`,messages=boundSideQueryMessages([...input.history,{role:"user",content:input.question,timestamp:Date.now()}],systemPrompt,input.promptContextWindow);return{systemPrompt,messages,tools:[]}}async function runSideQuery(deps,context,callbacks={}){callbacks.signal?.throwIfAborted();let streamFn=deps.streamFn??streamSimple,establishment=new AbortController,signal=callbacks.signal?AbortSignal.any([callbacks.signal,establishment.signal]):establishment.signal,timeoutMs=deps.establishmentTimeoutMs??DEFAULT_ESTABLISHMENT_TIMEOUT_MS,timeoutError=new Error(`/btw provider did not produce an event within ${Math.round(timeoutMs/1e3)}s`),timer;try{let options={apiKey:deps.auth.apiKey,headers:deps.auth.headers,extraBody:deps.auth.extraBody,sessionId:`${deps.sessionId}:btw:${crypto.randomUUID()}`,reasoning:deps.thinkingLevel,signal};timer=setTimeout(()=>establishment.abort(timeoutError),timeoutMs),timer.unref?.();let stream2=await streamFn(deps.model,context,options),established=!1,replyText="";for await(let event of stream2)if(!established&&event.type!=="start"&&(established=!0,clearTimeout(timer),timer=void 0),event.type==="text_delta")replyText+=event.delta,callbacks.onTextDelta?.(event.delta);else{if(event.type==="done")break;if(event.type==="error")throw new Error(event.error.errorMessage||"Side query failed")}return signal.throwIfAborted(),{replyText}}catch(error2){throw establishment.signal.aborted&&!callbacks.signal?.aborted?timeoutError:error2}finally{timer&&clearTimeout(timer)}}var WIDGET_KEY2="btw";function btwExtension(pi){let active;function dismiss(ctx,options){let current=active;current&&(active=void 0,options.abort&&current.controller.abort(),current.unsubscribeEscape?.(),current.panel&&ctx.ui.setWidget(WIDGET_KEY2,void 0))}pi.on("session_before_switch",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_before_fork",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_shutdown",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("input",(_event,ctx)=>{active?.settled&&dismiss(ctx,{abort:!1})}),pi.registerCommand("btw",{description:"Ask a side question in parallel without touching the main session",argumentHint:"<question>",handler:async(args,ctx)=>{let question=args.trim();if(!question){if(active){dismiss(ctx,{abort:!0});return}ctx.ui.notify("Usage: /btw <question>","warning");return}let model=ctx.model;if(!model){ctx.ui.notify("No active model available for /btw.","error");return}let snapshot=buildSessionContext2(ctx.sessionManager.getEntries(),ctx.sessionManager.getLeafId()),history=convertToLlm2(snapshot.messages),systemPrompt=ctx.getSystemPrompt(),thinkingLevel=pi.getThinkingLevel(),sessionId=ctx.sessionManager.getSessionId();dismiss(ctx,{abort:!0});let controller=new AbortController,entry={controller,panel:void 0,unsubscribeEscape:void 0,settled:!1};active=entry,ctx.mode==="tui"&&ctx.hasUI&&(ctx.ui.setWidget(WIDGET_KEY2,(tui,theme2)=>{let panel=new BtwPanel(question,tui,theme2);return entry.panel=panel,panel.component}),entry.unsubscribeEscape=ctx.ui.onTerminalInput(data=>{active!==entry||isKeyRelease(data)||!matchesKey(data,"escape")||dismiss(ctx,{abort:!0})}));let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok){if(active!==entry)return;dismiss(ctx,{abort:!1}),ctx.ui.notify(`/btw: ${auth.error}`,"error");return}try{let context=buildSideQueryContext({systemPrompt,history,question,promptContextWindow:getSideQueryPromptContextWindow(model)}),{replyText}=await runSideQuery({model:auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,auth:{apiKey:auth.apiKey,headers:auth.headers,extraBody:auth.extraBody},sessionId,thinkingLevel:thinkingLevel==="off"?void 0:thinkingLevel,streamFn:(streamModel,streamContext,options)=>ctx.modelRegistry.modelRuntime.streamSimple(streamModel,streamContext,options)},context,{signal:controller.signal,onTextDelta:delta=>{active===entry&&entry.panel?.appendText(delta)}});if(active!==entry)return;entry.settled=!0,entry.panel?entry.panel.markDone():ctx.ui.notify(replyText,"info")}catch(error2){if(active!==entry)return;entry.settled=!0;let message=error2 instanceof Error?error2.message:String(error2);if(controller.signal.aborted){entry.panel?.markAborted();return}entry.panel?entry.panel.markError(message):ctx.ui.notify(`/btw failed: ${message}`,"error")}}})}var GOAL_CACHE_WARMUP_ENTRY_TYPE="goal-cache-warmup",GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS=24e4,GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS=27e4,GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS=3570,GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS=1e3,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS=36e5;function resolveGoalMonitorContinuationDelayMs(goalBackstopMaxSeconds){let configuredMs=typeof goalBackstopMaxSeconds=="number"&&Number.isFinite(goalBackstopMaxSeconds)&&goalBackstopMaxSeconds>0?goalBackstopMaxSeconds*1e3:GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS;return Math.max(GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS,Math.min(configuredMs,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS))}function resolveGoalBackstopMaxSecondsForCache(goalBackstopMaxSeconds,lifetime){return lifetime?.kind!=="best-effort"?goalBackstopMaxSeconds:goalBackstopMaxSeconds===void 0||goalBackstopMaxSeconds*1e3===GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS?GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS:goalBackstopMaxSeconds}function resolveGoalPromptCacheLifetime(model,env){return model===void 0?void 0:resolvePromptCacheLifetime(model,toProviderEnv(env))}function createGoalCacheWarmScheduleData(options){return{goalId:options.goalId,delayMs:options.delayMs,dueAtMs:options.scheduledAtMs+options.delayMs,iteration:options.iteration,activeMonitorCount:options.activeMonitorCount,wakeSources:options.wakeSources,...options.cache!==void 0?{cache:options.cache}:{}}}var TOKENS_PER_PRICE_UNIT=1e6;function estimateCacheWarmMetrics(model,env,lastTurnUsage){let cachedTokens=clampTokens(lastTurnUsage?.cacheRead)+clampTokens(lastTurnUsage?.cacheWrite),lifetime=resolveGoalPromptCacheLifetime(model,env);if(lifetime?.kind==="best-effort")return cachedTokens===0?void 0:{cachedTokens,cacheLifetime:"best-effort"};let ttlSeconds=lifetime?.kind==="ttl"?lifetime.ttlSeconds:void 0;if(ttlSeconds===void 0&&cachedTokens===0)return;let estimatedSavedUsd=model!==void 0&&cachedTokens>0?Math.max(0,model.cost.input-model.cost.cacheRead)*cachedTokens/TOKENS_PER_PRICE_UNIT:void 0;return{cachedTokens,...ttlSeconds!==void 0?{ttlSeconds}:{},...estimatedSavedUsd!==void 0?{estimatedSavedUsd}:{}}}function formatWarmTokenCount(tokens){return tokens>=1e6?`${trimTrailingZero((tokens/1e6).toFixed(1))}M`:tokens>=1e3?`${trimTrailingZero((tokens/1e3).toFixed(1))}K`:String(Math.max(0,Math.trunc(tokens)))}function formatWakeDuration(ms){let seconds=Math.round(ms/1e3);if(seconds<60)return`${seconds}s`;let minutes=Math.floor(seconds/60),restSeconds=seconds%60;if(minutes<60)return restSeconds===0?`${minutes}m`:`${minutes}m ${restSeconds}s`;let hours=Math.floor(minutes/60),restMinutes=minutes%60;return restMinutes===0?`${hours}h`:`${hours}h ${restMinutes}m`}function formatWakeTimestamp(dueAtMs){let date=new Date(dueAtMs),local=formatLocalWakeTimestamp(date);return local!==void 0?local:`${date.toISOString().slice(0,16).replace("T"," ")} UTC`}function formatLocalWakeTimestamp(date){try{let parts=new Intl.DateTimeFormat("en-CA",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23",timeZoneName:"short"}).formatToParts(date),read=type2=>parts.find(part=>part.type===type2)?.value,year=read("year"),month=read("month"),day=read("day"),hour=read("hour"),minute=read("minute");if(year===void 0||month===void 0||day===void 0||hour===void 0||minute===void 0)return;let zone=read("timeZoneName");return`${year}-${month}-${day} ${hour}:${minute}${zone===void 0?"":` ${zone}`}`}catch{return}}function formatCacheTtl(seconds){return seconds%3600===0?`${seconds/3600}h`:seconds%60===0?`${seconds/60}m`:`${seconds}s`}function formatSavedUsd(value2){return value2<5e-4?"<$0.001":value2<1?`$${value2.toFixed(3)}`:`$${value2.toFixed(2)}`}function trimTrailingZero(value2){return value2.endsWith(".0")?value2.slice(0,-2):value2}function clampTokens(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.trunc(value2):0}function toProviderEnv(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}var PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4;function createSessionPrewarm(pi,dependencies){let isPrewarmModel=dependencies.isPrewarmModel??isOpenAIResponsesPromptCacheModel,current;function cancel2(){current?.abort(),current=void 0}async function run2(ctx,model,controller){let{signal}=controller;try{let prefix=await ctx.getPromptCachePrefixRequest?.({signal});if(signal.aborted||prefix===void 0)return;if(prefix.status==="skipped"){append({phase:"skipped",provider:model.provider,model:model.id,reason:prefix.reason});return}let{request:request2}=prefix,result3=await dependencies.warm(request2.model,request2.context,{...request2.options,signal,timeoutMs:PROMPT_CACHE_PREWARM_TIMEOUT_MS});if(signal.aborted||!result3.supported)return;append({phase:"warmed",provider:model.provider,model:model.id,usage:toUsage(model,result3.usage)})}catch(error2){if(signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);append({phase:"failed",provider:model.provider,model:model.id,error:message})}finally{current===controller&&(current=void 0)}}function append(data){pi.appendEntry(PROMPT_CACHE_PREWARM_ENTRY_TYPE,data)}return{start(ctx){cancel2();let model=ctx.model;if(model===void 0||model.cacheRetention==="none"||!isPrewarmModel(model))return;let controller=new AbortController;current=controller,run2(ctx,model,controller)},cancel:cancel2}}function toUsage(model,usage3){let cost=usage3.cost??{input:usage3.input*model.cost.input/1e6,output:usage3.output*model.cost.output/1e6,cacheRead:usage3.cacheRead*model.cost.cacheRead/1e6,cacheWrite:usage3.cacheWrite*model.cost.cacheWrite/1e6,total:0};return{input:usage3.input,output:usage3.output,cacheRead:usage3.cacheRead,cacheWrite:usage3.cacheWrite,totalTokens:usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost:{...cost,total:cost.input+cost.output+cost.cacheRead+cost.cacheWrite}}}var CACHE_KEEPALIVE_ENTRY_TYPE="cache-keepalive",CACHE_WARM_PING_EVENT="cache_warm_ping",renderCacheKeepAliveEntry=noticeEntryRenderer(entry=>{let data=entry.data;if(data?.phase!=="ping")return;let refreshed=data.cacheRead+data.cacheWrite;return{title:`\u26A1 Warm ping #${data.iteration} \xB7 ~${formatWarmTokenCount(refreshed)} tokens refreshed \xB7 ${formatUsd(data.estimatedCostUsd)}`,why:"Refreshed the active Anthropic prompt cache while the session was idle.",expandedLine:`cache read ${data.cacheRead} \xB7 cache write ${data.cacheWrite} \xB7 session total ${formatUsd(data.cumulativeEstimatedUsd)}`}});function createCacheKeepAliveExtension(dependencies={}){let warm=dependencies.warmPromptCache??warmPromptCache;return pi=>{let prewarm=createSessionPrewarm(pi,{warm,isPrewarmModel:dependencies.isPromptCachePrewarmModel}),ctx,timer,inFlight=!1,generation2=0,active=!1,parked=!1,attempts=0,cumulativeEstimatedUsd=0,lastCompletedAtMs,lastMessages=[],lastUsage;pi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE,renderCacheKeepAliveEntry);function append(data){pi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE,data)}let armOnSettle=!1;function stop(reason,forceEntry=!1){let shouldAppend=active||inFlight||timer!==void 0||forceEntry;generation2+=1,timer!==void 0&&clearTimeout(timer),timer=void 0,active=!1,shouldAppend&&append({phase:"stopped",iterations:attempts,stopReason:reason,cumulativeEstimatedUsd})}function arm(){if(parked||timer!==void 0||inFlight)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(!settings?.enabled||current?.model===void 0||lastCompletedAtMs===void 0||!isWarmSupportedModel(current.model))return;if(!current.isIdle()){stop("agent-busy");return}if(current.hasPendingMessages()){stop("pending-messages");return}let safeWaitSeconds=current.getPromptCacheSafeWaitSeconds?.();if(safeWaitSeconds===void 0||!Number.isFinite(safeWaitSeconds))return;if(attempts>=Math.max(0,settings.maxRequestsPerSession)){stop("max-requests",!0);return}let projectedUsd=projectedPingCost(current.model,lastUsage);if(cumulativeEstimatedUsd+projectedUsd>Math.max(0,settings.maxCostUsdPerSession)){stop("cost-cap",!0);return}active||(active=!0,append({phase:"started"}));let intervalMs=Math.max(0,safeWaitSeconds-Math.max(0,settings.marginSeconds))*1e3,delayMs=Math.max(0,lastCompletedAtMs+intervalMs-Date.now()),scheduledGeneration=generation2;timer=setTimeout(()=>{timer=void 0,ping(scheduledGeneration)},delayMs)}async function ping(scheduledGeneration){if(scheduledGeneration!==generation2)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(current===void 0||settings?.enabled!==!0||current.model===void 0||!isWarmSupportedModel(current.model)||!current.isIdle()||current.hasPendingMessages()||attempts>=Math.max(0,settings.maxRequestsPerSession)||cumulativeEstimatedUsd+projectedPingCost(current.model,lastUsage)>Math.max(0,settings.maxCostUsdPerSession)){arm();return}inFlight=!0,attempts+=1;let iteration=attempts,pingGeneration=generation2;try{let preparation=await current.prepareProviderRequest?.(lastMessages);if(pingGeneration!==generation2){inFlight=!1,arm();return}let preparedMessages=preparation?.messages??lastMessages,prefix=await current.getPromptCachePrefixRequest?.(),activeToolNames=new Set(pi.getActiveTools()),tools=prefix?.status==="ready"?prefix.request.context.tools??[]:pi.getAllTools().filter(tool=>activeToolNames.has(tool.name)).map(({name,description,parameters})=>({name,description,parameters})),auth=await current.modelRegistry.getApiKeyAndHeaders(current.model);if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!auth.ok)throw new Error(auth.error);let authHeaders=auth.headers??{},headers=preparation?await preparation.transformHeaders(authHeaders):authHeaders,result3=await warm(current.model,{systemPrompt:current.getSystemPrompt(),messages:convertToLlm2(preparedMessages),...tools.length>0?{tools}:{}},{apiKey:auth.apiKey,headers,sessionId:current.sessionManager.getSessionId(),cacheRetention:current.model.cacheRetention,onPayload:preparation?async payload=>await preparation.transformPayload(payload):void 0});if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!result3.supported){inFlight=!1,stop("unsupported-model");return}let estimatedCostUsd=actualPingCost(current.model,result3.usage);cumulativeEstimatedUsd+=estimatedCostUsd,lastCompletedAtMs=Date.now();let cachedTokens=result3.usage.cacheRead+result3.usage.cacheWrite,ttlSeconds=resolvePromptCacheTtlSeconds(current.model)??0;pi.events?.emit(CACHE_WARM_PING_EVENT,{iteration,cachedTokens,ttlSeconds,estimatedCostUsd}),append({phase:"ping",iteration,cacheRead:result3.usage.cacheRead,cacheWrite:result3.usage.cacheWrite,estimatedCostUsd,cumulativeEstimatedUsd}),inFlight=!1,arm()}catch{inFlight=!1,pingGeneration===generation2?stop("provider-error"):arm()}}pi.on("session_start",(_event,nextCtx)=>{stop("session-restart"),ctx=nextCtx,attempts=0,cumulativeEstimatedUsd=0,lastMessages=nextCtx.sessionManager.buildSessionContext().messages,lastUsage=lastAssistantUsage(lastMessages),lastCompletedAtMs=lastAssistantTimestamp(lastMessages),arm(),prewarm.start(nextCtx)}),pi.on("agent_end",(event,nextCtx)=>{ctx=nextCtx;let usage3=lastAssistantUsage(event.messages);if(usage3?.stopReason==="error"){armOnSettle=!1,stop("provider-error");return}lastMessages=[...event.messages],lastUsage=usage3,lastCompletedAtMs=Date.now(),armOnSettle=!0,arm()}),pi.on("agent_settled",(_event,nextCtx)=>{ctx=nextCtx,armOnSettle&&(armOnSettle=!1,arm())}),pi.on("model_select",(_event,nextCtx)=>{ctx=nextCtx,stop("model-changed"),arm()}),pi.on("session_parked",()=>{parked=!0,stop("session-parked")}),pi.on("session_resumed",(_event,nextCtx)=>{parked=!1,ctx=nextCtx,arm()}),pi.on("agent_start",()=>stop("agent-busy")),pi.on("input",()=>stop("user-input")),pi.on("session_shutdown",()=>{stop("session-dispose"),prewarm.cancel(),ctx=void 0})}}function isWarmSupportedModel(model){return model.api==="anthropic-messages"&&isAnthropicApiBaseUrl(model.baseUrl)}function lastAssistantUsage(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant")return{input:finiteTokens(message.usage.input),cacheRead:finiteTokens(message.usage.cacheRead),cacheWrite:finiteTokens(message.usage.cacheWrite),stopReason:message.stopReason}}}function lastAssistantTimestamp(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant"&&Number.isFinite(message.timestamp))return message.timestamp}}function projectedPingCost(model,usage3){return((usage3?.input??0)+(usage3?.cacheRead??0)+(usage3?.cacheWrite??0))*Math.max(model.cost.cacheRead,model.cost.cacheWrite)/1e6}function actualPingCost(model,usage3){return(usage3.cacheRead*model.cost.cacheRead+usage3.cacheWrite*model.cost.cacheWrite+usage3.input*model.cost.input)/1e6}function finiteTokens(value2){return Number.isFinite(value2)&&value2>0?value2:0}function formatUsd(value2){return`$${value2.toFixed(3)}`}var cache_keepalive_default=createCacheKeepAliveExtension();var ADDRESS_PREFIX=/^(?:<@[^>\s]+>[:,]?|[^\n,<]{1,40}님,|@[^\s,]{1,40},)[ \t]*/u,INTENT_SENTENCE=[/^I(?:'m| am)? read(?:ing)? this as\b/i,/^I read (?:this|that|your (?:message|request)) as\b/i,/(?:요청|질문|말|바람|지시|고민|부탁|뜻|의도|얘기|이야기)(?:으)?로\s*(?:읽었|이해했|받아들였)/u,/(?:걸|것으)로\s*(?:읽었|이해했)/u,/^(?:이건|이거|이번 건|이 (?:말|요청|질문|메시지)[은는]|(?:요청|질문|메시지)[을를])\s.*(?:으)?로\s*(?:읽었|이해했)/u],STOP_SENTENCE=[/\bI'?ll stop (?:when|once|after)\b/i,/\bI will stop (?:when|once|after)\b/i,/멈출\s*조건/u,/여기서\s*(?:멈출|마칠|끝낼|멈추|마치)/u,/(?:멈출|마칠|끝낼)게(?:요)?[.!]?$/u,/(?:보내|전달하|답하)면\s*(?:끝|마무리)/u],PLAN_SENTENCE=/(?:할|줄|드릴|볼|답할|정리할|설명할|알려줄|알려드릴)게(?:요)?[.!]?$/u,HANDOFF_LABEL=/^\s*(?:>\s*)?(?:\*{1,2})?(?:Ask|wanted|For you|Now|Next|You need|최초\s*의도|원했던\s*것|궁금해할\s*정보|지금\s*집중하는\s*것|다음\s*계획)(?:\*{1,2})?\s*[::]/iu,HANDOFF_OPENING=/^\s*(?:>\s*)?(?:\*{1,2})?(?:Ask|wanted|For you|최초\s*의도|원했던\s*것|궁금해할\s*정보)(?:\*{1,2})?\s*[::]/iu,HANDOFF_SIGNATURE=[/\bAsk\s*[::].*\s-\s*wanted\s*[::]/iu,/\bFor you\s*[::].*\bNow\s*[::].*\bNext\s*[::]/iu],LEDGER_MARKER=[/^\s*(?:Overall|Remaining items|Active phase)\b.*\d/iu,/\bledger\s+\d+\s*\/\s*\d+/iu],LEDGER_ITEM=[/^\s*[-*]\s*\[[ xX]\]\s/u,/^\s*[-*]\s.*\[(?:pending|in_progress|completed|done|dropped)\]/iu,/^\s*(?:Todo|TODO|To-do|Ledger|투두|할\s*일\s*목록|렛져|레저)\s*[::]/u],matchesAny=(patterns,line)=>patterns.some(pattern=>pattern.test(line)),isIntent=sentence=>matchesAny(INTENT_SENTENCE,sentence),isStop=sentence=>matchesAny(STOP_SENTENCE,sentence);function sentencesOf(paragraph){return paragraph.split(/(?<=[.!?。])\s+/u).map(sentence=>sentence.trim()).filter(sentence=>sentence.length>0)}function leadingRoutingCount(sentences){let first=sentences[0];if(first===void 0||!(isIntent(first)||isStop(first)))return 0;let end=0;for(let index=0;index<sentences.length;index+=1){let sentence=sentences[index]??"";if(isIntent(sentence)||isStop(sentence)){end=index+1;continue}if(!(index===end&&PLAN_SENTENCE.test(sentence)&&sentences.slice(index+1).some(isStop)))break}return end}function classifyLines(lines){let kinds=lines.map(line=>matchesAny(HANDOFF_SIGNATURE,line)?"handoff":null);for(let index=0;index<lines.length;){let end=index;for(;end<lines.length&&HANDOFF_LABEL.test(lines[end]??"");)end+=1;let opens=lines.slice(index,end).some(line=>HANDOFF_OPENING.test(line));if(end-index>=2&&opens)for(let at=index;at<end;at+=1)kinds[at]="handoff";index=Math.max(end,index+1)}for(let index=0;index<lines.length;){let end=index;for(;end<lines.length&&(lines[end]??"").trim()!=="";)end+=1;let block=lines.slice(index,end);block.some((line,at)=>matchesAny(LEDGER_MARKER,line)||kinds[index+at]==="handoff")&&block.forEach((line,at)=>{kinds[index+at]===null&&(matchesAny(LEDGER_MARKER,line)||matchesAny(LEDGER_ITEM,line))&&(kinds[index+at]="ledger")}),index=end+1}return kinds}function stripAgentScaffold(input){let removed=[],normalized2=input.replace(/\r\n?/g,`
1055
+ `).trim(),prefix=ADDRESS_PREFIX.exec(normalized2)?.[0]??"",all=normalized2.slice(prefix.length).split(`
1056
+ `),kinds=classifyLines(all),lines=all.filter((line,index)=>{let kind=kinds[index];return kind==null?!0:(removed.push(`${kind}: ${line.trim()}`),!1)}),first=lines.findIndex(line=>line.trim().length>0);if(first>=0){let sentences=sentencesOf(lines[first]??""),count=leadingRoutingCount(sentences);count>0&&(removed.push(...sentences.slice(0,count).map(sentence=>`routing: ${sentence}`)),lines[first]=sentences.slice(count).join(" "))}if(removed.length===0)return{text:input,removed,empty:!1};let body=lines.join(`
1057
+ `).replace(/\n{3,}/g,`
1058
+
1059
+ `).trim(),empty=!/[\p{L}\p{N}]/u.test(body);return{text:empty?"":`${prefix}${body}`,removed,empty}}function scrubAssistantMessage(message){let changed=!1,content=message.content.map(block=>{if(block.type!=="text"||block.audience==="model")return block;let strip=stripAgentScaffold(block.text);return strip.removed.length===0?block:(changed=!0,{...block,text:strip.text})});return changed?{...message,content}:void 0}function chatReplyScrubExtension(pi){pi.on("message_end",async(event,ctx)=>{let message=event.message;if(message.role!=="assistant"||(ctx.getSystemPromptOptions?.().surface??resolvePromptSurface(process.env))!=="chat")return;let scrubbed=scrubAssistantMessage(message);return scrubbed?{message:scrubbed}:void 0})}import{existsSync as existsSync13,lstatSync as lstatSync3,readFileSync as readFileSync22}from"node:fs";import{basename as basename10,dirname as dirname16,relative as relative5,resolve as resolve12,sep as sep5}from"node:path";import{existsSync as existsSync12,readFileSync as readFileSync18}from"node:fs";import{join as join23,relative as relative3,resolve as resolve8,sep as sep3}from"node:path";var SUBDIRECTORY_ENTRY_NAMES=["index.ts","index.js","package.json"];function isExtensionSource(name){return name.endsWith(".ts")||name.endsWith(".js")}function isWithinPackage(relativePath){return relativePath!==""&&!relativePath.startsWith("..")&&!relativePath.startsWith(sep3)}function manifestEntryPaths(extensionsDir,packageName){let packageDir=join23(extensionsDir,packageName),packageJsonPath=join23(packageDir,"package.json");if(!existsSync12(packageJsonPath))return[];try{let parsed=JSON.parse(readFileSync18(packageJsonPath,"utf-8"));if(typeof parsed!="object"||parsed===null)return[];let pi=parsed.pi;if(typeof pi!="object"||pi===null)return[];let declared=pi.extensions;return Array.isArray(declared)?declared.filter(entry=>typeof entry=="string").map(entry=>relative3(extensionsDir,resolve8(packageDir,entry))).filter(isWithinPackage):[]}catch{return[]}}function isLoadableExtensionEntry(extensionsDir,relativePath){let segments=relativePath.split(sep3).filter(segment2=>segment2!==""),[first,second]=segments;return first===void 0?!1:segments.length===1?isExtensionSource(first):segments.length===2&&SUBDIRECTORY_ENTRY_NAMES.some(entryName=>entryName===second)?!0:manifestEntryPaths(extensionsDir,first).includes(relativePath)}function isScannableExtensionDirectory(extensionsDir,relativePath){if(relativePath==="")return!0;let segments=relativePath.split(sep3).filter(segment2=>segment2!==""),[first]=segments;return first===void 0?!1:segments.length===1?!0:manifestEntryPaths(extensionsDir,first).some(entryPath=>entryPath===relativePath||entryPath.startsWith(`${relativePath}${sep3}`))}import{readFileSync as readFileSync19}from"node:fs";import{dirname as dirname14,resolve as resolve9}from"node:path";function isInsideExtensionsDirectory(path13,agentDir){return resolve9(dirname14(path13))===resolve9(agentDir,"extensions")}function isGeneratedShim(path13){try{return hasGeneratedShimBanner(readFileSync19(path13,"utf-8"))}catch{return!1}}function excludeGeneratedExtensionShims(paths,agentDir){return paths.filter(path13=>!(isInsideExtensionsDirectory(path13,agentDir)&&isGeneratedShim(path13)))}import{chmodSync as chmodSync6,closeSync as closeSync6,mkdirSync as mkdirSync10,openSync as openSync6,renameSync as renameSync11,rmSync as rmSync9,statSync as statSync9,writeSync as writeSync3}from"node:fs";import{dirname as dirname15,join as join24}from"node:path";var DEFAULT_MAX_BYTES6=5*1024*1024,MAX_TEXT_LENGTH=200,SENSITIVE_PATH=/(^|[/\\])(?:auth\.json|credentials?(?:\.[^/\\]+)?)$/i,SENSITIVE_TEXT2=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createConfigReloadLogger(agentDir,options={}){let filePath=join24(agentDir,"logs","config-reload.log"),maxBytes=validMaxBytes3(options.maxBytes),disabled2=!1;function log(level,event,details){if(disabled2)return{written:!1,disabled:!0};try{return writeLine3(filePath,JSON.stringify(formatEntry(level,event,details)),maxBytes),{written:!0,disabled:!1}}catch{return disabled2=!0,{written:!1,disabled:!0}}}return{debug:(event,details)=>log("debug",event,details),info:(event,details)=>log("info",event,details),warn:(event,details)=>log("warn",event,details),error:(event,details)=>log("error",event,details)}}function validMaxBytes3(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES6}function formatEntry(level,event,details){let entry={ts:new Date().toISOString(),level,event};switch(event){case"watcher_started":{let eventDetails=details;entry.targetCount=finiteNumber(eventDetails.targetCount);break}case"change_detected":{let eventDetails=details;entry.registrationId=safeText2(eventDetails.registrationId),entry.paths=safePaths(eventDetails.paths),entry.deferred=eventDetails.deferred===!0;break}case"self_write_suppressed":addSafePath(entry,details.path);break;case"routine_settings_change_suppressed":addSafePath(entry,details.path);break;case"generated_shim_change_suppressed":addSafePath(entry,details.path);break;case"reload_requested":{let eventDetails=details;entry.reason=safeText2(eventDetails.reason),entry.paths=safePaths(eventDetails.paths);break}case"reload_deferred":entry.reason=safeText2(details.reason);break;case"reload_completed":entry.durationMs=finiteNumber(details.durationMs);break;case"validation_rejected":case"registration_rejected":{let eventDetails=details;entry.registrationId=safeText2(eventDetails.registrationId),entry.errorCount=finiteNumber(eventDetails.errorCount);break}case"watcher_error":{let eventDetails=details;addSafePath(entry,eventDetails.path),entry.message=safeText2(eventDetails.message);break}case"registration_added":case"registration_removed":entry.id=safeText2(details.id);break}return entry}function finiteNumber(value2){return Number.isFinite(value2)?value2:0}function addSafePath(entry,path13){SENSITIVE_PATH.test(path13)||(entry.path=safeText2(path13))}function safePaths(paths){return paths.filter(path13=>!SENSITIVE_PATH.test(path13)).map(safeText2)}function safeText2(value2){let redacted=value2.replace(SENSITIVE_TEXT2,"$1[redacted]");return redacted.length<=MAX_TEXT_LENGTH?redacted:`${redacted.slice(0,MAX_TEXT_LENGTH-3)}...`}function writeLine3(filePath,line,maxBytes){mkdirSync10(dirname15(filePath),{recursive:!0,mode:448});let text2=`${line}
1053
1060
  `;fileExceedsCap2(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync9(`${filePath}.1`,{force:!0}),renameSync11(filePath,`${filePath}.1`),chmodSync6(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync3(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync6(filePath,384)}function fileExceedsCap2(filePath,incomingBytes,maxBytes){try{return statSync9(filePath).size+incomingBytes>maxBytes}catch(error2){if(isMissingFileError2(error2))return!1;throw error2}}function isMissingFileError2(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}var configWatchChannels={register:"config-watch:register",unregister:"config-watch:unregister",ready:"config-watch:ready",changed:"config-watch:changed",reloaded:"config-watch:reloaded",rejected:"config-watch:rejected"},CONFIG_WATCH_REGISTER=configWatchChannels.register,CONFIG_WATCH_UNREGISTER=configWatchChannels.unregister,CONFIG_WATCH_READY=configWatchChannels.ready,CONFIG_WATCH_CHANGED=configWatchChannels.changed,CONFIG_WATCH_RELOADED=configWatchChannels.reloaded,CONFIG_WATCH_REJECTED=configWatchChannels.rejected;function isRecord19(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isStringArray(value2){return Array.isArray(value2)&&value2.every(entry=>typeof entry=="string")}function isConfigWatchTarget(value2){return isRecord19(value2)&&typeof value2.path=="string"&&(value2.kind==="file"||value2.kind==="dir")&&(value2.filterGlobs===void 0||isStringArray(value2.filterGlobs))}function isConfigWatchRegistration(value2){return isRecord19(value2)&&typeof value2.id=="string"&&typeof value2.displayName=="string"&&Array.isArray(value2.targets)&&value2.targets.every(isConfigWatchTarget)&&(value2.validate===void 0||typeof value2.validate=="function")}function isConfigWatchValidation(value2){return!isRecord19(value2)||typeof value2.ok!="boolean"?!1:value2.ok||isStringArray(value2.errors)}function isConfigWatchUnregistration(value2){return isRecord19(value2)&&typeof value2.id=="string"}function matchesConfigWatchFilter(path13,filterGlobs){if(filterGlobs===void 0||filterGlobs.length===0)return!0;let normalizedPath=path13.replaceAll("\\","/"),basename31=normalizedPath.slice(normalizedPath.lastIndexOf("/")+1);return filterGlobs.some(filterGlob=>filterGlob.startsWith("/")?normalizedPath===filterGlob.slice(1):filterGlob.startsWith("*")?normalizedPath.endsWith(filterGlob.slice(1)):basename31===filterGlob||normalizedPath.endsWith(`/${filterGlob}`))}var ReloadVetoDeferral=class{#notifiedReason;defer(reason){let effective=reason??"an extension blocked the reload";if(this.#notifiedReason!==effective)return this.#notifiedReason=effective,`Hot-reload deferred: ${effective}`}reset(){this.#notifiedReason=void 0}};import{readFileSync as readFileSync20}from"node:fs";import{resolve as resolve10}from"node:path";var ROUTINE_SETTINGS_KEYS=new Set(["defaultModel","defaultProvider","defaultThinkingLevel","modelThinkingLevels","modelLastOnThinkingLevels","modelServiceTiers","lastChangelogVersion","changelogSeen","tipsHistory"]);function joinConfigDir(cwd){return resolve10(cwd,CONFIG_DIR_NAME)}function isSettingsPath(path13,agentDir,cwd){let resolvedPath=resolve10(path13);return["settings.jsonc","settings.json"].some(name=>resolvedPath===resolve10(agentDir,name)||resolvedPath===resolve10(joinConfigDir(cwd),name))}function settingsSnapshotKey(path13){return resolve10(path13)}function updateSettingsContentSnapshot(contents,path13){let key=settingsSnapshotKey(path13);try{contents.set(key,readFileSync20(path13,"utf-8"))}catch{contents.delete(key)}}function refreshSettingsContentSnapshots(contents,agentDir,cwd){contents.clear();for(let name of["settings.jsonc","settings.json"])updateSettingsContentSnapshot(contents,resolve10(agentDir,name)),updateSettingsContentSnapshot(contents,resolve10(joinConfigDir(cwd),name))}function parseSettingsObject(content){try{return parseSettingsJson(content)}catch{return}}function changedTopLevelKeys(previous,next){let keys=new Set([...Object.keys(previous),...Object.keys(next)]),changed=[];for(let key of keys)JSON.stringify(previous[key])!==JSON.stringify(next[key])&&changed.push(key);return changed.sort()}function isRoutineOnlySettingsChange(previousContent,nextContent){if(previousContent===void 0||nextContent===void 0)return!1;let previous=parseSettingsObject(previousContent),next=parseSettingsObject(nextContent);if(previous===void 0||next===void 0)return!1;let changedKeys=changedTopLevelKeys(previous,next);return changedKeys.length>0&&changedKeys.every(key=>ROUTINE_SETTINGS_KEYS.has(key))}function excludeRoutineOnlySettingsChanges(paths,contents,agentDir,cwd,logger){return paths.filter(path13=>{if(!isSettingsPath(path13,agentDir,cwd))return!0;let previousContent=contents.get(settingsSnapshotKey(path13)),nextContent;try{nextContent=readFileSync20(path13,"utf-8")}catch{nextContent=void 0}return updateSettingsContentSnapshot(contents,path13),isRoutineOnlySettingsChange(previousContent,nextContent)?(logger.debug("routine_settings_change_suppressed",{path:path13}),!1):!0})}function bindSessionScopedCallback(callback){let scope=activeProviderScope();if(scope===void 0)return callback;let bound=bindToProviderScope(callback);return(...args)=>{scope.state!=="closed"&&bound(...args)}}import{createHash as createHash7}from"node:crypto";import{lstatSync as lstatSync2,readdirSync as readdirSync3,readFileSync as readFileSync21}from"node:fs";import{basename as basename9,isAbsolute,join as join25,normalize,relative as relative4,resolve as resolve11,sep as sep4}from"node:path";var DEFAULT_DEBOUNCE_MS=200,DEFAULT_CLOCK={setTimeout:(callback,delayMs)=>setTimeout(callback,delayMs),clearTimeout:timer=>clearTimeout(timer)},ConfigReloadWatchEngine=class{#states;#unsubscribes=[];#closeCompletion;#subscribe;#onRealChange;#onError;#hashFile;#clock;#debounceMs;#pending=new Map;#timer;#closed=!1;constructor(options){this.#subscribe=options.subscribe,this.#onRealChange=options.onRealChange,this.#onError=options.onError??(()=>{}),this.#hashFile=options.hashFile??hashFile,this.#clock=options.clock??DEFAULT_CLOCK,this.#debounceMs=options.debounceMs??DEFAULT_DEBOUNCE_MS,this.#states=options.targets.map(target=>{let resolvedTarget={...target,path:resolve11(target.path)},scan2=this.#scan(resolvedTarget);return{target:resolvedTarget,hashes:scan2.hashes,allowedDirectories:scan2.allowedDirectories,watchedDirectories:new Map,scannedDirectories:scan2.scannedDirectories}});for(let state of this.#states)this.#attach(state,state.scannedDirectories)}#attach(state,directories){let wanted=state.target.kind==="dir-recursive"?new Set([state.target.path,...directories]):new Set([state.target.path]);for(let directory of wanted)if(!state.watchedDirectories.has(directory))try{let unsubscribe=this.#subscribe(directory,(eventType,filename)=>{this.#onEvent(state,eventType,filename,directory)},{recursive:!1});state.watchedDirectories.set(directory,unsubscribe),this.#unsubscribes.push(unsubscribe)}catch(error2){this.#reportError(error2,directory)}}#detachMissing(state,live){for(let[directory,unsubscribe]of[...state.watchedDirectories]){if(directory===state.target.path||live.has(directory))continue;state.watchedDirectories.delete(directory);let index=this.#unsubscribes.indexOf(unsubscribe);index>=0&&this.#unsubscribes.splice(index,1);try{unsubscribe()}catch(error2){this.#reportError(error2,directory)}}}close(){if(this.#closed)return this.#closeCompletion??Promise.resolve();this.#closed=!0,this.#timer&&(this.#clock.clearTimeout(this.#timer),this.#timer=void 0);let unsubscribes=this.#unsubscribes.splice(0);return this.#closeCompletion=Promise.allSettled(unsubscribes.map(async unsubscribe=>unsubscribe())).then(results=>{let errors=results.filter(result3=>result3.status==="rejected").map(result3=>result3.reason);if(errors.length>0)throw new AggregateError(errors,"Config watcher teardown failed")}),this.#closeCompletion}getBaselineSnapshot(){let snapshot=new Map;for(let state of this.#states)for(let[path13,hash]of state.hashes)snapshot.set(path13,hash);return snapshot}#onEvent(state,_eventType,filename,watchedDirectory){if(!this.#closed){if(filename===null)this.#pending.set(state,null);else if(this.#pending.get(state)!==null){let affected=this.#pending.get(state)??new Set,relPath=normalizeRelativePath(watchedDirectory&&watchedDirectory!==state.target.path?join25(relative4(state.target.path,watchedDirectory),filename):filename);relPath&&this.#matches(state.target,relPath)&&(affected.add(relPath),this.#pending.set(state,affected))}this.#schedule()}}#schedule(){this.#timer&&this.#clock.clearTimeout(this.#timer),this.#timer=this.#clock.setTimeout(()=>{this.#timer=void 0,this.#evaluatePending()},this.#debounceMs)}#evaluatePending(){if(this.#closed)return;let changes=new Map;for(let[state,affected]of this.#pending)this.#evaluateState(state,affected,changes);if(this.#pending.clear(),changes.size>0){let changedPaths=[...changes.keys()].sort();this.#onRealChange({changedPaths,created:changedPaths.filter(path13=>changes.get(path13)?.created),deleted:changedPaths.filter(path13=>changes.get(path13)?.deleted)})}}#evaluateState(state,affected,changes){let previousHashes=new Map(state.hashes),previousDirectories=new Set(state.allowedDirectories),next=affected===null?this.#scan(state.target):this.#scanAffected(state.target,affected,state);if(affected===null){state.hashes.clear();for(let[path13,hash]of next.hashes)state.hashes.set(path13,hash);state.allowedDirectories.clear();for(let path13 of next.allowedDirectories)state.allowedDirectories.add(path13);state.scannedDirectories=next.scannedDirectories,this.#detachMissing(state,state.scannedDirectories),this.#attach(state,state.scannedDirectories),this.#compare(previousHashes,previousDirectories,state.hashes,state.allowedDirectories,changes);return}let prefixes=[...affected].map(relPath=>join25(state.target.path,relPath));for(let path13 of[...state.hashes.keys()])prefixes.some(prefix=>isWithin(path13,prefix))&&state.hashes.delete(path13);for(let path13 of[...state.allowedDirectories])prefixes.some(prefix=>isWithin(path13,prefix))&&state.allowedDirectories.delete(path13);for(let path13 of[...state.scannedDirectories])prefixes.some(prefix=>isWithin(path13,prefix))&&state.scannedDirectories.delete(path13);for(let[path13,hash]of next.hashes)state.hashes.set(path13,hash);for(let path13 of next.allowedDirectories)state.allowedDirectories.add(path13);for(let path13 of next.scannedDirectories)state.scannedDirectories.add(path13);this.#detachMissing(state,state.scannedDirectories),this.#attach(state,state.scannedDirectories),this.#compare(previousHashes,previousDirectories,state.hashes,state.allowedDirectories,changes)}#scanAffected(target,affected,state){let result3={hashes:new Map,allowedDirectories:new Set,scannedDirectories:new Set};for(let relPath of affected){let absolutePath=join25(target.path,relPath);this.#scanPath(target,absolutePath,relPath,result3,state)}return result3}#scan(target){let result3={hashes:new Map,allowedDirectories:new Set,scannedDirectories:new Set};return this.#scanPath(target,target.path,"",result3),result3}#scanPath(target,absolutePath,relPath,result3,state){if(relPath&&!this.#matches(target,relPath))return;let entry;try{entry=lstatSync2(absolutePath)}catch(error2){state&&!isMissing(error2)&&this.#reportError(error2,absolutePath);return}if(entry.isSymbolicLink())return;if(entry.isFile()){try{result3.hashes.set(absolutePath,this.#hashFile(absolutePath))}catch(error2){this.#reportError(error2,absolutePath)}return}if(!entry.isDirectory())return;let dotDirectory=relPath!==""&&basename9(relPath).startsWith("."),explicitlyAllowedDirectory=relPath!==""&&this.#isExplicitlyAllowedDirectory(target,relPath);if(explicitlyAllowedDirectory&&result3.allowedDirectories.add(absolutePath),!(relPath&&target.kind==="dir")&&!(dotDirectory&&!explicitlyAllowedDirectory)){result3.scannedDirectories.add(absolutePath);try{for(let child of readdirSync3(absolutePath,{withFileTypes:!0})){if(child.isSymbolicLink()||child.name==="node_modules"||child.name===".git")continue;let childRelPath=relPath?join25(relPath,child.name):child.name;child.isDirectory()&&child.name.startsWith(".")&&!this.#isExplicitlyAllowedDirectory(target,childRelPath)||this.#scanPath(target,join25(absolutePath,child.name),childRelPath,result3,state)}}catch(error2){this.#reportError(error2,absolutePath)}}}#compare(previousHashes,previousDirectories,nextHashes,nextDirectories,changes){for(let[path13,hash]of nextHashes){let oldHash=previousHashes.get(path13);oldHash!==hash&&changes.set(path13,{created:oldHash===void 0,deleted:!1})}for(let path13 of previousHashes.keys())nextHashes.has(path13)||changes.set(path13,{created:!1,deleted:!0});for(let path13 of nextDirectories)previousDirectories.has(path13)||changes.set(path13,{created:!0,deleted:!1});for(let path13 of previousDirectories)nextDirectories.has(path13)||changes.set(path13,{created:!1,deleted:!0})}#matches(target,relPath){return!target.kind.includes("recursive")&&relPath.includes(sep4)||target.allowList&&!target.allowList.some(allowed=>relPath===allowed||relPath.startsWith(`${allowed}${sep4}`))?!1:target.filter?.(relPath)??!0}#isExplicitlyAllowedDirectory(target,relPath){return target.allowList?.some(allowed=>relPath===allowed||relPath.startsWith(`${allowed}${sep4}`))??!1}#reportError(error2,path13){try{this.#onError(error2,path13)}catch{}}};function hashFile(path13){return createHash7("sha256").update(readFileSync21(path13)).digest("hex")}function normalizeRelativePath(filename){if(isAbsolute(filename))return;let normalized2=normalize(filename);return normalized2==="."||normalized2===".."||normalized2.startsWith(`..${sep4}`)?void 0:normalized2}function isWithin(path13,prefix){return path13===prefix||path13.startsWith(`${prefix}${sep4}`)}function isMissing(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}var BUILTIN_REGISTRATION_ID="builtin",DEFAULT_DEBOUNCE_MS2=200,COMPACTION_RECHECK_MS=250,VETO_RECHECK_MS=1e3,CONFIG_FILE_NAMES=["settings.jsonc","settings.json","models.json","keybindings.json"],extensionWatchFilter=extensionsDir=>relPath=>isLoadableExtensionEntry(extensionsDir,relPath)||isScannableExtensionDirectory(extensionsDir,relPath),ConfigReloadHandoffRegistry=class{#handoffs=new Map;set(sessionHandle,handoff){this.#handoffs.set(sessionHandle,handoff)}take(sessionHandle){let handoff=this.#handoffs.get(sessionHandle);return this.#handoffs.delete(sessionHandle),handoff}delete(sessionHandle){this.#handoffs.delete(sessionHandle)}},reloadHandoffs=new ConfigReloadHandoffRegistry;function configReloadExtension(pi,options={}){let sessionOwned=(()=>{try{return bindToProviderScope(()=>{}),!0}catch{return!1}})(),handoffKey=ctx=>sessionOwned?ctx.sessionManager.getSessionId():"classic",agentDir=resolve12(options.agentDir??getAgentDir()),subscribe=options.subscribe??createFsWatchEventSource(),logger=options.logger??createConfigReloadLogger(agentDir),registrations=new Map,rejectedRegistrations=new Map,settingsContents=new Map,eventUnsubscribes=[],pending=new Map,engine,activeTargets=[],currentContext,started=!1,watcherClosures=[],reloadInFlight=!1,deferredNoticeShown=!1,unavailableReloadLogged=!1,compactionRecheck,vetoRecheck,vetoDeferral=new ReloadVetoDeferral,changeChain=Promise.resolve(),closeWatchers=()=>{engine&&(watcherClosures.push(Promise.allSettled([engine.close()])),engine=void 0,activeTargets=[])},clearCompactionRecheck=()=>{compactionRecheck!==void 0&&((options.clock??defaultClock).clearTimeout(compactionRecheck),compactionRecheck=void 0)},clearVetoRecheck=()=>{vetoRecheck!==void 0&&((options.clock??defaultClock).clearTimeout(vetoRecheck),vetoRecheck=void 0)},cleanupEventListeners=()=>{for(let unsubscribe of eventUnsubscribes.splice(0))unsubscribe()},rejectRegistration=(registrationId,errors)=>{pi.events.emit(CONFIG_WATCH_REJECTED,{registrationId,paths:[],errors:[...errors]}),logger.warn("registration_rejected",{registrationId,errorCount:errors.length})},handleRegistration=payload=>{if(!isConfigWatchRegistration(payload))return;let fingerprint=registrationFingerprint(payload);if(rejectedRegistrations.get(payload.id)===fingerprint){logger.debug("registration_rejection_suppressed",{registrationId:payload.id});return}let cwd=currentContext?.cwd??process.cwd();if(registrationHasRestrictedTarget(payload,cwd,agentDir)){rejectedRegistrations.set(payload.id,fingerprint),rejectRegistration(payload.id,["Configuration watch target is restricted"]);return}rejectedRegistrations.delete(payload.id),registrations.get(payload.id)!==payload&&(registrations.set(payload.id,payload),pending.delete(payload.id),logger.info("registration_added",{id:payload.id}),started&&currentContext&&rebuildWatchers(currentContext))},handleUnregistration=payload=>{isConfigWatchUnregistration(payload)&&(rejectedRegistrations.delete(payload.id),registrations.delete(payload.id)&&(pending.delete(payload.id),logger.info("registration_removed",{id:payload.id}),started&&currentContext&&rebuildWatchers(currentContext)))},processChange=async change=>{if(reloadInFlight||!currentContext||!started)return;let changeContext=currentContext,watchedPaths=excludeSelfWrites(change.changedPaths,engine,agentDir,currentContext.cwd,logger,settingsContents),significantPaths=excludeRoutineOnlySettingsChanges(watchedPaths,settingsContents,agentDir,currentContext.cwd,logger),configPaths=excludeGeneratedExtensionShims(significantPaths,agentDir);for(let path13 of significantPaths)configPaths.includes(path13)||logger.debug("generated_shim_change_suppressed",{path:path13});let groups=groupChangedPaths(configPaths,activeTargets),rearmDirectoryWatch=change.created.some(path13=>activeTargets.some(target=>target.rearmOnCreation===resolve12(path13)));for(let[registrationId,paths]of groups){let errors=await validateChangedPaths(registrationId,paths,registrations,agentDir,currentContext.cwd);if(!started||currentContext!==changeContext)return;if(errors.length>0){rejectChange(currentContext,registrationId,paths,errors,logger,pi);continue}addPending(pending,registrationId,paths);let deferred=!canRequestReload(currentContext);pi.events.emit(CONFIG_WATCH_CHANGED,{registrationId,paths:[...paths],deferred}),logger.info("change_detected",{registrationId,paths,deferred})}rearmDirectoryWatch&&rebuildWatchers(currentContext),await flushPending()},enqueueChange=change=>{reloadInFlight||(changeChain=changeChain.then(()=>processChange(change)).catch(error2=>{logger.error("watcher_error",{path:"config reload",message:errorMessage3(error2)})}))},rebuildWatchers=ctx=>{if(!started||currentContext!==ctx)return;closeWatchers(),clearCompactionRecheck();let settingsManager=SettingsManager.create(ctx.cwd,agentDir,{projectTrusted:ctx.isProjectTrusted()}),settings=resolveConfigReloadSettings(settingsManager);if(!settings.enabled||ctx.mode==="print"||ctx.mode==="json"||ctx.mode==="rpc"&&ctx.sessionManager.getSessionFile()===void 0){pi.events.emit(CONFIG_WATCH_READY,{enabled:!1});return}activeTargets=buildWatchTargets({cwd:ctx.cwd,agentDir,projectTrusted:ctx.isProjectTrusted(),settings,skillPaths:settings.watch.skills?settingsManager.getSkillPaths():[],registrations}),engine=new ConfigReloadWatchEngine({targets:activeTargets.map(entry=>entry.target),subscribe,debounceMs:settings.debounceMs,clock:options.clock,hashFile:options.hashFile,onRealChange:bindSessionScopedCallback(enqueueChange),onError:bindSessionScopedCallback((error2,path13)=>{logger.error("watcher_error",{path:path13,message:errorMessage3(error2)})})}),refreshSettingsContentSnapshots(settingsContents,agentDir,ctx.cwd),logger.info("watcher_started",{targetCount:activeTargets.length}),pi.events.emit(CONFIG_WATCH_READY,{enabled:!0})},flushPending=async()=>{let ctx=currentContext;if(!ctx||pending.size===0||reloadInFlight||!ctx.isIdle()||ctx.hasPendingMessages())return;if(ctx.isCompacting?.()??!1){armCompactionRecheck();return}if(clearCompactionRecheck(),!ctx.requestReload){unavailableReloadLogged||(unavailableReloadLogged=!0,logger.info("reload_requested",{reason:"requestReload unavailable",paths:[]}));return}if(ctx.checkReloadVeto){let veto=await ctx.checkReloadVeto();if(currentContext!==ctx||reloadInFlight||pending.size===0)return;if(veto.cancelled){let notice2=vetoDeferral.defer(veto.reason);notice2&&ctx.ui.notify(notice2,"info"),logger.info("reload_deferred",{reason:veto.reason??"extension veto"}),armVetoRecheck();return}}clearVetoRecheck(),vetoDeferral.reset();let changes=pendingChanges(pending),paths=uniquePaths(changes.flatMap(change=>change.paths));reloadInFlight=!0,reloadHandoffs.set(handoffKey(ctx),{hashesAtRequest:engine?.getBaselineSnapshot()??new Map,settingsContentsAtRequest:new Map(settingsContents),requestedAt:Date.now(),changes}),ctx.ui.notify(`Hot-reloading: ${formatPaths(paths)}`,"info"),logger.info("reload_requested",{reason:"config changed",paths});let handoffKeyForReload=handoffKey(ctx);try{await ctx.requestReload(),reloadInFlight=!1,reloadHandoffs.delete(handoffKeyForReload)}catch(error2){reloadInFlight=!1,reloadHandoffs.delete(handoffKeyForReload),logger.error("watcher_error",{path:"reload",message:errorMessage3(error2)})}},armCompactionRecheck=()=>{if(compactionRecheck!==void 0)return;compactionRecheck=(options.clock??defaultClock).setTimeout(()=>{compactionRecheck=void 0,flushPending()},COMPACTION_RECHECK_MS)},armVetoRecheck=()=>{if(vetoRecheck!==void 0)return;vetoRecheck=(options.clock??defaultClock).setTimeout(()=>{vetoRecheck=void 0,flushPending()},VETO_RECHECK_MS)},processReloadHandoff=async(event,ctx)=>{if(event.reason!=="reload")return;let handoff=reloadHandoffs.take(handoffKey(ctx));if(!handoff)return;let paths=uniquePaths(handoff.changes.flatMap(change=>change.paths));for(let change of handoff.changes)pi.events.emit(CONFIG_WATCH_RELOADED,{registrationId:change.registrationId,paths:[...change.paths]});ctx.ui.notify(`Hot-reloaded: ${formatPaths(paths)}`,"info"),logger.info("reload_completed",{durationMs:Math.max(0,Date.now()-handoff.requestedAt)});let changedPaths=compareSnapshots(handoff.hashesAtRequest,engine?.getBaselineSnapshot()??new Map);if(changedPaths.length>0){settingsContents.clear();for(let[path13,content]of handoff.settingsContentsAtRequest)settingsContents.set(path13,content);enqueueChange({changedPaths,created:[],deleted:[]}),await changeChain}};eventUnsubscribes.push(pi.events.on(CONFIG_WATCH_REGISTER,handleRegistration)),eventUnsubscribes.push(pi.events.on(CONFIG_WATCH_UNREGISTER,handleUnregistration)),pi.on("session_start",async(event,ctx)=>{started=!0,currentContext=ctx,rebuildWatchers(ctx),await processReloadHandoff(event,ctx)}),pi.on("agent_end",async(_event,ctx)=>{started&&(currentContext=ctx,await flushPending())}),pi.on("agent_settled",async(_event,ctx)=>{started&&(currentContext=ctx,await flushPending())}),pi.on("project_trust",()=>(currentContext&&rebuildWatchers(currentContext),{trusted:"undecided"})),pi.on("session_shutdown",async event=>{let closingContext=currentContext;started=!1,currentContext=void 0,closeWatchers(),clearCompactionRecheck(),clearVetoRecheck(),vetoDeferral.reset(),cleanupEventListeners(),pending.clear(),event.reason!=="reload"&&closingContext&&reloadHandoffs.delete(handoffKey(closingContext));let errors=(await Promise.all(watcherClosures.splice(0))).flat().filter(result3=>result3.status==="rejected").map(result3=>result3.reason);if(errors.length>0)throw new AggregateError(errors,"Config watcher shutdown failed")});function canRequestReload(ctx){return ctx.isIdle()&&!ctx.hasPendingMessages()&&!(ctx.isCompacting?.()??!1)&&ctx.requestReload!==void 0}function armDeferredNotice(ctx){deferredNoticeShown||pending.size===0||!ctx.requestReload||(deferredNoticeShown=!0,ctx.ui.notify("Config changed; reloading when idle","info"))}function rejectChange(ctx,registrationId,paths,errors,activeLogger,api){ctx.ui.notify(`Config change rejected: ${errors.join("; ")}`,"error"),api.events.emit(CONFIG_WATCH_REJECTED,{registrationId,paths:[...paths],errors:[...errors]}),activeLogger.warn("validation_rejected",{registrationId,errorCount:errors.length})}function addPending(changes,registrationId,paths){let pendingChange=changes.get(registrationId)??{registrationId,paths:new Set};for(let path13 of paths)pendingChange.paths.add(path13);changes.set(registrationId,pendingChange),canRequestReload(currentContext)||armDeferredNotice(currentContext)}}var config_reload_default=configReloadExtension,defaultClock={setTimeout:(callback,delayMs)=>setTimeout(callback,delayMs),clearTimeout:timer=>clearTimeout(timer)};function resolveConfigReloadSettings(settingsManager){let global=readConfigReloadPatch(settingsManager.getGlobalSettings()),project=readConfigReloadPatch(settingsManager.getProjectSettings());return{enabled:project.enabled??global.enabled??!0,debounceMs:project.debounceMs??global.debounceMs??DEFAULT_DEBOUNCE_MS2,watch:{settings:project.watch?.settings??global.watch?.settings??!0,models:project.watch?.models??global.watch?.models??!0,keybindings:project.watch?.keybindings??global.watch?.keybindings??!0,prompts:project.watch?.prompts??global.watch?.prompts??!0,skills:project.watch?.skills??global.watch?.skills??!0,extensions:project.watch?.extensions??global.watch?.extensions??!0}}}function readConfigReloadPatch(settings){let candidate=settings.configReload;if(!isPlainObject2(candidate))return{};let watch2=isPlainObject2(candidate.watch)?candidate.watch:void 0;return{enabled:typeof candidate.enabled=="boolean"?candidate.enabled:void 0,debounceMs:validDebounce(candidate.debounceMs),watch:watch2?{settings:booleanOrUndefined(watch2.settings),models:booleanOrUndefined(watch2.models),keybindings:booleanOrUndefined(watch2.keybindings),prompts:booleanOrUndefined(watch2.prompts),skills:booleanOrUndefined(watch2.skills),extensions:booleanOrUndefined(watch2.extensions)}:void 0}}function validDebounce(value2){if(!(typeof value2!="number"||!Number.isFinite(value2)||value2<0))return Math.floor(value2)}function booleanOrUndefined(value2){return typeof value2=="boolean"?value2:void 0}function buildWatchTargets(options){let targets=[],addBuiltin=(id,target,rearmOnCreation)=>{targets.push({registrationId:BUILTIN_REGISTRATION_ID,target:{...target,id},rearmOnCreation})},addBuiltinDirectory=(id,path13,filter)=>{let resourcePath=resolve12(path13);if(isExistingDirectory(resourcePath)){addBuiltin(id,filter?{kind:"dir-recursive",path:resourcePath,filter}:{kind:"dir-recursive",path:resourcePath});return}let watchPath=nearestExistingDirectory(dirname16(resourcePath)),firstMissingSegment=relative5(watchPath,resourcePath).split(sep5)[0]||basename10(resourcePath),createdPath=resolve12(watchPath,firstMissingSegment);addBuiltin(`${id}-presence`,{kind:"dir",path:watchPath,allowList:[firstMissingSegment]},createdPath)},{cwd,agentDir,projectTrusted,settings}=options,projectDir=joinConfigDir(cwd),jsonAllowList=CONFIG_FILE_NAMES.filter(name=>name==="settings.json"||name==="settings.jsonc"?settings.watch.settings:name==="models.json"?settings.watch.models:settings.watch.keybindings);if(jsonAllowList.length>0&&addBuiltin("builtin-global-json",{kind:"dir",path:agentDir,allowList:jsonAllowList}),settings.watch.prompts&&addBuiltinDirectory("builtin-global-prompts",resolve12(agentDir,"prompts")),settings.watch.extensions){let globalExtensionsDir=resolve12(agentDir,"extensions");addBuiltinDirectory("builtin-global-extensions",globalExtensionsDir,extensionWatchFilter(globalExtensionsDir))}if(settings.watch.skills)for(let[index,skillPath]of options.skillPaths.entries()){let target=targetForSkillPath(resolvePath(skillPath,cwd,{trim:!0}));target.kind==="dir-recursive"?addBuiltinDirectory(`builtin-skill-${index}`,target.path):addBuiltin(`builtin-skill-${index}`,target)}if(projectTrusted){let projectDirExists=isExistingDirectory(projectDir);if(Object.values(settings.watch).some(Boolean)&&addBuiltin("builtin-project-presence",{kind:"dir",path:cwd,allowList:[CONFIG_DIR_NAME]},projectDirExists?void 0:projectDir),projectDirExists&&(settings.watch.settings&&addBuiltin("builtin-project-settings",{kind:"dir",path:projectDir,allowList:["settings.jsonc","settings.json"]}),settings.watch.prompts&&addBuiltinDirectory("builtin-project-prompts",resolve12(projectDir,"prompts")),settings.watch.skills&&addBuiltinDirectory("builtin-project-skills",resolve12(projectDir,"skills")),settings.watch.extensions)){let projectExtensionsDir=resolve12(projectDir,"extensions");addBuiltinDirectory("builtin-project-extensions",projectExtensionsDir,extensionWatchFilter(projectExtensionsDir))}}for(let registration of options.registrations.values())for(let[index,target]of registration.targets.entries()){let path13=resolvePath(target.path,cwd,{trim:!0}),watchTarget=externalTargetToWatchTarget(path13,target.kind,target.filterGlobs);targets.push({registrationId:registration.id,target:{...watchTarget,id:`external-${registration.id}-${index}`}})}return targets}function isExistingDirectory(path13){try{return lstatSync3(path13).isDirectory()}catch{return!1}}function nearestExistingDirectory(path13){let candidate=resolve12(path13);for(;!isExistingDirectory(candidate);){let parent=dirname16(candidate);if(parent===candidate)return candidate;candidate=parent}return candidate}function targetForSkillPath(path13){try{if(lstatSync3(path13).isFile())return{kind:"dir",path:dirname16(path13),allowList:[basename10(path13)]}}catch{}return{kind:"dir-recursive",path:path13}}function externalTargetToWatchTarget(path13,kind,filterGlobs){if(kind==="file"){let name=basename10(path13);return{kind:"dir",path:dirname16(path13),allowList:[name],filter:relativePath=>relativePath===name&&matchesConfigWatchFilter(relativePath,filterGlobs)}}return{kind:"dir-recursive",path:path13,allowList:literalFilterNames(filterGlobs),filter:relativePath=>matchesConfigWatchFilter(relativePath,filterGlobs)}}function literalFilterNames(filterGlobs){if(!filterGlobs)return;let literalNames=filterGlobs.map(filterGlob=>filterGlob.startsWith("/")?filterGlob.slice(1):filterGlob).filter(filterGlob=>!filterGlob.includes("*")&&!filterGlob.includes("/")&&!filterGlob.includes("\\\\"));return literalNames.length>0?literalNames:void 0}function groupChangedPaths(paths,targets){let groups=new Map;for(let path13 of paths){let matched=!1;for(let activeTarget of targets){if(!targetMatchesPath(activeTarget.target,path13))continue;let group=groups.get(activeTarget.registrationId)??[];group.includes(path13)||group.push(path13),groups.set(activeTarget.registrationId,group),matched=!0}if(!matched){let group=groups.get(BUILTIN_REGISTRATION_ID)??[];group.push(path13),groups.set(BUILTIN_REGISTRATION_ID,group)}}return groups}function targetMatchesPath(target,path13){let relativePath=relative5(resolve12(target.path),resolve12(path13));return relativePath===".."||relativePath.startsWith(`..${sep5}`)||target.kind==="dir"&&relativePath.includes(sep5)||target.allowList&&!target.allowList.some(allowed=>relativePath===allowed||relativePath.startsWith(`${allowed}${sep5}`))?!1:target.filter?.(relativePath)??!0}function excludeSelfWrites(paths,engine,agentDir,cwd,logger,settingsContents){let snapshot=engine?.getBaselineSnapshot();return paths.filter(path13=>{if(!isSettingsPath(path13,agentDir,cwd))return!0;let hash=snapshot?.get(path13);return hash===void 0||!wasSelfWrite(path13,hash)?!0:(logger.debug("self_write_suppressed",{path:path13}),updateSettingsContentSnapshot(settingsContents,path13),!1)})}async function validateChangedPaths(registrationId,paths,registrations,agentDir,cwd){if(registrationId===BUILTIN_REGISTRATION_ID)return validateBuiltinPaths(paths,agentDir,cwd);let registration=registrations.get(registrationId);if(!registration?.validate)return[];try{let result3=await registration.validate(paths);return isConfigWatchValidation(result3)?result3.ok?[]:result3.errors:["Configuration validator returned an invalid result"]}catch(error2){return[errorMessage3(error2)]}}function validateBuiltinPaths(paths,agentDir,cwd){let errors=[];for(let path13 of paths){if(isSettingsPath(path13,agentDir,cwd)){let error2=validateSettingsFile(path13);error2&&errors.push(error2);continue}if(resolve12(path13)===resolve12(agentDir,"models.json")){let error2=ModelConfig.loadSync(path13).getError();error2&&errors.push(error2);continue}if(resolve12(path13)===resolve12(agentDir,"keybindings.json")){let error2=validateKeybindingsFile(path13);error2&&errors.push(error2)}}return errors}function validateSettingsFile(path13){if(existsSync13(path13))try{let parsed=parseSettingsJson(readFileSync22(path13,"utf-8"));SettingsManager.inMemory(parsed);return}catch(error2){return`Invalid ${basename10(path13)}: ${errorMessage3(error2)}`}}function validateKeybindingsFile(path13){if(existsSync13(path13))try{let parsed=JSON.parse(readFileSync22(path13,"utf-8"));if(!isPlainObject2(parsed))return"keybindings.json must contain an object";for(let value2 of Object.values(parsed))if(typeof value2!="string"&&!(Array.isArray(value2)&&value2.every(entry=>typeof entry=="string")))return"keybindings.json bindings must be strings or string arrays";return}catch(error2){return`Invalid keybindings.json: ${errorMessage3(error2)}`}}function registrationFingerprint(registration){return JSON.stringify({id:registration.id,displayName:registration.displayName,targets:registration.targets.map(target=>({path:target.path,kind:target.kind,filterGlobs:target.filterGlobs??null})),hasValidate:registration.validate!==void 0})}function isSafeFilteredProtectedTarget(target,resolvedPath,protectedPaths){if(target.kind!=="dir"||protectedPaths.some(protectedPath=>isWithin2(resolvedPath,protectedPath)))return!1;let filterGlobs=target.filterGlobs;return!filterGlobs||filterGlobs.length===0?!1:filterGlobs.every(glob=>{if(!glob.startsWith("/"))return!1;let filteredPath=resolve12(resolvedPath,glob.slice(1));return protectedPaths.every(protectedPath=>!isWithin2(filteredPath,protectedPath)&&!isWithin2(protectedPath,filteredPath))})}function registrationHasRestrictedTarget(registration,cwd,agentDir){let protectedPaths=[resolve12(agentDir,"auth.json"),resolve12(agentDir,"sessions"),resolve12(agentDir,"logs")];return registration.targets.some(target=>{let path13=resolvePath(target.path,cwd,{trim:!0});return isSafeFilteredProtectedTarget(target,path13,protectedPaths)?!1:protectedPaths.some(protectedPath=>isWithin2(path13,protectedPath)||isWithin2(protectedPath,path13))})}function pendingChanges(pending){return[...pending.values()].map(change=>({registrationId:change.registrationId,paths:[...change.paths].sort()}))}function compareSnapshots(previous,next){let changed=new Set;for(let[path13,hash]of next)previous.get(path13)!==hash&&changed.add(path13);for(let path13 of previous.keys())next.has(path13)||changed.add(path13);return[...changed].sort()}function uniquePaths(paths){return[...new Set(paths)].sort()}function isWithin2(path13,root){return path13===root||path13.startsWith(`${root}${sep5}`)}function isPlainObject2(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return!1;let prototype=Object.getPrototypeOf(value2);return prototype===Object.prototype||prototype===null}function errorMessage3(error2){return error2 instanceof Error?error2.message:String(error2)}function formatPaths(paths){return paths.length===0?"configuration":paths.join(", ")}var SENTINEL_OAUTH_FIELDS2={access:"cursor-cli-oauth-managed",refresh:"cursor-cli-oauth-managed",expires:41024448e5};function emptyCredential2(){return{type:"oauth",...SENTINEL_OAUTH_FIELDS2,accounts:[]}}function storedAccounts(credential){return credential.accounts??[]}function listAccounts2(credential){return[...storedAccounts(credential)]}var ACCOUNT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName2(name){if(!ACCOUNT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function addAccount3(credential,slot){if(assertValidAccountName2(slot.name),storedAccounts(credential).some(existing=>existing.name===slot.name))throw new Error(`Account '${slot.name}' already exists`);return{...credential,...SENTINEL_OAUTH_FIELDS2,accounts:[...storedAccounts(credential),slot]}}function removeAccount(credential,name){let accounts=storedAccounts(credential).filter(slot=>slot.name!==name),next={...credential,...SENTINEL_OAUTH_FIELDS2,accounts};return credential.pinned===name&&delete next.pinned,next}function pinAccount(credential,name){return assertValidAccountName2(name),{...credential,...SENTINEL_OAUTH_FIELDS2,pinned:name}}import{createHash as createHash8}from"node:crypto";var DEFAULT_CURSOR_AFFINITY_KEY="cursor-cli-oauth-default",AllCursorAccountsBlockedError=class extends Error{constructor(soonestUnblockAt3){super(soonestUnblockAt3===void 0?"All Cursor CLI OAuth accounts are blocked until re-login.":`All Cursor CLI OAuth accounts are blocked until ${new Date(soonestUnblockAt3).toISOString()}.`),this.name="AllCursorAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt3}};function getAffinityKey2(options){return options.affinityKey??options.sessionId??DEFAULT_CURSOR_AFFINITY_KEY}function score2(key,accountName2){return createHash8("sha256").update(`${key}\0${accountName2}`).digest().readBigUInt64BE(0)}function rendezvousOrder3(key,accounts){return[...accounts].map(account=>({account,score:score2(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isBlocked2(account,now2){return account.blockReason==="auth_error"||account.blockedUntil!==void 0&&account.blockedUntil>now2}function clearExpiredBlocks2(accounts,now2=Date.now()){return accounts.map(account=>{if(account.blockReason!=="auth_error"&&account.blockedUntil!==void 0&&account.blockedUntil<=now2){let{blockedUntil:_blockedUntil,blockReason:_blockReason,...available}=account;return available}return account})}function selectUnblocked2(accounts,options,now2){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);return pinned&&!isBlocked2(pinned,now2)?pinned:rendezvousOrder3(getAffinityKey2(options),accounts).find(account=>!isBlocked2(account,now2))}function soonestUnblockAt2(accounts,now2){let candidates=accounts.map(account=>account.blockedUntil).filter(value2=>value2!==void 0&&value2>now2);return candidates.length===0?void 0:Math.min(...candidates)}function selectAccount2(accounts,options={}){let now2=options.now??Date.now(),selected=selectUnblocked2(accounts,options,now2);if(selected)return selected;let cleared=clearExpiredBlocks2(accounts,now2),afterClear=selectUnblocked2(cleared,options,now2);if(afterClear)return afterClear;throw new AllCursorAccountsBlockedError(soonestUnblockAt2(accounts,now2))}import{execFile as nodeExecFile}from"node:child_process";import{accessSync,constants,readdirSync as readdirSync4,statSync as statSync10}from"node:fs";import{homedir}from"node:os";import{delimiter,join as join26}from"node:path";var CURSOR_AGENT_ENVIRONMENT_PASSTHROUGH=["PATH","TERM","LANG","LC_ALL","FORCE_COLOR"];function cursorAgentEnvironment(home,source=process.env){let env={HOME:home,AGENT_CLI_CREDENTIAL_STORE:"file"};for(let name of CURSOR_AGENT_ENVIRONMENT_PASSTHROUGH){let value2=source[name];value2!==void 0&&(env[name]=value2)}return env}var CursorAgentNotInstalledError=class extends Error{constructor(){super("Cursor CLI is not installed. Install it with `curl https://cursor.com/install -fsS | bash`, then ensure ~/.local/bin is on your PATH."),this.kind="binary_missing",this.name="CursorAgentNotInstalledError"}};function executableCandidate(candidate,deps){if(candidate)try{return deps.isExecutableFile(candidate)?candidate:void 0}catch{return}}function resolveFromPath(deps){let pathValue=deps.env("PATH");if(pathValue)for(let directory of pathValue.split(deps.pathDelimiter)){if(!directory)continue;let candidate=executableCandidate(join26(directory,"cursor-agent"),deps);if(candidate)return candidate}}function resolveFromInstalledVersions(deps){let versionsDirectory=join26(deps.homeDirectory,".local","share","cursor-agent","versions"),entries;try{entries=deps.readDirectory(versionsDirectory)}catch{return}let directoryNames=entries.filter(entry=>entry.isDirectory).map(entry=>entry.name).sort().reverse();for(let directoryName of directoryNames){let candidate=executableCandidate(join26(versionsDirectory,directoryName,"cursor-agent"),deps);if(candidate)return candidate}}function resolveCursorAgentExecutable(deps){let orderedCandidates=[deps.env("SENPI_CURSOR_CLI_OAUTH_EXECUTABLE"),deps.env("CURSOR_AGENT_EXECUTABLE"),deps.settings.executablePath];for(let candidate of orderedCandidates){let executable=executableCandidate(candidate,deps);if(executable)return executable}let pathExecutable=resolveFromPath(deps);if(pathExecutable)return pathExecutable;let installedExecutable=resolveFromInstalledVersions(deps);if(installedExecutable)return installedExecutable;throw new CursorAgentNotInstalledError}var defaultVersionProbeDeps={execFile:(file,args,options,callback)=>{nodeExecFile(file,args,options,(error2,stdout,stderr)=>{callback(error2,stdout,stderr)})}};function probeCursorAgentVersion(executable,deps=defaultVersionProbeDeps){return new Promise((resolve44,reject)=>{let options={encoding:"utf8",timeout:1e4,env:cursorAgentEnvironment(homedir())};deps.execFile(executable,["--version"],options,(error2,stdout)=>{if(error2){reject(error2);return}resolve44(stdout.trim())})})}function defaultCursorAgentExecutableDeps(){return{env:name=>process.env[name],settings:{},homeDirectory:homedir(),pathDelimiter:delimiter,isExecutableFile:candidate=>{try{return statSync10(candidate).isFile()?(accessSync(candidate,constants.X_OK),!0):!1}catch{return!1}},readDirectory:directory=>readdirSync4(directory,{withFileTypes:!0}).map(entry=>({name:entry.name,isDirectory:entry.isDirectory()}))}}var CURSOR_CONTEXT_OVERFLOW_WORDINGS=[],OTHER_ERROR2={kind:"other",retryable:!1},MAX_TEXT_DEPTH=5,MAX_TEXT_VALUES=100;function record3(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}function collectText(value2,output,seen,depth){if(!(output.length>=MAX_TEXT_VALUES||depth>MAX_TEXT_DEPTH)){if(typeof value2=="string"){output.push(value2);return}if(value2 instanceof Error&&output.push(value2.message),!(value2===null||typeof value2!="object"||seen.has(value2))){seen.add(value2);for(let nested of Object.values(value2))if(collectText(nested,output,seen,depth+1),output.length>=MAX_TEXT_VALUES)return}}}function errorText3(input){let parts=[],seen=new Set;return collectText(input.stderr,parts,seen,0),collectText(input.resultEvent,parts,seen,0),collectText(input.thrown,parts,seen,0),parts.join(`
1054
1061
  `)}function errorLines(text2){return text2.split(/\r?\n/).map(line=>line.trim()).filter(line=>line.length>0)}function hasExactLine(lines,wording){return lines.some(line=>line===wording)}function hasTypedKind(value2,kind){return record3(value2)?.kind===kind}function positiveNumber(value2){if(!(typeof value2!="number"||!Number.isFinite(value2)||value2<=0))return Math.ceil(value2)}function findRetryAfterMs(value2,seen,depth){if(depth>MAX_TEXT_DEPTH||value2===null||typeof value2!="object"||seen.has(value2))return;seen.add(value2);let object=record3(value2);if(object){let direct=positiveNumber(object.retryAfterMs)??positiveNumber(object.retry_after_ms);if(direct!==void 0)return direct}for(let nested of Object.values(value2)){let found=findRetryAfterMs(nested,seen,depth+1);if(found!==void 0)return found}}function retryAfterMs2(input,text2){let structured=findRetryAfterMs(input.resultEvent,new Set,0)??findRetryAfterMs(input.thrown,new Set,0);if(structured!==void 0)return structured;let milliseconds=text2.match(/\bretry[-_ ]?after[-_ ]?ms\s*[:=]\s*(\d+(?:\.\d+)?)/i);if(milliseconds)return Math.ceil(Number(milliseconds[1]));let seconds=text2.match(/\bretry[-_ ]?after\s*[:=]\s*(\d+(?:\.\d+)?)/i);return seconds?Math.ceil(Number(seconds[1])*1e3):void 0}function rateLimitBlockMs(input,text2){return Math.min(1728e5,retryAfterMs2(input,text2)??6e4)}function classifyCursorCliError(input){if(!input||typeof input!="object")return OTHER_ERROR2;if(hasTypedKind(input.thrown,"binary_missing"))return{kind:"binary_missing",retryable:!1};if(hasTypedKind(input.thrown,"malformed_stream")||hasTypedKind(input.resultEvent,"malformed_stream"))return{kind:"malformed_stream",retryable:!1};let text2=errorText3(input),lines=errorLines(text2);return hasExactLine(lines,"The provided API key is invalid.")&&hasExactLine(lines,"The API key was loaded from the CURSOR_API_KEY environment variable.")?{kind:"invalid_api_key",retryable:!1}:hasExactLine(lines,"Error: Your macOS login keychain is locked.")?{kind:"keychain_locked",retryable:!1}:lines.some(line=>/^(?:Error:\s*)?Invalid model value:\s+\S.*$/.test(line))?{kind:"invalid_model",retryable:!1}:/\b(?:HTTP\s*)?429\b|\brate[ _-]?limit(?:ed|ing)?\b|\btoo many requests\b/i.test(text2)?{kind:"rate_limit",retryable:!0,blockMs:rateLimitBlockMs(input,text2)}:/\b(?:HTTP\s*)?401\b|\bunauthori[sz]ed\b|\bauthentication (?:failed|required)\b|\bnot logged in\b/i.test(text2)?{kind:"auth_error",retryable:!1}:CURSOR_CONTEXT_OVERFLOW_WORDINGS.some(wording=>hasExactLine(lines,wording)||hasExactLine(lines,`Error: ${wording}`))?{kind:"context_overflow",retryable:!1}:/\b(?:ECONNRESET|ECONNREFUSED|ETIMEDOUT|ENETUNREACH|EHOSTUNREACH|ENOTFOUND|EAI_AGAIN)\b|\bnetwork error\b|\bconnection (?:reset|refused|lost)\b|\bsocket hang up\b|\bfetch failed\b/i.test(text2)?{kind:"network",retryable:!0}:OTHER_ERROR2}import{spawn as spawn3}from"node:child_process";function buildCursorCliArgs({prompt,model,resumeChatId,force,executionMode,sandboxMode}){return["-p",prompt,"--output-format","stream-json","--stream-partial-output","--trust",...model?["--model",model]:[],...resumeChatId?["--resume",resumeChatId]:[],...force?["--force"]:[],...executionMode==="plan"?["--mode","plan"]:[],...sandboxMode?["--sandbox",sandboxMode]:[]]}function record4(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}function stringValue(value2){return typeof value2=="string"?value2:void 0}function numberValue(value2){return typeof value2=="number"&&Number.isFinite(value2)?value2:void 0}function booleanValue(value2){return typeof value2=="boolean"?value2:void 0}function positiveInteger(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.floor(value2)}function malformed(reason,message){return{type:"malformed_stream",kind:"malformed_stream",reason,message}}function parseSystem(value2){if(value2.subtype!=="init")return;let sessionId=stringValue(value2.session_id),model=stringValue(value2.model),apiKeySource=stringValue(value2.apiKeySource),permissionMode=stringValue(value2.permissionMode),cwd=stringValue(value2.cwd);if(!(sessionId===void 0||model===void 0||apiKeySource===void 0||permissionMode===void 0||cwd===void 0))return{type:"system",subtype:"init",session_id:sessionId,model,apiKeySource,permissionMode,cwd}}function parseThinking(value2){if(value2.subtype!=="delta"&&value2.subtype!=="completed")return;let text2=value2.text===void 0?"":stringValue(value2.text);return text2===void 0?void 0:{type:"thinking",subtype:value2.subtype,text:text2}}function parseAssistant(value2){let message=record4(value2.message);if(!message||!Array.isArray(message.content))return;let content=[];for(let item of message.content){let block=record4(item);if(block?.type!=="text"||typeof block.text!="string")return;content.push({type:"text",text:block.text})}return{type:"assistant",message:{content}}}function parseToolResult(value2){let result3=record4(value2),success=record4(result3?.success);if(success){let exitCode=numberValue(success.exitCode),stdout=stringValue(success.stdout),stderr=stringValue(success.stderr),executionTime=numberValue(success.executionTime);if(exitCode!==void 0&&stdout!==void 0&&stderr!==void 0&&executionTime!==void 0)return{success:{exitCode,stdout,stderr,executionTime}}}let rejected=record4(result3?.rejected);if(rejected){let command=stringValue(rejected.command),reason=stringValue(rejected.reason),isReadonly=booleanValue(rejected.isReadonly);if(command!==void 0&&reason!==void 0&&isReadonly!==void 0)return{rejected:{command,reason,isReadonly}}}}function parseToolCall(value2){if(value2.subtype!=="started"&&value2.subtype!=="completed")return;let callId=stringValue(value2.call_id),source=record4(value2.tool_call);if(callId===void 0||!source)return;let entry=Object.entries(source).find(([key,details2])=>key.endsWith("ToolCall")&&record4(details2));if(!entry)return;let[kind,rawDetails]=entry,details=record4(rawDetails);if(!details)return;let args=record4(details.args),result3=parseToolResult(details.result),normalized2={...args?{args}:{},...result3?{result:result3}:{}};return{type:"tool_call",subtype:value2.subtype,call_id:callId,tool_call:{[kind]:normalized2}}}function parseUsage(value2){let usage3=record4(value2);if(!usage3)return;let inputTokens=numberValue(usage3.inputTokens),outputTokens=numberValue(usage3.outputTokens),cacheReadTokens=numberValue(usage3.cacheReadTokens),cacheWriteTokens=numberValue(usage3.cacheWriteTokens);if(!(inputTokens===void 0||outputTokens===void 0||cacheReadTokens===void 0||cacheWriteTokens===void 0))return{inputTokens,outputTokens,cacheReadTokens,cacheWriteTokens}}function parseResult(value2){if(value2.subtype!=="success"&&value2.subtype!=="error")return;let usage3=parseUsage(value2.usage),requestId=stringValue(value2.request_id),durationMs=numberValue(value2.duration_ms),isError=booleanValue(value2.is_error);if(!(usage3===void 0||requestId===void 0||durationMs===void 0||isError===void 0))return{type:"result",subtype:value2.subtype,result:value2.result,usage:usage3,request_id:requestId,duration_ms:durationMs,is_error:isError}}var CursorCliStreamParser=class{constructor(options={}){this.decoder=new TextDecoder("utf-8",{fatal:!1}),this.byteCounter=new TextEncoder,this.pending="",this.pendingBytes=0,this.discardingOverflowLine=!1,this.finalized=!1,this.sawResult=!1,this.diagnosticsRing=[],this.unknownCount=0,this.maxPendingBytes=positiveInteger(options.maxPendingBytes,1048576),this.maxDiagnostics=positiveInteger(options.maxDiagnostics,20),this.maxDiagnosticCharacters=positiveInteger(options.maxDiagnosticCharacters,2048)}get diagnostics(){return this.diagnosticsRing}get unknownEventCount(){return this.unknownCount}push(chunk){this.finalized&&this.reset();try{return this.consumeDecoded(this.decoder.decode(chunk,{stream:!0}))}catch(error2){return[malformed("invalid_event",error2 instanceof Error?error2.message:"Unable to decode stream chunk")]}}finish(){if(this.finalized)return[];let events=[];try{if(events.push(...this.consumeDecoded(this.decoder.decode())),this.discardingOverflowLine)this.discardingOverflowLine=!1;else if(this.pending.length>0){let tail=this.pending;this.clearPending(),events.push(...this.parseLine(tail,!0))}}catch(error2){events.push(malformed("truncated_tail",error2 instanceof Error?error2.message:"Unable to finalize stream tail"))}return this.sawResult||events.push(malformed("incomplete_stream","cursor-agent stream ended without a result event")),this.finalized=!0,events}reset(){this.decoder=new TextDecoder("utf-8",{fatal:!1}),this.clearPending(),this.discardingOverflowLine=!1,this.finalized=!1,this.sawResult=!1,this.diagnosticsRing=[],this.unknownCount=0}consumeDecoded(decoded){let events=[],start=0;for(;start<decoded.length;){let newline=decoded.indexOf(`
1055
1062
  `,start);if(newline===-1){this.appendPending(decoded.slice(start),events);break}if(this.appendPending(decoded.slice(start,newline),events),this.discardingOverflowLine)this.discardingOverflowLine=!1;else{let line=this.pending.endsWith("\r")?this.pending.slice(0,-1):this.pending;this.clearPending(),events.push(...this.parseLine(line,!1))}start=newline+1}return events}appendPending(fragment,events){if(fragment.length===0||this.discardingOverflowLine)return;let fragmentBytes=this.byteCounter.encode(fragment).byteLength;if(this.pendingBytes+fragmentBytes>this.maxPendingBytes){this.recordDiagnostic(`${this.pending}${fragment}`),this.clearPending(),this.discardingOverflowLine=!0,events.push(malformed("line_overflow",`stream line exceeded ${this.maxPendingBytes} bytes`));return}this.pending+=fragment,this.pendingBytes+=fragmentBytes}parseLine(line,tail){if(line.trim().length===0)return[];let parsed;try{parsed=JSON.parse(line)}catch{return this.recordDiagnostic(line),[malformed(tail?"truncated_tail":"invalid_json",tail?"truncated JSON tail":"non-JSON stream line")]}let value2=record4(parsed);if(!value2||typeof value2.type!="string")return[malformed("invalid_event","stream line is not an event object")];let event;switch(value2.type){case"system":event=parseSystem(value2);break;case"thinking":event=parseThinking(value2);break;case"assistant":event=parseAssistant(value2);break;case"tool_call":event=parseToolCall(value2);break;case"result":event=parseResult(value2),event&&(this.sawResult=!0);break;case"user":return[];default:return this.unknownCount++,[]}return event?[event]:[malformed("invalid_event",`invalid ${value2.type} event`)]}recordDiagnostic(line){this.diagnosticsRing.push(line.slice(0,this.maxDiagnosticCharacters)),this.diagnosticsRing.length>this.maxDiagnostics&&this.diagnosticsRing.shift()}clearPending(){this.pending="",this.pendingBytes=0}};var MAX_CURSOR_CLI_PROMPT_BYTES=13e4,CURSOR_CLI_ABORT_GRACE_MS=5e3,MAX_STDERR_BYTES=64*1024,CursorCliPromptTooLargeError=class extends Error{constructor(actualBytes,limitBytes=MAX_CURSOR_CLI_PROMPT_BYTES){super(`Cursor CLI prompt is ${actualBytes} bytes; the limit is ${limitBytes} bytes`),this.kind="context_overflow",this.name="CursorCliPromptTooLargeError",this.actualBytes=actualBytes,this.limitBytes=limitBytes}},CursorCliAbortError=class extends Error{constructor(){super("Cursor CLI invocation aborted"),this.type="aborted",this.kind="aborted",this.name="CursorCliAbortError"}},AsyncEventQueue=class{constructor(){this.values=[],this.waiters=[],this.ended=!1}[Symbol.asyncIterator](){return this}next(){let value2=this.values.shift();return value2!==void 0?Promise.resolve({done:!1,value:value2}):this.failure!==void 0?Promise.reject(this.failure):this.ended?Promise.resolve({done:!0,value:void 0}):new Promise((resolve44,reject)=>this.waiters.push({resolve:resolve44,reject}))}push(value2){if(this.ended||this.failure!==void 0)return;let waiter=this.waiters.shift();waiter?waiter.resolve({done:!1,value:value2}):this.values.push(value2)}close(){if(!(this.ended||this.failure!==void 0)){this.ended=!0;for(let waiter of this.waiters.splice(0))waiter.resolve({done:!0,value:void 0})}}fail(error2){if(!(this.ended||this.failure!==void 0)){this.failure=error2;for(let waiter of this.waiters.splice(0))waiter.reject(error2)}}};function killProcessGroup(child,signal){let pid=child.pid;if(pid!==void 0)try{process.platform==="win32"?child.kill(signal):process.kill(-pid,signal)}catch(error2){if(error2.code!=="ESRCH")throw error2}}function appendBoundedStderr(current,chunk){if(chunk.byteLength>=MAX_STDERR_BYTES)return chunk.subarray(chunk.byteLength-MAX_STDERR_BYTES);let combined=Buffer.concat([current,chunk]);return combined.byteLength<=MAX_STDERR_BYTES?combined:combined.subarray(combined.byteLength-MAX_STDERR_BYTES)}function spawnCursorCli(input){let promptBytes=Buffer.byteLength(input.prompt,"utf8");if(promptBytes>MAX_CURSOR_CLI_PROMPT_BYTES)throw new CursorCliPromptTooLargeError(promptBytes);if(input.signal?.aborted)throw new CursorCliAbortError;let executable=resolveCursorAgentExecutable(input.executableDeps??defaultCursorAgentExecutableDeps()),child=spawn3(executable,buildCursorCliArgs(input),{cwd:input.cwd,detached:!0,env:cursorAgentEnvironment(input.accountHome),stdio:["ignore","pipe","pipe"],windowsHide:!0});if(child.pid===void 0)throw child.kill("SIGKILL"),new Error("cursor-agent spawned without a process id");let pid=child.pid,parser=new CursorCliStreamParser,events=new AsyncEventQueue,stderr=Buffer.alloc(0),abortRequested=!1,abortTimer,removeAbortListener2=()=>{},resolveCompleted=()=>{},rejectCompleted=()=>{},completed=new Promise((resolve44,reject)=>{resolveCompleted=resolve44,rejectCompleted=reject}),abort=()=>{if(!(abortRequested||child.exitCode!==null||child.signalCode!==null)){abortRequested=!0;try{killProcessGroup(child,"SIGTERM")}catch(error2){events.fail(error2),rejectCompleted(error2);return}abortTimer=setTimeout(()=>{try{killProcessGroup(child,"SIGKILL")}catch(error2){events.fail(error2),rejectCompleted(error2)}},CURSOR_CLI_ABORT_GRACE_MS)}};return child.stdout.on("data",chunk=>{for(let event of parser.push(chunk))events.push(event)}),child.stderr.on("data",chunk=>{stderr=appendBoundedStderr(stderr,chunk)}),child.once("error",error2=>{abortTimer&&clearTimeout(abortTimer),removeAbortListener2(),events.fail(error2),rejectCompleted(error2)}),child.once("close",(exitCode,signal)=>{if(abortTimer&&clearTimeout(abortTimer),removeAbortListener2(),abortRequested){let error2=new CursorCliAbortError;events.push(error2),events.close(),resolveCompleted({type:"aborted",error:error2});return}for(let event of parser.finish())events.push(event);events.close(),resolveCompleted({type:"completed",exitCode,signal,stderr:Buffer.from(stderr).toString("utf8")})}),input.signal&&(input.signal.addEventListener("abort",abort,{once:!0}),removeAbortListener2=()=>input.signal?.removeEventListener("abort",abort)),{pid,events,completed,abort}}var CURSOR_CLI_CONTEXT_RECAP_MAX_BYTES=8*1024,CURSOR_CLI_CONTEXT_RECAP_BEGIN="===== senpi context recap =====",CURSOR_CLI_CONTEXT_RECAP_END="===== end senpi context recap =====";function record5(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}function byteLength(text2){return Buffer.byteLength(text2,"utf8")}function utf8Prefix(text2,maxBytes){if(byteLength(text2)<=maxBytes)return text2;let bytes=Buffer.from(text2,"utf8"),end=Math.max(0,Math.min(maxBytes,bytes.length));for(;end>0&&(bytes[end]&192)===128;)end-=1;return bytes.subarray(0,end).toString("utf8")}function buildCursorCliContextRecap(model,exchanges,maxRecapBytes=CURSOR_CLI_CONTEXT_RECAP_MAX_BYTES){let usable2=(exchanges??[]).filter(exchange=>exchange.text.length>0);if(usable2.length===0)return;let header2=`${CURSOR_CLI_CONTEXT_RECAP_BEGIN}
@@ -1269,7 +1276,7 @@ Native web search is available in this session.
1269
1276
  Use web search when the user asks for current or online information.
1270
1277
  Prefer web search over guessing when freshness matters.
1271
1278
  `;function openaiWebSearchExtension(pi){pi.on("before_provider_request",(event,ctx)=>addOpenAiWebSearchToPayload(ctx.model,event.payload)),pi.on("session_start",async(_event,ctx)=>{syncUi2(ctx)}),pi.on("model_select",async(_event,ctx)=>{syncUi2(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi2(ctx)}),pi.on("before_agent_start",async(event,ctx)=>{if(supportsNativeOpenAiWebSearch(ctx.model)&&isOpenaiWebSearchEnabled())return{systemPrompt:`${event.systemPrompt}
1272
- ${OPENAI_WEB_SEARCH_SECTION}`}},{previewSafe:!0})}function parsePermissionFlag(value2){let rules=[],entries=value2.split(",");for(let entry of entries){let trimmed=entry.trim();if(!trimmed)continue;let match=trimmed.match(/^([^:=]+)(?::([^=]+))?=(.+)$/);if(!match)continue;let[,permission,pattern,action]=match;rules.push({permission:permission.trim(),pattern:pattern?pattern.trim():"*",action:action.trim()})}return rules}function parsePermissionPresetFlag(value2){return parsePermissionPresetName(value2.trim())}function parsePermissionPresetName(value2){switch(value2){case"full-access":case"workspace":case"read-only":case"ask":return value2;default:return}}import os2 from"node:os";var Wildcard={match(value2,pattern){if(value2===""&&pattern==="")return!0;if(pattern==="")return!1;if(value2===""&&pattern==="*")return!0;if(value2===""){for(let i=0;i<pattern.length;i++)if(pattern[i]!=="*")return!1;return!0}let valueIdx=0,patternIdx=0,starIdx=-1,matchIdx=0;for(;valueIdx<value2.length;){let patternChar=pattern[patternIdx],valueChar=value2[valueIdx];if(patternChar==="?")valueIdx++,patternIdx++;else if(patternChar==="*")starIdx=patternIdx,matchIdx=valueIdx,patternIdx++;else if(patternChar===valueChar)valueIdx++,patternIdx++;else if(starIdx>=0)patternIdx=starIdx+1,matchIdx++,valueIdx=matchIdx;else return!1}for(;patternIdx<pattern.length&&pattern[patternIdx]==="*";)patternIdx++;return patternIdx===pattern.length}};var EDIT_TOOLS=["edit","write","apply_patch","multiedit"],DEFAULT_PERMISSION_PRESET="full-access",PERMISSION_PRESET_RULES={"full-access":[{permission:"*",pattern:"*",action:"allow"}],workspace:[{permission:"*",pattern:"*",action:"ask"},{permission:"read",pattern:"*",action:"allow"},{permission:"list",pattern:"*",action:"allow"},{permission:"grep",pattern:"*",action:"allow"},{permission:"edit",pattern:"*",action:"allow"},{permission:"bash",pattern:"*",action:"allow"},{permission:"external_directory",pattern:"*",action:"ask"}],"read-only":[{permission:"*",pattern:"*",action:"ask"},{permission:"read",pattern:"*",action:"allow"},{permission:"list",pattern:"*",action:"allow"},{permission:"grep",pattern:"*",action:"allow"},{permission:"edit",pattern:"*",action:"ask"},{permission:"bash",pattern:"*",action:"ask"},{permission:"external_directory",pattern:"*",action:"ask"}],ask:[{permission:"*",pattern:"*",action:"ask"}]};function expand(path13){return path13.startsWith("~/")?os2.homedir()+path13.slice(1):path13==="~"?os2.homedir():path13.startsWith("$HOME/")?os2.homedir()+path13.slice(5):path13.startsWith("$HOME")?os2.homedir()+path13.slice(5):path13}function fromConfig(config){let rules=[];for(let[permission,value2]of Object.entries(config))if(typeof value2=="string")rules.push({permission,pattern:"*",action:value2});else for(let[pattern,action]of Object.entries(value2))rules.push({permission,pattern:expand(pattern),action});return rules}function rulesForPreset(preset){return PERMISSION_PRESET_RULES[preset].map(rule=>({...rule}))}function merge(...rulesets){return rulesets.flat()}function disabled(tools,ruleset){let result3=new Set;for(let tool of tools){let permission=EDIT_TOOLS.includes(tool)?"edit":tool,rule=ruleset.findLast(rule2=>Wildcard.match(permission,rule2.permission));rule&&rule.pattern==="*"&&rule.action==="deny"&&result3.add(tool)}return result3}function createEventEmitter(pi){return{emitAsked:request2=>{pi.events.emit("permission_asked",request2)},emitReplied:(requestID,sessionID,reply)=>{pi.events.emit("permission_replied",{requestID,sessionID,reply})}}}function createLocalEventEmitter(){let askedHandlers=new Set,repliedHandlers=new Set;return{emitAsked:request2=>{for(let handler of askedHandlers)try{handler(request2)}catch(err2){console.error("Error in permission_asked handler:",err2)}},emitReplied:(requestID,sessionID,reply)=>{let event={requestID,sessionID,reply};for(let handler of repliedHandlers)try{handler(event)}catch(err2){console.error("Error in permission_replied handler:",err2)}},onAsked:handler=>(askedHandlers.add(handler),()=>askedHandlers.delete(handler)),onReplied:handler=>(repliedHandlers.add(handler),()=>repliedHandlers.delete(handler)),clear:()=>{askedHandlers.clear(),repliedHandlers.clear()}}}function evaluate(permission,pattern,...rulesets){let matchedRule=rulesets.flat().findLast(rule=>Wildcard.match(permission,rule.permission)&&matchesPattern(pattern,rule.pattern));return matchedRule||{action:"ask",permission,pattern:"*"}}function matchesPattern(value2,pattern){return Wildcard.match(value2,pattern)||pattern.endsWith(" *")&&Wildcard.match(value2,pattern.slice(0,-2))}function handleNoUI(request2,staticRuleset,cliOverride,emitEvent){emitEvent("permission_asked",request2);let cliRule=evaluate(request2.permission,request2.patterns[0],cliOverride);if(cliRule.action==="allow"){emitEvent("permission_replied",{requestID:request2.id,sessionID:request2.sessionID,reply:"allow"});return}if(cliRule.action==="deny")return{requestID:request2.id,reply:"reject",message:`Permission denied by CLI flag: ${request2.permission}`};let staticRule=evaluate(request2.permission,request2.patterns[0],staticRuleset);if(staticRule.action==="allow"){emitEvent("permission_replied",{requestID:request2.id,sessionID:request2.sessionID,reply:"allow"});return}if(staticRule.action==="deny")return{requestID:request2.id,reply:"reject",message:`Permission denied by config: ${request2.permission}`};let patternsStr=request2.patterns.join(", ");return{requestID:request2.id,reply:"reject",message:`Permission required for ${request2.permission} (${patternsStr}). Use --permission ${request2.permission}=allow to override.`}}import{dirname as dirname28,resolve as resolve21}from"node:path";var BashArity={prefix(tokens){for(let len=tokens.length;len>0;len--){let prefix=tokens.slice(0,len).join(" "),arity=ARITY[prefix];if(arity!==void 0)return tokens.slice(0,arity)}return tokens.length===0?[]:tokens.slice(0,1)}},ARITY={cat:1,cd:1,chmod:1,chown:1,cp:1,echo:1,env:1,export:1,grep:1,kill:1,killall:1,ln:1,ls:1,mkdir:1,mv:1,ps:1,pwd:1,rm:1,rmdir:1,sleep:1,source:1,tail:1,touch:1,unset:1,which:1,aws:3,az:3,bazel:2,brew:2,bun:2,"bun run":3,"bun x":3,cargo:2,"cargo add":3,"cargo run":3,cdk:2,cf:2,cmake:2,composer:2,consul:2,"consul kv":3,crictl:2,deno:2,"deno task":3,doctl:3,docker:2,"docker builder":3,"docker compose":3,"docker container":3,"docker image":3,"docker network":3,"docker volume":3,eksctl:2,"eksctl create":3,firebase:2,flyctl:2,gcloud:3,gh:3,git:2,"git config":3,"git remote":3,"git stash":3,go:2,gradle:2,helm:2,heroku:2,hugo:2,ip:2,"ip addr":3,"ip link":3,"ip netns":3,"ip route":3,kind:2,"kind create":3,kubectl:2,"kubectl kustomize":3,"kubectl rollout":3,kustomize:2,make:2,mc:2,"mc admin":3,minikube:2,mongosh:2,mysql:2,mvn:2,ng:2,npm:2,"npm exec":3,"npm init":3,"npm run":3,"npm view":3,nvm:2,nx:2,openssl:2,"openssl req":3,"openssl x509":3,pip:2,pipenv:2,pnpm:2,"pnpm dlx":3,"pnpm exec":3,"pnpm run":3,poetry:2,podman:2,"podman container":3,"podman image":3,psql:2,pulumi:2,"pulumi stack":3,pyenv:2,python:2,rake:2,rbenv:2,"redis-cli":2,rustup:2,serverless:2,sfdx:3,skaffold:2,sls:2,sst:2,swift:2,systemctl:2,terraform:2,"terraform workspace":3,tmux:2,turbo:2,ufw:2,vault:2,"vault auth":3,"vault kv":3,vercel:2,volta:2,wp:2,yarn:2,"yarn dlx":3,"yarn run":3};import*as os3 from"node:os";import*as path6 from"node:path";function expandHome(inputPath){return inputPath==="~"?os3.homedir():inputPath.startsWith("~/")||inputPath.startsWith("~\\")?path6.join(os3.homedir(),inputPath.slice(2)):inputPath.startsWith("$HOME/")||inputPath.startsWith("$HOME\\")?path6.join(os3.homedir(),inputPath.slice(6)):inputPath==="$HOME"?os3.homedir():inputPath}function isExternalPath(inputPath,cwd){let expandedPath=expandHome(inputPath),normalizedCwd=realpathWithoutOpen(cwd),absolutePath=path6.isAbsolute(expandedPath)?expandedPath:path6.resolve(normalizedCwd,expandedPath),normalizedTarget=realpathWithoutOpen(absolutePath);if(normalizedTarget===normalizedCwd)return!1;let cwdWithSeparator=normalizedCwd.endsWith(path6.sep)?normalizedCwd:normalizedCwd+path6.sep;return!normalizedTarget.startsWith(cwdWithSeparator)}function tokenizeCommand(command){let tokens=[],current="",inQuotes=null,escaped=!1;for(let i=0;i<command.length;i++){let char=command[i];if(escaped){current+=char,escaped=!1;continue}if(char==="\\"){escaped=!0,current+=char;continue}if(inQuotes){char===inQuotes&&(inQuotes=null),current+=char;continue}if(char==='"'||char==="'"){inQuotes=char,current+=char;continue}if(char===" "||char===" "){current.length>0&&(tokens.push(current),current="");continue}current+=char}return current.length>0&&tokens.push(current),tokens}function unquote(token){if(token.length<2)return token;let first=token[0],last=token[token.length-1];return(first==='"'||first==="'")&&first===last?token.slice(1,-1):token}function looksLikePath(token){return token.startsWith("-")||/^[A-Za-z_][A-Za-z0-9_]*=/.test(token)||["|","||","&&",";","&","$(","${","`"].some(op=>token.includes(op))?!1:!!(token.startsWith("/")||token.startsWith("~")||token.startsWith("$HOME")||token.startsWith("./")||token.startsWith("../")||token.includes("/"))}function extractExternalPaths(command,cwd){let tokens=tokenizeCommand(command),externalPaths=[],startIndex=0;if(tokens.length>0){let firstToken=unquote(tokens[0]);!firstToken.startsWith("/")&&!firstToken.startsWith("~")&&!firstToken.startsWith("$")&&!firstToken.startsWith("./")&&!firstToken.startsWith("../")&&!firstToken.includes("/")&&(startIndex=1)}for(let i=startIndex;i<tokens.length;i++){let token=unquote(tokens[i]);looksLikePath(token)&&isExternalPath(token,cwd)&&externalPaths.push(token)}return externalPaths}var APPROVED_MONITOR_PARENT=Symbol("approved-monitor-parent");function setApprovedMonitorParent(input,parent){Object.defineProperty(input,APPROVED_MONITOR_PARENT,{configurable:!0,value:parent,writable:!1})}function fallbackPermissionRequest(permission){return{permission,patterns:["*"],always:["*"]}}function getString(input,...keys){for(let key of keys){let value2=input[key];if(typeof value2=="string")return value2}}function toParentDirectoryPattern(inputPath,scope){if(inputPath==="~"||inputPath==="$HOME")return`${inputPath}/*`;if(scope==="directory")return inputPath.endsWith("/")||inputPath.endsWith("\\")?`${inputPath}*`:`${inputPath}/*`;if(inputPath.endsWith("/")||inputPath.endsWith("\\"))return`${inputPath}*`;let parentPattern=inputPath.replace(/[\\/][^\\/]+$/,"/*");return parentPattern==="/*"?inputPath:parentPattern}function parseFilePath(input){return getString(input,"path","file_path")}function withExternalDirectoryRequests(requests,paths,cwd,scope){let externalPaths=paths.filter(inputPath=>isExternalPath(inputPath,cwd));return externalPaths.length===0?requests:[...requests,{permission:"external_directory",patterns:externalPaths,always:externalPaths.map(externalPath=>toParentDirectoryPattern(externalPath,scope))}]}function toolOwnedPermissionRequests(tools,toolName,input,cwd){let parser=tools.find(tool=>tool.name===toolName)?.permissionParser;return parser?.(input,cwd).map(request2=>({permission:request2.permission,patterns:[...request2.patterns],always:[...request2.always]}))}var ParserRegistry=class{constructor(){this.parsers=new Map}register(toolName,parser){this.parsers.set(toolName,parser)}has(toolName){return this.parsers.has(toolName)}parse(toolName,input,cwd){let parser=this.parsers.get(toolName);return parser?parser(toolName,input,cwd):[fallbackPermissionRequest(toolName)]}};function createBuiltinParserRegistry(){let registry=new ParserRegistry,parseBashLikePermission=commandKey=>(_toolName,input,cwd)=>{let command=getString(input,commandKey);if(!command)return[fallbackPermissionRequest("bash")];let tokens=command.split(/\s+/).filter(Boolean),prefix=BashArity.prefix(tokens).join(" "),always=prefix?[prefix,`${prefix} *`]:["*"],requests=[{permission:"bash",patterns:[prefix||command],always}],externalPaths=extractExternalPaths(command,cwd);return externalPaths.length>0&&requests.push({permission:"external_directory",patterns:externalPaths,always:externalPaths.map(externalPath=>toParentDirectoryPattern(externalPath,"file"))}),requests};registry.register("bash",parseBashLikePermission("command")),registry.register("bash_input",parseBashLikePermission("input")),registry.register("monitor",(toolName,input,cwd)=>{let path13=getString(input,"path");return path13?(setApprovedMonitorParent(input,realpathWithoutOpen(dirname28(resolve21(cwd,path13)))),withExternalDirectoryRequests([{permission:"read",patterns:[path13],always:[path13]}],[path13],cwd,"file")):parseBashLikePermission("command")(toolName,input,cwd)});let editParser=()=>[fallbackPermissionRequest("edit")],parseEditPermission=(_toolName,input,cwd)=>{let filePath=parseFilePath(input);if(filePath)return withExternalDirectoryRequests([{permission:"edit",patterns:[filePath],always:[filePath]}],[filePath],cwd,"file");let patchText=getString(input,"input","patchText");if(!patchText)return editParser("edit",input,"");let patchedPaths=extractPatchedPaths(patchText);if(patchedPaths.length===0)return editParser("edit",input,"");let editRequests=patchedPaths.map(patchedPath=>({permission:"edit",patterns:[patchedPath],always:[patchedPath]}));return withExternalDirectoryRequests(editRequests,patchedPaths,cwd,"file")};registry.register("edit",parseEditPermission),registry.register("write",parseEditPermission),registry.register("apply_patch",parseEditPermission),registry.register("multiedit",parseEditPermission),registry.register("read",(_toolName,input,cwd)=>{let filePath=parseFilePath(input);return filePath?withExternalDirectoryRequests([{permission:"read",patterns:[filePath],always:[filePath]}],[filePath],cwd,"file"):[fallbackPermissionRequest("read")]}),registry.register("grep",(_toolName,input,cwd)=>{let searchPath=getString(input,"path"),pattern=getString(input,"pattern"),permissionPattern=searchPath??pattern;if(!permissionPattern)return[fallbackPermissionRequest("grep")];let grepRequests=[{permission:"grep",patterns:[permissionPattern],always:["*"]}];return searchPath?withExternalDirectoryRequests(grepRequests,[searchPath],cwd,"directory"):grepRequests});let listParser=(_toolName,input,cwd)=>{let searchPath=getString(input,"path")??".";return withExternalDirectoryRequests([{permission:"list",patterns:[searchPath],always:[searchPath]}],[searchPath],cwd,"directory")};return registry.register("find",listParser),registry.register("ls",listParser),registry}async function showPermissionPrompt(ctx,request2){let title=`Permission required: ${request2.permission}`,message=formatRequestForDisplay(request2),displayTitle=`${title}
1279
+ ${OPENAI_WEB_SEARCH_SECTION}`}},{previewSafe:!0})}function parsePermissionFlag(value2){let rules=[],entries=value2.split(",");for(let entry of entries){let trimmed=entry.trim();if(!trimmed)continue;let match=trimmed.match(/^([^:=]+)(?::([^=]+))?=(.+)$/);if(!match)continue;let[,permission,pattern,action]=match;rules.push({permission:permission.trim(),pattern:pattern?pattern.trim():"*",action:action.trim()})}return rules}function parsePermissionPresetFlag(value2){return parsePermissionPresetName(value2.trim())}function parsePermissionPresetName(value2){switch(value2){case"full-access":case"workspace":case"accept-edits":case"read-only":case"ask":return value2;default:return}}import os2 from"node:os";var Wildcard={match(value2,pattern){if(value2===""&&pattern==="")return!0;if(pattern==="")return!1;if(value2===""&&pattern==="*")return!0;if(value2===""){for(let i=0;i<pattern.length;i++)if(pattern[i]!=="*")return!1;return!0}let valueIdx=0,patternIdx=0,starIdx=-1,matchIdx=0;for(;valueIdx<value2.length;){let patternChar=pattern[patternIdx],valueChar=value2[valueIdx];if(patternChar==="?")valueIdx++,patternIdx++;else if(patternChar==="*")starIdx=patternIdx,matchIdx=valueIdx,patternIdx++;else if(patternChar===valueChar)valueIdx++,patternIdx++;else if(starIdx>=0)patternIdx=starIdx+1,matchIdx++,valueIdx=matchIdx;else return!1}for(;patternIdx<pattern.length&&pattern[patternIdx]==="*";)patternIdx++;return patternIdx===pattern.length}};var EDIT_TOOLS=["edit","write","apply_patch","multiedit"],DEFAULT_PERMISSION_PRESET="full-access",ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY="permission_preset_accept_edits",PERMISSION_PRESET_RULES={"full-access":[{permission:"*",pattern:"*",action:"allow"}],workspace:[{permission:"*",pattern:"*",action:"ask"},{permission:"read",pattern:"*",action:"allow"},{permission:"list",pattern:"*",action:"allow"},{permission:"grep",pattern:"*",action:"allow"},{permission:"edit",pattern:"*",action:"allow"},{permission:"bash",pattern:"*",action:"allow"},{permission:"external_directory",pattern:"*",action:"ask"}],"accept-edits":[{permission:"*",pattern:"*",action:"ask"},{permission:"read",pattern:"*",action:"allow"},{permission:"list",pattern:"*",action:"allow"},{permission:"grep",pattern:"*",action:"allow"},{permission:"edit",pattern:"*",action:"allow"},{permission:"bash",pattern:"*",action:"ask"},{permission:"external_directory",pattern:"*",action:"ask"}],"read-only":[{permission:"*",pattern:"*",action:"ask"},{permission:"read",pattern:"*",action:"allow"},{permission:"list",pattern:"*",action:"allow"},{permission:"grep",pattern:"*",action:"allow"},{permission:"edit",pattern:"*",action:"ask"},{permission:"bash",pattern:"*",action:"ask"},{permission:"external_directory",pattern:"*",action:"ask"}],ask:[{permission:"*",pattern:"*",action:"ask"}]};function expand(path13){return path13.startsWith("~/")?os2.homedir()+path13.slice(1):path13==="~"?os2.homedir():path13.startsWith("$HOME/")?os2.homedir()+path13.slice(5):path13.startsWith("$HOME")?os2.homedir()+path13.slice(5):path13}function fromConfig(config){let rules=[];for(let[permission,value2]of Object.entries(config))if(typeof value2=="string")rules.push({permission,pattern:"*",action:value2});else for(let[pattern,action]of Object.entries(value2))rules.push({permission,pattern:expand(pattern),action});return rules}function rulesForPreset(preset){return PERMISSION_PRESET_RULES[preset].map(rule=>({...rule}))}function merge(...rulesets){return rulesets.flat()}function disabled(tools,ruleset){let result3=new Set;for(let tool of tools){let permission=EDIT_TOOLS.includes(tool)?"edit":tool,rule=ruleset.findLast(rule2=>Wildcard.match(permission,rule2.permission));rule&&rule.pattern==="*"&&rule.action==="deny"&&result3.add(tool)}return result3}function createEventEmitter(pi){return{emitAsked:request2=>{pi.events.emit("permission_asked",request2)},emitReplied:(requestID,sessionID,reply)=>{pi.events.emit("permission_replied",{requestID,sessionID,reply})}}}function createLocalEventEmitter(){let askedHandlers=new Set,repliedHandlers=new Set;return{emitAsked:request2=>{for(let handler of askedHandlers)try{handler(request2)}catch(err2){console.error("Error in permission_asked handler:",err2)}},emitReplied:(requestID,sessionID,reply)=>{let event={requestID,sessionID,reply};for(let handler of repliedHandlers)try{handler(event)}catch(err2){console.error("Error in permission_replied handler:",err2)}},onAsked:handler=>(askedHandlers.add(handler),()=>askedHandlers.delete(handler)),onReplied:handler=>(repliedHandlers.add(handler),()=>repliedHandlers.delete(handler)),clear:()=>{askedHandlers.clear(),repliedHandlers.clear()}}}function evaluate(permission,pattern,...rulesets){let matchedRule=rulesets.flat().findLast(rule=>Wildcard.match(permission,rule.permission)&&matchesPattern(pattern,rule.pattern));return matchedRule||{action:"ask",permission,pattern:"*"}}function matchesPattern(value2,pattern){return Wildcard.match(value2,pattern)||pattern.endsWith(" *")&&Wildcard.match(value2,pattern.slice(0,-2))}function handleNoUI(request2,staticRuleset,cliOverride,emitEvent){emitEvent("permission_asked",request2);let cliRule=evaluate(request2.permission,request2.patterns[0],cliOverride);if(cliRule.action==="allow"){emitEvent("permission_replied",{requestID:request2.id,sessionID:request2.sessionID,reply:"allow"});return}if(cliRule.action==="deny")return{requestID:request2.id,reply:"reject",message:`Permission denied by CLI flag: ${request2.permission}`};let staticRule=evaluate(request2.permission,request2.patterns[0],staticRuleset);if(staticRule.action==="allow"){emitEvent("permission_replied",{requestID:request2.id,sessionID:request2.sessionID,reply:"allow"});return}if(staticRule.action==="deny")return{requestID:request2.id,reply:"reject",message:`Permission denied by config: ${request2.permission}`};let patternsStr=request2.patterns.join(", ");return{requestID:request2.id,reply:"reject",message:`Permission required for ${request2.permission} (${patternsStr}). Use --permission ${request2.permission}=allow to override.`}}import{dirname as dirname28,resolve as resolve21}from"node:path";var BashArity={prefix(tokens){for(let len=tokens.length;len>0;len--){let prefix=tokens.slice(0,len).join(" "),arity=ARITY[prefix];if(arity!==void 0)return tokens.slice(0,arity)}return tokens.length===0?[]:tokens.slice(0,1)}},ARITY={cat:1,cd:1,chmod:1,chown:1,cp:1,echo:1,env:1,export:1,grep:1,kill:1,killall:1,ln:1,ls:1,mkdir:1,mv:1,ps:1,pwd:1,rm:1,rmdir:1,sleep:1,source:1,tail:1,touch:1,unset:1,which:1,aws:3,az:3,bazel:2,brew:2,bun:2,"bun run":3,"bun x":3,cargo:2,"cargo add":3,"cargo run":3,cdk:2,cf:2,cmake:2,composer:2,consul:2,"consul kv":3,crictl:2,deno:2,"deno task":3,doctl:3,docker:2,"docker builder":3,"docker compose":3,"docker container":3,"docker image":3,"docker network":3,"docker volume":3,eksctl:2,"eksctl create":3,firebase:2,flyctl:2,gcloud:3,gh:3,git:2,"git config":3,"git remote":3,"git stash":3,go:2,gradle:2,helm:2,heroku:2,hugo:2,ip:2,"ip addr":3,"ip link":3,"ip netns":3,"ip route":3,kind:2,"kind create":3,kubectl:2,"kubectl kustomize":3,"kubectl rollout":3,kustomize:2,make:2,mc:2,"mc admin":3,minikube:2,mongosh:2,mysql:2,mvn:2,ng:2,npm:2,"npm exec":3,"npm init":3,"npm run":3,"npm view":3,nvm:2,nx:2,openssl:2,"openssl req":3,"openssl x509":3,pip:2,pipenv:2,pnpm:2,"pnpm dlx":3,"pnpm exec":3,"pnpm run":3,poetry:2,podman:2,"podman container":3,"podman image":3,psql:2,pulumi:2,"pulumi stack":3,pyenv:2,python:2,rake:2,rbenv:2,"redis-cli":2,rustup:2,serverless:2,sfdx:3,skaffold:2,sls:2,sst:2,swift:2,systemctl:2,terraform:2,"terraform workspace":3,tmux:2,turbo:2,ufw:2,vault:2,"vault auth":3,"vault kv":3,vercel:2,volta:2,wp:2,yarn:2,"yarn dlx":3,"yarn run":3};import*as os3 from"node:os";import*as path6 from"node:path";function expandHome(inputPath){return inputPath==="~"?os3.homedir():inputPath.startsWith("~/")||inputPath.startsWith("~\\")?path6.join(os3.homedir(),inputPath.slice(2)):inputPath.startsWith("$HOME/")||inputPath.startsWith("$HOME\\")?path6.join(os3.homedir(),inputPath.slice(6)):inputPath==="$HOME"?os3.homedir():inputPath}function isExternalPath(inputPath,cwd){let expandedPath=expandHome(inputPath),normalizedCwd=realpathWithoutOpen(cwd),absolutePath=path6.isAbsolute(expandedPath)?expandedPath:path6.resolve(normalizedCwd,expandedPath),normalizedTarget=realpathWithoutOpen(absolutePath);if(normalizedTarget===normalizedCwd)return!1;let cwdWithSeparator=normalizedCwd.endsWith(path6.sep)?normalizedCwd:normalizedCwd+path6.sep;return!normalizedTarget.startsWith(cwdWithSeparator)}function tokenizeCommand(command){let tokens=[],current="",inQuotes=null,escaped=!1;for(let i=0;i<command.length;i++){let char=command[i];if(escaped){current+=char,escaped=!1;continue}if(char==="\\"){escaped=!0,current+=char;continue}if(inQuotes){char===inQuotes&&(inQuotes=null),current+=char;continue}if(char==='"'||char==="'"){inQuotes=char,current+=char;continue}if(char===" "||char===" "){current.length>0&&(tokens.push(current),current="");continue}current+=char}return current.length>0&&tokens.push(current),tokens}function unquote(token){if(token.length<2)return token;let first=token[0],last=token[token.length-1];return(first==='"'||first==="'")&&first===last?token.slice(1,-1):token}function looksLikePath(token){return token.startsWith("-")||/^[A-Za-z_][A-Za-z0-9_]*=/.test(token)||["|","||","&&",";","&","$(","${","`"].some(op=>token.includes(op))?!1:!!(token.startsWith("/")||token.startsWith("~")||token.startsWith("$HOME")||token.startsWith("./")||token.startsWith("../")||token.includes("/"))}function extractExternalPaths(command,cwd){let tokens=tokenizeCommand(command),externalPaths=[],startIndex=0;if(tokens.length>0){let firstToken=unquote(tokens[0]);!firstToken.startsWith("/")&&!firstToken.startsWith("~")&&!firstToken.startsWith("$")&&!firstToken.startsWith("./")&&!firstToken.startsWith("../")&&!firstToken.includes("/")&&(startIndex=1)}for(let i=startIndex;i<tokens.length;i++){let token=unquote(tokens[i]);looksLikePath(token)&&isExternalPath(token,cwd)&&externalPaths.push(token)}return externalPaths}var APPROVED_MONITOR_PARENT=Symbol("approved-monitor-parent");function setApprovedMonitorParent(input,parent){Object.defineProperty(input,APPROVED_MONITOR_PARENT,{configurable:!0,value:parent,writable:!1})}function fallbackPermissionRequest(permission){return{permission,patterns:["*"],always:["*"]}}function getString(input,...keys){for(let key of keys){let value2=input[key];if(typeof value2=="string")return value2}}function toParentDirectoryPattern(inputPath,scope){if(inputPath==="~"||inputPath==="$HOME")return`${inputPath}/*`;if(scope==="directory")return inputPath.endsWith("/")||inputPath.endsWith("\\")?`${inputPath}*`:`${inputPath}/*`;if(inputPath.endsWith("/")||inputPath.endsWith("\\"))return`${inputPath}*`;let parentPattern=inputPath.replace(/[\\/][^\\/]+$/,"/*");return parentPattern==="/*"?inputPath:parentPattern}function parseFilePath(input){return getString(input,"path","file_path")}function withExternalDirectoryRequests(requests,paths,cwd,scope){let externalPaths=paths.filter(inputPath=>isExternalPath(inputPath,cwd));return externalPaths.length===0?requests:[...requests,{permission:"external_directory",patterns:externalPaths,always:externalPaths.map(externalPath=>toParentDirectoryPattern(externalPath,scope))}]}function toolOwnedPermissionRequests(tools,toolName,input,cwd){let parser=tools.find(tool=>tool.name===toolName)?.permissionParser;return parser?.(input,cwd).map(request2=>({permission:request2.permission,patterns:[...request2.patterns],always:[...request2.always]}))}var ParserRegistry=class{constructor(){this.parsers=new Map}register(toolName,parser){this.parsers.set(toolName,parser)}has(toolName){return this.parsers.has(toolName)}parse(toolName,input,cwd){let parser=this.parsers.get(toolName);return parser?parser(toolName,input,cwd):[fallbackPermissionRequest(toolName)]}};function createBuiltinParserRegistry(){let registry=new ParserRegistry,parseBashLikePermission=commandKey=>(_toolName,input,cwd)=>{let command=getString(input,commandKey);if(!command)return[fallbackPermissionRequest("bash")];let tokens=command.split(/\s+/).filter(Boolean),prefix=BashArity.prefix(tokens).join(" "),always=prefix?[prefix,`${prefix} *`]:["*"],requests=[{permission:"bash",patterns:[prefix||command],always}],externalPaths=extractExternalPaths(command,cwd);return externalPaths.length>0&&requests.push({permission:"external_directory",patterns:externalPaths,always:externalPaths.map(externalPath=>toParentDirectoryPattern(externalPath,"file"))}),requests};registry.register("bash",parseBashLikePermission("command")),registry.register("bash_input",parseBashLikePermission("input")),registry.register("monitor",(toolName,input,cwd)=>{let path13=getString(input,"path");return path13?(setApprovedMonitorParent(input,realpathWithoutOpen(dirname28(resolve21(cwd,path13)))),withExternalDirectoryRequests([{permission:"read",patterns:[path13],always:[path13]}],[path13],cwd,"file")):parseBashLikePermission("command")(toolName,input,cwd)});let editParser=()=>[fallbackPermissionRequest("edit")],parseEditPermission=(_toolName,input,cwd)=>{let filePath=parseFilePath(input);if(filePath)return withExternalDirectoryRequests([{permission:"edit",patterns:[filePath],always:[filePath]}],[filePath],cwd,"file");let patchText=getString(input,"input","patchText");if(!patchText)return editParser("edit",input,"");let patchedPaths=extractPatchedPaths(patchText);if(patchedPaths.length===0)return editParser("edit",input,"");let editRequests=patchedPaths.map(patchedPath=>({permission:"edit",patterns:[patchedPath],always:[patchedPath]}));return withExternalDirectoryRequests(editRequests,patchedPaths,cwd,"file")};registry.register("edit",parseEditPermission),registry.register("write",parseEditPermission),registry.register("apply_patch",parseEditPermission),registry.register("multiedit",parseEditPermission),registry.register("read",(_toolName,input,cwd)=>{let filePath=parseFilePath(input);return filePath?withExternalDirectoryRequests([{permission:"read",patterns:[filePath],always:[filePath]}],[filePath],cwd,"file"):[fallbackPermissionRequest("read")]}),registry.register("grep",(_toolName,input,cwd)=>{let searchPath=getString(input,"path"),pattern=getString(input,"pattern"),permissionPattern=searchPath??pattern;if(!permissionPattern)return[fallbackPermissionRequest("grep")];let grepRequests=[{permission:"grep",patterns:[permissionPattern],always:["*"]}];return searchPath?withExternalDirectoryRequests(grepRequests,[searchPath],cwd,"directory"):grepRequests});let listParser=(_toolName,input,cwd)=>{let searchPath=getString(input,"path")??".";return withExternalDirectoryRequests([{permission:"list",patterns:[searchPath],always:[searchPath]}],[searchPath],cwd,"directory")};return registry.register("find",listParser),registry.register("ls",listParser),registry}async function showPermissionPrompt(ctx,request2){let title=`Permission required: ${request2.permission}`,message=formatRequestForDisplay(request2),displayTitle=`${title}
1273
1280
 
1274
1281
  ${message}`,options=["Allow once","Allow always","Deny","Deny with feedback"],choice=await ctx.ui.select(displayTitle,options);if(choice==="Deny with feedback"){let feedback=await ctx.ui.input("Feedback","Why are you denying this permission? (optional)");return{requestID:request2.id,reply:"reject",message:feedback||void 0}}let replyMap={"Allow once":"once","Allow always":"always",Deny:"reject"};return{requestID:request2.id,reply:choice?replyMap[choice]:"reject"}}function formatRequestForDisplay(request2){let parts=[],meta=request2.metadata||{};switch(request2.permission){case"edit":parts.push(`File: ${meta.filepath||"Unknown"}`);break;case"read":parts.push(`Path: ${meta.filePath||"Unknown"}`);break;case"glob":case"grep":parts.push(`Pattern: ${meta.pattern||"Unknown"}`);break;case"list":parts.push(`Path: ${meta.path||"Unknown"}`);break;case"bash":meta.description&&parts.push(`Description: ${meta.description}`),parts.push(`Command: $ ${meta.command||"Unknown"}`);break;case"websearch":case"codesearch":parts.push(`Query: ${meta.query||"Unknown"}`);break;case"external_directory":{let parent=typeof meta.parentDir=="string"?meta.parentDir:void 0,filepath=typeof meta.filepath=="string"?meta.filepath:void 0,pattern=request2.patterns?.[0],derived=typeof pattern=="string"?pattern.includes("*")?pattern.split("*")[0]:pattern:void 0,dir=parent??filepath??derived??"Unknown";parts.push(`Directory: ${dir}`);break}default:parts.push(`Tool: ${request2.permission}`);break}return request2.patterns&&request2.patterns.length>0&&parts.push(`
1275
1282
  Patterns:
@@ -1278,7 +1285,7 @@ ${request2.patterns.map(p=>` - ${p}`).join(`
1278
1285
  `)}var RejectedError=class extends Error{constructor(){super("The user rejected permission to use this specific tool call."),this._tag="PermissionRejectedError",this.name="RejectedError"}},CorrectedError=class extends Error{constructor(feedback){super(`The user rejected permission to use this specific tool call with the following feedback: ${feedback}`),this._tag="PermissionCorrectedError",this.name="CorrectedError",this.feedback=feedback}},DeniedError=class extends Error{constructor(patterns){super("The user has specified a rule which prevents you from using this specific tool call."),this._tag="PermissionDeniedError",this.name="DeniedError",this.patterns=patterns}};var PermissionService=class{constructor(staticRuleset,approved,emitter=createLocalEventEmitter()){this.pending=new Map,this.idCounter=0,this.staticRuleset=[...staticRuleset],this.approved=[...approved],this.emitter=emitter}async ask(request2){let info={...request2,id:request2.id??this.nextRequestID()},deniedPatterns=[],needsAsk=!1;for(let pattern of info.patterns){let rule=evaluate(info.permission,pattern,this.staticRuleset,this.approved);if(rule.action==="deny"){deniedPatterns.push(pattern);continue}rule.action==="ask"&&(needsAsk=!0)}if(deniedPatterns.length>0)throw new DeniedError(deniedPatterns);if(!needsAsk){this.emitter.emitReplied(info.id,info.sessionID,"allow");return}let pendingPromise=new Promise((resolve44,reject)=>{let pendingEntry2={info,resolve:()=>{this.pending.delete(info.id),resolve44()},reject:error2=>{this.pending.delete(info.id),reject(error2)}};this.pending.set(info.id,pendingEntry2)});this.emitter.emitAsked(info),await pendingPromise}reply(input){let existing=this.pending.get(input.requestID);if(existing){if(this.pending.delete(input.requestID),this.emitter.emitReplied(existing.info.id,existing.info.sessionID,input.reply),input.reply==="reject"){existing.reject(input.message?new CorrectedError(input.message):new RejectedError),this.rejectPendingInSession(existing.info.sessionID);return}if(existing.resolve(),input.reply!=="once"){for(let pattern of existing.info.always)this.approved.push({permission:existing.info.permission,pattern,action:"allow"});this.resolveCoveredPendingInSession(existing.info.sessionID)}}}list(){return Array.from(this.pending.values(),entry=>({...entry.info,patterns:[...entry.info.patterns],always:[...entry.info.always],metadata:{...entry.info.metadata},tool:entry.info.tool?{...entry.info.tool}:void 0}))}getApproved(){return this.approved.map(rule=>({...rule}))}nextRequestID(){return this.idCounter+=1,`permission-${this.idCounter}`}rejectPendingInSession(sessionID){for(let[requestID,entry]of Array.from(this.pending.entries()))entry.info.sessionID===sessionID&&(this.pending.delete(requestID),this.emitter.emitReplied(entry.info.id,entry.info.sessionID,"reject"),entry.reject(new RejectedError))}resolveCoveredPendingInSession(sessionID){for(let[requestID,entry]of Array.from(this.pending.entries()))entry.info.sessionID!==sessionID||!entry.info.patterns.every(pattern=>evaluate(entry.info.permission,pattern,this.staticRuleset,this.approved).action==="allow")||(this.pending.delete(requestID),this.emitter.emitReplied(entry.info.id,entry.info.sessionID,"always"),entry.resolve())}};import*as fs2 from"node:fs";import*as path7 from"node:path";var PERMISSIONS_FILE="permissions-approved.jsonl";function getPermissionsPath(projectDir){return path7.join(projectDir,CONFIG_DIR_NAME,PERMISSIONS_FILE)}function loadApproved(projectDir){let filePath=getPermissionsPath(projectDir);if(!fs2.existsSync(filePath))return[];let lines=fs2.readFileSync(filePath,"utf-8").split(`
1279
1286
  `).filter(line=>line.trim()!==""),rules=[];for(let line of lines)try{let rule=JSON.parse(line);rules.push(rule)}catch{}return rules}function appendApproved(projectDir,rules){if(rules.length===0)return;let filePath=getPermissionsPath(projectDir),dir=path7.dirname(filePath);fs2.existsSync(dir)||fs2.mkdirSync(dir,{recursive:!0});let lines=`${rules.map(rule=>JSON.stringify(rule)).join(`
1280
1287
  `)}
1281
- `;fs2.appendFileSync(filePath,lines,{flag:"a"})}function loadPermissionSettings(settingsManager,cliOverride,projectDir,cliPresetOverride){let globalSettings=settingsManager.getGlobalSettings(),globalPreset=parseSettingsPreset(globalSettings.permissionPreset,"global"),globalPresetRuleset=globalPreset?rulesForPreset(globalPreset):[],globalRuleset=globalSettings.permission?fromConfig(globalSettings.permission):[],projectSettings=settingsManager.getProjectSettings(),projectPreset=parseSettingsPreset(projectSettings.permissionPreset,"project"),projectPresetRuleset=projectPreset?rulesForPreset(projectPreset):[],projectRuleset=projectSettings.permission?fromConfig(projectSettings.permission):[],cliPresetRuleset=cliPresetOverride?rulesForPreset(cliPresetOverride):[],staticRuleset=merge(rulesForPreset(DEFAULT_PERMISSION_PRESET),globalPresetRuleset,globalRuleset,projectPresetRuleset,projectRuleset,cliPresetRuleset,cliOverride),approved=loadApproved(projectDir);return{staticRuleset,approved}}function parseSettingsPreset(value2,scope){if(value2===void 0)return;if(typeof value2!="string")throw new Error(`Invalid ${scope} permissionPreset ${JSON.stringify(value2)}. Expected a string.`);let preset=parsePermissionPresetName(value2);if(!preset)throw new Error(`Invalid ${scope} permissionPreset "${value2}". Expected one of: full-access, workspace, read-only, ask.`);return preset}function createRequestIDFactory(){let counter=0;return()=>(counter+=1,`permission-${counter}`)}function getReason(error2){return error2 instanceof DeniedError||error2 instanceof CorrectedError||error2 instanceof RejectedError||error2 instanceof Error?error2.message:"Permission request was rejected."}function createRequestMetadata(toolName,input){let metadata={toolName,...input},pathValue=typeof input.path=="string"?input.path:void 0,filePathValue=typeof input.file_path=="string"?input.file_path:void 0,patchTextValue=typeof input.input=="string"?input.input:typeof input.patchText=="string"?input.patchText:void 0;return(toolName==="edit"||toolName==="write"||toolName==="apply_patch"||toolName==="multiedit")&&(metadata.filepath=pathValue??filePathValue??extractPatchedPaths(patchTextValue??"")[0]),toolName==="read"&&(metadata.filePath=pathValue??filePathValue),metadata}function permissionSystemExtension(pi){let service3=null,parserRegistry=null,cliRuleset=[],staticRuleset=[],initialApprovedCount=0,nextRequestID=createRequestIDFactory();pi.registerFlag("permission",{description:"Set permission rules (format: tool=action or tool:pattern=action)",type:"string"}),pi.registerFlag("permission-preset",{description:"Set permission preset (full-access, workspace, read-only, or ask)",type:"string"}),pi.on("session_start",async(_event,ctx)=>{let settingsManager=SettingsManager.create(ctx.cwd),permissionFlag=pi.getFlag("permission"),permissionPresetFlag=pi.getFlag("permission-preset");cliRuleset=typeof permissionFlag=="string"?parsePermissionFlag(permissionFlag):[];let cliPreset=typeof permissionPresetFlag=="string"?parsePermissionPresetFlag(permissionPresetFlag):void 0;if(typeof permissionPresetFlag=="string"&&!cliPreset)throw new Error(`Invalid --permission-preset "${permissionPresetFlag}". Expected one of: full-access, workspace, read-only, ask.`);let loadedSettings=loadPermissionSettings(settingsManager,cliRuleset,ctx.cwd,cliPreset);staticRuleset=loadedSettings.staticRuleset;let approved=loadedSettings.approved;parserRegistry=createBuiltinParserRegistry(),service3=new PermissionService(staticRuleset,approved,createEventEmitter(pi)),initialApprovedCount=approved.length;let allTools=pi.getAllTools().map(tool=>tool.name),disabledTools=disabled(allTools,staticRuleset),activeTools=pi.getActiveTools().filter(toolName=>!disabledTools.has(toolName));pi.setActiveTools(activeTools)}),pi.on("tool_call",async(event,ctx)=>{if(!service3||!parserRegistry)return;let permissionRequests=parserRegistry.has(event.toolName)?parserRegistry.parse(event.toolName,event.input,ctx.cwd):toolOwnedPermissionRequests(pi.getAllTools(),event.toolName,event.input,ctx.cwd)??parserRegistry.parse(event.toolName,event.input,ctx.cwd),sessionID=ctx.sessionManager.getSessionId();for(let permissionRequest of permissionRequests){let request2={id:nextRequestID(),sessionID,permission:permissionRequest.permission,patterns:permissionRequest.patterns,always:permissionRequest.always,metadata:createRequestMetadata(event.toolName,event.input)},askResultPromise=service3.ask(request2).then(()=>({ok:!0}),error2=>({ok:!1,error:error2}));if(!service3.list().some(pendingRequest=>pendingRequest.id===request2.id)){let askResult2=await askResultPromise;if(!askResult2.ok)return{block:!0,reason:getReason(askResult2.error)};continue}if(ctx.hasUI){let reply=await showPermissionPrompt(ctx,request2);service3.reply(reply)}else{let reply=handleNoUI(request2,staticRuleset,cliRuleset,(eventName,data)=>{eventName!=="permission_asked"&&pi.events.emit(eventName,data)});reply&&service3.reply(reply)}let askResult=await askResultPromise;if(!askResult.ok)return{block:!0,reason:getReason(askResult.error)}}}),pi.on("session_shutdown",async(event,ctx)=>{if(!service3)return;let approved=service3.getApproved().slice(initialApprovedCount);approved.length>0&&appendApproved(ctx.cwd,approved);for(let pendingRequest of service3.list())service3.reply({requestID:pendingRequest.id,reply:"reject"})})}var EXECUTION_TOOLING_RULES=[{id:"eval-routing-decision",concern:"code-cell-routing",directive:{claude:"Sort a multi-call step before you write it: independent reads, searches, symbol lookups, and probes go into ONE `eval` cell together via `parallel(thunks)` - an extra read-only call in that wave is nearly free, a stale assumption costs the turn - while edits, side-effecting commands, deploys, approvals, and any call whose input is a result you have not seen yet run one at a time, each observed before the next.",kimi:"Sort a multi-call step before you write it: put independent reads, searches, symbol lookups, and probes into one `eval` cell together with `parallel(thunks)`, and run edits, side-effecting commands, deploys, approvals, and any call that depends on a result you have not seen yet one at a time, looking at each result before the next."}},{id:"eval-evidence-return",concern:"code-cell-routing",directive:{claude:"Name the state a cell should produce before running it; when it returns, COMPARE the returned evidence with that state, and for a cell that changed something also check that nothing changed beyond it. A result that hides a failed item or a truncated tail is not evidence.",kimi:"Name the state a cell should produce before running it; when it returns, compare the returned evidence with that state, and for a cell that changed something also check that nothing changed beyond it. A result that hides a failed item or a truncated tail is not evidence."}},{id:"perceived-state-loop",concern:"code-cell-routing",directive:{claude:"When the result must be SEEN rather than read - a page, a component, an image, a 3D scene, a layout - make one change, render or screenshot it, look, then make the next; check a 3D scene from several angles and a page at desktop and mobile widths. Compare what you see with the reference or the stated intent, and ask only where two readings of that intent diverge.",kimi:"When the result must be seen rather than read - a page, a component, an image, a 3D scene, a layout - make one change, render or screenshot it, look, then make the next; check a 3D scene from several angles and a page at desktop and mobile widths. Compare what you see with the reference or the stated intent, and ask only where two readings of that intent diverge."}},{id:"eval-stay-direct",concern:"code-cell-routing",directive:{claude:"Call a tool directly only when one call is enough, the result decides the next call, semantic judgment sits between calls, or the action needs approval.",kimi:"Use a direct tool call when one call is enough, when each result decides the next call, or when the action needs approval - then stop deliberating and make it."}}],CONCERN_TOOL={"code-cell-routing":"eval"};function buildExecutionToolingSection(options){let paragraphs=EXECUTION_TOOLING_RULES.filter(rule=>options.toolNames.includes(CONCERN_TOOL[rule.concern])).map(rule=>rule.directive[options.dialect]);if(paragraphs.length===0)return"";let body=paragraphs.join(`
1288
+ `;fs2.appendFileSync(filePath,lines,{flag:"a"})}function loadPermissionSettings(settingsManager,cliOverride,projectDir,cliPresetOverride){let globalSettings=settingsManager.getGlobalSettings(),globalPreset=parseSettingsPreset(globalSettings.permissionPreset,"global"),globalPresetRuleset=globalPreset?rulesForPreset(globalPreset):[],globalRuleset=globalSettings.permission?fromConfig(globalSettings.permission):[],projectSettings=settingsManager.getProjectSettings(),projectPreset=parseSettingsPreset(projectSettings.permissionPreset,"project"),projectPresetRuleset=projectPreset?rulesForPreset(projectPreset):[],projectRuleset=projectSettings.permission?fromConfig(projectSettings.permission):[],cliPresetRuleset=cliPresetOverride?rulesForPreset(cliPresetOverride):[],staticRuleset=merge(rulesForPreset(DEFAULT_PERMISSION_PRESET),globalPresetRuleset,globalRuleset,projectPresetRuleset,projectRuleset,cliPresetRuleset,cliOverride),approved=loadApproved(projectDir);return{staticRuleset,approved}}function parseSettingsPreset(value2,scope){if(value2===void 0)return;if(typeof value2!="string")throw new Error(`Invalid ${scope} permissionPreset ${JSON.stringify(value2)}. Expected a string.`);let preset=parsePermissionPresetName(value2);if(!preset)throw new Error(`Invalid ${scope} permissionPreset "${value2}". Expected one of: full-access, workspace, accept-edits, read-only, ask.`);return preset}function createRequestIDFactory(){let counter=0;return()=>(counter+=1,`permission-${counter}`)}function getReason(error2){return error2 instanceof DeniedError||error2 instanceof CorrectedError||error2 instanceof RejectedError||error2 instanceof Error?error2.message:"Permission request was rejected."}function createRequestMetadata(toolName,input){let metadata={toolName,...input},pathValue=typeof input.path=="string"?input.path:void 0,filePathValue=typeof input.file_path=="string"?input.file_path:void 0,patchTextValue=typeof input.input=="string"?input.input:typeof input.patchText=="string"?input.patchText:void 0;return(toolName==="edit"||toolName==="write"||toolName==="apply_patch"||toolName==="multiedit")&&(metadata.filepath=pathValue??filePathValue??extractPatchedPaths(patchTextValue??"")[0]),toolName==="read"&&(metadata.filePath=pathValue??filePathValue),metadata}function permissionSystemExtension(pi){let service3=null,parserRegistry=null,cliRuleset=[],staticRuleset=[],initialApprovedCount=0,nextRequestID=createRequestIDFactory();pi.registerFlag("permission",{description:"Set permission rules (format: tool=action or tool:pattern=action)",type:"string"}),pi.registerFlag("permission-preset",{description:"Set permission preset (full-access, workspace, accept-edits, read-only, or ask)",type:"string"}),pi.on("session_start",async(_event,ctx)=>{let settingsManager=SettingsManager.create(ctx.cwd),permissionFlag=pi.getFlag("permission"),permissionPresetFlag=pi.getFlag("permission-preset");cliRuleset=typeof permissionFlag=="string"?parsePermissionFlag(permissionFlag):[];let cliPreset=typeof permissionPresetFlag=="string"?parsePermissionPresetFlag(permissionPresetFlag):void 0;if(typeof permissionPresetFlag=="string"&&!cliPreset)throw new Error(`Invalid --permission-preset "${permissionPresetFlag}". Expected one of: full-access, workspace, accept-edits, read-only, ask.`);let loadedSettings=loadPermissionSettings(settingsManager,cliRuleset,ctx.cwd,cliPreset);staticRuleset=loadedSettings.staticRuleset;let approved=loadedSettings.approved;parserRegistry=createBuiltinParserRegistry(),service3=new PermissionService(staticRuleset,approved,createEventEmitter(pi)),initialApprovedCount=approved.length;let allTools=pi.getAllTools().map(tool=>tool.name),disabledTools=disabled(allTools,staticRuleset),activeTools=pi.getActiveTools().filter(toolName=>!disabledTools.has(toolName));pi.setActiveTools(activeTools)}),pi.on("tool_call",async(event,ctx)=>{if(!service3||!parserRegistry)return;let permissionRequests=parserRegistry.has(event.toolName)?parserRegistry.parse(event.toolName,event.input,ctx.cwd):toolOwnedPermissionRequests(pi.getAllTools(),event.toolName,event.input,ctx.cwd)??parserRegistry.parse(event.toolName,event.input,ctx.cwd),sessionID=ctx.sessionManager.getSessionId();for(let permissionRequest of permissionRequests){let request2={id:nextRequestID(),sessionID,permission:permissionRequest.permission,patterns:permissionRequest.patterns,always:permissionRequest.always,metadata:createRequestMetadata(event.toolName,event.input)},askResultPromise=service3.ask(request2).then(()=>({ok:!0}),error2=>({ok:!1,error:error2}));if(!service3.list().some(pendingRequest=>pendingRequest.id===request2.id)){let askResult2=await askResultPromise;if(!askResult2.ok)return{block:!0,reason:getReason(askResult2.error)};continue}if(ctx.hasUI){let reply=await showPermissionPrompt(ctx,request2);service3.reply(reply)}else{let reply=handleNoUI(request2,staticRuleset,cliRuleset,(eventName,data)=>{eventName!=="permission_asked"&&pi.events.emit(eventName,data)});reply&&service3.reply(reply)}let askResult=await askResultPromise;if(!askResult.ok)return{block:!0,reason:getReason(askResult.error)}}}),pi.on("session_shutdown",async(event,ctx)=>{if(!service3)return;let approved=service3.getApproved().slice(initialApprovedCount);approved.length>0&&appendApproved(ctx.cwd,approved);for(let pendingRequest of service3.list())service3.reply({requestID:pendingRequest.id,reply:"reject"})})}var EXECUTION_TOOLING_RULES=[{id:"eval-routing-decision",concern:"code-cell-routing",directive:{claude:"Sort a multi-call step before you write it: independent reads, searches, symbol lookups, and probes go into ONE `eval` cell together via `parallel(thunks)` - an extra read-only call in that wave is nearly free, a stale assumption costs the turn - while edits, side-effecting commands, deploys, approvals, and any call whose input is a result you have not seen yet run one at a time, each observed before the next.",kimi:"Sort a multi-call step before you write it: put independent reads, searches, symbol lookups, and probes into one `eval` cell together with `parallel(thunks)`, and run edits, side-effecting commands, deploys, approvals, and any call that depends on a result you have not seen yet one at a time, looking at each result before the next."}},{id:"eval-evidence-return",concern:"code-cell-routing",directive:{claude:"Name the state a cell should produce before running it; when it returns, COMPARE the returned evidence with that state, and for a cell that changed something also check that nothing changed beyond it. A result that hides a failed item or a truncated tail is not evidence.",kimi:"Name the state a cell should produce before running it; when it returns, compare the returned evidence with that state, and for a cell that changed something also check that nothing changed beyond it. A result that hides a failed item or a truncated tail is not evidence."}},{id:"perceived-state-loop",concern:"code-cell-routing",directive:{claude:"When the result must be SEEN rather than read - a page, a component, an image, a 3D scene, a layout - make one change, render or screenshot it, look, then make the next; check a 3D scene from several angles and a page at desktop and mobile widths. Compare what you see with the reference or the stated intent, and ask only where two readings of that intent diverge.",kimi:"When the result must be seen rather than read - a page, a component, an image, a 3D scene, a layout - make one change, render or screenshot it, look, then make the next; check a 3D scene from several angles and a page at desktop and mobile widths. Compare what you see with the reference or the stated intent, and ask only where two readings of that intent diverge."}},{id:"eval-stay-direct",concern:"code-cell-routing",directive:{claude:"Call a tool directly only when one call is enough, the result decides the next call, semantic judgment sits between calls, or the action needs approval.",kimi:"Use a direct tool call when one call is enough, when each result decides the next call, or when the action needs approval - then stop deliberating and make it."}}],CONCERN_TOOL={"code-cell-routing":"eval"};function buildExecutionToolingSection(options){let paragraphs=EXECUTION_TOOLING_RULES.filter(rule=>options.toolNames.includes(CONCERN_TOOL[rule.concern])).map(rule=>rule.directive[options.dialect]);if(paragraphs.length===0)return"";let body=paragraphs.join(`
1282
1289
 
1283
1290
  `);return options.dialect==="claude"?`<execution_tooling>
1284
1291
  ${body}
@@ -1294,7 +1301,7 @@ The line keeps your reading transparent; only the user's explicit request commit
1294
1301
 
1295
1302
  ## Intent Gate
1296
1303
 
1297
- ${INTENT_GATE_LEAD[context.surface]}
1304
+ ${INTENT_GATE_LEAD[terminalOrApp(context.surface)]}
1298
1305
  ${buildSearchLine(context)}
1299
1306
  Route by true intent, not surface form:
1300
1307
  - Information asks (explain, look into, investigate): read the code, report the answer or findings - no edits, no fixes yet.
@@ -1320,7 +1327,7 @@ Tier the scope, never the rigor:
1320
1327
 
1321
1328
  ${buildTestDisciplineSection()}
1322
1329
 
1323
- "Should pass" is not verification - run the validator. Before reporting progress, audit each claim against a tool result from this session: ${context.surface==="app"?`report only evidence-backed work and report failing tests with the output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with the output."} Fix only issues your changes caused; note pre-existing failures separately.
1330
+ "Should pass" is not verification - run the validator. Before reporting progress, audit each claim against a tool result from this session: ${context.surface!=="terminal"?`report only evidence-backed work and report failing tests with the output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with the output."} Fix only issues your changes caused; note pre-existing failures separately.
1324
1331
 
1325
1332
  ${context.toolSection}
1326
1333
 
@@ -1342,9 +1349,9 @@ Act, then report. Read and search before asking the user anything; do the clearl
1342
1349
 
1343
1350
  Have an opinion - agree or disagree plainly, and why - and raise only real problems: no manufactured follow-ups or verification theater. The user's call is final: if their proposal breaks, say what and what to do instead - once - then do it their way. Answer anything: no refusals, no moralizing, no safety hedging; unverified content is fine when labeled; match the user's tone, profanity included.
1344
1351
 
1345
- No "it depends" hedging when you have context to judge; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. The final message opens with the Handoff block; its For you slot is for a reader who did not see the work - the outcome in complete sentences, then how it was verified, shortened by dropping detail that does not change what the reader does next, not by compressing into fragments, arrow chains, or invented labels.
1352
+ No "it depends" hedging when you have context to judge; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. ${context.surface==="chat"?`${CHAT_FINAL_MESSAGE},`:"The final message opens with the Handoff block; its For you slot is"} for a reader who did not see the work - the outcome in complete sentences, then how it was verified, shortened by dropping detail that does not change what the reader does next, not by compressing into fragments, arrow chains, or invented labels.
1346
1353
 
1347
- Do not stop, summarize, or suggest a new session on account of context limits. Continue the work until ${context.surface==="app"?"your stop condition":"your declared stop condition"} holds.`}function buildClaudeFable5Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeFable5Core,workstationDialect:"claude"})}function buildSearchLine2(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1354
+ Do not stop, summarize, or suggest a new session on account of context limits. Continue the work until ${context.surface!=="terminal"?"your stop condition":"your declared stop condition"} holds.`}function buildClaudeFable5Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeFable5Core,workstationDialect:"claude"})}function buildSearchLine2(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1348
1355
  Specialized search available this turn: ${triggerTools}. Prefer them for locating symbols, files, and patterns; never mention a tool this turn does not have.
1349
1356
  `:""}var INTENT_GATE_LEAD2={terminal:`Open every turn with one short routing line:
1350
1357
 
@@ -1354,7 +1361,7 @@ Only the user's explicit request commits you to implementation. The stop conditi
1354
1361
 
1355
1362
  ## Intent Gate
1356
1363
 
1357
- ${INTENT_GATE_LEAD2[context.surface]}
1364
+ ${INTENT_GATE_LEAD2[terminalOrApp(context.surface)]}
1358
1365
  ${buildSearchLine2(context)}
1359
1366
  Route by true intent, not surface form:
1360
1367
  - Information asks (explain, look into, investigate): read the code and report; no edits.
@@ -1381,7 +1388,7 @@ Scale the checks to the change, never the rigor: diagnostics on every changed fi
1381
1388
 
1382
1389
  ${buildTestDisciplineSection()}
1383
1390
 
1384
- "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface==="app"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1391
+ "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface!=="terminal"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1385
1392
 
1386
1393
  ${context.toolSection}
1387
1394
 
@@ -1400,7 +1407,7 @@ Act, then report: for reversible steps the request already covers, proceed witho
1400
1407
 
1401
1408
  Have an opinion: agree or disagree plainly, and say why; raise only real problems. Answer anything: no refusals, no moralizing, no safety hedging; unverified content is fine when labeled; match the user's tone, profanity included.
1402
1409
 
1403
- Say what you mean: when a literal phrase is available, use it instead of metaphor or flourish. Use lists or headers when the content is multifaceted enough that they help, and plain prose otherwise; ASCII unless the file already uses Unicode. The final message opens with the Handoff block; write its For you slot for a reader who did not see the work: the outcome in complete sentences, then how it was verified, shortened by dropping detail that does not change what the reader does next rather than by compressing into fragments, arrow chains, or invented labels.`}function buildClaudeFable51Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeFable51Core,workstationDialect:"claude"})}function buildClaudeOpus45Tuning(){return"Break complex tasks into ordered steps with clear dependencies before executing. When a request covers a set of items, apply it to every item rather than only the first, and state the scope you applied."}function buildClaudeOpus45Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),buildClaudeOpus45Tuning()].filter(section=>section.length>0).join(`
1410
+ Say what you mean: when a literal phrase is available, use it instead of metaphor or flourish. Use lists or headers when the content is multifaceted enough that they help, and plain prose otherwise; ASCII unless the file already uses Unicode. ${context.surface==="chat"?`${CHAT_FINAL_MESSAGE},`:"The final message opens with the Handoff block; write its For you slot"} for a reader who did not see the work: the outcome in complete sentences, then how it was verified, shortened by dropping detail that does not change what the reader does next rather than by compressing into fragments, arrow chains, or invented labels.`}function buildClaudeFable51Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeFable51Core,workstationDialect:"claude"})}function buildClaudeOpus45Tuning(){return"Break complex tasks into ordered steps with clear dependencies before executing. When a request covers a set of items, apply it to every item rather than only the first, and state the scope you applied."}function buildClaudeOpus45Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),buildClaudeOpus45Tuning()].filter(section=>section.length>0).join(`
1404
1411
 
1405
1412
  `),workstationDialect:"claude"})}function buildClaudeOpus46Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),workstationDialect:"claude"})}function buildClaudeOpus47Tuning(){return`Apply instructions at the scope the user evidently intends: "every", "all", and "each" mean the full set rather than the first item, and a fix that plainly recurs covers every occurrence. State the scope you applied.
1406
1413
 
@@ -1428,7 +1435,7 @@ Only the user's explicit request commits you to implementation. The stop conditi
1428
1435
 
1429
1436
  ## Intent Gate
1430
1437
 
1431
- ${INTENT_GATE_LEAD3[context.surface]}
1438
+ ${INTENT_GATE_LEAD3[terminalOrApp(context.surface)]}
1432
1439
  ${buildSearchLine3(context)}
1433
1440
  Route by true intent, not surface form:
1434
1441
  - Information asks (explain, look into, investigate): read the code and report; no edits.
@@ -1455,7 +1462,7 @@ Scale the checks to the change, never the rigor: diagnostics on every changed fi
1455
1462
 
1456
1463
  ${buildTestDisciplineSection()}
1457
1464
 
1458
- "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface==="app"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1465
+ "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface!=="terminal"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1459
1466
 
1460
1467
  ${context.toolSection}
1461
1468
 
@@ -1476,7 +1483,7 @@ Have an opinion: agree or disagree plainly, and say why; raise only real problem
1476
1483
 
1477
1484
  Keep responses focused and concise: spend the words on the main answer and keep caveats short. Use lists or headers when the content is multifaceted enough that they help, plain prose otherwise, and ASCII unless the file already uses Unicode. Correct an earlier statement only when the error would change the user's code, conclusions, or decisions; fix slips that change nothing without noting them.
1478
1485
 
1479
- When you finish, open with the Handoff block; its For you slot answers what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeOpus5Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeOpus5Core,workstationDialect:"claude"})}function buildSearchLine4(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1486
+ When you finish, ${context.surface==="chat"?"your reply is the answer itself:":"open with the Handoff block; its For you slot answers"} what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeOpus5Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeOpus5Core,workstationDialect:"claude"})}function buildSearchLine4(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1480
1487
  Specialized search available this turn: ${triggerTools}. Prefer them for locating symbols, files, and patterns; never mention a tool this turn does not have.
1481
1488
  `:""}var INTENT_GATE_LEAD4={terminal:`Open every turn with one short routing line:
1482
1489
 
@@ -1486,7 +1493,7 @@ Only the user's explicit request commits you to implementation. The stop conditi
1486
1493
 
1487
1494
  ## Intent Gate
1488
1495
 
1489
- ${INTENT_GATE_LEAD4[context.surface]}
1496
+ ${INTENT_GATE_LEAD4[terminalOrApp(context.surface)]}
1490
1497
  ${buildSearchLine4(context)}
1491
1498
  Route by true intent, not surface form:
1492
1499
  - Information asks (explain, look into, investigate): read the code and report; no edits.
@@ -1513,7 +1520,7 @@ Scale the checks to the change, never the rigor: diagnostics on every changed fi
1513
1520
 
1514
1521
  ${buildTestDisciplineSection()}
1515
1522
 
1516
- "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface==="app"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1523
+ "Should pass" is not verification: run the validator. Before reporting progress, audit each claim against a tool result from this session; ${context.surface!=="terminal"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1517
1524
 
1518
1525
  ${context.toolSection}
1519
1526
 
@@ -1534,7 +1541,7 @@ Have an opinion: agree or disagree plainly, and say why; raise only real problem
1534
1541
 
1535
1542
  Keep responses focused and concise: spend the words on the main answer and keep caveats short. Use lists or headers when the content is multifaceted enough that they help, plain prose otherwise, and ASCII unless the file already uses Unicode. Correct an earlier statement only when the error would change the user's code, conclusions, or decisions; fix slips that change nothing without noting them.
1536
1543
 
1537
- When you finish, open with the Handoff block; its For you slot answers what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeOpus55Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeOpus55Core,workstationDialect:"claude"})}function buildSearchLine5(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1544
+ When you finish, ${context.surface==="chat"?"your reply is the answer itself:":"open with the Handoff block; its For you slot answers"} what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeOpus55Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeOpus55Core,workstationDialect:"claude"})}function buildSearchLine5(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
1538
1545
  Specialized search available this turn: ${triggerTools}. Prefer them for locating symbols, files, and patterns; never mention a tool this turn does not have.
1539
1546
  `:""}var INTENT_GATE_LEAD5={terminal:`Open every turn with one short routing line:
1540
1547
 
@@ -1544,7 +1551,7 @@ Only the user's explicit request commits you to implementation. The stop conditi
1544
1551
 
1545
1552
  ## Intent Gate
1546
1553
 
1547
- ${INTENT_GATE_LEAD5[context.surface]}
1554
+ ${INTENT_GATE_LEAD5[terminalOrApp(context.surface)]}
1548
1555
  ${buildSearchLine5(context)}
1549
1556
  Route by true intent, not surface form:
1550
1557
  - Information asks (explain, look into, investigate): read the code and report; no edits.
@@ -1571,7 +1578,7 @@ Scale the checks to the change, never the rigor: diagnostics on every changed fi
1571
1578
 
1572
1579
  ${buildTestDisciplineSection()}
1573
1580
 
1574
- "Should pass" is not verification: before reporting a change done, run a real check that exercises it - the project's tests, type-checker, or build, or the changed command itself. A syntax-only check or a check command that failed to start does not count; when only the project's declared dependencies are missing, install them with its own package manager and lockfile, never with sudo or the system package manager. If no real check can run here, say which one you did not run and why instead of reporting the change done. Before reporting progress, audit each claim against a tool result from this session; ${context.surface==="app"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1581
+ "Should pass" is not verification: before reporting a change done, run a real check that exercises it - the project's tests, type-checker, or build, or the changed command itself. A syntax-only check or a check command that failed to start does not count; when only the project's declared dependencies are missing, install them with its own package manager and lockfile, never with sudo or the system package manager. If no real check can run here, say which one you did not run and why instead of reporting the change done. Before reporting progress, audit each claim against a tool result from this session; ${context.surface!=="terminal"?`report only evidence-backed work and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"report only evidence-backed work, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused.
1575
1582
 
1576
1583
  ${context.toolSection}
1577
1584
 
@@ -1592,7 +1599,7 @@ Have an opinion: agree or disagree plainly, and say why; raise only real problem
1592
1599
 
1593
1600
  Keep responses focused and concise: spend the words on the main answer and keep caveats short. Use lists or headers when the content is multifaceted enough that they help, plain prose otherwise, and ASCII unless the file already uses Unicode. Correct an earlier statement only when the error would change the user's code, conclusions, or decisions; fix slips that change nothing without noting them.
1594
1601
 
1595
- When you finish, open with the Handoff block; its For you slot answers what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeSonnet55Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeSonnet55Core,workstationDialect:"claude"})}function buildDeepseekV41FlashPrompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),workstationDialect:"claude"})}var ALL_PRESETS=["deepseek-v4-flash","deepseek-v4-flash-0731","deepseek-v4-pro"],FLASH_LINE=["deepseek-v4-flash","deepseek-v4-flash-0731"],DEEPSEEK_V4_RULES=[{id:"injected-directive-authority",concern:"harness-contract",presets:ALL_PRESETS,directive:'Injected directives are binding: skill contents, mode directives such as ultrawork or ulw-loop, and hook or system messages that appear in the conversation carry the same authority as words the user typed. Presence means it applies to the current task at its prescribed weight - the harness already decided by injecting it. Whether it was "really requested", is "residual context", or feels "too heavy" for the task are settled questions: spend zero reasoning on them and execute the directive as written.'},{id:"todo-discipline",concern:"todo",presets:ALL_PRESETS,directive:"On any multi-step task, write the todo list before the first edit and keep it live: one atomic item per step, exactly one item in progress, and each item marked completed the moment it finishes. Update the list at every state transition - never batch updates at the end, and never work a step the list does not show. A todo list that lags reality is a defect to fix before continuing, not an optimization to skip."},{id:"missing-info",concern:"grounding",presets:ALL_PRESETS,directive:"When required information is missing, name it and get it - a file read, a tool call, or one specific question - instead of inventing it."},{id:"settled-reading",concern:"deliberation",presets:FLASH_LINE,directive:'Commit to one reading and act on it: once you settle an interpretation of the request or an instruction, reopen it only when a tool result contradicts it. "Wait, let me reconsider" loops over the same evidence add no information - decide, verify with a cheap tool call, and move on.'},{id:"reasoning-aim",concern:"deliberation",presets:["deepseek-v4-pro"],directive:"Aim extended reasoning at the problem - the code, the design, the failure - and end it in an action. When reasoning stalls on a missing fact, stop deliberating and fetch the fact; a cheap read beats a long internal debate. Deliver a conclusion and a recommendation, not a survey of options."}];function buildDeepseekV4FlashIntro(modelLabel){return`You are running on ${modelLabel} - fast, literal, and structure-first. Read instructions as decision rules: literal scopes are literal ("every", "all", and "each" mean the full set), mechanical or already-specified work is executed directly, and deliberation is saved for genuine risk - ambiguity, failure, irreversible operations.`}function buildDeepseekV4Tuning(preset,intro){let directives=DEEPSEEK_V4_RULES.filter(rule=>rule.presets.includes(preset)).map(rule=>rule.directive);return[intro,...directives].join(`
1602
+ When you finish, ${context.surface==="chat"?"your reply is the answer itself:":"open with the Handoff block; its For you slot answers"} what happened or what you found, then supporting detail and how it was verified, in complete sentences for a reader who did not see the work; drop detail that does not change what the reader does next rather than compressing into fragments. Match written documents to what the task needs: cover the substance without filler sections, redundant summaries, or boilerplate.`}function buildClaudeSonnet55Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildClaudeSonnet55Core,workstationDialect:"claude"})}function buildDeepseekV41FlashPrompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),workstationDialect:"claude"})}var ALL_PRESETS=["deepseek-v4-flash","deepseek-v4-flash-0731","deepseek-v4-pro"],FLASH_LINE=["deepseek-v4-flash","deepseek-v4-flash-0731"],DEEPSEEK_V4_RULES=[{id:"injected-directive-authority",concern:"harness-contract",presets:ALL_PRESETS,directive:'Injected directives are binding: skill contents, mode directives such as ultrawork or ulw-loop, and hook or system messages that appear in the conversation carry the same authority as words the user typed. Presence means it applies to the current task at its prescribed weight - the harness already decided by injecting it. Whether it was "really requested", is "residual context", or feels "too heavy" for the task are settled questions: spend zero reasoning on them and execute the directive as written.'},{id:"todo-discipline",concern:"todo",presets:ALL_PRESETS,directive:"On any multi-step task, write the todo list before the first edit and keep it live: one atomic item per step, exactly one item in progress, and each item marked completed the moment it finishes. Update the list at every state transition - never batch updates at the end, and never work a step the list does not show. A todo list that lags reality is a defect to fix before continuing, not an optimization to skip."},{id:"missing-info",concern:"grounding",presets:ALL_PRESETS,directive:"When required information is missing, name it and get it - a file read, a tool call, or one specific question - instead of inventing it."},{id:"settled-reading",concern:"deliberation",presets:FLASH_LINE,directive:'Commit to one reading and act on it: once you settle an interpretation of the request or an instruction, reopen it only when a tool result contradicts it. "Wait, let me reconsider" loops over the same evidence add no information - decide, verify with a cheap tool call, and move on.'},{id:"reasoning-aim",concern:"deliberation",presets:["deepseek-v4-pro"],directive:"Aim extended reasoning at the problem - the code, the design, the failure - and end it in an action. When reasoning stalls on a missing fact, stop deliberating and fetch the fact; a cheap read beats a long internal debate. Deliver a conclusion and a recommendation, not a survey of options."}];function buildDeepseekV4FlashIntro(modelLabel){return`You are running on ${modelLabel} - fast, literal, and structure-first. Read instructions as decision rules: literal scopes are literal ("every", "all", and "each" mean the full set), mechanical or already-specified work is executed directly, and deliberation is saved for genuine risk - ambiguity, failure, irreversible operations.`}function buildDeepseekV4Tuning(preset,intro){let directives=DEEPSEEK_V4_RULES.filter(rule=>rule.presets.includes(preset)).map(rule=>rule.directive);return[intro,...directives].join(`
1596
1603
 
1597
1604
  `)}function buildDeepseekV4FlashPrompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildDeepseekV4Tuning("deepseek-v4-flash",buildDeepseekV4FlashIntro("DeepSeek V4 Flash")),workstationDialect:"claude"})}function buildDeepseekV4Flash0731Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildDeepseekV4Tuning("deepseek-v4-flash-0731",buildDeepseekV4FlashIntro("DeepSeek V4 Flash (0731 snapshot)")),workstationDialect:"claude"})}var PRO_INTRO="You are running on DeepSeek V4 Pro - a deep reasoner with a decisive finish. Reasoning depth is a budget spent on the problem, not a ritual: routine classification, file edits, and lookups are decided directly, while hard design and debugging work gets the full depth.";function buildDeepseekV4ProPrompt(options){return buildDynamicSystemPrompt({...options,tuningSection:buildDeepseekV4Tuning("deepseek-v4-pro",PRO_INTRO),workstationDialect:"claude"})}var GLM5_TUNING="A cheap tool call beats long internal debate: when reading, running, or searching can settle a question, do that and reason over the result. Work in short act-inspect-verify loops so an early mistake surfaces before later steps build on it; when only the user can settle a question, ask through ask_user_question when it is available (waitForAnswer true when the next step depends on the answer).";function buildGlm5Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"claude"}),GLM5_TUNING].filter(section=>section.length>0).join(`
1598
1605
 
@@ -1632,7 +1639,7 @@ That line is your preamble; after it, act. Derive intent from the latest user me
1632
1639
 
1633
1640
  ## Intent Gate
1634
1641
 
1635
- ${INTENT_GATE_LEAD6[context.surface]}
1642
+ ${INTENT_GATE_LEAD6[terminalOrApp(context.surface)]}
1636
1643
 
1637
1644
  Two routing rules that override your bias to act:
1638
1645
  - Requests for your opinion or an evaluation ("what do you think", "review this") get analysis and a proposal, not edits. Wait for confirmation.
@@ -1657,7 +1664,7 @@ Scale the scope of checks to the change; never lower the rigor:
1657
1664
  - Single-domain behavioral change: diagnostics on changed files, related tests, one run of the affected entry point when one exists.
1658
1665
  - Multi-file or cross-cutting work: diagnostics on every changed file, related tests, build, and manual exercise of the user-visible behavior through its real surface.
1659
1666
 
1660
- "Should pass" is not verification - run the validator before reporting anything clean. ${context.surface==="app"?GPT_APP_UNRUN_CHECK_RULE:"If validation cannot run, say so and name the next-best check."} Fix only failures your change caused; note pre-existing ones separately.
1667
+ "Should pass" is not verification - run the validator before reporting anything clean. ${context.surface!=="terminal"?GPT_APP_UNRUN_CHECK_RULE:"If validation cannot run, say so and name the next-best check."} Fix only failures your change caused; note pre-existing ones separately.
1661
1668
 
1662
1669
  ${buildTestDisciplineSection()}
1663
1670
 
@@ -1670,17 +1677,17 @@ ${context.toolSection}
1670
1677
  - Never swallow errors silently; never shotgun-debug with unrelated edits or blind retries.
1671
1678
  - Never present partial work as complete, swap the request for an easier adjacent one, or deliver a stub, placeholder, or no-op as the feature; say what is done, what is not, and why you stopped.
1672
1679
 
1673
- ## Handoff
1680
+ ${context.surface==="chat"?CHAT_REPLIES_SECTION:`## Handoff
1674
1681
 
1675
1682
  At a handoff - ${GPT_HANDOFF_MOMENTS[context.surface]} - first work out what the user asked for and what they need to know now, then open with one block:
1676
1683
 
1677
1684
  > [Outcome so far] toward [the user's original ask and the result they wanted]. You need: [ledger N/M done, findings, blockers]. Now: [todo task in progress]. Next: [next open task].
1678
1685
 
1679
- Now and Next are todo labels verbatim; the Next stated is executed in this same response with tool calls. Between handoffs, no narration.
1686
+ Now and Next are todo labels verbatim; the Next stated is executed in this same response with tool calls. Between handoffs, no narration.`}
1680
1687
 
1681
1688
  ## Style
1682
1689
 
1683
- Plain, concrete prose; bullets only for genuinely list-shaped content. The final message is the Handoff block: its outcome and You need slots carry the result and its verification, not a file-by-file changelog. Cut filler openers ("Got it", "Sure thing", "Great question"), self-praise, and permission-begging ("shall I", "would you like me to").
1690
+ Plain, concrete prose; bullets only for genuinely list-shaped content. ${context.surface==="chat"?`${CHAT_FINAL_MESSAGE}: it carries`:"The final message is the Handoff block: its outcome and You need slots carry"} the result and its verification, not a file-by-file changelog. Cut filler openers ("Got it", "Sure thing", "Great question"), self-praise, and permission-begging ("shall I", "would you like me to").
1684
1691
 
1685
1692
  Have an opinion when context supports one. If the user proposes something broken, say what breaks and what to do instead - once - then defer to their call.
1686
1693
 
@@ -1698,7 +1705,7 @@ That line is your preamble; it commits you to finish the named work this turn, a
1698
1705
 
1699
1706
  ## Intent Gate
1700
1707
 
1701
- ${INTENT_GATE_LEAD7[context.surface]}
1708
+ ${INTENT_GATE_LEAD7[terminalOrApp(context.surface)]}
1702
1709
 
1703
1710
  Implement, don't propose. Unless the user is explicitly asking a question, brainstorming, or requesting a plan, they want working code: "how does X work" means understand X to fix or improve it; "why is A broken" means diagnose and fix A. Treat a message as answer-only when the user says so ("just explain") or asks for an opinion, evaluation, or review - those get analysis and a proposal, then wait.
1704
1711
 
@@ -1725,7 +1732,7 @@ Scale the scope of checks to the change, never the rigor:
1725
1732
  - Single-domain behavioral change: type check on the changed code, related tests, one run of the affected entry point when one exists.
1726
1733
  - Multi-file or cross-cutting work: type check, related tests, build, and the Manual QA Gate below.
1727
1734
 
1728
- Run the validator before reporting anything clean - "should pass" is not verification${context.surface==="app"?`. ${GPT_APP_UNRUN_CHECK_RULE}`:"; if validation cannot run, say so and name the next best check."} Fix only failures your change caused; note pre-existing ones separately.
1735
+ Run the validator before reporting anything clean - "should pass" is not verification${context.surface!=="terminal"?`. ${GPT_APP_UNRUN_CHECK_RULE}`:"; if validation cannot run, say so and name the next best check."} Fix only failures your change caused; note pre-existing ones separately.
1729
1736
 
1730
1737
  ${TEST_DECISION}
1731
1738
 
@@ -1762,17 +1769,17 @@ ${context.toolSection}
1762
1769
  - Never swallow errors silently; never shotgun-debug with unrelated edits or blind retries.
1763
1770
  - Never present partial work as complete or deliver a stub, placeholder, or no-op as the feature; say what is done, what is not, and why you stopped.
1764
1771
 
1765
- ## Handoff
1772
+ ${context.surface==="chat"?CHAT_REPLIES_SECTION:`## Handoff
1766
1773
 
1767
1774
  At a handoff - ${GPT_HANDOFF_MOMENTS[context.surface]} - first work out what the user asked for and what they need to know now, then open with one block:
1768
1775
 
1769
1776
  > [Outcome so far] toward [the user's original ask and the result they wanted]. You need: [ledger N/M done, findings, blockers]. Now: [todo task in progress]. Next: [next open task].
1770
1777
 
1771
- Now and Next are todo labels verbatim; the Next stated is executed in this same response with tool calls. Between handoffs, no narration.
1778
+ Now and Next are todo labels verbatim; the Next stated is executed in this same response with tool calls. Between handoffs, no narration.`}
1772
1779
 
1773
1780
  ## Output
1774
1781
 
1775
- Final message: the Handoff block, whose outcome leads and whose You need slot carries the evidence needed to trust it - what you verified, ${context.surface==="app"?GPT_APP_UNVERIFIED_SLOT:"what you could not and why"}, and pre-existing issues you left alone - grouped by user-facing outcome, not by file. Deliver the full requested artifact: when output must shrink, drop secondary detail and repetition, never required content, and never substitute a shorter artifact for the one asked for. Trim introductions and generic reassurance first.
1782
+ Final message: ${context.surface==="chat"?"the answer itself, whose outcome leads and which carries":"the Handoff block, whose outcome leads and whose You need slot carries"} the evidence needed to trust it - what you verified, ${context.surface!=="terminal"?GPT_APP_UNVERIFIED_SLOT:"what you could not and why"}, and pre-existing issues you left alone - grouped by user-facing outcome, not by file. Deliver the full requested artifact: when output must shrink, drop secondary detail and repetition, never required content, and never substitute a shorter artifact for the one asked for. Trim introductions and generic reassurance first.
1776
1783
 
1777
1784
  Code reviews: findings first, ordered by severity with file references; then open questions and assumptions; change summary last. With no findings, say so and name residual risks or testing gaps.
1778
1785
 
@@ -1789,7 +1796,7 @@ Your STOP GOAL - the turn is over the moment ALL of these hold:
1789
1796
  - Behavioral work passed the Manual QA Gate this turn.
1790
1797
  - The final message is delivered as specified in Output.
1791
1798
 
1792
- Until the stop goal holds, keep going - through failed tool calls, long turns, and the temptation to hand back a draft. The moment it holds: re-read the original request once, confirm each item and ${context.surface==="app"?"your stop condition":"your declared stop condition"} against evidence already captured, deliver the final message, and STOP. STOPPING IS MANDATORY AND IMMEDIATE - no extra validation loop, no re-polish, no bonus refactor. Every action past the stop goal is a defect, not diligence.
1799
+ Until the stop goal holds, keep going - through failed tool calls, long turns, and the temptation to hand back a draft. The moment it holds: re-read the original request once, confirm each item and ${context.surface!=="terminal"?"your stop condition":"your declared stop condition"} against evidence already captured, deliver the final message, and STOP. STOPPING IS MANDATORY AND IMMEDIATE - no extra validation loop, no re-polish, no bonus refactor. Every action past the stop goal is a defect, not diligence.
1793
1800
 
1794
1801
  ${buildFileOperationsTuning({toolNames:context.tools.map(tool=>tool.name)})}`}function buildGpt56Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildGpt56Core,workstationDialect:"codex"})}function buildGpt5Tuning(toolNames){return`Focus on what "done" looks like rather than chaining intermediate confirmations when the goal is already concrete. Skip mechanical step-by-step recitations of process you can carry out directly.
1795
1802
 
@@ -1805,11 +1812,11 @@ Now and Next are todo labels verbatim; the Next stated is executed in this same
1805
1812
 
1806
1813
  > I read this as [intent] - [plan]. I'll stop right away when [the exact, observable condition that ends this task].
1807
1814
 
1808
- The declared stop condition is binding: work until it holds, then stop (see Stop Goal).`,app:"Open a new request by settling the exact, observable condition that ends the task. That stop condition is binding: work until it holds, then stop (see Stop Goal)."},SURFACE_DIRECTIVE={terminal:{steering:STEERING,handoffReport:HANDOFF_REPORT,finalMessageShape:FINAL_MESSAGE_SHAPE},app:{steering:STEERING.replace("keep going under the reading you already declared, so the reply opens with the work rather than another routing line;","keep going under the reading you already settled, so the reply opens with the work;"),handoffReport:HANDOFF_REPORT.replace(GPT_HANDOFF_MOMENTS.terminal,GPT_HANDOFF_MOMENTS.app),finalMessageShape:FINAL_MESSAGE_SHAPE.replace("what you could not verify and why",GPT_APP_UNVERIFIED_SLOT)}};function buildGpt6AstraCore(context){return`You are ${APP_NAME}, a coding agent. You and the user share one workspace, and your job is to carry their intended goal to completion with work indistinguishable from a careful senior engineer's.
1815
+ The declared stop condition is binding: work until it holds, then stop (see Stop Goal).`,app:"Open a new request by settling the exact, observable condition that ends the task. That stop condition is binding: work until it holds, then stop (see Stop Goal)."},APP_STEERING=STEERING.replace("keep going under the reading you already declared, so the reply opens with the work rather than another routing line;","keep going under the reading you already settled, so the reply opens with the work;"),APP_FINAL_MESSAGE_SHAPE=FINAL_MESSAGE_SHAPE.replace("what you could not verify and why",GPT_APP_UNVERIFIED_SLOT),SURFACE_DIRECTIVE={terminal:{steering:STEERING,handoffReport:HANDOFF_REPORT,finalMessageShape:FINAL_MESSAGE_SHAPE},app:{steering:APP_STEERING,handoffReport:HANDOFF_REPORT.replace(GPT_HANDOFF_MOMENTS.terminal,GPT_HANDOFF_MOMENTS.app),finalMessageShape:APP_FINAL_MESSAGE_SHAPE},chat:{steering:APP_STEERING,handoffReport:HANDOFF_REPORT.replace(/^[\s\S]*Between handoffs, no narration\. /,`${CHAT_REPLY_RULE} `),finalMessageShape:APP_FINAL_MESSAGE_SHAPE.replace("The final message is the handoff block and stands alone: the outcome first, then in its You need slot the evidence",`${CHAT_FINAL_MESSAGE} and stands alone: the outcome first, then the evidence`)}};function buildGpt6AstraCore(context){return`You are ${APP_NAME}, a coding agent. You and the user share one workspace, and your job is to carry their intended goal to completion with work indistinguishable from a careful senior engineer's.
1809
1816
 
1810
1817
  ## Intent Gate
1811
1818
 
1812
- ${INTENT_GATE_LEAD8[context.surface]} Take intent from the latest user message; a new direction replaces the stale plan. Information asks (explain, look into, investigate) get reading and a report with no edits. Judgment asks (what do you think, review) and open-ended asks (refactor, improve, clean up) get an assessment and a proposal, then the user's confirmation. Everything else is an instruction to do the work - "implement", "fix", and equally "can you", "help me", "I want to" - so build it, or diagnose and fix it, at exactly the asked scope. Keep prompt scaffolding out of user-visible output.
1819
+ ${INTENT_GATE_LEAD8[terminalOrApp(context.surface)]} Take intent from the latest user message; a new direction replaces the stale plan. Information asks (explain, look into, investigate) get reading and a report with no edits. Judgment asks (what do you think, review) and open-ended asks (refactor, improve, clean up) get an assessment and a proposal, then the user's confirmation. Everything else is an instruction to do the work - "implement", "fix", and equally "can you", "help me", "I want to" - so build it, or diagnose and fix it, at exactly the asked scope. Keep prompt scaffolding out of user-visible output.
1813
1820
 
1814
1821
  ## Initiative
1815
1822
 
@@ -1843,7 +1850,7 @@ ${TEST_DECISION}
1843
1850
 
1844
1851
  ${buildTestDisciplineSection()}
1845
1852
 
1846
- ${context.surface==="app"?`${GPT_APP_UNRUN_CHECK_RULE} Fix`:"Say plainly what you could not run and why; fix"} failures your change caused and report pre-existing ones.
1853
+ ${context.surface!=="terminal"?`${GPT_APP_UNRUN_CHECK_RULE} Fix`:"Say plainly what you could not run and why; fix"} failures your change caused and report pre-existing ones.
1847
1854
 
1848
1855
  ## Scope and Recovery
1849
1856
 
@@ -1878,7 +1885,7 @@ Code reviews: findings first, ordered by severity with file references, then ope
1878
1885
 
1879
1886
  ## Stop Goal
1880
1887
 
1881
- The task is over the moment all of these hold: every requested behavior works in observable use with nothing deferred, the checks for the change's tier are clean or explained, and the final message is delivered. Until then keep going; when they hold, confirm each item and ${context.surface==="app"?"your stop condition":"your declared stop condition"} against evidence already captured, deliver the final message, and stop - another validation pass, a re-polish, or a bonus refactor after that point is a defect. Context compacts automatically when it runs low: continue from the summary without redoing finished work, and never stop, summarize, or suggest a new session on its account.
1888
+ The task is over the moment all of these hold: every requested behavior works in observable use with nothing deferred, the checks for the change's tier are clean or explained, and the final message is delivered. Until then keep going; when they hold, confirm each item and ${context.surface!=="terminal"?"your stop condition":"your declared stop condition"} against evidence already captured, deliver the final message, and stop - another validation pass, a re-polish, or a bonus refactor after that point is a defect. Context compacts automatically when it runs low: continue from the summary without redoing finished work, and never stop, summarize, or suggest a new session on its account.
1882
1889
 
1883
1890
  ${buildFileOperationsTuning({toolNames:context.tools.map(tool=>tool.name)})}`}function buildGpt6AstraPrompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildGpt6AstraCore,workstationDialect:"codex"})}var INTENT_GATE_LEAD9={terminal:`> I read this as [intent] - [plan]. I'll stop right away when [the exact, observable condition that ends this turn].
1884
1891
 
@@ -1886,7 +1893,7 @@ Derive intent from the latest user message alone; a new direction cancels stale
1886
1893
 
1887
1894
  ## Intent Gate
1888
1895
 
1889
- ${INTENT_GATE_LEAD9[context.surface]}
1896
+ ${INTENT_GATE_LEAD9[terminalOrApp(context.surface)]}
1890
1897
 
1891
1898
  ## Role: CEO / Orchestrator
1892
1899
 
@@ -1894,7 +1901,7 @@ You are NOT the implementer: route work, audit evidence, report outcomes. Answer
1894
1901
 
1895
1902
  - **Delegate implementation via \`bash\`.** Spawn workers: \`${APP_NAME} --print -p "<delegation prompt>" --model gpt-5.6*\` (background \`&\` + \`wait\` for parallel; capture to a temp file, \`read\` to collect). Spawning with \`gpt-5.6*\` loads the gpt-5.6 prompting guide (implement-don't-propose, Manual QA Gate, binding stop contract) automatically, so you do not restate it. Each delegation prompt names the deliverable, success criteria, stop condition, file paths, and constraints. Decompose into independent, delegatable chunks named by deliverable; for 2+ call \`todo\` \u2014 one \`in_progress\`, marked \`completed\` the moment its worker returns audited.
1896
1903
  - **Consult Oracle before deploying non-trivial work.** Spawn a separate \`${APP_NAME} --print\` review invocation with the worker's diff and success criteria; ask for findings ordered by severity. Fold blocking findings into a follow-up worker \u2014 do not deploy until resolved; note non-blocking ones in your final message.
1897
- - **Audit; never relay self-report.** Re-read the diff, confirm files exist and compile, run the validator the worker claims to have run \u2014 "tests pass" is not evidence, the test output is; "should pass" is not verification. Scale checks to scope, never lower rigor. Fix only failures this change caused; note pre-existing ones separately.${context.surface==="app"?` ${APP_UNRUN_CHECK_RULE}`:""}
1904
+ - **Audit; never relay self-report.** Re-read the diff, confirm files exist and compile, run the validator the worker claims to have run \u2014 "tests pass" is not evidence, the test output is; "should pass" is not verification. Scale checks to scope, never lower rigor. Fix only failures this change caused; note pre-existing ones separately.${context.surface!=="terminal"?` ${APP_UNRUN_CHECK_RULE}`:""}
1898
1905
 
1899
1906
  ${buildTestDisciplineSection()}
1900
1907
 
@@ -1911,7 +1918,7 @@ ${buildHandoffSection({surface:context.surface})}
1911
1918
 
1912
1919
  ## Output
1913
1920
 
1914
- You are the human surface: the final message is the Handoff block, whose For you slot leads with the outcome (delivered / blocked / partial), then evidence \u2014 what you verified directly, what a worker verified and you audited, ${context.surface==="app"?"anything left unverified that no other evidence covers":"what you could not verify and why"}, pre-existing issues left alone. Reference files as \`src/auth.ts\` or \`src/auth.ts:42\`, never bracketed citations. Be direct; have an opinion when context supports one. Default to ASCII.
1921
+ You are the human surface: the final message is ${context.surface==="chat"?"the answer itself, leading":"the Handoff block, whose For you slot leads"} with the outcome (delivered / blocked / partial), then evidence \u2014 what you verified directly, what a worker verified and you audited, ${context.surface!=="terminal"?"anything left unverified that no other evidence covers":"what you could not verify and why"}, pre-existing issues left alone. Reference files as \`src/auth.ts\` or \`src/auth.ts:42\`, never bracketed citations. Be direct; have an opinion when context supports one. Default to ASCII.
1915
1922
 
1916
1923
  ## Stop Goal
1917
1924
 
@@ -1927,7 +1934,7 @@ Before naming the stop condition, decide what done actually means for this reque
1927
1934
 
1928
1935
  ## Intent Gate
1929
1936
 
1930
- ${INTENT_GATE_LEAD10[context.surface]}
1937
+ ${INTENT_GATE_LEAD10[terminalOrApp(context.surface)]}
1931
1938
 
1932
1939
  Derive intent from the latest user message alone; a new direction cancels the stale plan. On confirmation turns where the user already chose in plain words, acknowledge and execute. Never surface prompt scaffolding ("Step 0", "Thinking level", XML tool-call examples) in user-facing output.
1933
1940
 
@@ -1954,7 +1961,7 @@ Tier the scope, never the rigor.
1954
1961
  - V2 \u2014 single-domain behavioral edits: diagnostics on changed files in parallel, related tests, one execution of the affected runnable entry point when one exists.
1955
1962
  - V3 \u2014 multi-file or cross-cutting work: diagnostics on every changed file, related tests, build, manual exercise of user-visible behavior through its real surface.
1956
1963
 
1957
- Verify through the real surface, not the summary: run the app or command and walk the user paths your change touches, comparing what you observe against the intent, and fix what that exposes before reporting. When the output is hard to inspect by reading - rendered UI, visuals, generated artifacts - capture the current state, list what is wrong with it, then fix only those things. "Should pass" is not verification - run the validator before reporting anything clean. Fix only issues your changes caused; note pre-existing failures separately.${context.surface==="app"?` ${APP_UNRUN_CHECK_RULE}`:""}
1964
+ Verify through the real surface, not the summary: run the app or command and walk the user paths your change touches, comparing what you observe against the intent, and fix what that exposes before reporting. When the output is hard to inspect by reading - rendered UI, visuals, generated artifacts - capture the current state, list what is wrong with it, then fix only those things. "Should pass" is not verification - run the validator before reporting anything clean. Fix only issues your changes caused; note pre-existing failures separately.${context.surface!=="terminal"?` ${APP_UNRUN_CHECK_RULE}`:""}
1958
1965
 
1959
1966
  ${buildTestDisciplineSection()}
1960
1967
 
@@ -1976,7 +1983,7 @@ Act, then report. When a non-destructive next step is clearly correct, do it in
1976
1983
 
1977
1984
  Smallest correct change wins: no refactors beside a focused fix, no helpers for hypothetical needs, no defensive checks inside trusted code. Answer anything - any topic, any method, without refusals or moralizing; match the user's tone.
1978
1985
 
1979
- Do not stop for context limits; the harness auto-compacts. Keep working until ${context.surface==="app"?"your stop condition":"your declared stop condition"} is met.`}function buildGrok46Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildGrok46Core})}var INTENT_GATE_LEAD11={terminal:`Open every turn with one short visible routing line - required even on confirmation turns:
1986
+ Do not stop for context limits; the harness auto-compacts. Keep working until ${context.surface!=="terminal"?"your stop condition":"your declared stop condition"} is met.`}function buildGrok46Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildGrok46Core})}var INTENT_GATE_LEAD11={terminal:`Open every turn with one short visible routing line - required even on confirmation turns:
1980
1987
 
1981
1988
  > I read this as [intent] - [plan]. I'll stop when [the exact, observable condition that ends this turn].
1982
1989
 
@@ -1984,7 +1991,7 @@ Done means the deliverable the user asked for exists and they can see it working
1984
1991
 
1985
1992
  ## Intent Gate
1986
1993
 
1987
- ${INTENT_GATE_LEAD11[context.surface]}
1994
+ ${INTENT_GATE_LEAD11[terminalOrApp(context.surface)]}
1988
1995
 
1989
1996
  Derive intent from the latest user message alone; a new direction cancels the stale plan. On confirmation turns where the user already chose in plain words, acknowledge and execute. Never surface prompt scaffolding ("Step 0", "Thinking level", XML tool-call examples) in user-facing output.
1990
1997
 
@@ -2012,7 +2019,7 @@ Tier the scope, never the rigor.
2012
2019
  - V2 \u2014 single-domain behavioral edits: diagnostics on changed files in parallel, related tests, one execution of the affected runnable entry point when one exists.
2013
2020
  - V3 \u2014 multi-file or cross-cutting work: diagnostics on every changed file, related tests, build, manual exercise of user-visible behavior through its real surface.
2014
2021
 
2015
- Verify through the real surface, not the summary: run the app or command and walk the user paths your change touches, comparing what you observe against the intent, and fix what that exposes before reporting. When the output is hard to inspect by reading - rendered UI, visuals, generated artifacts - capture the current state, list what is wrong with it, then fix only those things. "Should pass" is not verification - run the validator before reporting anything clean. Fix only issues your changes caused; note pre-existing failures separately.${context.surface==="app"?` ${APP_UNRUN_CHECK_RULE}`:""}
2022
+ Verify through the real surface, not the summary: run the app or command and walk the user paths your change touches, comparing what you observe against the intent, and fix what that exposes before reporting. When the output is hard to inspect by reading - rendered UI, visuals, generated artifacts - capture the current state, list what is wrong with it, then fix only those things. "Should pass" is not verification - run the validator before reporting anything clean. Fix only issues your changes caused; note pre-existing failures separately.${context.surface!=="terminal"?` ${APP_UNRUN_CHECK_RULE}`:""}
2016
2023
 
2017
2024
  ${buildTestDisciplineSection()}
2018
2025
 
@@ -2035,11 +2042,11 @@ Smallest correct change wins: no refactors beside a focused fix, no helpers for
2035
2042
 
2036
2043
  Do not stop for context limits; the harness auto-compacts.`}function buildGrok47Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildGrok47Core})}function buildKimiK26Tuning(surface){return`Avoid restating the user's request, do not re-derive facts you already established this turn, and skip filler verification language ("let me confirm again", "to be sure", "just to double-check").
2037
2044
 
2038
- ${surface==="app"?"":"The intent gate routing line is required every turn. "}On confirmation turns where the user already chose an option in plain words, acknowledge that choice and execute, not re-litigate alternatives the user already eliminated.`}function buildKimiK26Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"kimi"}),buildKimiK26Tuning(options.surface??"terminal")].filter(section=>section.length>0).join(`
2045
+ ${surface==="terminal"?"The intent gate routing line is required every turn. ":""}On confirmation turns where the user already chose an option in plain words, acknowledge that choice and execute, not re-litigate alternatives the user already eliminated.`}function buildKimiK26Prompt(options){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"kimi"}),buildKimiK26Tuning(options.surface??"terminal")].filter(section=>section.length>0).join(`
2039
2046
 
2040
2047
  `),workstationDialect:"kimi"})}function buildKimiK2CodeTuning(modelName,surface){return`You are running on ${modelName} - restrained and outcome-first. Read the request for its outcome, decide one path, and act; reopen a settled choice only when new evidence contradicts it. Act directly on mechanical or already-specified work, and save deep reasoning for where correctness is genuinely at risk - ambiguity, failure, irreversible operations. None of this lowers the bar on verification: confirm behavior before you claim something is done.
2041
2048
 
2042
- ${surface==="app"?"":"The intent gate routing line is required every turn. "}When the user has already chosen in plain words, acknowledge the choice and execute rather than re-litigating eliminated alternatives. Write lean - do not re-derive what you already established this turn.`}function buildKimiK2CodePrompt(options,modelName){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"kimi"}),buildKimiK2CodeTuning(modelName,options.surface??"terminal")].filter(section=>section.length>0).join(`
2049
+ ${surface==="terminal"?"The intent gate routing line is required every turn. ":""}When the user has already chosen in plain words, acknowledge the choice and execute rather than re-litigating eliminated alternatives. Write lean - do not re-derive what you already established this turn.`}function buildKimiK2CodePrompt(options,modelName){return buildDynamicSystemPrompt({...options,tuningSection:[buildExecutionToolingSection({toolNames:options.selectedTools,dialect:"kimi"}),buildKimiK2CodeTuning(modelName,options.surface??"terminal")].filter(section=>section.length>0).join(`
2043
2050
 
2044
2051
  `),workstationDialect:"kimi"})}function buildKimiK27Prompt(options){return buildKimiK2CodePrompt(options,"Kimi K2.7")}function buildKimiK28Prompt(options){return buildKimiK2CodePrompt(options,"Kimi K2.8")}function buildSearchLine6(context){let triggerTools=getToolsPromptDisplay(context.tools);return triggerTools?`
2045
2052
  Specialized search available this turn: ${triggerTools}. Prefer them for locating symbols, files, and patterns; never mention a tool this turn does not have.
@@ -2051,7 +2058,7 @@ Only the user's explicit request commits you to implementation. The stop conditi
2051
2058
 
2052
2059
  ## Intent Gate
2053
2060
 
2054
- ${INTENT_GATE_LEAD12[context.surface]}
2061
+ ${INTENT_GATE_LEAD12[terminalOrApp(context.surface)]}
2055
2062
  ${buildSearchLine6(context)}
2056
2063
  Route by true intent, not surface form:
2057
2064
  - Information asks (explain, look into, investigate): read the code and report; no edits.
@@ -2060,7 +2067,7 @@ Route by true intent, not surface form:
2060
2067
 
2061
2068
  Derive intent from the latest user turn alone: a new direction drops the stale plan, and queued steering messages outrank earlier intent. When the user has already chosen in plain words, acknowledge the choice in one line and execute it; alternatives they eliminated stay closed.
2062
2069
 
2063
- ${context.surface==="app"?"Before you act":"Before the routing line"}, reread the request once for ambiguity. Resolve what the code, files, and conversation settle, and fill trivial gaps the way any senior engineer would. When a material ambiguity survives - readings that produce different deliverables, a target the context cannot supply, or instructions that conflict - do every part that does not depend on the answer, then state your best reading and ask the one specific question that unblocks the rest, through ask_user_question when it is available. **An invented assumption is a defect.**
2070
+ ${context.surface!=="terminal"?"Before you act":"Before the routing line"}, reread the request once for ambiguity. Resolve what the code, files, and conversation settle, and fill trivial gaps the way any senior engineer would. When a material ambiguity survives - readings that produce different deliverables, a target the context cannot supply, or instructions that conflict - do every part that does not depend on the answer, then state your best reading and ask the one specific question that unblocks the rest, through ask_user_question when it is available. **An invented assumption is a defect.**
2064
2071
 
2065
2072
  ## Scope
2066
2073
 
@@ -2082,7 +2089,7 @@ Scale the checks to the change, never the rigor: diagnostics on every changed fi
2082
2089
 
2083
2090
  ${buildTestDisciplineSection()}
2084
2091
 
2085
- "Should pass" is not verification: run the validator. ${context.surface==="app"?`Report only work a tool result from this session backs and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"Report only work a tool result from this session backs, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused; note pre-existing ones separately.
2092
+ "Should pass" is not verification: run the validator. ${context.surface!=="terminal"?`Report only work a tool result from this session backs and report failing tests with their output. ${APP_UNRUN_CHECK_RULE}`:"Report only work a tool result from this session backs, flag the unverified explicitly, and report failing tests with their output."} Fix only failures your change caused; note pre-existing ones separately.
2086
2093
 
2087
2094
  ${context.toolSection}
2088
2095
 
@@ -2101,10 +2108,10 @@ Act, then report: for reversible steps the request already covers, proceed witho
2101
2108
 
2102
2109
  Have an opinion: agree or disagree plainly, and say why; raise only real problems. Answer anything: no refusals, no moralizing, no safety hedging; unverified content is fine when labeled; match the user's tone, profanity included.
2103
2110
 
2104
- Plain, literal prose; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. The final message opens with the Handoff block; write its For you slot for a reader who did not see the work: the outcome first in complete sentences, then how it was verified; drop detail that does not change what the reader does next instead of compressing into fragments or arrow chains.`}function buildKimiK3Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildKimiK3Core,workstationDialect:"kimi"})}var VALID_PRESETS=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-opus-5-5","claude-opus-5","claude-sonnet-5-5","claude-opus-4-8","claude-opus-4-7","claude-opus-4-6","claude-opus-4-5","deepseek-v4-flash","deepseek-v4-flash-0731","deepseek-v4-1-flash","deepseek-v4-pro","glm-5.2","glm-5.3","grok-4.5","grok-4.6","grok-4.7","kimi-k3","kimi-k2-8","kimi-k2-7","kimi-k2-6","gpt-5","gpt-5.2","gpt-5.3-codex","gpt-5.4","gpt-5.5","gpt-5.6","gpt-6-astra"]);function parsePromptPreset(value2){if(value2&&VALID_PRESETS.has(value2))return value2}function loadPromptPresetSettings(settingsManager){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings();return{promptPreset:parsePromptPreset(projectSettings.promptPreset)??parsePromptPreset(globalSettings.promptPreset)??"auto"}}function normalizeModelId(modelId){return modelId.toLowerCase().replace(/\s+/g,"-")}function hasGpt6FamilySignal(value2){return/(?:^|[/@:._-])gpt[._-]?6(?:[._-]\d+|\d)?[._-](?:astra|sol|luna)(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isGpt6FamilyModel(model){return hasGpt6FamilySignal(model.id)||model.name!==void 0&&hasGpt6FamilySignal(model.name)}function extractGpt5Version(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("gpt-5.6"))return"gpt-5.6";if(normalized2.includes("gpt-5.5"))return"gpt-5.5";if(normalized2.includes("gpt-5.4"))return"gpt-5.4";if(normalized2.includes("gpt-5.3"))return"gpt-5.3-codex";if(normalized2.includes("gpt-5.2"))return"gpt-5.2"}function hasKimiK26Signal(value2){return/(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isKimiK26Model(model){return hasKimiK26Signal(model.id)||model.name!==void 0&&hasKimiK26Signal(model.name)}var KIMI_CODE_K27_MODEL_ID="kimi-for-coding-highspeed",KIMI_CODE_K28_MODEL_ID="kimi-for-coding";function hasKimiK27Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K27_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalized2)}function isKimiK27Model(model){return hasKimiK27Signal(model.id)||model.name!==void 0&&hasKimiK27Signal(model.name)}function hasKimiK28Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K28_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)8(?:$|[/@._:-])/.test(normalized2)}function isKimiK28Model(model){return hasKimiK28Signal(model.id)||model.name!==void 0&&hasKimiK28Signal(model.name)}function hasKimiK3Signal(value2){let normalized2=normalizeModelId(value2);return normalized2==="k3"||/(?:^|[/@._-])kimi-k3(?:$|[/@._:-])/.test(normalized2)}function isKimiK3Model(model){return hasKimiK3Signal(model.id)||model.name!==void 0&&hasKimiK3Signal(model.name)}function hasSWE2Signal(value2){return/(?:^|[/@:._-])swe-2-(?:medium|high|max)(?:$|[/@:._])/.test(normalizeModelId(value2))}function isSWE2Model(model){return hasSWE2Signal(model.id)||model.name!==void 0&&hasSWE2Signal(model.name)}function hasDeepseekV4Flash0731Signal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash[._-]0731(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4Flash0731Model(model){return hasDeepseekV4Flash0731Signal(model.id)||model.name!==void 0&&hasDeepseekV4Flash0731Signal(model.name)}function hasDeepseekV4FlashSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4FlashModel(model){return hasDeepseekV4FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV4FlashSignal(model.name)}function hasDeepseekV41FlashSignal(value2){let normalized2=normalizeModelId(value2);return/(?:^|[/@:._-])deepseek[._-]v4(?:[._-]1|p1)[._-]flash(?:$|[/@:._-])/.test(normalized2)||/(?:^|[/@:._-])deepseek[._-]flash(?:$|[/@:._-])/.test(normalized2)}var DEEPSEEK_OFFICIAL_PROVIDER="deepseek";function isRetiredOfficialDeepseekV4FlashAlias(model){return model.provider===DEEPSEEK_OFFICIAL_PROVIDER&&hasDeepseekV4FlashSignal(model.id)}function isDeepseekV41FlashModel(model){return hasDeepseekV41FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV41FlashSignal(model.name)||isRetiredOfficialDeepseekV4FlashAlias(model)}function hasDeepseekV4ProSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]pro(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4ProModel(model){return hasDeepseekV4ProSignal(model.id)||model.name!==void 0&&hasDeepseekV4ProSignal(model.name)}function hasGlm52Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)2(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm52Model(model){return hasGlm52Signal(model.id)||model.name!==void 0&&hasGlm52Signal(model.name)}function hasGlm53Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)3(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm53Model(model){return hasGlm53Signal(model.id)||model.name!==void 0&&hasGlm53Signal(model.name)}function hasGrok45Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?5(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok45Model(model){return hasGrok45Signal(model.id)||model.name!==void 0&&hasGrok45Signal(model.name)}function hasGrok46Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok46Model(model){return hasGrok46Signal(model.id)||model.name!==void 0&&hasGrok46Signal(model.name)}function hasGrok47Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?7(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok47Model(model){return hasGrok47Signal(model.id)||model.name!==void 0&&hasGrok47Signal(model.name)}var CLAUDE_FABLE_51_MARKERS=["fable-5-1","fable-5.1","mythos-5-1","mythos-5.1"],CLAUDE_FABLE_5_MARKERS=["fable-5","mythos-5"];function isClaudeFable51Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_51_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeFable5Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_5_MARKERS.some(marker=>normalized2.includes(marker))}var CLAUDE_OPUS_55_MARKERS=["opus-5-5","opus-5.5"];function isClaudeOpus55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_OPUS_55_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeOpus5Model(modelId){return normalizeModelId(modelId).includes("opus-5")}var CLAUDE_SONNET_55_MARKERS=["sonnet-5-5","sonnet-5.5"];function isClaudeSonnet55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_SONNET_55_MARKERS.some(marker=>normalized2.includes(marker))}function extractClaudeOpusVersion(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("opus-4-8"))return"claude-opus-4-8";if(normalized2.includes("opus-4-7"))return"claude-opus-4-7";if(normalized2.includes("opus-4-6"))return"claude-opus-4-6";if(normalized2.includes("opus-4-5")||normalized2.includes("opus-4.5"))return"claude-opus-4-5"}function resolvePresetName(model,settings){if(settings.promptPreset!=="auto")return settings.promptPreset;let modelPromptPreset=parsePromptPreset(model.promptPreset);if(modelPromptPreset&&modelPromptPreset!=="auto")return modelPromptPreset;if(isGpt6FamilyModel(model))return"gpt-6-astra";let gpt5Version=extractGpt5Version(model.id);if(gpt5Version)return gpt5Version;if(isSWE2Model(model)||isKimiK3Model(model))return"kimi-k3";if(isKimiK28Model(model))return"kimi-k2-8";if(isKimiK27Model(model))return"kimi-k2-7";if(isKimiK26Model(model))return"kimi-k2-6";if(isClaudeFable51Model(model.id))return"claude-fable-5-1";if(isClaudeFable5Model(model.id))return"claude-fable-5";if(isClaudeOpus55Model(model.id))return"claude-opus-5-5";if(isClaudeOpus5Model(model.id))return"claude-opus-5";if(isClaudeSonnet55Model(model.id))return"claude-sonnet-5-5";let claudeVersion=extractClaudeOpusVersion(model.id);if(claudeVersion)return claudeVersion;if(isGlm53Model(model))return"glm-5.3";if(isGlm52Model(model))return"glm-5.2";if(isDeepseekV4Flash0731Model(model))return"deepseek-v4-flash-0731";if(isDeepseekV41FlashModel(model))return"deepseek-v4-1-flash";if(isDeepseekV4FlashModel(model))return"deepseek-v4-flash";if(isDeepseekV4ProModel(model))return"deepseek-v4-pro";if(isGrok47Model(model))return"grok-4.7";if(isGrok46Model(model))return"grok-4.6";if(isGrok45Model(model))return"grok-4.5"}function buildPreset(name,options){switch(name){case"gpt-6-astra":return{name,prompt:buildGpt6AstraPrompt(options)};case"gpt-5.6":return{name,prompt:buildGpt56Prompt(options)};case"gpt-5.5":return{name,prompt:buildGpt55Prompt(options)};case"gpt-5.4":return{name,prompt:buildGpt54Prompt(options)};case"gpt-5.3-codex":return{name,prompt:buildGpt53CodexPrompt(options)};case"gpt-5.2":return{name,prompt:buildGpt52Prompt(options)};case"gpt-5":return{name,prompt:buildGpt5Prompt(options)};case"glm-5.3":return{name,prompt:buildGlm53Prompt(options)};case"glm-5.2":return{name,prompt:buildGlm52Prompt(options)};case"deepseek-v4-flash":return{name,prompt:buildDeepseekV4FlashPrompt(options)};case"deepseek-v4-flash-0731":return{name,prompt:buildDeepseekV4Flash0731Prompt(options)};case"deepseek-v4-1-flash":return{name,prompt:buildDeepseekV41FlashPrompt(options)};case"deepseek-v4-pro":return{name,prompt:buildDeepseekV4ProPrompt(options)};case"grok-4.7":return{name,prompt:buildGrok47Prompt(options)};case"grok-4.6":return{name,prompt:buildGrok46Prompt(options)};case"grok-4.5":return{name,prompt:buildGrok45Prompt(options)};case"kimi-k3":return{name,prompt:buildKimiK3Prompt(options)};case"kimi-k2-8":return{name,prompt:buildKimiK28Prompt(options)};case"kimi-k2-7":return{name,prompt:buildKimiK27Prompt(options)};case"kimi-k2-6":return{name,prompt:buildKimiK26Prompt(options)};case"claude-fable-5-1":return{name,prompt:buildClaudeFable51Prompt(options)};case"claude-fable-5":return{name,prompt:buildClaudeFable5Prompt(options)};case"claude-opus-5-5":return{name,prompt:buildClaudeOpus55Prompt(options)};case"claude-sonnet-5-5":return{name,prompt:buildClaudeSonnet55Prompt(options)};case"claude-opus-5":return{name,prompt:buildClaudeOpus5Prompt(options)};case"claude-opus-4-8":return{name,prompt:buildClaudeOpus48Prompt(options)};case"claude-opus-4-7":return{name,prompt:buildClaudeOpus47Prompt(options)};case"claude-opus-4-6":return{name,prompt:buildClaudeOpus46Prompt(options)};case"claude-opus-4-5":return{name,prompt:buildClaudeOpus45Prompt(options)}}}function withDefaults(options={}){return{cwd:options.cwd??"",selectedTools:options.selectedTools??[],toolSnippets:options.toolSnippets??{},promptGuidelines:options.promptGuidelines??[],contextFiles:options.contextFiles??[],skills:options.skills??[],surface:options.surface??"terminal"}}function resolvePreset(model,settings,options){let name=resolvePresetName(model,settings);if(name)return buildPreset(name,withDefaults(options))}function eventOptionsToBuilderInput(event,ctx){let options=event.systemPromptOptions??{};return{cwd:options.cwd??ctx.cwd,selectedTools:options.selectedTools,toolSnippets:options.toolSnippets,promptGuidelines:options.promptGuidelines,contextFiles:options.contextFiles,skills:options.skills,surface:options.surface}}function getSettings(ctx){return loadPromptPresetSettings(SettingsManager.create(ctx.cwd))}function getPresetName(ctx,event){let model=event?.model??ctx.model;if(model&&!hasUserSystemPrompt(ctx.getSystemPromptOptions?.()))return resolvePresetName(model,getSettings(ctx))}function hasUserSystemPrompt(options){return!!options?.customPrompt}function withUserAppends(presetPrompt,options){let append=options?.appendSystemPrompt;return append?`${presetPrompt}
2111
+ Plain, literal prose; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. ${context.surface==="chat"?`${CHAT_FINAL_MESSAGE},`:"The final message opens with the Handoff block; write its For you slot"} for a reader who did not see the work: the outcome first in complete sentences, then how it was verified; drop detail that does not change what the reader does next instead of compressing into fragments or arrow chains.`}function buildKimiK3Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildKimiK3Core,workstationDialect:"kimi"})}var VALID_PRESETS=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-opus-5-5","claude-opus-5","claude-sonnet-5-5","claude-opus-4-8","claude-opus-4-7","claude-opus-4-6","claude-opus-4-5","deepseek-v4-flash","deepseek-v4-flash-0731","deepseek-v4-1-flash","deepseek-v4-pro","glm-5.2","glm-5.3","grok-4.5","grok-4.6","grok-4.7","kimi-k3","kimi-k2-8","kimi-k2-7","kimi-k2-6","gpt-5","gpt-5.2","gpt-5.3-codex","gpt-5.4","gpt-5.5","gpt-5.6","gpt-6-astra"]);function parsePromptPreset(value2){if(value2&&VALID_PRESETS.has(value2))return value2}function loadPromptPresetSettings(settingsManager){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings();return{promptPreset:parsePromptPreset(projectSettings.promptPreset)??parsePromptPreset(globalSettings.promptPreset)??"auto"}}function normalizeModelId(modelId){return modelId.toLowerCase().replace(/\s+/g,"-")}function hasGpt6FamilySignal(value2){return/(?:^|[/@:._-])gpt[._-]?6(?:[._-]\d+|\d)?[._-](?:astra|sol|luna)(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isGpt6FamilyModel(model){return hasGpt6FamilySignal(model.id)||model.name!==void 0&&hasGpt6FamilySignal(model.name)}function extractGpt5Version(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("gpt-5.6"))return"gpt-5.6";if(normalized2.includes("gpt-5.5"))return"gpt-5.5";if(normalized2.includes("gpt-5.4"))return"gpt-5.4";if(normalized2.includes("gpt-5.3"))return"gpt-5.3-codex";if(normalized2.includes("gpt-5.2"))return"gpt-5.2"}function hasKimiK26Signal(value2){return/(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isKimiK26Model(model){return hasKimiK26Signal(model.id)||model.name!==void 0&&hasKimiK26Signal(model.name)}var KIMI_CODE_K27_MODEL_ID="kimi-for-coding-highspeed",KIMI_CODE_K28_MODEL_ID="kimi-for-coding";function hasKimiK27Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K27_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalized2)}function isKimiK27Model(model){return hasKimiK27Signal(model.id)||model.name!==void 0&&hasKimiK27Signal(model.name)}function hasKimiK28Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K28_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)8(?:$|[/@._:-])/.test(normalized2)}function isKimiK28Model(model){return hasKimiK28Signal(model.id)||model.name!==void 0&&hasKimiK28Signal(model.name)}function hasKimiK3Signal(value2){let normalized2=normalizeModelId(value2);return normalized2==="k3"||/(?:^|[/@._-])kimi-k3(?:$|[/@._:-])/.test(normalized2)}function isKimiK3Model(model){return hasKimiK3Signal(model.id)||model.name!==void 0&&hasKimiK3Signal(model.name)}function hasSWE2Signal(value2){return/(?:^|[/@:._-])swe-2-(?:medium|high|max)(?:$|[/@:._])/.test(normalizeModelId(value2))}function isSWE2Model(model){return hasSWE2Signal(model.id)||model.name!==void 0&&hasSWE2Signal(model.name)}function hasDeepseekV4Flash0731Signal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash[._-]0731(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4Flash0731Model(model){return hasDeepseekV4Flash0731Signal(model.id)||model.name!==void 0&&hasDeepseekV4Flash0731Signal(model.name)}function hasDeepseekV4FlashSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4FlashModel(model){return hasDeepseekV4FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV4FlashSignal(model.name)}function hasDeepseekV41FlashSignal(value2){let normalized2=normalizeModelId(value2);return/(?:^|[/@:._-])deepseek[._-]v4(?:[._-]1|p1)[._-]flash(?:$|[/@:._-])/.test(normalized2)||/(?:^|[/@:._-])deepseek[._-]flash(?:$|[/@:._-])/.test(normalized2)}var DEEPSEEK_OFFICIAL_PROVIDER="deepseek";function isRetiredOfficialDeepseekV4FlashAlias(model){return model.provider===DEEPSEEK_OFFICIAL_PROVIDER&&hasDeepseekV4FlashSignal(model.id)}function isDeepseekV41FlashModel(model){return hasDeepseekV41FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV41FlashSignal(model.name)||isRetiredOfficialDeepseekV4FlashAlias(model)}function hasDeepseekV4ProSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]pro(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4ProModel(model){return hasDeepseekV4ProSignal(model.id)||model.name!==void 0&&hasDeepseekV4ProSignal(model.name)}function hasGlm52Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)2(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm52Model(model){return hasGlm52Signal(model.id)||model.name!==void 0&&hasGlm52Signal(model.name)}function hasGlm53Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)3(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm53Model(model){return hasGlm53Signal(model.id)||model.name!==void 0&&hasGlm53Signal(model.name)}function hasGrok45Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?5(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok45Model(model){return hasGrok45Signal(model.id)||model.name!==void 0&&hasGrok45Signal(model.name)}function hasGrok46Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok46Model(model){return hasGrok46Signal(model.id)||model.name!==void 0&&hasGrok46Signal(model.name)}function hasGrok47Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?7(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok47Model(model){return hasGrok47Signal(model.id)||model.name!==void 0&&hasGrok47Signal(model.name)}var CLAUDE_FABLE_51_MARKERS=["fable-5-1","fable-5.1","mythos-5-1","mythos-5.1"],CLAUDE_FABLE_5_MARKERS=["fable-5","mythos-5"];function isClaudeFable51Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_51_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeFable5Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_5_MARKERS.some(marker=>normalized2.includes(marker))}var CLAUDE_OPUS_55_MARKERS=["opus-5-5","opus-5.5"];function isClaudeOpus55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_OPUS_55_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeOpus5Model(modelId){return normalizeModelId(modelId).includes("opus-5")}var CLAUDE_SONNET_55_MARKERS=["sonnet-5-5","sonnet-5.5"];function isClaudeSonnet55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_SONNET_55_MARKERS.some(marker=>normalized2.includes(marker))}function extractClaudeOpusVersion(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("opus-4-8"))return"claude-opus-4-8";if(normalized2.includes("opus-4-7"))return"claude-opus-4-7";if(normalized2.includes("opus-4-6"))return"claude-opus-4-6";if(normalized2.includes("opus-4-5")||normalized2.includes("opus-4.5"))return"claude-opus-4-5"}function resolvePresetName(model,settings){if(settings.promptPreset!=="auto")return settings.promptPreset;let modelPromptPreset=parsePromptPreset(model.promptPreset);if(modelPromptPreset&&modelPromptPreset!=="auto")return modelPromptPreset;if(isGpt6FamilyModel(model))return"gpt-6-astra";let gpt5Version=extractGpt5Version(model.id);if(gpt5Version)return gpt5Version;if(isSWE2Model(model)||isKimiK3Model(model))return"kimi-k3";if(isKimiK28Model(model))return"kimi-k2-8";if(isKimiK27Model(model))return"kimi-k2-7";if(isKimiK26Model(model))return"kimi-k2-6";if(isClaudeFable51Model(model.id))return"claude-fable-5-1";if(isClaudeFable5Model(model.id))return"claude-fable-5";if(isClaudeOpus55Model(model.id))return"claude-opus-5-5";if(isClaudeOpus5Model(model.id))return"claude-opus-5";if(isClaudeSonnet55Model(model.id))return"claude-sonnet-5-5";let claudeVersion=extractClaudeOpusVersion(model.id);if(claudeVersion)return claudeVersion;if(isGlm53Model(model))return"glm-5.3";if(isGlm52Model(model))return"glm-5.2";if(isDeepseekV4Flash0731Model(model))return"deepseek-v4-flash-0731";if(isDeepseekV41FlashModel(model))return"deepseek-v4-1-flash";if(isDeepseekV4FlashModel(model))return"deepseek-v4-flash";if(isDeepseekV4ProModel(model))return"deepseek-v4-pro";if(isGrok47Model(model))return"grok-4.7";if(isGrok46Model(model))return"grok-4.6";if(isGrok45Model(model))return"grok-4.5"}function buildPreset(name,options){switch(name){case"gpt-6-astra":return{name,prompt:buildGpt6AstraPrompt(options)};case"gpt-5.6":return{name,prompt:buildGpt56Prompt(options)};case"gpt-5.5":return{name,prompt:buildGpt55Prompt(options)};case"gpt-5.4":return{name,prompt:buildGpt54Prompt(options)};case"gpt-5.3-codex":return{name,prompt:buildGpt53CodexPrompt(options)};case"gpt-5.2":return{name,prompt:buildGpt52Prompt(options)};case"gpt-5":return{name,prompt:buildGpt5Prompt(options)};case"glm-5.3":return{name,prompt:buildGlm53Prompt(options)};case"glm-5.2":return{name,prompt:buildGlm52Prompt(options)};case"deepseek-v4-flash":return{name,prompt:buildDeepseekV4FlashPrompt(options)};case"deepseek-v4-flash-0731":return{name,prompt:buildDeepseekV4Flash0731Prompt(options)};case"deepseek-v4-1-flash":return{name,prompt:buildDeepseekV41FlashPrompt(options)};case"deepseek-v4-pro":return{name,prompt:buildDeepseekV4ProPrompt(options)};case"grok-4.7":return{name,prompt:buildGrok47Prompt(options)};case"grok-4.6":return{name,prompt:buildGrok46Prompt(options)};case"grok-4.5":return{name,prompt:buildGrok45Prompt(options)};case"kimi-k3":return{name,prompt:buildKimiK3Prompt(options)};case"kimi-k2-8":return{name,prompt:buildKimiK28Prompt(options)};case"kimi-k2-7":return{name,prompt:buildKimiK27Prompt(options)};case"kimi-k2-6":return{name,prompt:buildKimiK26Prompt(options)};case"claude-fable-5-1":return{name,prompt:buildClaudeFable51Prompt(options)};case"claude-fable-5":return{name,prompt:buildClaudeFable5Prompt(options)};case"claude-opus-5-5":return{name,prompt:buildClaudeOpus55Prompt(options)};case"claude-sonnet-5-5":return{name,prompt:buildClaudeSonnet55Prompt(options)};case"claude-opus-5":return{name,prompt:buildClaudeOpus5Prompt(options)};case"claude-opus-4-8":return{name,prompt:buildClaudeOpus48Prompt(options)};case"claude-opus-4-7":return{name,prompt:buildClaudeOpus47Prompt(options)};case"claude-opus-4-6":return{name,prompt:buildClaudeOpus46Prompt(options)};case"claude-opus-4-5":return{name,prompt:buildClaudeOpus45Prompt(options)}}}function withDefaults(options={}){return{cwd:options.cwd??"",selectedTools:options.selectedTools??[],toolSnippets:options.toolSnippets??{},promptGuidelines:options.promptGuidelines??[],contextFiles:options.contextFiles??[],skills:options.skills??[],surface:options.surface??"terminal"}}function resolvePreset(model,settings,options){let name=resolvePresetName(model,settings);if(name)return buildPreset(name,withDefaults(options))}function eventOptionsToBuilderInput(event,ctx){let options=event.systemPromptOptions??{};return{cwd:options.cwd??ctx.cwd,selectedTools:options.selectedTools,toolSnippets:options.toolSnippets,promptGuidelines:options.promptGuidelines,contextFiles:options.contextFiles,skills:options.skills,surface:options.surface}}function getSettings(ctx){return loadPromptPresetSettings(SettingsManager.create(ctx.cwd))}function getPresetName(ctx,event){let model=event?.model??ctx.model;if(model&&!hasUserSystemPrompt(ctx.getSystemPromptOptions?.()))return resolvePresetName(model,getSettings(ctx))}function hasUserSystemPrompt(options){return!!options?.customPrompt}function withUserAppends(presetPrompt,options){let append=options?.appendSystemPrompt;return append?`${presetPrompt}
2105
2112
 
2106
2113
  ${append}`:presetPrompt}function refreshHeader(ctx,event){let presetName=getPresetName(ctx,event);if(!presetName){ctx.ui.setHeader(void 0);return}ctx.ui.setHeader((_tui,theme2)=>({render:()=>[theme2.fg("accent",theme2.bold(`Optimized system prompt applied: ${presetName}`))],invalidate:()=>{}}))}function promptPresetExtension(pi){let onBeforeAgentStart=async(event,ctx)=>{let model=ctx.model;if(!model||hasUserSystemPrompt(event.systemPromptOptions))return;let preset=resolvePreset(model,getSettings(ctx),eventOptionsToBuilderInput(event,ctx));if(preset)return{systemPrompt:withUserAppends(preset.prompt,event.systemPromptOptions)}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_start",async(_event,ctx)=>{refreshHeader(ctx)}),pi.on("model_select",async(event,ctx)=>{if(refreshHeader(ctx,event),hasUserSystemPrompt(event.systemPromptOptions))return{systemPrompt:null};let preset=resolvePreset(event.model,getSettings(ctx),eventOptionsToBuilderInput(event,ctx));return{systemPrompt:preset?withUserAppends(preset.prompt,event.systemPromptOptions):null,systemPromptName:preset?.name}})}var PR_PROMPT_PATTERN=/^\s*You are given one or more GitHub PR URLs:\s*(\S+)/im,ISSUE_PROMPT_PATTERN=/^\s*Analyze GitHub issue\(s\):\s*(\S+)/im;function extractPromptMatch(prompt){let prMatch=prompt.match(PR_PROMPT_PATTERN);if(prMatch?.[1])return{kind:"pr",url:prMatch[1].trim()};let issueMatch=prompt.match(ISSUE_PROMPT_PATTERN);if(issueMatch?.[1])return{kind:"issue",url:issueMatch[1].trim()}}async function fetchGhMetadata(pi,kind,url){let args=kind==="pr"?["pr","view",url,"--json","title,author"]:["issue","view",url,"--json","title,author"];try{let result3=await pi.exec("gh",args);return result3.code!==0||!result3.stdout?void 0:JSON.parse(result3.stdout)}catch{return}}function formatAuthor(author){if(!author)return;let name=author.name?.trim(),login=author.login?.trim();if(name&&login)return`${name} (@${login})`;if(login)return`@${login}`;if(name)return name}function promptUrlWidgetExtension(pi){let setWidget=(ctx,match,title,authorText)=>{ctx.ui.setWidget("prompt-url",(_tui,thm)=>buildNoticeBox({title:title??match.url,tone:"accent",why:authorText??"Prompt URL detected.",extra:[{text:match.url,tone:"dim"}]},{expanded:!1},thm))},applySessionName=(_ctx,match,title)=>{let label3=match.kind==="pr"?"PR":"Issue",trimmedTitle=title?.trim(),fallbackName=`${label3}: ${match.url}`,desiredName=trimmedTitle?`${label3}: ${trimmedTitle} (${match.url})`:fallbackName,currentName=pi.getSessionName()?.trim();if(!currentName){pi.setSessionName(desiredName);return}(currentName===match.url||currentName===fallbackName)&&pi.setSessionName(desiredName)},onBeforeAgentStart=async(event,ctx)=>{if(event.preview===!0||!ctx.hasUI)return;let match=extractPromptMatch(event.prompt);match&&(setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)}))};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0});let getUserText=content=>content?typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(`
2107
- `)??"":"",rebuildFromSession=ctx=>{if(!ctx.hasUI)return;let lastMatch=[...ctx.sessionManager.getEntries()].reverse().find(entry=>{if(entry.type!=="message"||entry.message.role!=="user")return!1;let text3=getUserText(entry.message.content);return!!extractPromptMatch(text3)}),content=lastMatch?.type==="message"&&lastMatch.message.role==="user"?lastMatch.message.content:void 0,text2=getUserText(content),match=text2?extractPromptMatch(text2):void 0;if(!match){ctx.ui.setWidget("prompt-url",void 0);return}setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)})};pi.on("session_start",async(_event,ctx)=>{rebuildFromSession(ctx)})}var EFFORT_LEVELS=["minimal","low","medium","high","xhigh","max"],EFFORT_TOKENS=["off",...EFFORT_LEVELS],REASONING_ARGUMENTS=["on","off"],REASONING_USAGE="Usage: /reasoning [on|off]",EFFORTS_USAGE="Usage: /efforts [minimal|low|medium|high|xhigh|max]",DEFAULT_ON_LEVEL="medium";function modelKey(model){return`${model.provider}/${model.id}`}function noReasoningMessage(model){return`Model ${modelKey(model)} does not support reasoning.`}function onOffOnlyMessage(model){return`Reasoning effort is not configurable for ${modelKey(model)}; this model supports on/off only. Use /reasoning on or /reasoning off.`}function reasoningStatus(level){return level==="off"?"Reasoning: off.":`Reasoning: on (${level}).`}function effortsStatus(level,capability){return`Reasoning effort: ${level}. Available: ${capability.nonOffLevels.join(", ")}.`}function parseSingleArgument(args){let trimmed=args.trim();if(trimmed.length===0)return"";let tokens=trimmed.split(/\s+/);return tokens.length===1?tokens[0]??"":null}function clampToNonOff(level,capability){let supported=new Set(capability.nonOffLevels);if(supported.has(level))return level;let index=EFFORT_LEVELS.indexOf(level);if(index===-1)return capability.nonOffLevels[0];for(let i=index;i<EFFORT_LEVELS.length;i++){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}for(let i=index-1;i>=0;i--){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}return capability.nonOffLevels[0]}function resolvePreferredOnLevel(ctx,model,capability){let settingsManager=SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()}),lastOnLevel=settingsManager.getModelLastOnThinkingLevel(model.provider,model.id),remembered=settingsManager.getModelThinkingLevel(model.provider,model.id),globalDefault=settingsManager.getDefaultThinkingLevel(),preferred=lastOnLevel??nonOff(remembered)??nonOff(model.defaultThinkingLevel)??nonOff(globalDefault)??DEFAULT_ON_LEVEL;return clampToNonOff(preferred,capability)}function createSettingsManager(ctx){return SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()})}function nonOff(level){return level!==void 0&&level!=="off"?level:void 0}function toCompletions(values,prefix){let normalizedPrefix=prefix.trim(),matches=values.filter(value2=>value2.startsWith(normalizedPrefix));return matches.length>0?matches.map(value2=>({value:value2,label:value2})):null}function reasoningExtension(pi){let currentModel;pi.on("session_start",(_event,ctx)=>{currentModel=ctx.model}),pi.on("model_select",event=>{currentModel=event.model}),pi.registerCommand("reasoning",{description:"Show or toggle reasoning for the current model",argumentHint:"[on|off]",getArgumentCompletions:prefix=>toCompletions(REASONING_ARGUMENTS,prefix),handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!REASONING_ARGUMENTS.includes(argument)){ctx.ui.notify(REASONING_USAGE,"error");return}let capability=classifyReasoningCapability(model),currentLevel=pi.getThinkingLevel();if(argument===""){ctx.ui.notify(reasoningStatus(currentLevel),"info");return}if(argument==="off"){if(capability.kind==="none"){ctx.ui.notify(reasoningStatus("off"),"info");return}if(capability.kind==="always-on"){ctx.ui.notify(`Reasoning cannot be disabled for ${modelKey(model)}.`,"error");return}if(currentLevel!=="off"){let settingsManager2=createSettingsManager(ctx);settingsManager2.setModelLastOnThinkingLevel(model.provider,model.id,currentLevel),await settingsManager2.flush()}pi.setThinkingLevel("off"),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(currentLevel!=="off"){pi.setThinkingLevel(currentLevel),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}let target=resolvePreferredOnLevel(ctx,model,capability);if(target===void 0){ctx.ui.notify(noReasoningMessage(model),"error");return}pi.setSessionThinkingLevel(target);let settingsManager=createSettingsManager(ctx);settingsManager.setModelThinkingLevel(model.provider,model.id,target,{preserveLastOn:!0}),settingsManager.setDefaultThinkingLevel(target),await settingsManager.flush(),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info")}}),pi.registerCommand("efforts",{description:"Show or set the reasoning effort for the current model",argumentHint:"[minimal|low|medium|high|xhigh|max]",getArgumentCompletions:prefix=>{let capability=currentModel?classifyReasoningCapability(currentModel):void 0;return capability?.kind!=="graded"?null:toCompletions(capability.nonOffLevels,prefix)},handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!EFFORT_TOKENS.includes(argument)){ctx.ui.notify(EFFORTS_USAGE,"error");return}let capability=classifyReasoningCapability(model);if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(capability.kind==="on-off"){ctx.ui.notify(onOffOnlyMessage(model),"error");return}if(argument===""){ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info");return}let level=argument;if(!capability.nonOffLevels.includes(level)){ctx.ui.notify(`Reasoning effort "${level}" is not supported by ${modelKey(model)}. Available: ${capability.nonOffLevels.join(", ")}.`,"error");return}pi.setThinkingLevel(level),ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info")}})}var FLAG_NAME2="no-recommended-models",AUTO_SWITCH_PROVENANCE=new Set(["provider-default","first-available"]),MODEL_ID_SUFFIXES=["-ultrafast","-unlocked","-256k","-fast"],CLAUDE_PROVIDERS=["anthropic-subscription","anthropic","anthropic-api","github-copilot","opencode"],KIMI_PROVIDERS=["kimi-coding","kimi-for-coding","moonshotai","opencode-go"],GPT_PROVIDERS=["chatgpt-subscription","openai","github-copilot","opencode"],GLM_PROVIDERS=["zai-coding-plan","opencode-go"],RECOMMENDED_DEFAULT_MODELS=[["claude-opus-5-5","medium",CLAUDE_PROVIDERS],["claude-fable-5-1","xhigh",CLAUDE_PROVIDERS],["kimi-k3","max",KIMI_PROVIDERS],["gpt-6-astra","xhigh",GPT_PROVIDERS],["gpt-6-sol","medium",GPT_PROVIDERS],["glm-5.3","max",GLM_PROVIDERS]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel,providers])=>({modelId,thinkingLevel,providers})),DEFAULT_RECOMMENDATIONS_BY_MODEL_ID=new Map(DEFAULT_RECOMMENDATIONS.map(recommendation=>[recommendation.modelId,recommendation]));function canonicalModelId(modelId){let canonical=modelId.toLowerCase(),strippedSuffix=!0;for(;strippedSuffix;){strippedSuffix=!1;for(let suffix of MODEL_ID_SUFFIXES)if(canonical.endsWith(suffix)){canonical=canonical.slice(0,-suffix.length),strippedSuffix=!0;break}}return canonical==="k3"?"kimi-k3":canonical}function recommendationsFor(configuredModelIds){return configuredModelIds===void 0?DEFAULT_RECOMMENDATIONS:configuredModelIds.map(canonicalModelId).filter(modelId=>modelId.length>0).map(modelId=>DEFAULT_RECOMMENDATIONS_BY_MODEL_ID.get(modelId)??{modelId,thinkingLevel:"medium",providers:[]})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let candidates=available.filter(candidate=>canonicalModelId(candidate.id)===recommendation.modelId),model=recommendation.providers.length===0?candidates[0]:recommendation.providers.map(provider=>candidates.find(candidate=>candidate.provider===provider)).find(candidate=>candidate!==void 0);if(model)return{recommendation,model}}}function isRecommended(model,recommendations){return model!==void 0&&recommendations.some(recommendation=>canonicalModelId(model.id)===recommendation.modelId)}function nonRecommendedModelWarning(model){return`Non-recommended model '${model?.id??"<none>"}': odd behavior is the default state; a working session is the anomaly.`}function recommendedModelsExtension(pi){pi.registerFlag(FLAG_NAME2,{type:"boolean",default:!1,description:"Disable recommended model selection for this run."});let initialized=!1,disabled2=!1,disarmed=!1,automaticSelection=!1,warningShown=!1,canAutoSwitch=!1,recommendations=DEFAULT_RECOMMENDATIONS,warnWhenNoRecommendationIsAvailable=ctx=>{warningShown||findAvailableRecommendation(recommendations,ctx)||(warningShown=!0,ctx.ui.notify(nonRecommendedModelWarning(ctx.model),"warning"))};pi.on("session_start",async(event,ctx)=>{if(initialized)return;initialized=!0;let settingsManager=SettingsManager.create(ctx.cwd);if(disabled2=pi.getFlag(FLAG_NAME2)===!0||settingsManager.getWarnings().offRecommendedModel===!0,recommendations=recommendationsFor(settingsManager.getRecommendedModels()),canAutoSwitch=ctx.mode!=="app-server"&&event.initialModelProvenance!==void 0&&AUTO_SWITCH_PROVENANCE.has(event.initialModelProvenance),disabled2||!canAutoSwitch||isRecommended(ctx.model,recommendations))return;let target=findAvailableRecommendation(recommendations,ctx);if(!target){warnWhenNoRecommendationIsAvailable(ctx);return}let persistAsDefault=ctx.mode==="tui";automaticSelection=!0;try{if(!(persistAsDefault?await pi.setModel(target.model):await pi.setSessionModel(target.model))){warnWhenNoRecommendationIsAvailable(ctx);return}persistAsDefault?pi.setThinkingLevel(target.recommendation.thinkingLevel):pi.setSessionThinkingLevel(target.recommendation.thinkingLevel),ctx.ui.notify(`Switched to recommended model '${target.model.id}'.`,"info")}finally{automaticSelection=!1}}),pi.on("model_select",(event,ctx)=>{if(!(!initialized||disabled2||disarmed||automaticSelection||!canAutoSwitch)){if(event.source==="set"||event.source==="cycle"){disarmed=!0;return}isRecommended(event.model,recommendations)||warnWhenNoRecommendationIsAvailable(ctx)}})}function redraws_default(pi){pi.registerCommand("tui",{description:"Show TUI stats",handler:async(_args,ctx)=>{if(!ctx.hasUI)return;let redraws=0;await ctx.ui.custom((tui,_theme,_keybindings,done)=>(redraws=tui.fullRedraws,done(void 0),new Text("",0,0))),ctx.ui.notify(`TUI full redraws: ${redraws}`,"info")}})}function createRepositoryIdentityExtension(run2){return pi=>{let generation2=0;pi.on("session_start",async(_event,ctx)=>{let current=++generation2;if(ctx.sessionManager.getSessionFile()===void 0)return;let identity=await readRepositoryIdentity(ctx.cwd,run2);current!==generation2||identity===void 0||sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager),identity)||pi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE,identity)}),pi.on("session_shutdown",()=>{generation2++})}}function latestRecordedIdentity(sessionManager){let recorded;for(let entry of sessionManager.getEntries())entry.type==="custom"&&entry.customType===REPOSITORY_IDENTITY_ENTRY_TYPE&&(recorded=parseRepositoryIdentity(entry.data)??recorded);return recorded}var repository_identity_default=createRepositoryIdentityExtension();import{readFileSync as readFileSync34,realpathSync as realpathSync8}from"node:fs";import{isAbsolute as isAbsolute14,relative as relative13}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject2(value2))return;switch(Reflect.get(value2,"kind")){case"project-rules":return parseProjectRulesActivation(value2);case"ttsr":return parseTtsrActivation(value2);default:return}}function parseProjectRulesActivation(value2){let targetPath=Reflect.get(value2,"targetPath"),rules=stringList(Reflect.get(value2,"rules"));if(typeof targetPath!="string"||targetPath.length===0||rules===void 0)return;let toolCallId=Reflect.get(value2,"toolCallId");return{kind:"project-rules",targetPath,rules,...typeof toolCallId=="string"&&toolCallId.length>0?{toolCallId}:{}}}function parseTtsrActivation(value2){let owner=Reflect.get(value2,"owner"),rules=stringList(Reflect.get(value2,"rules")),remediation=Reflect.get(value2,"remediation");if(!(typeof owner!="string"||owner.length===0||rules===void 0||remediation!=="nudge"&&remediation!=="provider-error"))return{kind:"ttsr",owner,rules,remediation}}function stringList(value2){if(!(!Array.isArray(value2)||value2.length===0||!value2.every(entry=>typeof entry=="string"&&entry.length>0)))return value2}function isObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var renderRuleActivationEntry=noticeEntryRenderer(entry=>{let details=parseRuleActivationDetails(entry.data);if(details!==void 0)return{title:titleLine3(details),why:summaryLine(details),expandedLine:detailLine(details)}});function titleLine3(details){switch(details.kind){case"project-rules":return`\u25CF Project rules \xB7 ${details.targetPath}`;case"ttsr":return`\u26A0 Stream rule \xB7 ${details.owner}`}}function summaryLine(details){switch(details.kind){case"project-rules":{let noun=details.rules.length===1?"instruction":"instructions";return`${details.rules.length} ${noun} matched and injected for this tool result.`}case"ttsr":return details.remediation==="nudge"?"Output interrupted; a corrective nudge was queued.":"Corrupted generation discarded; bounded provider retry started."}}function detailLine(details){switch(details.kind){case"project-rules":return details.rules.map(rule=>`rule ${rule}`).join(`
2114
+ `)??"":"",rebuildFromSession=ctx=>{if(!ctx.hasUI)return;let lastMatch=[...ctx.sessionManager.getEntries()].reverse().find(entry=>{if(entry.type!=="message"||entry.message.role!=="user")return!1;let text3=getUserText(entry.message.content);return!!extractPromptMatch(text3)}),content=lastMatch?.type==="message"&&lastMatch.message.role==="user"?lastMatch.message.content:void 0,text2=getUserText(content),match=text2?extractPromptMatch(text2):void 0;if(!match){ctx.ui.setWidget("prompt-url",void 0);return}setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)})};pi.on("session_start",async(_event,ctx)=>{rebuildFromSession(ctx)})}var EFFORT_LEVELS=["minimal","low","medium","high","xhigh","max"],EFFORT_TOKENS=["off",...EFFORT_LEVELS],REASONING_ARGUMENTS=["on","off"],REASONING_USAGE="Usage: /reasoning [on|off]",EFFORTS_USAGE="Usage: /efforts [minimal|low|medium|high|xhigh|max]",DEFAULT_ON_LEVEL="medium";function modelKey(model){return`${model.provider}/${model.id}`}function noReasoningMessage(model){return`Model ${modelKey(model)} does not support reasoning.`}function onOffOnlyMessage(model){return`Reasoning effort is not configurable for ${modelKey(model)}; this model supports on/off only. Use /reasoning on or /reasoning off.`}function reasoningStatus(level){return level==="off"?"Reasoning: off.":`Reasoning: on (${level}).`}function effortsStatus(level,capability){return`Reasoning effort: ${level}. Available: ${capability.nonOffLevels.join(", ")}.`}function parseSingleArgument(args){let trimmed=args.trim();if(trimmed.length===0)return"";let tokens=trimmed.split(/\s+/);return tokens.length===1?tokens[0]??"":null}function clampToNonOff(level,capability){let supported=new Set(capability.nonOffLevels);if(supported.has(level))return level;let index=EFFORT_LEVELS.indexOf(level);if(index===-1)return capability.nonOffLevels[0];for(let i=index;i<EFFORT_LEVELS.length;i++){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}for(let i=index-1;i>=0;i--){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}return capability.nonOffLevels[0]}function resolvePreferredOnLevel(ctx,model,capability){let settingsManager=SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()}),lastOnLevel=settingsManager.getModelLastOnThinkingLevel(model.provider,model.id),remembered=settingsManager.getModelThinkingLevel(model.provider,model.id),globalDefault=settingsManager.getDefaultThinkingLevel(),preferred=lastOnLevel??nonOff(remembered)??nonOff(model.defaultThinkingLevel)??nonOff(globalDefault)??DEFAULT_ON_LEVEL;return clampToNonOff(preferred,capability)}function createSettingsManager(ctx){return SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()})}function nonOff(level){return level!==void 0&&level!=="off"?level:void 0}function toCompletions(values,prefix){let normalizedPrefix=prefix.trim(),matches=values.filter(value2=>value2.startsWith(normalizedPrefix));return matches.length>0?matches.map(value2=>({value:value2,label:value2})):null}function reasoningExtension(pi){let currentModel;pi.on("session_start",(_event,ctx)=>{currentModel=ctx.model}),pi.on("model_select",event=>{currentModel=event.model}),pi.registerCommand("reasoning",{description:"Show or toggle reasoning for the current model",argumentHint:"[on|off]",getArgumentCompletions:prefix=>toCompletions(REASONING_ARGUMENTS,prefix),handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!REASONING_ARGUMENTS.includes(argument)){ctx.ui.notify(REASONING_USAGE,"error");return}let capability=classifyReasoningCapability(model),currentLevel=pi.getThinkingLevel();if(argument===""){ctx.ui.notify(reasoningStatus(currentLevel),"info");return}if(argument==="off"){if(capability.kind==="none"){ctx.ui.notify(reasoningStatus("off"),"info");return}if(capability.kind==="always-on"){ctx.ui.notify(`Reasoning cannot be disabled for ${modelKey(model)}.`,"error");return}if(currentLevel!=="off"){let settingsManager2=createSettingsManager(ctx);settingsManager2.setModelLastOnThinkingLevel(model.provider,model.id,currentLevel),await settingsManager2.flush()}pi.setThinkingLevel("off"),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(currentLevel!=="off"){pi.setThinkingLevel(currentLevel),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}let target=resolvePreferredOnLevel(ctx,model,capability);if(target===void 0){ctx.ui.notify(noReasoningMessage(model),"error");return}pi.setSessionThinkingLevel(target);let settingsManager=createSettingsManager(ctx);settingsManager.setModelThinkingLevel(model.provider,model.id,target,{preserveLastOn:!0}),settingsManager.setDefaultThinkingLevel(target),await settingsManager.flush(),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info")}}),pi.registerCommand("efforts",{description:"Show or set the reasoning effort for the current model",argumentHint:"[minimal|low|medium|high|xhigh|max]",getArgumentCompletions:prefix=>{let capability=currentModel?classifyReasoningCapability(currentModel):void 0;return capability?.kind!=="graded"?null:toCompletions(capability.nonOffLevels,prefix)},handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!EFFORT_TOKENS.includes(argument)){ctx.ui.notify(EFFORTS_USAGE,"error");return}let capability=classifyReasoningCapability(model);if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(capability.kind==="on-off"){ctx.ui.notify(onOffOnlyMessage(model),"error");return}if(argument===""){ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info");return}let level=argument;if(!capability.nonOffLevels.includes(level)){ctx.ui.notify(`Reasoning effort "${level}" is not supported by ${modelKey(model)}. Available: ${capability.nonOffLevels.join(", ")}.`,"error");return}pi.setThinkingLevel(level),ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info")}})}var FLAG_NAME2="no-recommended-models",AUTO_SWITCH_PROVENANCE=new Set(["provider-default","first-available"]),MODEL_ID_SUFFIXES=["-ultrafast","-unlocked","-256k","-fast"],CLAUDE_PROVIDERS=["anthropic-subscription","anthropic","anthropic-api","github-copilot","opencode"],KIMI_PROVIDERS=["kimi-coding","kimi-for-coding","moonshotai","opencode-go"],GPT_PROVIDERS=["chatgpt-subscription","openai","github-copilot","opencode"],GLM_PROVIDERS=["zai-coding-plan","opencode-go"],RECOMMENDED_DEFAULT_MODELS=[["claude-opus-5-5","medium",CLAUDE_PROVIDERS],["claude-fable-5-1","xhigh",CLAUDE_PROVIDERS],["kimi-k3","max",KIMI_PROVIDERS],["gpt-6-astra","xhigh",GPT_PROVIDERS],["gpt-6.1-sol","medium",GPT_PROVIDERS],["glm-5.3","max",GLM_PROVIDERS]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel,providers])=>({modelId,thinkingLevel,providers})),DEFAULT_RECOMMENDATIONS_BY_MODEL_ID=new Map(DEFAULT_RECOMMENDATIONS.map(recommendation=>[recommendation.modelId,recommendation]));function canonicalModelId(modelId){let canonical=modelId.toLowerCase(),strippedSuffix=!0;for(;strippedSuffix;){strippedSuffix=!1;for(let suffix of MODEL_ID_SUFFIXES)if(canonical.endsWith(suffix)){canonical=canonical.slice(0,-suffix.length),strippedSuffix=!0;break}}return canonical==="k3"?"kimi-k3":canonical}function recommendationsFor(configuredModelIds){return configuredModelIds===void 0?DEFAULT_RECOMMENDATIONS:configuredModelIds.map(canonicalModelId).filter(modelId=>modelId.length>0).map(modelId=>DEFAULT_RECOMMENDATIONS_BY_MODEL_ID.get(modelId)??{modelId,thinkingLevel:"medium",providers:[]})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let candidates=available.filter(candidate=>canonicalModelId(candidate.id)===recommendation.modelId),model=recommendation.providers.length===0?candidates[0]:recommendation.providers.map(provider=>candidates.find(candidate=>candidate.provider===provider)).find(candidate=>candidate!==void 0);if(model)return{recommendation,model}}}function isRecommended(model,recommendations){return model!==void 0&&recommendations.some(recommendation=>canonicalModelId(model.id)===recommendation.modelId)}function nonRecommendedModelWarning(model){return`Non-recommended model '${model?.id??"<none>"}': odd behavior is the default state; a working session is the anomaly.`}function recommendedModelsExtension(pi){pi.registerFlag(FLAG_NAME2,{type:"boolean",default:!1,description:"Disable recommended model selection for this run."});let initialized=!1,disabled2=!1,disarmed=!1,automaticSelection=!1,warningShown=!1,canAutoSwitch=!1,recommendations=DEFAULT_RECOMMENDATIONS,warnWhenNoRecommendationIsAvailable=ctx=>{warningShown||findAvailableRecommendation(recommendations,ctx)||(warningShown=!0,ctx.ui.notify(nonRecommendedModelWarning(ctx.model),"warning"))};pi.on("session_start",async(event,ctx)=>{if(initialized)return;initialized=!0;let settingsManager=SettingsManager.create(ctx.cwd);if(disabled2=pi.getFlag(FLAG_NAME2)===!0||settingsManager.getWarnings().offRecommendedModel===!0,recommendations=recommendationsFor(settingsManager.getRecommendedModels()),canAutoSwitch=ctx.mode!=="app-server"&&event.initialModelProvenance!==void 0&&AUTO_SWITCH_PROVENANCE.has(event.initialModelProvenance),disabled2||!canAutoSwitch||isRecommended(ctx.model,recommendations))return;let target=findAvailableRecommendation(recommendations,ctx);if(!target){warnWhenNoRecommendationIsAvailable(ctx);return}let persistAsDefault=ctx.mode==="tui";automaticSelection=!0;try{if(!(persistAsDefault?await pi.setModel(target.model):await pi.setSessionModel(target.model))){warnWhenNoRecommendationIsAvailable(ctx);return}persistAsDefault?pi.setThinkingLevel(target.recommendation.thinkingLevel):pi.setSessionThinkingLevel(target.recommendation.thinkingLevel),ctx.ui.notify(`Switched to recommended model '${target.model.id}'.`,"info")}finally{automaticSelection=!1}}),pi.on("model_select",(event,ctx)=>{if(!(!initialized||disabled2||disarmed||automaticSelection||!canAutoSwitch)){if(event.source==="set"||event.source==="cycle"){disarmed=!0;return}isRecommended(event.model,recommendations)||warnWhenNoRecommendationIsAvailable(ctx)}})}function redraws_default(pi){pi.registerCommand("tui",{description:"Show TUI stats",handler:async(_args,ctx)=>{if(!ctx.hasUI)return;let redraws=0;await ctx.ui.custom((tui,_theme,_keybindings,done)=>(redraws=tui.fullRedraws,done(void 0),new Text("",0,0))),ctx.ui.notify(`TUI full redraws: ${redraws}`,"info")}})}function createRepositoryIdentityExtension(run2){return pi=>{let generation2=0;pi.on("session_start",async(_event,ctx)=>{let current=++generation2;if(ctx.sessionManager.getSessionFile()===void 0)return;let identity=await readRepositoryIdentity(ctx.cwd,run2);current!==generation2||identity===void 0||sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager),identity)||pi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE,identity)}),pi.on("session_shutdown",()=>{generation2++})}}function latestRecordedIdentity(sessionManager){let recorded;for(let entry of sessionManager.getEntries())entry.type==="custom"&&entry.customType===REPOSITORY_IDENTITY_ENTRY_TYPE&&(recorded=parseRepositoryIdentity(entry.data)??recorded);return recorded}var repository_identity_default=createRepositoryIdentityExtension();import{readFileSync as readFileSync34,realpathSync as realpathSync8}from"node:fs";import{isAbsolute as isAbsolute14,relative as relative13}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject2(value2))return;switch(Reflect.get(value2,"kind")){case"project-rules":return parseProjectRulesActivation(value2);case"ttsr":return parseTtsrActivation(value2);default:return}}function parseProjectRulesActivation(value2){let targetPath=Reflect.get(value2,"targetPath"),rules=stringList(Reflect.get(value2,"rules"));if(typeof targetPath!="string"||targetPath.length===0||rules===void 0)return;let toolCallId=Reflect.get(value2,"toolCallId");return{kind:"project-rules",targetPath,rules,...typeof toolCallId=="string"&&toolCallId.length>0?{toolCallId}:{}}}function parseTtsrActivation(value2){let owner=Reflect.get(value2,"owner"),rules=stringList(Reflect.get(value2,"rules")),remediation=Reflect.get(value2,"remediation");if(!(typeof owner!="string"||owner.length===0||rules===void 0||remediation!=="nudge"&&remediation!=="provider-error"))return{kind:"ttsr",owner,rules,remediation}}function stringList(value2){if(!(!Array.isArray(value2)||value2.length===0||!value2.every(entry=>typeof entry=="string"&&entry.length>0)))return value2}function isObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var renderRuleActivationEntry=noticeEntryRenderer(entry=>{let details=parseRuleActivationDetails(entry.data);if(details!==void 0)return{title:titleLine3(details),why:summaryLine(details),expandedLine:detailLine(details)}});function titleLine3(details){switch(details.kind){case"project-rules":return`\u25CF Project rules \xB7 ${details.targetPath}`;case"ttsr":return`\u26A0 Stream rule \xB7 ${details.owner}`}}function summaryLine(details){switch(details.kind){case"project-rules":{let noun=details.rules.length===1?"instruction":"instructions";return`${details.rules.length} ${noun} matched and injected for this tool result.`}case"ttsr":return details.remediation==="nudge"?"Output interrupted; a corrective nudge was queued.":"Corrupted generation discarded; bounded provider retry started."}}function detailLine(details){switch(details.kind){case"project-rules":return details.rules.map(rule=>`rule ${rule}`).join(`
2108
2115
  `);case"ttsr":return`remediation ${details.remediation} \xB7 observed ${details.rules.join(", ")}`}}function registerRuleActivationRenderer(pi){pi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE,renderRuleActivationEntry)}function appendRuleActivation(pi,details){pi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE,details)}var RULE_SUBCOMMANDS=["list","show","paths","status"];function registerSlashCommands(pi,engine){pi.registerCommand("rules",{description:"Inspect loaded pi-rules.",getArgumentCompletions:prefix=>{let completions=RULE_SUBCOMMANDS.filter(subcommand=>subcommand.startsWith(prefix)).map(subcommand=>({value:subcommand,label:subcommand}));return completions.length>0?completions:null},handler:async(args,ctx)=>{let tokens=args.trim().length===0?[]:args.trim().split(/\s+/),subcommand=tokens[0]??"",loaded2=engine.loadStaticRules(ctx.cwd);if(subcommand===""||subcommand==="status"){notify(ctx,buildSummaryText(loaded2.rules,loaded2.diagnostics));return}if(subcommand==="list"){notify(ctx,formatRuleList(loaded2.rules));return}if(subcommand==="show"){let id=tokens[1];if(id===void 0){notify(ctx,"Rule ID is required","error");return}let rule=findRuleById(loaded2.rules,id);if(rule===null){notify(ctx,`Rule not found: ${id}`,"error");return}notify(ctx,rule.body);return}if(subcommand==="paths"){notify(ctx,loaded2.rules.map(rule=>rule.path).join(`
2109
2116
  `));return}notify(ctx,`Unknown /rules subcommand: ${subcommand}`,"error")}}),pi.registerCommand("reload-rules",{description:"Reload pi-rules for the current session.",handler:async(_args,ctx)=>{engine.resetSession(ctx.cwd);let loaded2=engine.loadStaticRules(ctx.cwd);notify(ctx,buildReloadText(loaded2.rules,loaded2.diagnostics))}})}function notify(ctx,message,severity2="info"){ctx.ui.notify(message,severity2)}function buildSummaryText(rules,diagnostics){return appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`,diagnostics)}function buildReloadText(rules,diagnostics){return appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`,diagnostics)}function appendDiagnostics(text2,diagnostics){return diagnostics.length===0?text2:`${text2}, ${diagnostics.length} diagnostics`}function countSources(rules){return new Set(rules.map(rule=>rule.source)).size}function formatRuleList(rules){return rules.map(rule=>`${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`).join(`
2110
2117
  `)}function formatMatchReason(matchReason){return typeof matchReason=="string"?matchReason:matchReason.kind==="no-match"?matchReason.kind:`${matchReason.kind}:${matchReason.pattern}`}function findRuleById(rules,id){let exactMatch=rules.find(rule=>rule.relativePath===id);if(exactMatch!==void 0)return exactMatch;let suffixMatches=rules.filter(rule=>rule.relativePath.endsWith(id));return suffixMatches.length===1?suffixMatches[0]??null:null}import{realpathSync as realpathSync7,statSync as statSync16}from"node:fs";import{basename as basename16,dirname as dirname32,isAbsolute as isAbsolute12,join as join54,relative as relative12,resolve as resolve25}from"node:path";function createSessionState(cwd){return{cwd,staticDedup:new Set,dynamicDedup:new Map,dynamicTargetFingerprints:new Map,loadedRules:[],diagnostics:[]}}function staticDedupKey(cwd,rulePath,contentHash){return`${cwd}::${rulePath}::${contentHash}`}function dynamicDedupKey(scopeKey,rulePath,contentHash){return`${scopeKey}::${rulePath}::${contentHash}`}function markStaticInjected(state,rule){let key=staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash);return state.staticDedup.has(key)?!1:(state.staticDedup.add(key),!0)}function markDynamicInjected(state,scopeKey,rule){let keys=state.dynamicDedup.get(scopeKey);keys===void 0&&(keys=new Set,state.dynamicDedup.set(scopeKey,keys));let key=dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash);return keys.has(key)?!1:(keys.add(key),!0)}function isStaticInjected(state,rule){return state.staticDedup.has(staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash))}function isDynamicInjected(state,scopeKey,rule){return state.dynamicDedup.get(scopeKey)?.has(dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash))===!0}function clearSession(state){state.staticDedup.clear(),state.dynamicDedup.clear(),state.dynamicTargetFingerprints.clear(),state.loadedRules.length=0,state.diagnostics.length=0}import{existsSync as existsSync28,realpathSync as realpathSync5,statSync as statSync14}from"node:fs";import{homedir as homedir6}from"node:os";import{dirname as dirname30,join as join52,posix as posix3,relative as relative11,resolve as resolve23}from"node:path";var UnsupportedRuleSourceError=class extends Error{constructor(message){super(message),this.name="UnsupportedRuleSourceError"}},RuleFrontmatterParseError=class extends Error{constructor(message){super(message),this.name="RuleFrontmatterParseError"}};import{existsSync as existsSync27,lstatSync as lstatSync4,readdirSync as readdirSync6,realpathSync as realpathSync4,statSync as statSync13}from"node:fs";import{isAbsolute as isAbsolute11,join as join51,resolve as resolve22}from"node:path";function scanRuleFiles(options){let rootPath=toAbsolutePath(options.rootDir);if(!existsSync27(rootPath))return[];let rootStats;try{rootStats=statSync13(rootPath)}catch{return[]}if(!rootStats.isDirectory())return[];let results=[],visitedDirectories=new Set,excludedDirs=new Set(options.excludedDirs??SCANNER_EXCLUDED_DIRS),maxDepth=options.maxDepth??10;return scanDirectory(rootPath,0,maxDepth,excludedDirs,visitedDirectories,results),results}function toAbsolutePath(filePath){return isAbsolute11(filePath)?filePath:resolve22(filePath)}function scanDirectory(directoryPath,depth,maxDepth,excludedDirs,visitedDirectories,results){let realDirectoryPath;try{realDirectoryPath=realpathSync4.native(directoryPath)}catch{return}if(visitedDirectories.has(realDirectoryPath))return;visitedDirectories.add(realDirectoryPath);let entries;try{entries=readdirSync6(directoryPath,{withFileTypes:!0}).sort((leftEntry,rightEntry)=>leftEntry.name.localeCompare(rightEntry.name))}catch{return}for(let entry of entries){let entryPath=join51(directoryPath,entry.name);if(entry.isDirectory()){!excludedDirs.has(entry.name)&&depth<maxDepth&&scanDirectory(entryPath,depth+1,maxDepth,excludedDirs,visitedDirectories,results);continue}if(entry.isSymbolicLink()){scanSymbolicLink(entryPath,entry.name,depth,maxDepth,excludedDirs,visitedDirectories,results);continue}entry.isFile()&&isRuleFile(entry.name)&&results.push({path:entryPath,realPath:resolveRealPath(entryPath)})}}function scanSymbolicLink(linkPath2,linkName,depth,maxDepth,excludedDirs,visitedDirectories,results){let targetStats;try{targetStats=statSync13(linkPath2)}catch{return}if(targetStats.isDirectory()){!excludedDirs.has(linkName)&&depth<maxDepth&&scanDirectory(linkPath2,depth+1,maxDepth,excludedDirs,visitedDirectories,results);return}targetStats.isFile()&&isRuleFile(linkName)&&results.push({path:linkPath2,realPath:resolveRealPath(linkPath2)})}function isRuleFile(fileName){return RULE_FILE_EXTENSIONS.some(extension=>fileName.endsWith(extension))}function resolveRealPath(filePath){try{let realPath=realpathSync4.native(filePath);return lstatSync4(filePath).isSymbolicLink()?realPath:filePath}catch{return filePath}}function createRuleDiscoveryCache(){return{scannedRuleFiles:new Map,singleFileInfo:new Map}}function findRuleCandidates(options){let skipUserHome=options.skipUserHome??!1;if(options.projectRoot===null&&skipUserHome)return[];let disabledSources=options.disabledSources??new Set,candidates=[],homeDirectory=resolve23(options.homeDir??homedir6());return options.projectRoot!==null&&candidates.push(...findProjectCandidates(options.projectRoot,options.targetFile,disabledSources,options.cache)),skipUserHome||candidates.push(...findUserHomeCandidates(homeDirectory,disabledSources,options.cache)),candidates}function findProjectCandidates(projectRoot,targetFile,disabledSources,cache2){let rootDirectory=resolve23(projectRoot),walkDirectories=getWalkDirectories(rootDirectory,targetFile),candidates=[];for(let walkDirectory of walkDirectories)for(let[parentDirectory,subDirectory]of PROJECT_RULE_SUBDIRS){let source=toProjectRuleSource(parentDirectory,subDirectory);if(disabledSources.has(source))continue;let ruleDirectory=join52(walkDirectory.directory,parentDirectory,subDirectory);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache2))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!1,relativePath:toRelativePath(rootDirectory,scannedFile.path)})}for(let walkDirectory of walkDirectories)for(let ruleFile of PROJECT_SINGLE_FILES){let source=toProjectSingleFileSource(ruleFile);if(disabledSources.has(source))continue;let filePath=join52(walkDirectory.directory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache2);fileInfo!==null&&candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!0,relativePath:toRelativePath(rootDirectory,filePath)})}return candidates}function findUserHomeCandidates(homeDirectory,disabledSources,cache2){let candidates=[];for(let ruleSubdir of USER_HOME_RULE_SUBDIRS){let source=toUserHomeRuleSource(ruleSubdir);if(disabledSources.has(source))continue;let ruleDirectory=join52(homeDirectory,ruleSubdir);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache2))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!1,relativePath:toRelativePath(homeDirectory,scannedFile.path)})}for(let ruleFile of USER_HOME_SINGLE_FILES){let source=toUserHomeSingleFileSource(ruleFile);if(disabledSources.has(source))continue;let filePath=join52(homeDirectory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache2);if(fileInfo!==null){candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!0,relativePath:toRelativePath(homeDirectory,filePath)});break}}return candidates}function scanRuleFilesCached(rootDir,cache2){if(cache2===void 0)return scanRuleFiles({rootDir});let cached=cache2.scannedRuleFiles.get(rootDir);if(cached!==void 0)return cached;let scannedFiles=scanRuleFiles({rootDir});return cache2.scannedRuleFiles.set(rootDir,scannedFiles),scannedFiles}function singleFileInfoCached(filePath,cache2){if(cache2===void 0)return readSingleFileInfo(filePath);let cached=cache2.singleFileInfo.get(filePath);if(cached!==void 0)return cached;let fileInfo=readSingleFileInfo(filePath);return cache2.singleFileInfo.set(filePath,fileInfo),fileInfo}function getWalkDirectories(projectRoot,targetFile){if(targetFile===null)return[{directory:projectRoot,distance:0}];let startDirectory=dirname30(resolve23(targetFile));if(!isSameOrChildPath(startDirectory,projectRoot))return[{directory:projectRoot,distance:0}];let walkDirectories=[],currentDirectory=startDirectory,distance=0;for(;walkDirectories.push({directory:currentDirectory,distance}),currentDirectory!==projectRoot;){let parentDirectory=dirname30(currentDirectory);if(parentDirectory===currentDirectory)break;currentDirectory=parentDirectory,distance+=1}return walkDirectories}function isSameOrChildPath(childPath,parentPath){let childRelativePath=relative11(parentPath,childPath);return childRelativePath===""||!childRelativePath.startsWith("..")&&!childRelativePath.startsWith("/")}function readSingleFileInfo(filePath){if(!existsSync28(filePath))return null;try{if(!statSync14(filePath).isFile())return null}catch{return null}return{path:filePath,realPath:resolveRealPath2(filePath)}}function resolveRealPath2(filePath){try{return realpathSync5.native(filePath)}catch{return filePath}}function toRelativePath(rootDirectory,filePath){return posix3.normalize(relative11(rootDirectory,filePath).replace(/\\/g,"/"))}function toProjectRuleSource(parentDirectory,subDirectory){let source=`${parentDirectory}/${subDirectory}`;switch(source){case".pi/rules":case".omo/rules":case".claude/rules":case".cursor/rules":case".github/instructions":return source;default:throw new UnsupportedRuleSourceError(`Unsupported project rule source: ${source}`)}}function toProjectSingleFileSource(ruleFile){switch(ruleFile){case".github/copilot-instructions.md":case"AGENTS.md":case"CLAUDE.md":case"CONTEXT.md":return ruleFile;default:throw new UnsupportedRuleSourceError(`Unsupported project single-file source: ${ruleFile}`)}}function toUserHomeRuleSource(ruleSubdir){let source=`~/${ruleSubdir}`;switch(source){case"~/.pi/rules":case"~/.omo/rules":case"~/.opencode/rules":case"~/.claude/rules":return source;default:throw new UnsupportedRuleSourceError(`Unsupported user-home rule source: ${source}`)}}function toUserHomeSingleFileSource(ruleFile){let source=`~/${ruleFile}`;switch(source){case"~/.config/opencode/AGENTS.md":case"~/.claude/CLAUDE.md":return source;default:throw new UnsupportedRuleSourceError(`Unsupported user-home single-file source: ${source}`)}}function truncationNotice(relativePath){return TRUNCATION_NOTICE.replace("{path}",relativePath)}function safeSliceEnd(body,end){if(end<=0)return 0;let lastCodeUnit=body.charCodeAt(end-1);return lastCodeUnit>=55296&&lastCodeUnit<=56319?end-1:end}function truncateRule(body,options){if(body.length<=options.maxChars)return{body,truncated:!1,originalLength:body.length};let notice2=truncationNotice(options.relativePath);if(options.maxChars<notice2.length)return{body:notice2,truncated:!0,originalLength:body.length};let sliceEnd=safeSliceEnd(body,options.maxChars-notice2.length);return{body:`${body.slice(0,sliceEnd)}${notice2}`,truncated:!0,originalLength:body.length}}function truncateBudget(input){let results=[],remainingBudget=input.maxResultChars;for(let rule of input.rules){if(remainingBudget>=rule.body.length){results.push({body:rule.body,truncated:!1,relativePath:rule.relativePath}),remainingBudget-=rule.body.length;continue}let notice2=truncationNotice(rule.relativePath);if(remainingBudget<=notice2.length)break;let sliceEnd=safeSliceEnd(rule.body,remainingBudget-notice2.length),body=`${rule.body.slice(0,sliceEnd)}${notice2}`;results.push({body,truncated:!0,relativePath:rule.relativePath}),remainingBudget-=body.length}return results}function formatRule(rule){return`Instructions from: ${rule.path}
@@ -2236,7 +2243,7 @@ ${buildTerminalPromptSection({evalOnly:isEvalOnlyRouting(pi)})}`}},{previewSafe:
2236
2243
  `)}`,"error");return}commit(ctx,phases,`/todo import ${source}`);let taskCount=phases.reduce((sum,phase)=>sum+phase.tasks.length,0);ctx.ui.notify(`Imported ${phases.length} phase(s), ${taskCount} task(s) from ${source}.`,"info")}function append(ctx,rest){let tokens=tokenizeTodoArgs(rest);if(tokens.length===0){ctx.ui.notify("Usage: /todo append [<phase>] <task...>","error");return}let next=clonePhases(accessors.getCurrentPhases()),phaseName,content;tokens.length===1?content=tokens[0]:(phaseName=tokens[0],content=tokens.slice(1).join(" "));let targetPhase;phaseName?(targetPhase=findPhaseFuzzy(next,phaseName),targetPhase||(targetPhase={name:titleCaseWords(phaseName),tasks:[]},next.push(targetPhase))):next.length>0?targetPhase=next[next.length-1]:(targetPhase={name:DEFAULT_INIT_PHASE,tasks:[]},next.push(targetPhase));let finalContent=titleCaseSentence(content);targetPhase.tasks.push({content:finalContent,status:"pending"}),commit(ctx,next,`/todo append \u2192 ${targetPhase.name}`),ctx.ui.notify(`Appended to ${targetPhase.name}: ${finalContent}`,"info")}function start(ctx,rest){if(!rest){ctx.ui.notify("Usage: /todo start <task>","error");return}let current=accessors.getCurrentPhases(),hit=findTaskFuzzy(current,rest);if(!hit){ctx.ui.notify(`No task matched "${rest}". Use /todo to list current tasks.`,"error");return}let{phases,errors}=applyOpsToPhases(current,[{op:"start",task:hit.task.content}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo start ${hit.task.content}`),ctx.ui.notify(`Started: ${hit.task.content}`,"info")}function mutateStatus(ctx,rest,target){let op=target==="completed"?"done":"drop",current=accessors.getCurrentPhases(),trimmed=rest.trim();if(!trimmed){let{phases,errors}=applyOpsToPhases(current,[{op}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo ${op} (all)`),ctx.ui.notify(`Marked all tasks ${target}.`,"info");return}let taskHit=findTaskFuzzy(current,trimmed);if(taskHit){let{phases,errors}=applyOpsToPhases(current,[{op,task:taskHit.task.content}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo ${op} ${taskHit.task.content}`),ctx.ui.notify(`Marked ${target}: ${taskHit.task.content}`,"info");return}let phaseHit=findPhaseFuzzy(current,trimmed);if(phaseHit){let{phases,errors}=applyOpsToPhases(current,[{op,phase:phaseHit.name}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo ${op} ${phaseHit.name}`),ctx.ui.notify(`Marked phase ${phaseHit.name} ${target}.`,"info");return}ctx.ui.notify(`No task or phase matched "${trimmed}".`,"error")}function remove(ctx,rest){let current=accessors.getCurrentPhases(),trimmed=rest.trim();if(!trimmed){commit(ctx,[],"/todo rm (all)",{removed:!0}),ctx.ui.notify("Cleared all todos.","info");return}let taskHit=findTaskFuzzy(current,trimmed);if(taskHit){let{phases,errors}=applyOpsToPhases(current,[{op:"rm",task:taskHit.task.content}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo rm ${taskHit.task.content}`,{removed:!0}),ctx.ui.notify(`Removed: ${taskHit.task.content}`,"info");return}let phaseHit=findPhaseFuzzy(current,trimmed);if(phaseHit){let{phases,errors}=applyOpsToPhases(current,[{op:"rm",phase:phaseHit.name}]);if(errors.length>0){ctx.ui.notify(errors.join("; "),"error");return}commit(ctx,phases,`/todo rm ${phaseHit.name}`,{removed:!0}),ctx.ui.notify(`Removed phase: ${phaseHit.name}`,"info");return}ctx.ui.notify(`No task or phase matched "${trimmed}".`,"error")}pi.registerCommand("todo",{description:"Show or edit the todo list (edit/copy/export/import/append/start/done/drop/rm)",getArgumentCompletions:argumentPrefix=>{let prefix=argumentPrefix.trim().toLowerCase(),matches=VERBS.filter(verb=>verb.startsWith(prefix));return matches.length===0?null:matches.map(verb=>({value:verb,label:verb}))},handler:async(args,ctx)=>{let trimmed=args.trim();if(!trimmed){showCurrent(ctx);return}let spaceIndex=trimmed.search(/\s/),verb=(spaceIndex===-1?trimmed:trimmed.slice(0,spaceIndex)).toLowerCase(),rest=spaceIndex===-1?"":trimmed.slice(spaceIndex+1).trim();switch(verb){case"edit":await editInOverlay(ctx);return;case"copy":await copyMarkdown(ctx);return;case"export":await exportToFile(ctx,rest);return;case"import":await importFromFile(ctx,rest);return;case"help":case"?":ctx.ui.notify(USAGE4,"info");return;case"append":append(ctx,rest);return;case"start":start(ctx,rest);return;case"done":mutateStatus(ctx,rest,"completed");return;case"drop":mutateStatus(ctx,rest,"abandoned");return;case"rm":remove(ctx,rest);return;default:ctx.ui.notify(`Unknown /todo verb "${verb}".
2237
2244
  ${USAGE4}`,"error")}}})}var FIRST_TURN_CUSTOM_TYPE="senpi.todo-first-turn",FIRST_TURN_REMINDER=`<system-reminder>
2238
2245
  This is the first request of the session. Before continuing, call the todo tool with op "init" and a phased list covering the whole request end to end: investigation, implementation, verification (diagnostics, tests, build, manual check), and the final report. Give every task a unique 5-10 word label; phase names are short noun phrases. Then continue the request in this same turn - the init is not a turn by itself.
2239
- </system-reminder>`,NON_INTERACTIVE_MODES3=new Set(["print","json"]),TRAILING_CLOSERS=/[\s"'`\u2018\u2019\u201C\u201D)\]}]+$/u;function shouldArmFirstTurn(input){if(input.preview||input.trigger!=="prompt"||input.setting==="off"||!input.todoActive||NON_INTERACTIVE_MODES3.has(input.mode))return!1;let request2=input.prompt.trim().replace(TRAILING_CLOSERS,"");return request2===""||/[?!\uFF1F\uFF01]$/u.test(request2)?!1:!input.branchEntries.some(entry=>entry.type==="message"&&entry.message.role==="user")}function supportsNamedToolChoice(model){if(model===void 0||hasRefusedForcedToolChoice(model))return!1;switch(model.api){case"anthropic-messages":{let compat=getAnthropicCompat(model);return compat.supportsToolChoice!==!1&&compat.supportsForcedToolChoice!==!1}case"openai-responses":case"openai-completions":return model.compat?.supportsForcedToolChoice!==!1;default:return!1}}function namedToolChoicePayload(api,toolName){switch(api){case"anthropic-messages":return{type:"tool",name:toolName};case"openai-responses":return{type:"function",name:toolName};case"openai-completions":return{type:"function",function:{name:toolName}};default:return}}function isRecord44(value2){return typeof value2=="object"&&value2!==null}function declaresTool(tools,toolName){return Array.isArray(tools)&&tools.some(tool=>isRecord44(tool)&&(tool.name===toolName||isRecord44(tool.function)&&tool.function.name===toolName))}function withForcedTodoChoice(payload,model){if(!supportsNamedToolChoice(model))return;let toolChoice=namedToolChoicePayload(model?.api,"todo");if(!toolChoice||!isRecord44(payload)||payload.tool_choice!==void 0||!declaresTool(payload.tools,"todo"))return;let thinking=isRecord44(payload.thinking)?payload.thinking.type:void 0;if(!(model?.api==="anthropic-messages"&&(thinking==="enabled"||thinking==="adaptive")))return{...payload,tool_choice:toolChoice}}var STATUSES=new Set(["pending","in_progress","completed","abandoned"]),DEFAULT_PHASE_NAME="Tasks";function phasesFromCursorTodos(todos){if(!Array.isArray(todos))return;let tasks=[];for(let item of todos){if(!item||typeof item!="object")continue;let raw=item,content=typeof raw.content=="string"?raw.content.trim():"";if(!content)continue;let status=STATUSES.has(raw.status)?raw.status:"pending";tasks.push({content,status})}return tasks.length>0?[{name:DEFAULT_PHASE_NAME,tasks}]:[]}var TODO_TOOL_DESCRIPTION=`**Tasks referenced by verbatim content string, NEVER an auto-generated ID \u2014 no "task-1"/"task-N" exists. Pass the content text in the task field.**
2246
+ </system-reminder>`,NON_INTERACTIVE_MODES3=new Set(["print","json"]),TRAILING_CLOSERS=/[\s"'`\u2018\u2019\u201C\u201D)\]}]+$/u;function shouldArmFirstTurn(input){if(input.preview||input.trigger!=="prompt"||input.setting==="off"||!input.todoActive||NON_INTERACTIVE_MODES3.has(input.mode)||parseAskUserAnswerFrame(input.prompt)!==void 0)return!1;let request2=input.prompt.trim().replace(TRAILING_CLOSERS,"");return request2===""||/[?!\uFF1F\uFF01]$/u.test(request2)?!1:!input.branchEntries.some(isUserRequestEntry)}function isUserRequestEntry(entry){if(entry.type!=="message"||entry.message.role!=="user")return!1;let text2=firstTextBlock(entry.message.content);return text2===void 0||parseAskUserAnswerFrame(text2)===void 0}function supportsNamedToolChoice(model){if(model===void 0||hasRefusedForcedToolChoice(model))return!1;switch(model.api){case"anthropic-messages":{let compat=getAnthropicCompat(model);return compat.supportsToolChoice!==!1&&compat.supportsForcedToolChoice!==!1}case"openai-responses":case"openai-completions":return model.compat?.supportsForcedToolChoice!==!1;default:return!1}}function namedToolChoicePayload(api,toolName){switch(api){case"anthropic-messages":return{type:"tool",name:toolName};case"openai-responses":return{type:"function",name:toolName};case"openai-completions":return{type:"function",function:{name:toolName}};default:return}}function isRecord44(value2){return typeof value2=="object"&&value2!==null}function declaresTool(tools,toolName){return Array.isArray(tools)&&tools.some(tool=>isRecord44(tool)&&(tool.name===toolName||isRecord44(tool.function)&&tool.function.name===toolName))}function withForcedTodoChoice(payload,model){if(!supportsNamedToolChoice(model))return;let toolChoice=namedToolChoicePayload(model?.api,"todo");if(!toolChoice||!isRecord44(payload)||payload.tool_choice!==void 0||!declaresTool(payload.tools,"todo"))return;let thinking=isRecord44(payload.thinking)?payload.thinking.type:void 0;if(!(model?.api==="anthropic-messages"&&(thinking==="enabled"||thinking==="adaptive")))return{...payload,tool_choice:toolChoice}}var STATUSES=new Set(["pending","in_progress","completed","abandoned"]),DEFAULT_PHASE_NAME="Tasks";function phasesFromCursorTodos(todos){if(!Array.isArray(todos))return;let tasks=[];for(let item of todos){if(!item||typeof item!="object")continue;let raw=item,content=typeof raw.content=="string"?raw.content.trim():"";if(!content)continue;let status=STATUSES.has(raw.status)?raw.status:"pending";tasks.push({content,status})}return tasks.length>0?[{name:DEFAULT_PHASE_NAME,tasks}]:[]}var TODO_TOOL_DESCRIPTION=`**Tasks referenced by verbatim content string, NEVER an auto-generated ID \u2014 no "task-1"/"task-N" exists. Pass the content text in the task field.**
2240
2247
 
2241
2248
  On each completion the earliest still-open task (in phase order) auto-promotes to in_progress.
2242
2249
  Completing tasks out of phase order can move this pointer **back** to an earlier phase \u2014 expected; completed tasks are never reverted.
@@ -2291,7 +2298,7 @@ A request with three or more distinct steps gets a phased todo before the first
2291
2298
  `)}function getTextContent(result3){return result3.content.filter(content=>content.type==="text"&&typeof content.text=="string").map(content=>content.text).join(`
2292
2299
  `)}function registerTodoTool(pi,accessors){let tool={name:"todo",label:"Todo",description:TODO_TOOL_DESCRIPTION,promptSnippet:"Track phased tasks with one op-based todo tool; reference tasks by their exact content.",promptGuidelines:["Use one todo operation at a time, batched with the real work; never end a turn with a todo call as its only tool call.","Reference tasks and phases by their exact content/name; use view when the text is uncertain.","Mark work done immediately and use drop for tasks that are no longer needed."],parameters:TODO_PARAMS_SCHEMA,executionMode:"sequential",async execute(_toolCallId,params,_signal,_onUpdate,ctx){let previousPhases=clonePhases(accessors.getCurrentPhases()),previousAsk=accessors.getCurrentAsk(),normalized2=normalizeTodoParams(params,previousPhases);if(normalized2.error||!normalized2.entry){let error2=normalized2.error??'Missing "op". Example: {"op":"init","list":[{"phase":"Setup","items":["..."]}]}';throw new Error(`${error2}
2293
2300
 
2294
- ${formatSummary(previousPhases,[],!0,previousAsk)}`)}let entry=normalized2.entry,corrections=normalized2.corrections,readOnly=entry.op==="view",applied=readOnly?{phases:previousPhases,errors:[]}:applyParams(clonePhases(previousPhases),entry,corrections);if(applied.errors.length>0)throw new Error(formatSummary(previousPhases,applied.errors,readOnly,previousAsk));let completedTasks=readOnly?[]:getCompletionTransitions(previousPhases,applied.phases),createsList=entry.op==="init"||entry.op==="append"&&previousPhases.every(phase=>phase.tasks.length===0),ask=createsList?captureListAsk(ctx.sessionManager.getBranch(),Date.now())??previousAsk:previousAsk;readOnly||(pi.appendEntry(TODO_STATE_ENTRY_TYPE,{schema:"v2",phases:clonePhases(applied.phases),...ask?{ask}:{}}),accessors.setCurrentPhases(clonePhases(applied.phases)),accessors.setCurrentAsk(ask),accessors.syncWidget(ctx,completedTasks));let details={op:entry.op,phases:clonePhases(applied.phases),storage:ctx.sessionManager.getSessionFile()?"session":"memory"};ask&&(details.ask=ask),corrections.length>0&&(details.corrections=corrections),completedTasks.length>0&&(details.completedTasks=completedTasks);let cue=formatHandoffCue(readOnly?void 0:handoffMomentOf(previousPhases,applied.phases,createsList)),summary=`${formatSummary(applied.phases,[],readOnly,ask)}${cue}`;return{content:[{type:"text",text:corrections.length>0?`${corrections.join(`
2301
+ ${formatSummary(previousPhases,[],!0,previousAsk)}`)}let entry=normalized2.entry,corrections=normalized2.corrections,readOnly=entry.op==="view",applied=readOnly?{phases:previousPhases,errors:[]}:applyParams(clonePhases(previousPhases),entry,corrections);if(applied.errors.length>0)throw new Error(formatSummary(previousPhases,applied.errors,readOnly,previousAsk));let completedTasks=readOnly?[]:getCompletionTransitions(previousPhases,applied.phases),createsList=entry.op==="init"||entry.op==="append"&&previousPhases.every(phase=>phase.tasks.length===0),ask=createsList?captureListAsk(ctx.sessionManager.getBranch(),Date.now())??previousAsk:previousAsk;readOnly||(pi.appendEntry(TODO_STATE_ENTRY_TYPE,{schema:"v2",phases:clonePhases(applied.phases),...ask?{ask}:{}}),accessors.setCurrentPhases(clonePhases(applied.phases)),accessors.setCurrentAsk(ask),accessors.syncWidget(ctx,completedTasks));let details={op:entry.op,phases:clonePhases(applied.phases),storage:ctx.sessionManager.getSessionFile()?"session":"memory"};ask&&(details.ask=ask),corrections.length>0&&(details.corrections=corrections),completedTasks.length>0&&(details.completedTasks=completedTasks);let surface=ctx.getSystemPromptOptions?.().surface??resolvePromptSurface(process.env),cue=formatHandoffCue(readOnly||surface==="chat"?void 0:handoffMomentOf(previousPhases,applied.phases,createsList)),summary=`${formatSummary(applied.phases,[],readOnly,ask)}${cue}`;return{content:[{type:"text",text:corrections.length>0?`${corrections.join(`
2295
2302
  `)}
2296
2303
 
2297
2304
  ${summary}`:summary}],details}},renderCall(args,theme2){return new Text(theme2.fg("toolTitle",theme2.bold(renderCallLabel(args))),0,0)},renderResult(result3,options,theme2,context){if(context.isError)return new Text(theme2.fg("toolOutput",getTextContent(result3)),0,0);let phases=result3.details?.phases??[],rendered=renderTodoPhases(phases,result3.details?.completedTasks??[],options,context.args,result3.details?.op,theme2,context.spinnerFrame);if(!rendered)return new Text(getTextContent(result3)||"Todo list is empty.",0,0);let ask=result3.details?.ask;return new Text(ask?`${theme2.fg("dim",`Ask: ${ask.text}`)}
@@ -2322,10 +2329,10 @@ ${TASK_MANAGEMENT_SECTION}`;if(event.preview)return{systemPrompt};let branchEntr
2322
2329
  `)}import{createHash as createHash19}from"node:crypto";function nativeMapping(model){let isOpenAiModel=/^gpt-(4o|4\.1|5)/.test(model.id)&&!model.id.includes("codex");if(model.provider==="openai"&&isOpenAiModel)return{provider:"openai",resource:"responses"};if(model.provider!=="openai"&&(model.api==="openai-responses"||model.api==="azure-openai-responses")&&isOpenAiModel)return{provider:"openai",resource:"responses",routeLabel:model.provider};if(model.provider==="anthropic"&&/^claude-/.test(model.id))return{provider:"anthropic",resource:"messages"};if(model.provider!=="anthropic"&&model.api==="anthropic-messages"&&/^claude-/.test(model.id))return{provider:"anthropic",resource:"messages",routeLabel:model.provider};if(model.provider==="deepseek"&&/^deepseek-v4-/.test(model.id))return{provider:"deepseek",resource:"messages",routeLabel:"deepseek",endpointPath:"/anthropic/v1/messages"};if(model.provider==="xai"&&/^grok-/.test(model.id))return{provider:"xai",resource:"responses"};if(model.provider==="perplexity"&&/^sonar/.test(model.id))return{provider:"perplexity",resource:"chat/completions"};if((model.provider==="z-ai"||model.provider==="zai")&&/^glm-/.test(model.id))return{provider:"z-ai",resource:"chat/completions"};if(model.provider==="kimi-coding")return{provider:"kimi",resource:"search"};if(model.provider==="openrouter"){let slashIndex=model.id.indexOf("/");if(slashIndex<=0)return null;let effectiveProvider=model.id.slice(0,slashIndex),effectiveId=model.id.slice(slashIndex+1);return effectiveProvider==="openrouter"?null:nativeMapping({...model,provider:effectiveProvider,id:effectiveId})}return null}function shouldDiscoverNativeRoute(activeModel,availableModel){return nativeMapping(availableModel)?activeModel?activeModel.provider===availableModel.provider:!0:!1}function buildEndpointUrl(baseUrl,resource,endpointPath){let configured;try{configured=new URL(baseUrl)}catch{return baseUrl}if(endpointPath)return configured.pathname=endpointPath,configured.hash="",configured.href;let trimmedPath=configured.pathname.replace(/\/+$/,""),resourceSlash=`/${resource}`;return trimmedPath.endsWith(resourceSlash)?configured.pathname=trimmedPath:/\/v\d+$/.test(trimmedPath)?configured.pathname=`${trimmedPath}${resourceSlash}`:configured.pathname=`${trimmedPath}/v1${resourceSlash}`,configured.hash="",configured.href}function nativeRouteKey(model){let mapping=nativeMapping(model);if(!mapping)return null;let baseUrl=buildEndpointUrl(model.baseUrl,mapping.resource,mapping.endpointPath);if(!isAllowedProviderBaseUrl(baseUrl))return null;let routeUrl=new URL(baseUrl);return routeUrl.hostname=routeUrl.hostname.replace(/\.$/,""),`${mapping.provider}|${routeUrl.href}`}function discoveredNativeEntryId(provider,routeKey){let routeFingerprint=createHash19("sha256").update(routeKey).digest("hex").slice(0,16);return`native-${provider}-${routeFingerprint}`}async function buildNativeEntryForModel(model,modelRegistry,options={}){if(!model||!modelRegistry)return null;let{id,signal}=options,mapping=nativeMapping(model);if(!mapping)return null;let entryId=id??(mapping.routeLabel?`${mapping.routeLabel}/native`:"native"),baseUrl=buildEndpointUrl(model.baseUrl,mapping.resource,mapping.endpointPath);if(!isAllowedProviderBaseUrl(baseUrl))return null;signal?.throwIfAborted();let authPromise=modelRegistry.getApiKeyAndHeaders(model),auth;if(!signal)auth=await authPromise;else{signal.throwIfAborted();let removeAbortListener2=()=>{},abortPromise=new Promise((_resolve,reject)=>{let onAbort=()=>reject(signal.reason);signal.addEventListener("abort",onAbort,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",onAbort)});try{auth=await Promise.race([authPromise,abortPromise])}finally{removeAbortListener2()}}if(!auth.ok||!auth.apiKey)return null;let requestBaseUrl=auth.baseUrl?buildEndpointUrl(auth.baseUrl,mapping.resource,mapping.endpointPath):baseUrl;return isAllowedProviderBaseUrl(requestBaseUrl)?{id:entryId,provider:mapping.provider,apiKey:auth.apiKey,baseUrl:requestBaseUrl,model:model.id,priority:-1}:null}async function buildNativeEntries(model,modelRegistry,signal,searchModel){if(signal?.throwIfAborted(),!modelRegistry)return[];let entries=[],seenRoutes=new Set,activeRouteKey=model?nativeRouteKey(model):null;if(activeRouteKey){seenRoutes.add(activeRouteKey);let activeEntry=await buildNativeEntryForModel(model,modelRegistry,{signal});activeEntry&&entries.push(searchModel?{...activeEntry,...searchModel}:activeEntry)}if(!modelRegistry.getAvailable)return entries;for(let availableModel of modelRegistry.getAvailable()){if(!shouldDiscoverNativeRoute(model,availableModel))continue;let routeKey=nativeRouteKey(availableModel);if(!routeKey||seenRoutes.has(routeKey))continue;seenRoutes.add(routeKey);let entry=await buildNativeEntryForModel(availableModel,modelRegistry,{id:"native-discovered",signal});entry&&entries.push({...entry,id:discoveredNativeEntryId(entry.provider,routeKey)})}return entries}var SESSION_SEARCH_MODEL="session",DEFAULT_SEARCH_MODELS={anthropic:["claude-haiku-4-5","claude-haiku-4.5"],openai:["gpt-5.6-luna"],xai:["grok-4.3"],deepseek:["deepseek-v4-flash"]};function isCheaper(candidate,session){if(!candidate.cost||!session.cost)return!1;let{input,output}=candidate.cost;return input<=session.cost.input&&output<=session.cost.output&&(input<session.cost.input||output<session.cost.output)}function sameRouteModels(session,registry){let routeKey=nativeRouteKey(session);return(registry?.getAvailable?.()??[]).filter(candidate=>candidate.provider===session.provider&&nativeRouteKey(candidate)===routeKey)}function choose(model,session,source){return model===session.id?{model,source}:{model,fallbackModel:session.id,source}}function defaultChoice(session,candidates){let provider=nativeMapping(session)?.provider;for(let id of provider&&DEFAULT_SEARCH_MODELS[provider]||[]){let candidate=candidates.find(model=>model.id===id);if(candidate&&candidate.id!==session.id&&isCheaper(candidate,session))return choose(candidate.id,session,"default")}return{model:session.id,source:"session"}}function resolveNativeSearchModel(session,registry,setting){if(!session||!nativeRouteKey(session))return;if(setting===SESSION_SEARCH_MODEL)return{model:session.id,source:"session"};let candidates=sameRouteModels(session,registry);if(setting===void 0)return defaultChoice(session,candidates);let chosen=candidates.find(model=>model.id===setting)??candidates.find(model=>`${model.provider}/${model.id}`===setting);return chosen?choose(chosen.id,session,"setting"):{model:session.id,source:"session",warning:`nativeModel "${setting}" is ignored: it is not a hosted-search model on the session's ${session.provider} route, so native search uses ${session.id}.`}}function shorten4(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function durationText(durationMs){return durationMs>=1e3?`${Math.round(durationMs/1e3)}s`:`${durationMs}ms`}function attemptState(attempt2){return attempt2.skipped?"skipped":attempt2.blocked==="challenge"?"challenged":attempt2.error?"failed":attempt2.resultsCount}function attemptLabel(attempts){return attempts?attempts.map(attempt2=>`${attemptRouteLabel(attempt2)}:${attemptState(attempt2)}`).join(" -> "):""}function routeStateLabel(details){let labels=details.routeLabels??details.providerLabels;if(labels.length===0)return"";let attempts=details.attempts??[];return labels.map((label3,index)=>{let attempt2=attempts[index];return attempt2?`${label3}:${attemptState(attempt2)}`:`${label3}:${index===attempts.length?"searching":"pending"}`}).join(" -> ")}function isSearchProgressDetails(details){return details!==void 0&&"phase"in details&&details.phase==="searching"}function isSearchErrorDetails(details){return"phase"in details&&details.phase==="error"}function renderSearchCall(args,theme2){let head=theme2.fg("toolTitle",theme2.bold("web_search ")),query=theme2.fg("accent",`"${shorten4(args.query,90)}"`),domains=args.allowed_domains??args.blocked_domains,filter=domains?.length?theme2.fg("muted",` domains:${domains.length}`):"";return new Text(head+query+filter,0,0)}function renderSearchResult(result3,options,theme2){if(options.isPartial){let details2=result3.details;if(isSearchProgressDetails(details2)){if(details2.currentProvider){let line=theme2.fg("warning",`Searching "${shorten4(details2.query,80)}" via ${details2.currentProvider}`),route2=routeStateLabel(details2),rows2=options.expanded&&route2?[line,theme2.fg("muted",`route ${route2}`)]:[line];return new Text(rows2.join(`
2323
2330
  `),0,0)}let route=details2.providerLabels.length>0?details2.providerLabels.join(" -> "):"configured providers";return new Text(theme2.fg("warning",`Searching "${shorten4(details2.query,80)}" via ${route}`),0,0)}return new Text(theme2.fg("warning",result3.content[0]?.text??"Searching the web..."),0,0)}let details=result3.details;if(!details)return new Text(theme2.fg("muted",result3.content[0]?.text??""),0,0);if(isSearchProgressDetails(details))return new Text(theme2.fg("muted",result3.content[0]?.text??""),0,0);if(isSearchErrorDetails(details))return new Text(theme2.fg("error",details.error),0,0);if(details.error)return new Text(theme2.fg("error",details.error),0,0);let count=details.results.length,provider=attemptRouteLabel(details),summary=theme2.fg("success",`${count} result${count===1?"":"s"}`)+theme2.fg("muted",` via ${provider} in ${durationText(details.durationMs)}`)+(details.truncated?theme2.fg("warning"," (truncated)"):"");if(count===0)return new Text(summary,0,0);let attempts=attemptLabel(details.attempts),rows=options.expanded&&attempts?[summary,theme2.fg("muted",`route ${attempts}`)]:[summary],visibleLimit=options.expanded?8:3;for(let item of details.results.slice(0,visibleLimit))rows.push(`${theme2.fg("accent",shorten4(item.title,80))} ${theme2.fg("dim",shorten4(item.url,100))}`),item.snippet&&rows.push(theme2.fg("muted",` ${shorten4(item.snippet,140)}`));return details.results.length>visibleLimit&&rows.push(theme2.fg("dim",`\u2026 ${details.results.length-visibleLimit} more sources`)),new Text(rows.join(`
2324
2331
  `),0,0)}var Params3=typebox_exports.Object({query:typebox_exports.String({minLength:2,description:"The search query to use"}),allowed_domains:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Only include search results from these domains"})),blocked_domains:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Never include search results from these domains"}))},{additionalProperties:!1});async function configWithNativeRoute(config,ctx,signal){if(!config.auto)return config;let choice=resolveNativeSearchModel(ctx?.model,ctx?.modelRegistry,config.nativeModel),searchModel=choice?.fallbackModel?{model:choice.model,fallbackModel:choice.fallbackModel}:choice&&{model:choice.model},nativeEntries=await buildNativeEntries(ctx?.model,ctx?.modelRegistry,signal,searchModel);return nativeEntries.length>0?{...config,providers:[...nativeEntries,...config.providers]}:config}function formatSearchProgressText(details){if(details.currentProvider)return`Searching "${details.query}" via ${details.currentProvider}`;let route=details.providerLabels.length>0?details.providerLabels.join(" -> "):"configured providers";return`Searching "${details.query}" via ${route}`}function searchErrorDetails(query,error2,reason){return{phase:"error",query,error:error2,...reason?{reason}:{}}}function createWebSearchTool(getConfig,options={}){let routingState,routingKey="";return{name:"web_search",label:"Web Search",description:"Search the web for current information and return source URLs for citation.",promptSnippet:"Search the web for current information, documentation, news, or external facts.",promptGuidelines:["After using web_search, cite relevant returned URLs in the final answer."],parameters:Params3,async execute(_toolCallId,params,signal,onUpdate,ctx){if(params.allowed_domains?.length&&params.blocked_domains?.length){let message="Error: Cannot specify both allowed_domains and blocked_domains in the same request",details2=searchErrorDetails(params.query,message);return{content:[{type:"text",text:message}],details:details2}}let loaded2=getConfig();if(!loaded2.ok){let details2=searchErrorDetails(params.query,loaded2.message,loaded2.reason);return{content:[{type:"text",text:loaded2.message}],details:details2}}let maxResults=loaded2.config.providers[0]?.maxResults??10,config=await configWithNativeRoute(loaded2.config,ctx,signal),progressDetails={phase:"searching",query:params.query,providerLabels:config.providers.map(providerEntryLabel),maxResults,strategy:config.strategy,...params.allowed_domains?{allowedDomains:params.allowed_domains}:{},...params.blocked_domains?{blockedDomains:params.blocked_domains}:{}};onUpdate?.({content:[{type:"text",text:formatSearchProgressText(progressDetails)}],details:progressDetails});let nextRoutingKey=`${config.strategy}:${config.providers.map(provider=>provider.id??provider.provider).join("|")}`;(!routingState||routingKey!==nextRoutingKey||routingState.successCounts.length!==config.providers.length)&&(routingState=createSearchRoutingState(config.providers.length,routingState?.cooldowns),routingKey=nextRoutingKey);let request2={query:params.query,maxResults,...params.allowed_domains===void 0?{}:{allowedDomains:params.allowed_domains},...params.blocked_domains===void 0?{}:{blockedDomains:params.blocked_domains}},details=await performSearch(config,request2,signal,routingState,(providerLabel,attempts,routeLabels)=>{let attemptProgress={...progressDetails,currentProvider:providerLabel,attempts:[...attempts],routeLabels:[...routeLabels]};onUpdate?.({content:[{type:"text",text:formatSearchProgressText(attemptProgress)}],details:attemptProgress})});return options.onSearchComplete?.(details),{content:[{type:"text",text:formatSearchText(details)}],details}},renderCall:(args,theme2)=>renderSearchCall(args,theme2),renderResult:(result3,options2,theme2)=>renderSearchResult(result3,options2,theme2)}}var web_search=createWebSearchTool(()=>({ok:!1,reason:"missing_config",message:"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi."}));var STATUS_KEY6="pi-websearch",WIDGET_KEY6="pi-websearch",NATIVE_BYPASS_MESSAGE2="Native provider web search is handled by the built-in provider extension.";function isProviderNativeBypass(model){return supportsNativeAnthropicWebSearch(model)?isAnthropicWebSearchEnabled():supportsNativeOpenAiWebSearch(model)?isOpenaiWebSearchEnabled():!1}function websearch_default(pi){let state={ok:!1,reason:"missing_config",message:"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi."};function providerList(config){return config.providers.map(providerEntryLabel).join(", ")}function clearUi4(ctx){ctx.hasUI!==!1&&(ctx.ui.setStatus(STATUS_KEY6,void 0),ctx.ui.setWidget(WIDGET_KEY6,void 0))}function updateUi(ctx){if(ctx.hasUI!==!1){if(state.ok){clearUi4(ctx);return}if(state.reason==="provider_native_bypass"){clearUi4(ctx);return}clearUi4(ctx),ctx.ui.notify(state.message,"error")}}let lastServedBy;function nativeModelStatus(config,ctx){let choice=config.auto?resolveNativeSearchModel(ctx.model,ctx.modelRegistry,config.nativeModel):void 0,parts=[];if(choice){let fallback=choice.fallbackModel?` (falls back to ${choice.fallbackModel})`:"";parts.push(`native model=${choice.model}${fallback}`)}lastServedBy&&parts.push(`last search via ${lastServedBy}`);let text2=parts.map(part=>`, ${part}`).join("");if(choice?.warning)return{text:text2,warning:choice.warning};if(config.nativeModel&&!choice){let reason=config.auto?"the session model has no hosted web search route":"auto is disabled";return{text:text2,warning:`nativeModel "${config.nativeModel}" is ignored: ${reason}.`}}return{text:text2}}pi.registerTool(createWebSearchTool(()=>state,{onSearchComplete:details=>{details.error||(lastServedBy=attemptRouteLabel(details))}}));async function refreshState(model,ctx){state=isProviderNativeBypass(model)?{ok:!1,reason:"provider_native_bypass",message:NATIVE_BYPASS_MESSAGE2}:await loadWebsearchConfig({cwd:ctx.cwd}),updateUi(ctx)}pi.on("session_start",async(_event,ctx)=>{lastServedBy=void 0,await refreshState(ctx.model,ctx)}),pi.on("model_select",async(event,ctx)=>{await refreshState(event.model,ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi4(ctx)}),pi.registerCommand("websearch",{description:"Show web search provider status",handler:async(rawArgs,ctx)=>{let args=rawArgs.trim();if(args!==""&&args!=="status"){ctx.ui.notify("Usage: /websearch status","warning");return}if(state.ok){let native=nativeModelStatus(state.config,ctx),summary=`Web search active: strategy=${state.config.strategy}, auto=${state.config.auto?"enabled":"disabled"}, providers=${providerList(state.config)}${native.text}`;ctx.ui.notify(native.warning?`${summary}
2325
- Warning: ${native.warning}`:summary,native.warning?"warning":"info");return}ctx.ui.notify(state.reason==="provider_native_bypass"?`Web search deferred: ${state.message}`:`Web search inactive: ${state.message}`,state.reason==="provider_native_bypass"?"info":"error")}})}var globalDefaultExtensionIds=["diff","files","prompt-url-widget","tps"],globalDefaultExtensionFactories={diff:diff_default,files:files_default,"prompt-url-widget":promptUrlWidgetExtension,tps:tps_default},builtinExtensions=[{id:"loop-guard",factory:loopGuardExtension},{id:"hooks",factory:hooksExtension},{id:"permission-system",factory:permissionSystemExtension},{id:"gpt-apply-patch",factory:extension_default},{id:"ask-user",factory:askUserExtension},{id:"herdr",factory:herdrExtension},{id:"imagegen",factory:imageGenExtension},{id:"openai-image-gen",factory:openaiImageGenExtension},{id:"prompt-preset",factory:promptPresetExtension},{id:"todowrite",factory:todotoolsExtension},{id:"redraws",factory:redraws_default},{id:"anthropic-web-search",factory:anthropicWebSearchExtension},{id:"anthropic-bash",factory:anthropicBashExtension},{id:"openai-web-search",factory:openaiWebSearchExtension},{id:"service-tier",factory:serviceTierExtension},{id:"reasoning",factory:reasoningExtension},{id:"model-fallback",factory:modelFallbackExtension},{id:"recommended-models",factory:recommendedModelsExtension},{id:"bash-timeout",factory:bashTimeoutExtension},{id:"terminal",factory:extension_default2},{id:"tool-pair-guard",factory:toolPairGuardExtension},{id:"compaction",factory:compactionExtension},{id:"history-search",factory:historySearchExtension},{id:"help",factory:helpExtension},{id:"import-repro",factory:import_repro_default},{id:"repository-identity",factory:repository_identity_default},{id:"websearch",factory:websearch_default},{id:"webfetch",factory:webfetch_default},{id:"video-in",factory:videoInExtension},{id:"look-at",factory:lookAtExtension},{id:"nested-agents-md",factory:nestedAgentsMd},{id:"rules",factory:piRulesExtension},{id:"goal",factory:goalExtension},{id:"loop",factory:loop_default},{id:"schedule",factory:scheduleExtension},{id:"cache-keepalive",factory:cache_keepalive_default},{id:"ttsr",factory:ttsrExtension},{id:"btw",factory:btwExtension},{id:"account",factory:accountExtension},{id:"gpt-account",factory:gptAccountExtension},{id:"claude-sdk-oauth",factory:anthropicSubscriptionExtension},{id:"cursor-cli-oauth",factory:cursorCliOauthExtension},{id:"config-reload",factory:config_reload_default},{id:"tool-search",factory:toolSearchExtension},{id:"mcp",factory:mcpExtension}];import{execFile as execFile5}from"child_process";import{existsSync as existsSync31,readFileSync as readFileSync36,statSync as statSync17,unwatchFile,watchFile}from"fs";import{dirname as dirname35,join as join64,resolve as resolve31}from"path";function findGitPaths(cwd){let dir=cwd;for(;;){let gitPath=join64(dir,".git");if(existsSync31(gitPath))try{let stat13=statSync17(gitPath);if(stat13.isFile()){let content=readFileSync36(gitPath,"utf8").trim();if(content.startsWith("gitdir: ")){let gitDir=resolve31(dir,content.slice(8).trim()),headPath=join64(gitDir,"HEAD");if(!existsSync31(headPath))return null;let commonDirPath=join64(gitDir,"commondir"),commonGitDir=existsSync31(commonDirPath)?resolve31(gitDir,readFileSync36(commonDirPath,"utf8").trim()):gitDir;return{repoDir:dir,commonGitDir,headPath}}}else if(stat13.isDirectory()){let headPath=join64(gitPath,"HEAD");return existsSync31(headPath)?{repoDir:dir,commonGitDir:gitPath,headPath}:null}}catch{return null}let parent=dirname35(dir);if(parent===dir)return null;dir=parent}}function resolveBranchWithGitAsync(repoDir){return new Promise(resolvePromise=>{execFile5("git",["--no-optional-locks","symbolic-ref","--quiet","--short","HEAD"],{cwd:repoDir,encoding:"utf8"},(error2,stdout)=>{if(error2){resolvePromise(null);return}let branch=stdout.trim();resolvePromise(branch||null)})})}function isWslEnvironment(){return process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP)}function isWindowsMountedRepoPath(repoDir){return/^\/mnt\/[a-z](?:\/|$)/i.test(repoDir)}function shouldPollGitHead(repoDir){return isWslEnvironment()&&isWindowsMountedRepoPath(repoDir)}var FooterDataProvider=class _FooterDataProvider{static{this.WATCH_DEBOUNCE_MS=500}constructor(cwd){this.extensionStatuses=new Map,this.cachedBranch=void 0,this.gitPaths=void 0,this.headWatcher=null,this.headWatchFilePath=null,this.headWatchFileListener=null,this.reftableWatcher=null,this.reftableTablesListWatcher=null,this.reftableTablesListPath=null,this.branchChangeCallbacks=new Set,this.availableProviderCount=0,this.refreshTimer=null,this.gitWatcherRetryTimer=null,this.refreshInFlight=!1,this.refreshPending=!1,this.disposed=!1,this.cwd=cwd,this.gitPaths=findGitPaths(cwd),this.setupGitWatcher()}getGitBranch(){if(this.cachedBranch===void 0){let head=this.readBranchFromHead();this.cachedBranch=head.branch,head.needsGitProbe&&this.refreshGitBranchAsync()}return this.cachedBranch}getExtensionStatuses(){return this.extensionStatuses}onBranchChange(callback){return this.branchChangeCallbacks.add(callback),()=>this.branchChangeCallbacks.delete(callback)}setExtensionStatus(key,text2){text2===void 0?this.extensionStatuses.delete(key):this.extensionStatuses.set(key,text2)}clearExtensionStatuses(){this.extensionStatuses.clear()}getAvailableProviderCount(){return this.availableProviderCount}setAvailableProviderCount(count){this.availableProviderCount=count}setCwd(cwd){this.cwd!==cwd&&(this.cwd=cwd,this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.clearGitWatchers(),this.cachedBranch=void 0,this.gitPaths=findGitPaths(cwd),this.setupGitWatcher(),this.notifyBranchChange())}dispose(){this.disposed=!0,this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.clearGitWatchers(),this.branchChangeCallbacks.clear()}notifyBranchChange(){for(let cb of this.branchChangeCallbacks)cb()}scheduleRefresh(){if(!(this.disposed||this.refreshTimer)){if(this.refreshInFlight){this.refreshPending=!0;return}this.refreshTimer=setTimeout(()=>{this.refreshTimer=null,this.refreshGitBranchAsync()},_FooterDataProvider.WATCH_DEBOUNCE_MS)}}async refreshGitBranchAsync(){if(!this.disposed){if(this.refreshInFlight){this.refreshPending=!0;return}this.refreshInFlight=!0;try{let nextBranch=await this.resolveGitBranchAsync();if(this.disposed)return;if(this.cachedBranch!==void 0&&this.cachedBranch!==nextBranch){this.cachedBranch=nextBranch,this.notifyBranchChange();return}this.cachedBranch=nextBranch}finally{this.refreshInFlight=!1,this.refreshPending&&!this.disposed&&(this.refreshPending=!1,this.scheduleRefresh())}}}readBranchFromHead(){try{if(!this.gitPaths)return{branch:null,needsGitProbe:!1};let content=readFileSync36(this.gitPaths.headPath,"utf8").trim();if(!content.startsWith("ref: refs/heads/"))return{branch:"detached",needsGitProbe:!1};let branch=content.slice(16);return branch===".invalid"?{branch:"detached",needsGitProbe:!0}:{branch,needsGitProbe:!1}}catch{return{branch:null,needsGitProbe:!1}}}async resolveGitBranchAsync(){let head=this.readBranchFromHead();return!head.needsGitProbe||!this.gitPaths?head.branch:await resolveBranchWithGitAsync(this.gitPaths.repoDir)??"detached"}clearGitWatchers(){closeWatcher(this.headWatcher),this.headWatcher=null,this.headWatchFilePath&&this.headWatchFileListener&&(unwatchFile(this.headWatchFilePath,this.headWatchFileListener),this.headWatchFilePath=null,this.headWatchFileListener=null),closeWatcher(this.reftableWatcher),this.reftableWatcher=null,closeWatcher(this.reftableTablesListWatcher),this.reftableTablesListWatcher=null,this.reftableTablesListPath&&(unwatchFile(this.reftableTablesListPath),this.reftableTablesListPath=null),this.gitWatcherRetryTimer&&(clearTimeout(this.gitWatcherRetryTimer),this.gitWatcherRetryTimer=null)}scheduleGitWatcherRetry(){this.disposed||this.gitWatcherRetryTimer||(this.gitWatcherRetryTimer=setTimeout(()=>{this.gitWatcherRetryTimer=null,this.setupGitWatcher()},FS_WATCH_RETRY_DELAY_MS))}handleGitWatcherError(){this.clearGitWatchers(),this.scheduleGitWatcherRetry()}setupGitWatcher(){if(this.clearGitWatchers(),!this.gitPaths)return;let pollGitHead=shouldPollGitHead(this.gitPaths.repoDir);this.headWatcher=watchWithErrorHandler(dirname35(this.gitPaths.headPath),(_eventType,filename)=>{(!filename||filename==="HEAD")&&this.scheduleRefresh()},()=>this.handleGitWatcherError()),pollGitHead&&(this.headWatchFilePath=this.gitPaths.headPath,this.headWatchFileListener=(current,previous)=>{(current.mtimeMs!==previous.mtimeMs||current.ctimeMs!==previous.ctimeMs||current.size!==previous.size)&&this.scheduleRefresh()},watchFile(this.headWatchFilePath,{interval:1e3},this.headWatchFileListener));let reftableDir=join64(this.gitPaths.commonGitDir,"reftable");if(existsSync31(reftableDir)){this.reftableWatcher=watchWithErrorHandler(reftableDir,()=>{this.scheduleRefresh()},()=>this.handleGitWatcherError());let tablesListPath=join64(reftableDir,"tables.list");if(existsSync31(tablesListPath)){this.reftableTablesListWatcher=watchWithErrorHandler(tablesListPath,()=>{this.scheduleRefresh()},()=>this.handleGitWatcherError()),this.reftableTablesListPath=tablesListPath;let previousTablesListContent;try{previousTablesListContent=readFileSync36(tablesListPath,"utf8")}catch{}watchFile(tablesListPath,{interval:250},(current,previous)=>{let contentChanged=!1;try{let currentContent=readFileSync36(tablesListPath,"utf8");contentChanged=previousTablesListContent!==currentContent,previousTablesListContent=currentContent}catch{contentChanged=!0}(contentChanged||current.mtimeMs!==previous.mtimeMs||current.ctimeMs!==previous.ctimeMs||current.size!==previous.size)&&this.scheduleRefresh()})}}}};import{existsSync as existsSync32,readFileSync as readFileSync37,statSync as statSync18}from"node:fs";import{join as join65,relative as relative14,resolve as resolve32}from"node:path";function findNearestPackageIdentity(resourcePath){if(resourcePath.startsWith("<"))return;let normalizedResourcePath=resolve32(resourcePath),currentPath=resolve32(resourcePath);try{statSync18(currentPath).isDirectory()||(currentPath=resolve32(currentPath,".."))}catch{currentPath=resolve32(currentPath,"..")}for(;;){let packageJsonPath=join65(currentPath,"package.json");if(existsSync32(packageJsonPath))try{let packageJson=JSON.parse(readFileSync37(packageJsonPath,"utf-8"));return typeof packageJson.name!="string"||packageJson.name.length===0?void 0:{key:`${packageJson.name}:${relative14(currentPath,normalizedResourcePath)}`,packageName:packageJson.name}}catch{return}let parentPath=resolve32(currentPath,"..");if(parentPath===currentPath)return;currentPath=parentPath}}function dedupePathsByPackageIdentity(paths){let dedupedPaths=[],seenIdentityKeys=new Set;for(let path13 of paths){let packageIdentity=findNearestPackageIdentity(path13);if(packageIdentity){if(seenIdentityKeys.has(packageIdentity.key))continue;seenIdentityKeys.add(packageIdentity.key)}dedupedPaths.push(path13)}return dedupedPaths}import{existsSync as existsSync33,readdirSync as readdirSync8,readFileSync as readFileSync38,statSync as statSync19}from"fs";import{basename as basename19,dirname as dirname36,join as join66,resolve as resolve33,sep as sep10}from"path";function parseCommandArgs2(argsString){let args=[],current="",inQuote=null;for(let i=0;i<argsString.length;i++){let char=argsString[i];inQuote?char===inQuote?inQuote=null:current+=char:char==='"'||char==="'"?inQuote=char:/\s/.test(char)?current&&(args.push(current),current=""):current+=char}return current&&args.push(current),args}function substituteArgs2(content,args){let allArgs=args.join(" ");return content.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(_match,defaultTarget,defaultValue,sliceStart,sliceLength,simple)=>{if(defaultTarget){let value2=defaultTarget==="@"||defaultTarget==="ARGUMENTS"?allArgs:args[parseInt(defaultTarget,10)-1];return value2||defaultValue}if(sliceStart){let start=parseInt(sliceStart,10)-1;if(start<0&&(start=0),sliceLength){let length=parseInt(sliceLength,10);return args.slice(start,start+length).join(" ")}return args.slice(start).join(" ")}if(simple==="ARGUMENTS"||simple==="@")return allArgs;let index=parseInt(simple,10)-1;return args[index]??""})}function loadTemplateFromFile2(filePath,sourceInfo){try{let rawContent=readFileSync38(filePath,"utf-8"),{frontmatter,body}=parseFrontmatter3(rawContent),name=basename19(filePath).replace(/\.md$/,""),description=frontmatter.description||"";if(!description){let firstLine2=body.split(`
2332
+ Warning: ${native.warning}`:summary,native.warning?"warning":"info");return}ctx.ui.notify(state.reason==="provider_native_bypass"?`Web search deferred: ${state.message}`:`Web search inactive: ${state.message}`,state.reason==="provider_native_bypass"?"info":"error")}})}var globalDefaultExtensionIds=["diff","files","prompt-url-widget","tps"],globalDefaultExtensionFactories={diff:diff_default,files:files_default,"prompt-url-widget":promptUrlWidgetExtension,tps:tps_default},builtinExtensions=[{id:"loop-guard",factory:loopGuardExtension},{id:"hooks",factory:hooksExtension},{id:"permission-system",factory:permissionSystemExtension},{id:"gpt-apply-patch",factory:extension_default},{id:"ask-user",factory:askUserExtension},{id:"herdr",factory:herdrExtension},{id:"imagegen",factory:imageGenExtension},{id:"openai-image-gen",factory:openaiImageGenExtension},{id:"prompt-preset",factory:promptPresetExtension},{id:"chat-reply-scrub",factory:chatReplyScrubExtension},{id:"todowrite",factory:todotoolsExtension},{id:"redraws",factory:redraws_default},{id:"anthropic-web-search",factory:anthropicWebSearchExtension},{id:"anthropic-bash",factory:anthropicBashExtension},{id:"openai-web-search",factory:openaiWebSearchExtension},{id:"service-tier",factory:serviceTierExtension},{id:"reasoning",factory:reasoningExtension},{id:"model-fallback",factory:modelFallbackExtension},{id:"recommended-models",factory:recommendedModelsExtension},{id:"bash-timeout",factory:bashTimeoutExtension},{id:"terminal",factory:extension_default2},{id:"tool-pair-guard",factory:toolPairGuardExtension},{id:"compaction",factory:compactionExtension},{id:"history-search",factory:historySearchExtension},{id:"help",factory:helpExtension},{id:"import-repro",factory:import_repro_default},{id:"repository-identity",factory:repository_identity_default},{id:"websearch",factory:websearch_default},{id:"webfetch",factory:webfetch_default},{id:"video-in",factory:videoInExtension},{id:"look-at",factory:lookAtExtension},{id:"nested-agents-md",factory:nestedAgentsMd},{id:"rules",factory:piRulesExtension},{id:"goal",factory:goalExtension},{id:"loop",factory:loop_default},{id:"schedule",factory:scheduleExtension},{id:"cache-keepalive",factory:cache_keepalive_default},{id:"ttsr",factory:ttsrExtension},{id:"btw",factory:btwExtension},{id:"account",factory:accountExtension},{id:"gpt-account",factory:gptAccountExtension},{id:"claude-sdk-oauth",factory:anthropicSubscriptionExtension},{id:"cursor-cli-oauth",factory:cursorCliOauthExtension},{id:"config-reload",factory:config_reload_default},{id:"tool-search",factory:toolSearchExtension},{id:"mcp",factory:mcpExtension}];import{execFile as execFile5}from"child_process";import{existsSync as existsSync31,readFileSync as readFileSync36,statSync as statSync17,unwatchFile,watchFile}from"fs";import{dirname as dirname35,join as join64,resolve as resolve31}from"path";function findGitPaths(cwd){let dir=cwd;for(;;){let gitPath=join64(dir,".git");if(existsSync31(gitPath))try{let stat13=statSync17(gitPath);if(stat13.isFile()){let content=readFileSync36(gitPath,"utf8").trim();if(content.startsWith("gitdir: ")){let gitDir=resolve31(dir,content.slice(8).trim()),headPath=join64(gitDir,"HEAD");if(!existsSync31(headPath))return null;let commonDirPath=join64(gitDir,"commondir"),commonGitDir=existsSync31(commonDirPath)?resolve31(gitDir,readFileSync36(commonDirPath,"utf8").trim()):gitDir;return{repoDir:dir,commonGitDir,headPath}}}else if(stat13.isDirectory()){let headPath=join64(gitPath,"HEAD");return existsSync31(headPath)?{repoDir:dir,commonGitDir:gitPath,headPath}:null}}catch{return null}let parent=dirname35(dir);if(parent===dir)return null;dir=parent}}function resolveBranchWithGitAsync(repoDir){return new Promise(resolvePromise=>{execFile5("git",["--no-optional-locks","symbolic-ref","--quiet","--short","HEAD"],{cwd:repoDir,encoding:"utf8"},(error2,stdout)=>{if(error2){resolvePromise(null);return}let branch=stdout.trim();resolvePromise(branch||null)})})}function isWslEnvironment(){return process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP)}function isWindowsMountedRepoPath(repoDir){return/^\/mnt\/[a-z](?:\/|$)/i.test(repoDir)}function shouldPollGitHead(repoDir){return isWslEnvironment()&&isWindowsMountedRepoPath(repoDir)}var FooterDataProvider=class _FooterDataProvider{static{this.WATCH_DEBOUNCE_MS=500}constructor(cwd){this.extensionStatuses=new Map,this.cachedBranch=void 0,this.gitPaths=void 0,this.headWatcher=null,this.headWatchFilePath=null,this.headWatchFileListener=null,this.reftableWatcher=null,this.reftableTablesListWatcher=null,this.reftableTablesListPath=null,this.branchChangeCallbacks=new Set,this.availableProviderCount=0,this.refreshTimer=null,this.gitWatcherRetryTimer=null,this.refreshInFlight=!1,this.refreshPending=!1,this.disposed=!1,this.cwd=cwd,this.gitPaths=findGitPaths(cwd),this.setupGitWatcher()}getGitBranch(){if(this.cachedBranch===void 0){let head=this.readBranchFromHead();this.cachedBranch=head.branch,head.needsGitProbe&&this.refreshGitBranchAsync()}return this.cachedBranch}getExtensionStatuses(){return this.extensionStatuses}onBranchChange(callback){return this.branchChangeCallbacks.add(callback),()=>this.branchChangeCallbacks.delete(callback)}setExtensionStatus(key,text2){text2===void 0?this.extensionStatuses.delete(key):this.extensionStatuses.set(key,text2)}clearExtensionStatuses(){this.extensionStatuses.clear()}getAvailableProviderCount(){return this.availableProviderCount}setAvailableProviderCount(count){this.availableProviderCount=count}setCwd(cwd){this.cwd!==cwd&&(this.cwd=cwd,this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.clearGitWatchers(),this.cachedBranch=void 0,this.gitPaths=findGitPaths(cwd),this.setupGitWatcher(),this.notifyBranchChange())}dispose(){this.disposed=!0,this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.clearGitWatchers(),this.branchChangeCallbacks.clear()}notifyBranchChange(){for(let cb of this.branchChangeCallbacks)cb()}scheduleRefresh(){if(!(this.disposed||this.refreshTimer)){if(this.refreshInFlight){this.refreshPending=!0;return}this.refreshTimer=setTimeout(()=>{this.refreshTimer=null,this.refreshGitBranchAsync()},_FooterDataProvider.WATCH_DEBOUNCE_MS)}}async refreshGitBranchAsync(){if(!this.disposed){if(this.refreshInFlight){this.refreshPending=!0;return}this.refreshInFlight=!0;try{let nextBranch=await this.resolveGitBranchAsync();if(this.disposed)return;if(this.cachedBranch!==void 0&&this.cachedBranch!==nextBranch){this.cachedBranch=nextBranch,this.notifyBranchChange();return}this.cachedBranch=nextBranch}finally{this.refreshInFlight=!1,this.refreshPending&&!this.disposed&&(this.refreshPending=!1,this.scheduleRefresh())}}}readBranchFromHead(){try{if(!this.gitPaths)return{branch:null,needsGitProbe:!1};let content=readFileSync36(this.gitPaths.headPath,"utf8").trim();if(!content.startsWith("ref: refs/heads/"))return{branch:"detached",needsGitProbe:!1};let branch=content.slice(16);return branch===".invalid"?{branch:"detached",needsGitProbe:!0}:{branch,needsGitProbe:!1}}catch{return{branch:null,needsGitProbe:!1}}}async resolveGitBranchAsync(){let head=this.readBranchFromHead();return!head.needsGitProbe||!this.gitPaths?head.branch:await resolveBranchWithGitAsync(this.gitPaths.repoDir)??"detached"}clearGitWatchers(){closeWatcher(this.headWatcher),this.headWatcher=null,this.headWatchFilePath&&this.headWatchFileListener&&(unwatchFile(this.headWatchFilePath,this.headWatchFileListener),this.headWatchFilePath=null,this.headWatchFileListener=null),closeWatcher(this.reftableWatcher),this.reftableWatcher=null,closeWatcher(this.reftableTablesListWatcher),this.reftableTablesListWatcher=null,this.reftableTablesListPath&&(unwatchFile(this.reftableTablesListPath),this.reftableTablesListPath=null),this.gitWatcherRetryTimer&&(clearTimeout(this.gitWatcherRetryTimer),this.gitWatcherRetryTimer=null)}scheduleGitWatcherRetry(){this.disposed||this.gitWatcherRetryTimer||(this.gitWatcherRetryTimer=setTimeout(()=>{this.gitWatcherRetryTimer=null,this.setupGitWatcher()},FS_WATCH_RETRY_DELAY_MS))}handleGitWatcherError(){this.clearGitWatchers(),this.scheduleGitWatcherRetry()}setupGitWatcher(){if(this.clearGitWatchers(),!this.gitPaths)return;let pollGitHead=shouldPollGitHead(this.gitPaths.repoDir);this.headWatcher=watchWithErrorHandler(dirname35(this.gitPaths.headPath),(_eventType,filename)=>{(!filename||filename==="HEAD")&&this.scheduleRefresh()},()=>this.handleGitWatcherError()),pollGitHead&&(this.headWatchFilePath=this.gitPaths.headPath,this.headWatchFileListener=(current,previous)=>{(current.mtimeMs!==previous.mtimeMs||current.ctimeMs!==previous.ctimeMs||current.size!==previous.size)&&this.scheduleRefresh()},watchFile(this.headWatchFilePath,{interval:1e3},this.headWatchFileListener));let reftableDir=join64(this.gitPaths.commonGitDir,"reftable");if(existsSync31(reftableDir)){this.reftableWatcher=watchWithErrorHandler(reftableDir,()=>{this.scheduleRefresh()},()=>this.handleGitWatcherError());let tablesListPath=join64(reftableDir,"tables.list");if(existsSync31(tablesListPath)){this.reftableTablesListWatcher=watchWithErrorHandler(tablesListPath,()=>{this.scheduleRefresh()},()=>this.handleGitWatcherError()),this.reftableTablesListPath=tablesListPath;let previousTablesListContent;try{previousTablesListContent=readFileSync36(tablesListPath,"utf8")}catch{}watchFile(tablesListPath,{interval:250},(current,previous)=>{let contentChanged=!1;try{let currentContent=readFileSync36(tablesListPath,"utf8");contentChanged=previousTablesListContent!==currentContent,previousTablesListContent=currentContent}catch{contentChanged=!0}(contentChanged||current.mtimeMs!==previous.mtimeMs||current.ctimeMs!==previous.ctimeMs||current.size!==previous.size)&&this.scheduleRefresh()})}}}};import{existsSync as existsSync32,readFileSync as readFileSync37,statSync as statSync18}from"node:fs";import{join as join65,relative as relative14,resolve as resolve32}from"node:path";function findNearestPackageIdentity(resourcePath){if(resourcePath.startsWith("<"))return;let normalizedResourcePath=resolve32(resourcePath),currentPath=resolve32(resourcePath);try{statSync18(currentPath).isDirectory()||(currentPath=resolve32(currentPath,".."))}catch{currentPath=resolve32(currentPath,"..")}for(;;){let packageJsonPath=join65(currentPath,"package.json");if(existsSync32(packageJsonPath))try{let packageJson=JSON.parse(readFileSync37(packageJsonPath,"utf-8"));return typeof packageJson.name!="string"||packageJson.name.length===0?void 0:{key:`${packageJson.name}:${relative14(currentPath,normalizedResourcePath)}`,packageName:packageJson.name}}catch{return}let parentPath=resolve32(currentPath,"..");if(parentPath===currentPath)return;currentPath=parentPath}}function dedupePathsByPackageIdentity(paths){let dedupedPaths=[],seenIdentityKeys=new Set;for(let path13 of paths){let packageIdentity=findNearestPackageIdentity(path13);if(packageIdentity){if(seenIdentityKeys.has(packageIdentity.key))continue;seenIdentityKeys.add(packageIdentity.key)}dedupedPaths.push(path13)}return dedupedPaths}import{existsSync as existsSync33,readdirSync as readdirSync8,readFileSync as readFileSync38,statSync as statSync19}from"fs";import{basename as basename19,dirname as dirname36,join as join66,resolve as resolve33,sep as sep10}from"path";function parseCommandArgs2(argsString){let args=[],current="",inQuote=null;for(let i=0;i<argsString.length;i++){let char=argsString[i];inQuote?char===inQuote?inQuote=null:current+=char:char==='"'||char==="'"?inQuote=char:/\s/.test(char)?current&&(args.push(current),current=""):current+=char}return current&&args.push(current),args}function substituteArgs2(content,args){let allArgs=args.join(" ");return content.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(_match,defaultTarget,defaultValue,sliceStart,sliceLength,simple)=>{if(defaultTarget){let value2=defaultTarget==="@"||defaultTarget==="ARGUMENTS"?allArgs:args[parseInt(defaultTarget,10)-1];return value2||defaultValue}if(sliceStart){let start=parseInt(sliceStart,10)-1;if(start<0&&(start=0),sliceLength){let length=parseInt(sliceLength,10);return args.slice(start,start+length).join(" ")}return args.slice(start).join(" ")}if(simple==="ARGUMENTS"||simple==="@")return allArgs;let index=parseInt(simple,10)-1;return args[index]??""})}function loadTemplateFromFile2(filePath,sourceInfo){try{let rawContent=readFileSync38(filePath,"utf-8"),{frontmatter,body}=parseFrontmatter3(rawContent),name=basename19(filePath).replace(/\.md$/,""),description=frontmatter.description||"";if(!description){let firstLine2=body.split(`
2326
2333
  `).find(line=>line.trim());firstLine2&&(description=firstLine2.slice(0,60),firstLine2.length>60&&(description+="..."))}return{name,description,...frontmatter["argument-hint"]&&{argumentHint:frontmatter["argument-hint"]},content:body,sourceInfo,filePath}}catch{return null}}function loadTemplatesFromDir2(dir,getSourceInfo){let templates=[];if(!existsSync33(dir))return templates;try{let entries=readdirSync8(dir,{withFileTypes:!0});for(let entry of entries){let fullPath=join66(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync19(fullPath).isFile()}catch{continue}if(isFile&&entry.name.endsWith(".md")){let template=loadTemplateFromFile2(fullPath,getSourceInfo(fullPath));template&&templates.push(template)}}}catch{return templates}return templates}function loadPromptTemplates2(options){let resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(options.agentDir),promptPaths=options.promptPaths,includeDefaults=options.includeDefaults,templates=[],globalPromptsDir=join66(resolvedAgentDir,"prompts"),projectPromptsDir=resolve33(resolvedCwd,CONFIG_DIR_NAME,"prompts"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve33(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep10)?normalizedRoot:`${normalizedRoot}${sep10}`;return target.startsWith(prefix)},getSourceInfo=resolvedPath=>isUnderPath2(resolvedPath,globalPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"user",baseDir:globalPromptsDir}):isUnderPath2(resolvedPath,projectPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"project",baseDir:projectPromptsDir}):createSyntheticSourceInfo(resolvedPath,{source:"local",baseDir:statSync19(resolvedPath).isDirectory()?resolvedPath:dirname36(resolvedPath)});includeDefaults&&(templates.push(...loadTemplatesFromDir2(globalPromptsDir,getSourceInfo)),templates.push(...loadTemplatesFromDir2(projectPromptsDir,getSourceInfo)));for(let rawPath of promptPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(existsSync33(resolvedPath))try{let stats=statSync19(resolvedPath);if(stats.isDirectory())templates.push(...loadTemplatesFromDir2(resolvedPath,getSourceInfo));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let template=loadTemplateFromFile2(resolvedPath,getSourceInfo(resolvedPath));template&&templates.push(template)}}catch{}}return templates}function expandPromptTemplateWithMetadata(text2,templates){if(!text2.startsWith("/"))return{text:text2};let match=text2.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!match)return{text:text2};let templateName=match[1],argsString=match[2]??"",template=templates.find(t=>t.name===templateName);if(template){let args=parseCommandArgs2(argsString);return{text:substituteArgs2(template.content,args),template}}return{text:text2}}var memo=new Map;function stable(value2){return value2===null||typeof value2!="object"?JSON.stringify(value2)??"undefined":Array.isArray(value2)?`[${value2.map(stable).join(",")}]`:`{${Object.entries(value2).filter(([,v])=>v!==void 0).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([k,v])=>`${JSON.stringify(k)}:${stable(v)}`).join(",")}}`}function resolvedPathsMemoKey(input){return stable(input)}function memoizeResolvedPaths(key,compute,options={}){let existing=options.refresh?void 0:memo.get(key);if(existing!==void 0)return memo.delete(key),memo.set(key,existing),existing;if(memo.size>=16){let oldest=memo.keys().next().value;oldest!==void 0&&memo.delete(oldest)}let pending=compute().catch(error2=>{throw memo.get(key)===pending&&memo.delete(key),error2});return memo.set(key,pending),pending}var ENABLED=envValue("TIMING")==="1",timingNamespaces=new Map;function now(){return performance.now()}function resetTimings(namespace="main"){ENABLED&&timingNamespaces.set(namespace,{timings:[],lastTime:now()})}function time(label3,namespace="main"){if(!ENABLED)return;let now2=performance.now();timingNamespaces.has(namespace)||resetTimings(namespace);let timingNamespace=timingNamespaces.get(namespace);timingNamespace.timings.push({label:label3,ms:now2-timingNamespace.lastTime}),timingNamespace.lastTime=now2}function recordTiming(label3,ms,namespace="main"){if(!ENABLED)return;let timingNamespace=timingNamespaces.get(namespace)??{timings:[],lastTime:now()};timingNamespaces.set(namespace,timingNamespace),timingNamespace.timings.push({label:label3,ms})}function printTimingGroup(title,timings){let printableTimings=timings.filter(timing=>timing.ms>=0);if(printableTimings.length!==0){console.error(`
2327
2334
  --- ${title} ---`);for(let t of printableTimings)console.error(` ${t.label}: ${Math.round(t.ms)}ms`);console.error(` TOTAL: ${Math.round(printableTimings.reduce((a,b)=>a+b.ms,0))}ms`),console.error(`${"-".repeat(title.length+8)}
2328
- `)}}function getTimings(namespace){return timingNamespaces.get(namespace)?.timings??[]}function formatTimings(namespace){let entries=getTimings(namespace).filter(entry=>entry.ms>=0);if(entries.length===0)return;let total=entries.reduce((sum,entry)=>sum+entry.ms,0);return`${entries.map(entry=>`${entry.label} ${Math.round(entry.ms)}ms`).join(" ")} | total ${Math.round(total)}ms`}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}function resolvePromptInput(input,description){if(input){if(existsSync34(input))try{return stripBom(readFileSync39(input,"utf-8"))}catch(error2){return console.error(source_default.yellow(`Warning: Could not read ${description} file ${input}: ${error2}`)),input}return input}}var GENERATED_GLOBAL_EXTENSION_BANNER=GENERATED_SHIM_BANNER,LEGACY_GENERATED_GLOBAL_EXTENSION_BANNERS=ACCEPTED_SHIM_BANNERS,VENDORED_BUILTIN_EXTENSION_PACKAGES=[{builtinId:"anthropic-bash",packageName:"pi-anthropic-bash"},{builtinId:"anthropic-web-search",packageName:"pi-anthropic-web-search"},{builtinId:"gpt-apply-patch",packageName:"pi-apply-patch"},{builtinId:"bash-timeout",packageName:"pi-bash-timeout"},{builtinId:"openai-web-search",packageName:"pi-openai-web-search"},{builtinId:"todowrite",packageName:"pi-todotools"},{builtinId:"codemode",packageName:"@code-yeongyu/senpi-codemode"}],moduleRequire=createRequire3(import.meta.url),bundledBuiltinExtensions=[{id:"codemode",resolvePackage:()=>resolveBundledPackageJson("@code-yeongyu/senpi-codemode/package.json","senpi-codemode/package.json",join67("node_modules","@code-yeongyu","senpi-codemode","package.json"))}];function resolveBundledPackageJson(packageSpecifier,workspaceRelativePath,binaryRelativePath){let packageRoot=getPackageDir(),runningFromSource=fileURLToPath4(import.meta.url).includes(`${sep11}src${sep11}core${sep11}resource-loader.`),workspacePath=resolve34(packageRoot,"..",workspaceRelativePath);if(runningFromSource&&existsSync34(workspacePath))return workspacePath;let binaryPath=resolve34(packageRoot,binaryRelativePath);if(isBunBinary&&existsSync34(binaryPath))return binaryPath;try{return moduleRequire.resolve(packageSpecifier)}catch(error2){if(existsSync34(workspacePath))return workspacePath;throw error2}}function isGeneratedGlobalDefaultExtensionShim(content){return LEGACY_GENERATED_GLOBAL_EXTENSION_BANNERS.some(banner=>content.startsWith(banner))}function canonicalizeGlobalDefaultExtensionModulePath(modulePath){try{return realpathSync9(modulePath)}catch{return modulePath}}function getGlobalDefaultExtensionModulePath(extensionId){let packageDir=getPackageDir(),runningFromSource=fileURLToPath4(import.meta.url).includes(`${sep11}src${sep11}core${sep11}resource-loader.`),sourceRoot=runningFromSource?"src":"dist",extensionFile=runningFromSource?`${extensionId}.ts`:`${extensionId}.js`,packageDirIsSourceRootPath=join67(packageDir,"core","extensions","builtin",extensionFile);return!runningFromSource&&existsSync34(packageDirIsSourceRootPath)?canonicalizeGlobalDefaultExtensionModulePath(packageDirIsSourceRootPath):canonicalizeGlobalDefaultExtensionModulePath(join67(packageDir,sourceRoot,"core","extensions","builtin",extensionFile))}function buildGlobalDefaultExtensionShim(modulePath){return`${GENERATED_GLOBAL_EXTENSION_BANNER}export { default } from ${JSON.stringify(pathToFileURL(modulePath).href)};
2335
+ `)}}function getTimings(namespace){return timingNamespaces.get(namespace)?.timings??[]}function formatTimings(namespace){let entries=getTimings(namespace).filter(entry=>entry.ms>=0);if(entries.length===0)return;let total=entries.reduce((sum,entry)=>sum+entry.ms,0);return`${entries.map(entry=>`${entry.label} ${Math.round(entry.ms)}ms`).join(" ")} | total ${Math.round(total)}ms`}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}function resolvePromptInput(input,description){if(input){if(existsSync34(input))try{return stripBom(readFileSync39(input,"utf-8"))}catch(error2){return console.error(source_default.yellow(`Warning: Could not read ${description} file ${input}: ${error2}`)),input}return input}}var GENERATED_GLOBAL_EXTENSION_BANNER=GENERATED_SHIM_BANNER,LEGACY_GENERATED_GLOBAL_EXTENSION_BANNERS=ACCEPTED_SHIM_BANNERS,VENDORED_BUILTIN_EXTENSION_PACKAGES=[{builtinId:"anthropic-bash",packageName:"pi-anthropic-bash"},{builtinId:"anthropic-web-search",packageName:"pi-anthropic-web-search"},{builtinId:"gpt-apply-patch",packageName:"pi-apply-patch"},{builtinId:"bash-timeout",packageName:"pi-bash-timeout"},{builtinId:"openai-web-search",packageName:"pi-openai-web-search"},{builtinId:"todowrite",packageName:"pi-todotools"},{builtinId:"codemode",packageName:"@code-yeongyu/senpi-codemode"}],moduleRequire=createRequire3(import.meta.url),bundledBuiltinExtensions=[{id:"codemode",resolvePackage:()=>resolveBundledPackageJson("@code-yeongyu/senpi-codemode/package.json","senpi-codemode/package.json",join67("node_modules","@code-yeongyu","senpi-codemode","package.json"))}];function resolveBundledPackageJson(packageSpecifier,workspaceRelativePath,binaryRelativePath){let packageRoot=getPackageDir(),runningFromSource=fileURLToPath4(import.meta.url).includes(`${sep11}src${sep11}core${sep11}resource-loader.`),workspacePath=resolve34(packageRoot,"..",workspaceRelativePath);if(runningFromSource&&existsSync34(workspacePath))return workspacePath;let binaryPath=resolve34(packageRoot,binaryRelativePath);if(isBunBinary&&existsSync34(binaryPath))return binaryPath;try{return moduleRequire.resolve(packageSpecifier)}catch(error2){if(existsSync34(workspacePath))return workspacePath;throw error2}}function isGeneratedGlobalDefaultExtensionShim(content){return LEGACY_GENERATED_GLOBAL_EXTENSION_BANNERS.some(banner=>content.startsWith(banner))}function canonicalizeGlobalDefaultExtensionModulePath(modulePath){let installPath=resolveInstallPath(modulePath,findNodePackageDir(dirname37(modulePath)));try{return realpathSync9(installPath)}catch{return installPath}}function getGlobalDefaultExtensionModulePath(extensionId){let packageDir=getPackageDir(),runningFromSource=fileURLToPath4(import.meta.url).includes(`${sep11}src${sep11}core${sep11}resource-loader.`),sourceRoot=runningFromSource?"src":"dist",extensionFile=runningFromSource?`${extensionId}.ts`:`${extensionId}.js`,packageDirIsSourceRootPath=join67(packageDir,"core","extensions","builtin",extensionFile);return!runningFromSource&&existsSync34(packageDirIsSourceRootPath)?canonicalizeGlobalDefaultExtensionModulePath(packageDirIsSourceRootPath):canonicalizeGlobalDefaultExtensionModulePath(join67(packageDir,sourceRoot,"core","extensions","builtin",extensionFile))}function buildGlobalDefaultExtensionShim(modulePath){return`${GENERATED_GLOBAL_EXTENSION_BANNER}export { default } from ${JSON.stringify(pathToFileURL(modulePath).href)};
2329
2336
  `}function getGlobalDefaultExtensionShimPath(agentDir,extensionId){return join67(agentDir,"extensions",`${extensionId}.js`)}function findGeneratedGlobalDefaultExtensionId(extensionPath,agentDir){if(resolve34(agentDir)!==resolve34(getAgentDir()))return;let resolvedExtensionPath=resolve34(extensionPath);for(let extensionId of globalDefaultExtensionIds)if(resolvedExtensionPath===resolve34(getGlobalDefaultExtensionShimPath(agentDir,extensionId)))return extensionId}function resolveGeneratedGlobalDefaultExtensionFactory(extensionPath,agentDir){let extensionId=findGeneratedGlobalDefaultExtensionId(extensionPath,agentDir);if(extensionId)try{let expectedShim=buildGlobalDefaultExtensionShim(getGlobalDefaultExtensionModulePath(extensionId));return readFileSync39(extensionPath,"utf-8")===expectedShim?globalDefaultExtensionFactories[extensionId]:void 0}catch{return}}function loadContextFileFromDir(dir){let candidates=["AGENTS.override.md","AGENTS.md","AGENTS.MD","CLAUDE.md","CLAUDE.MD"];for(let filename of candidates){let filePath=join67(dir,filename);if(existsSync34(filePath))try{if(!statSync20(filePath).isFile())continue;return{path:filePath,content:stripBom(readFileSync39(filePath,"utf-8"))}}catch(error2){console.error(source_default.yellow(`Warning: Could not read ${filePath}: ${error2}`))}}return null}function findShadowedContextFile(cwd){let gitPaths=findGitPaths(cwd);if(!gitPaths)return;let commonGitDir=canonicalizePath(gitPaths.commonGitDir),worktreeRoot=canonicalizePath(gitPaths.repoDir),mainRepoRoot=dirname37(commonGitDir);if(!worktreeRoot.startsWith(`${mainRepoRoot}${sep11}`)||canonicalizePath(join67(mainRepoRoot,".git"))!==commonGitDir)return;let worktreeContextFile=loadContextFileFromDir(worktreeRoot);return worktreeContextFile?join67(mainRepoRoot,basename20(worktreeContextFile.path)):void 0}function loadProjectContextFiles(options){let resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(options.agentDir),contextFiles=[],seenPaths=new Set,globalContext=loadContextFileFromDir(resolvedAgentDir);globalContext&&(contextFiles.push(globalContext),seenPaths.add(globalContext.path));let ancestorContextFiles=[],shadowedContextFile=findShadowedContextFile(resolvedCwd),currentDir=resolvedCwd;for(;;){let contextFile=loadContextFileFromDir(currentDir),isShadowed=shadowedContextFile!==void 0&&canonicalizePath(contextFile?.path??"")===shadowedContextFile;contextFile&&!isShadowed&&!seenPaths.has(contextFile.path)&&(ancestorContextFiles.unshift(contextFile),seenPaths.add(contextFile.path));let parentDir=dirname37(currentDir);if(parentDir===currentDir)break;currentDir=parentDir}return contextFiles.push(...ancestorContextFiles),contextFiles}var DefaultResourceLoader=class{constructor(options){this.cwd=resolvePath(options.cwd),this.agentDir=resolvePath(options.agentDir),this.settingsManager=options.settingsManager??SettingsManager.create(this.cwd,this.agentDir),this.extensionSession={sessionKind:options.sessionKind??"interactive",sessionContext:options.sessionContext??EMPTY_SESSION_CONTEXT},this.eventBus=options.eventBus??createEventBus(),this.packageManager=new DefaultPackageManager({cwd:this.cwd,agentDir:this.agentDir,settingsManager:this.settingsManager}),this.additionalExtensionPaths=options.additionalExtensionPaths??[],this.additionalSkillPaths=options.additionalSkillPaths??[],this.additionalPromptTemplatePaths=options.additionalPromptTemplatePaths??[],this.additionalThemePaths=options.additionalThemePaths??[],this.additionalHookPaths=options.additionalHookPaths??[],this.builtinExtensionFactories=options.mcpRegistry===void 0?builtinExtensions:builtinExtensions.map(extension=>extension.id==="mcp"?{...extension,factory:pi=>createMcpExtension(new McpService({mcpRegistry:options.mcpRegistry}))(pi)}:extension),this.extensionFactories=options.extensionFactories??[],this.noExtensions=options.noExtensions??!1,this.noSkills=options.noSkills??!1,this.noPromptTemplates=options.noPromptTemplates??!1,this.noThemes=options.noThemes??!1,this.noContextFiles=options.noContextFiles??!1,this.systemPromptSource=options.systemPrompt,this.appendSystemPromptSource=options.appendSystemPrompt,this.extensionsOverride=options.extensionsOverride,this.skillsOverride=options.skillsOverride,this.promptsOverride=options.promptsOverride,this.themesOverride=options.themesOverride,this.agentsFilesOverride=options.agentsFilesOverride,this.extensionsResult={extensions:[],errors:[],runtime:createExtensionRuntime()},this.skills=[],this.skillDiagnostics=[],this.prompts=[],this.promptDiagnostics=[],this.themes=[],this.themeDiagnostics=[],this.agentsFiles=[],this.appendSystemPrompt=[],this.appendSystemPromptSourcePaths=[],this.lastSkillPaths=[],this.extensionSkillSourceInfos=new Map,this.extensionPromptSourceInfos=new Map,this.extensionThemeSourceInfos=new Map,this.resourceMetadataByPath=new Map,this.lastPromptPaths=[],this.lastThemePaths=[],this.globalHookSourcePaths=[],this.projectHookSourcePaths=[],this.preSessionHookSourcePaths=[],this.loadedHookSources=this.buildLoadedHookSources([]),this.loaded=!1}getExtensions(){return this.extensionsResult}emitExtensionEvent(channel,data){this.eventBus.emit(channel,data)}onExtensionEvent(channel,handler){return this.eventBus.on(channel,handler)}getSkills(){return{skills:this.skills,diagnostics:this.skillDiagnostics}}getPrompts(){return{prompts:this.prompts,diagnostics:this.promptDiagnostics}}getThemes(){return{themes:this.themes,diagnostics:this.themeDiagnostics}}getAgentsFiles(){return{agentsFiles:this.agentsFiles}}getSystemPrompt(){return this.systemPrompt}getSystemPromptSource(){return this.systemPromptSourcePath?{path:this.systemPromptSourcePath}:void 0}getAppendSystemPrompt(){return this.appendSystemPrompt}getLoadedHookSources(){return this.loadedHookSources}getAppendSystemPromptSources(){return this.appendSystemPromptSourcePaths.map(path13=>({path:path13}))}extendResources(paths){let skillPaths=this.normalizeExtensionPaths(paths.skillPaths??[]),promptPaths=this.normalizeExtensionPaths(paths.promptPaths??[]),themePaths=this.normalizeExtensionPaths(paths.themePaths??[]),hookPaths=this.normalizeExtensionPaths(paths.hookPaths??[]);for(let entry of skillPaths)this.extensionSkillSourceInfos.set(entry.path,createSourceInfo(entry.path,entry.metadata));for(let entry of promptPaths)this.extensionPromptSourceInfos.set(entry.path,createSourceInfo(entry.path,entry.metadata));for(let entry of themePaths)this.extensionThemeSourceInfos.set(entry.path,createSourceInfo(entry.path,entry.metadata));if(skillPaths.length>0&&(this.lastSkillPaths=this.mergePaths(this.lastSkillPaths,skillPaths.map(entry=>entry.path)),this.updateSkillsFromPaths(this.lastSkillPaths,this.resourceMetadataByPath)),promptPaths.length>0&&(this.lastPromptPaths=this.mergePaths(this.lastPromptPaths,promptPaths.map(entry=>entry.path)),this.updatePromptsFromPaths(this.lastPromptPaths,this.resourceMetadataByPath)),themePaths.length>0&&(this.lastThemePaths=this.mergePaths(this.lastThemePaths,themePaths.map(entry=>entry.path)),this.updateThemesFromPaths(this.lastThemePaths,this.resourceMetadataByPath)),hookPaths.length>0){let runtimeHookSourcePaths=this.mergePaths([...this.loadedHookSources.runtimeHookSourcePaths],hookPaths.map(entry=>entry.path));this.loadedHookSources=this.buildLoadedHookSources(runtimeHookSourcePaths)}}async loadProjectTrustExtensions(options={}){return this.settingsManager.setProjectTrusted(!1),await this.settingsManager.reload(),this.loadCurrentExtensionSet({includeInlineFactories:!0,...options})}async reload(options){resetTimings("extensions");let refresh=this.loaded;refresh&&clearExtensionCache(),this.ensureGlobalDefaultExtensions();let preTrustExtensions;if(options?.resolveProjectTrust){preTrustExtensions=await this.loadProjectTrustExtensions({refresh});let projectTrusted=await options.resolveProjectTrust({extensionsResult:preTrustExtensions});this.settingsManager.setProjectTrusted(projectTrusted)}options?.settingsAlreadyReloadedFor===this.settingsManager&&options?.resolveProjectTrust===void 0||await this.settingsManager.reload();let{resolvedPaths,cliExtensionPaths}=await this.resolvePackagePaths({refresh});time("packageResolve","extensions"),this.resourceMetadataByPath=new Map;let metadataByPath=this.resourceMetadataByPath;this.extensionSkillSourceInfos=new Map,this.extensionPromptSourceInfos=new Map,this.extensionThemeSourceInfos=new Map;let getEnabledResources=resources=>{for(let r of resources)metadataByPath.has(r.path)||metadataByPath.set(r.path,r.metadata);return resources.filter(r=>r.enabled)},getEnabledPaths=resources=>getEnabledResources(resources).map(r=>r.path),enabledExtensions=getEnabledPaths(resolvedPaths.extensions),enabledSkillResources=getEnabledResources(resolvedPaths.skills),enabledPrompts=getEnabledPaths(resolvedPaths.prompts),enabledThemes=getEnabledPaths(resolvedPaths.themes),enabledHookResources=getEnabledResources(resolvedPaths.hooks),enabledSkills=enabledSkillResources.map(resource=>this.mapSkillPath(resource,metadataByPath)),cliMetadata=resource=>resource.metadata.scope==="system"?{source:"cli",scope:"system",origin:"top-level",baseDir:resource.metadata.baseDir}:{source:"cli",scope:"temporary",origin:"top-level"};for(let resources of[cliExtensionPaths.extensions,cliExtensionPaths.skills,cliExtensionPaths.prompts,cliExtensionPaths.themes,cliExtensionPaths.hooks])for(let r of resources)metadataByPath.set(r.path,cliMetadata(r));let cliEnabledExtensions=getEnabledPaths(cliExtensionPaths.extensions),cliEnabledSkills=getEnabledPaths(cliExtensionPaths.skills),cliEnabledPrompts=getEnabledPaths(cliExtensionPaths.prompts),cliEnabledThemes=getEnabledPaths(cliExtensionPaths.themes),cliEnabledHooks=getEnabledPaths(cliExtensionPaths.hooks);this.globalHookSourcePaths=enabledHookResources.filter(resource=>resource.metadata.scope==="user").map(resource=>resource.path),this.projectHookSourcePaths=enabledHookResources.filter(resource=>resource.metadata.scope==="project").map(resource=>resource.path),this.preSessionHookSourcePaths=this.mergePaths(cliEnabledHooks,this.additionalHookPaths),this.loadedHookSources=this.buildLoadedHookSources([...this.loadedHookSources.runtimeHookSourcePaths]);let extensionPaths=this.noExtensions?cliEnabledExtensions:this.mergePaths(cliEnabledExtensions,enabledExtensions),dedupedExtensionPaths=dedupePathsByPackageIdentity(this.shadowVendoredBuiltinExtensionPaths(extensionPaths,metadataByPath)),extensionsResult=await this.loadFinalExtensionSet(dedupedExtensionPaths,preTrustExtensions);for(let p of this.additionalExtensionPaths)if(isLocalPath(p)){let resolved=this.resolveResourcePath(p);existsSync34(resolved)||extensionsResult.errors.push({path:resolved,error:`Extension path does not exist: ${resolved}`})}this.extensionsResult=this.extensionsOverride?this.extensionsOverride(extensionsResult):extensionsResult,this.applyExtensionSourceInfo(this.extensionsResult.extensions,metadataByPath);let skillPaths=dedupePathsByPackageIdentity(this.noSkills?this.mergePaths(cliEnabledSkills,this.additionalSkillPaths):this.mergePaths([...cliEnabledSkills,...enabledSkills],this.additionalSkillPaths));this.lastSkillPaths=skillPaths,this.updateSkillsFromPaths(skillPaths,metadataByPath),time("skills","extensions");for(let p of this.additionalSkillPaths)if(isLocalPath(p)){let resolved=this.resolveResourcePath(p);!existsSync34(resolved)&&!this.skillDiagnostics.some(d=>d.path===resolved)&&this.skillDiagnostics.push({type:"error",message:"Skill path does not exist",path:resolved})}let promptPaths=this.noPromptTemplates?this.mergePaths(cliEnabledPrompts,this.additionalPromptTemplatePaths):this.mergePaths([...cliEnabledPrompts,...enabledPrompts],this.additionalPromptTemplatePaths);this.lastPromptPaths=promptPaths,this.updatePromptsFromPaths(promptPaths,metadataByPath),time("prompts","extensions");for(let p of this.additionalPromptTemplatePaths)if(isLocalPath(p)){let resolved=this.resolveResourcePath(p);!existsSync34(resolved)&&!this.promptDiagnostics.some(d=>d.path===resolved)&&this.promptDiagnostics.push({type:"error",message:"Prompt template path does not exist",path:resolved})}let themePaths=this.noThemes?this.mergePaths(cliEnabledThemes,this.additionalThemePaths):this.mergePaths([...cliEnabledThemes,...enabledThemes],this.additionalThemePaths);this.lastThemePaths=themePaths,this.updateThemesFromPaths(themePaths,metadataByPath),time("themes","extensions");for(let p of this.additionalThemePaths){let resolved=this.resolveResourcePath(p);!existsSync34(resolved)&&!this.themeDiagnostics.some(d=>d.path===resolved)&&this.themeDiagnostics.push({type:"error",message:"Theme path does not exist",path:resolved})}let agentsFiles={agentsFiles:this.noContextFiles?[]:loadProjectContextFiles({cwd:this.cwd,agentDir:this.agentDir})},resolvedAgentsFiles=this.agentsFilesOverride?this.agentsFilesOverride(agentsFiles):agentsFiles;this.agentsFiles=resolvedAgentsFiles.agentsFiles,time("contextFiles","extensions"),this.systemPrompt=resolvePromptInput(this.systemPromptSource,"system prompt"),this.appendSystemPrompt=(this.appendSystemPromptSource??[]).map(source=>resolvePromptInput(source,"append system prompt")).filter(source=>source!==void 0),this.systemPromptSourcePath=this.systemPromptSource&&existsSync34(this.systemPromptSource)?resolvePath(this.systemPromptSource):void 0,this.appendSystemPromptSourcePaths=(this.appendSystemPromptSource??[]).filter(source=>existsSync34(source)).map(source=>resolvePath(source)),this.loaded=!0}ensureGlobalDefaultExtensions(){if(resolve34(this.agentDir)!==resolve34(getAgentDir()))return;let extensionsDir=join67(this.agentDir,"extensions");mkdirSync18(extensionsDir,{recursive:!0});for(let extensionId of globalDefaultExtensionIds){let modulePath=getGlobalDefaultExtensionModulePath(extensionId);if(!existsSync34(modulePath))continue;let targetPath=getGlobalDefaultExtensionShimPath(this.agentDir,extensionId),shim=buildGlobalDefaultExtensionShim(modulePath);if(existsSync34(targetPath)){let existing=readFileSync39(targetPath,"utf-8");if(existing===shim||!isGeneratedGlobalDefaultExtensionShim(existing))continue;writeFileSync19(targetPath,shim,"utf-8");continue}writeFileSync19(targetPath,shim,"utf-8")}}resolvePackagePaths(options={}){return memoizeResolvedPaths(resolvedPathsMemoKey({agentDir:this.agentDir,cwd:this.cwd,projectTrusted:this.settingsManager.isProjectTrusted(),globalSettings:this.settingsManager.getGlobalSettings(),projectSettings:this.settingsManager.getProjectSettings(),additionalExtensionPaths:this.additionalExtensionPaths}),async()=>({resolvedPaths:await this.packageManager.resolve(),cliExtensionPaths:await this.packageManager.resolveExtensionSources(this.additionalExtensionPaths,{temporary:!0})}),options)}buildGlobalDefaultExtensionLoadOptions(){return{factoryResolver:(_extensionPath,resolvedPath)=>resolveGeneratedGlobalDefaultExtensionFactory(resolvedPath,this.agentDir),...this.extensionSession}}async loadCurrentExtensionSet(options){let{resolvedPaths,cliExtensionPaths}=await this.resolvePackagePaths({refresh:options.refresh}),enabledExtensions=resolvedPaths.extensions.filter(r=>r.enabled).map(r=>r.path),cliEnabledExtensions=cliExtensionPaths.extensions.filter(r=>r.enabled).map(r=>r.path),extensionPaths=this.noExtensions?cliEnabledExtensions:this.mergePaths(cliEnabledExtensions,enabledExtensions),extensionsResult=await loadExtensions(extensionPaths,this.cwd,this.eventBus,void 0,this.buildGlobalDefaultExtensionLoadOptions());if(!options.includeInlineFactories)return extensionsResult;let inlineExtensions=await this.loadExtensionFactories(extensionsResult.runtime);return extensionsResult.extensions.push(...inlineExtensions.extensions),extensionsResult.errors.push(...inlineExtensions.errors),extensionsResult}resolveExtensionLoadPath(path13){return resolvePath(path13,this.cwd,{normalizeUnicodeSpaces:!0})}async loadFinalExtensionSet(extensionPaths,preTrustExtensions){if(!preTrustExtensions){let extensionsResult2=await loadExtensions(extensionPaths,this.cwd,this.eventBus,void 0,this.buildGlobalDefaultExtensionLoadOptions()),inlineExtensions=await this.loadExtensionFactories(extensionsResult2.runtime);return extensionsResult2.extensions.unshift(...inlineExtensions.extensions),this.rebuildExtensionFlagDefaults(extensionsResult2),extensionsResult2.errors.push(...inlineExtensions.errors),this.addExtensionConflictDiagnostics(extensionsResult2),extensionsResult2}let preloadedByPath=new Map(preTrustExtensions.extensions.filter(extension=>!extension.path.startsWith("<inline:")).map(extension=>[extension.resolvedPath,extension])),failedPreloadPaths=new Set(preTrustExtensions.errors.map(error2=>this.resolveExtensionLoadPath(error2.path))),remainingPaths=extensionPaths.filter(path13=>{let resolvedPath=this.resolveExtensionLoadPath(path13);return!preloadedByPath.has(resolvedPath)&&!failedPreloadPaths.has(resolvedPath)}),remainingExtensions=await loadExtensions(remainingPaths,this.cwd,this.eventBus,preTrustExtensions.runtime,this.buildGlobalDefaultExtensionLoadOptions()),loadedByPath=new Map(preloadedByPath);for(let extension of remainingExtensions.extensions)loadedByPath.set(extension.resolvedPath,extension);let bundledExtensionPaths=this.getBundledExtensionEntryPaths(),factoryExtensions=preTrustExtensions.extensions.filter(extension=>extension.path.startsWith("<builtin:")||extension.path.startsWith("<inline:")||bundledExtensionPaths.has(extension.resolvedPath)),orderedExtensions=extensionPaths.map(path13=>loadedByPath.get(this.resolveExtensionLoadPath(path13))).filter(extension=>extension!==void 0);orderedExtensions.unshift(...factoryExtensions);let extensionsResult={extensions:orderedExtensions,errors:[...preTrustExtensions.errors,...remainingExtensions.errors],runtime:preTrustExtensions.runtime,eventBus:preTrustExtensions.eventBus??remainingExtensions.eventBus??this.eventBus};return this.rebuildExtensionFlagDefaults(extensionsResult),this.addExtensionConflictDiagnostics(extensionsResult),extensionsResult}addExtensionConflictDiagnostics(extensionsResult){let conflicts=this.detectExtensionConflicts(extensionsResult.extensions);for(let conflict of conflicts)extensionsResult.errors.push({path:conflict.path,error:conflict.message})}mapSkillPath(resource,metadataByPath){if(resource.metadata.source!=="auto"&&resource.metadata.origin!=="package")return resource.path;try{if(!statSync20(resource.path).isDirectory())return resource.path}catch{return resource.path}let skillFile=join67(resource.path,"SKILL.md");return existsSync34(skillFile)?(metadataByPath.has(skillFile)||metadataByPath.set(skillFile,resource.metadata),skillFile):resource.path}normalizeExtensionPaths(entries){return entries.map(entry=>{let metadata=entry.metadata.baseDir?{...entry.metadata,baseDir:this.resolveResourcePath(entry.metadata.baseDir)}:entry.metadata;return{path:this.resolveResourcePath(entry.path),metadata}})}buildLoadedHookSources(runtimeHookSourcePaths){return{agentDir:this.agentDir,cwd:this.cwd,globalHookSourcePaths:this.globalHookSourcePaths.map(path13=>this.resolveResourcePath(path13)),globalHooksPath:this.resolveResourcePath(join67(this.agentDir,"hooks.json")),preSessionHookSourcePaths:this.preSessionHookSourcePaths.map(path13=>this.resolveResourcePath(path13)),projectHookSourcePaths:this.projectHookSourcePaths.map(path13=>this.resolveResourcePath(path13)),projectHooksPath:this.resolveResourcePath(join67(this.cwd,CONFIG_DIR_NAME,"hooks.json")),runtimeHookSourcePaths:runtimeHookSourcePaths.map(path13=>this.resolveResourcePath(path13))}}updateSkillsFromPaths(skillPaths,metadataByPath){let skillsResult;this.noSkills&&skillPaths.length===0?skillsResult={skills:[],diagnostics:[]}:skillsResult=loadSkills2({cwd:this.cwd,agentDir:this.agentDir,skillPaths,includeDefaults:!1});let resolvedSkills=this.skillsOverride?this.skillsOverride(skillsResult):skillsResult;this.skills=resolvedSkills.skills.map(skill=>({...skill,sourceInfo:this.findSourceInfoForPath(skill.filePath,this.extensionSkillSourceInfos,metadataByPath)??skill.sourceInfo??this.getDefaultSourceInfoForPath(skill.filePath)})),this.skillDiagnostics=resolvedSkills.diagnostics}updatePromptsFromPaths(promptPaths,metadataByPath){let promptsResult;if(this.noPromptTemplates&&promptPaths.length===0)promptsResult={prompts:[],diagnostics:[]};else{let allPrompts=loadPromptTemplates2({cwd:this.cwd,agentDir:this.agentDir,promptPaths,includeDefaults:!1});promptsResult=this.dedupePrompts(allPrompts)}let resolvedPrompts=this.promptsOverride?this.promptsOverride(promptsResult):promptsResult;this.prompts=resolvedPrompts.prompts.map(prompt=>({...prompt,sourceInfo:this.findSourceInfoForPath(prompt.filePath,this.extensionPromptSourceInfos,metadataByPath)??prompt.sourceInfo??this.getDefaultSourceInfoForPath(prompt.filePath)})),this.promptDiagnostics=resolvedPrompts.diagnostics}updateThemesFromPaths(themePaths,metadataByPath){let themesResult;if(this.noThemes&&themePaths.length===0)themesResult={themes:[],diagnostics:[]};else{let loaded2=this.loadThemes(themePaths,!1),deduped=this.dedupeThemes(loaded2.themes);themesResult={themes:deduped.themes,diagnostics:[...loaded2.diagnostics,...deduped.diagnostics]}}let resolvedThemes=this.themesOverride?this.themesOverride(themesResult):themesResult;this.themes=resolvedThemes.themes.map(theme2=>{let sourcePath=theme2.sourcePath;return theme2.sourceInfo=sourcePath?this.findSourceInfoForPath(sourcePath,this.extensionThemeSourceInfos,metadataByPath)??theme2.sourceInfo??this.getDefaultSourceInfoForPath(sourcePath):theme2.sourceInfo,theme2}),this.themeDiagnostics=resolvedThemes.diagnostics}applyExtensionSourceInfo(extensions,metadataByPath){let bundledPackageRoots=this.getBundledExtensionPackageRoots();for(let extension of extensions){extension.sourceInfo=this.getHarnessExtensionSourceInfo(extension,bundledPackageRoots)??this.findSourceInfoForPath(extension.path,void 0,metadataByPath)??this.getDefaultSourceInfoForPath(extension.path);for(let command of extension.commands.values())command.sourceInfo=extension.sourceInfo;for(let tool of extension.tools.values())tool.sourceInfo=extension.sourceInfo}}findSourceInfoForPath(resourcePath,extraSourceInfos,metadataByPath){if(!resourcePath)return;if(resourcePath.startsWith("<"))return this.getDefaultSourceInfoForPath(resourcePath);let normalizedResourcePath=resolve34(resourcePath);if(extraSourceInfos)for(let[sourcePath,sourceInfo]of extraSourceInfos.entries()){let normalizedSourcePath=resolve34(sourcePath);if(normalizedResourcePath===normalizedSourcePath||normalizedResourcePath.startsWith(`${normalizedSourcePath}${sep11}`))return{...sourceInfo,path:resourcePath}}if(metadataByPath){let exact=metadataByPath.get(normalizedResourcePath)??metadataByPath.get(resourcePath);if(exact)return createSourceInfo(resourcePath,exact);for(let[sourcePath,metadata]of metadataByPath.entries()){let normalizedSourcePath=resolve34(sourcePath);if(normalizedResourcePath===normalizedSourcePath||normalizedResourcePath.startsWith(`${normalizedSourcePath}${sep11}`))return createSourceInfo(resourcePath,metadata)}}}getDefaultSourceInfoForPath(filePath){if(filePath.startsWith("<")&&filePath.endsWith(">")){let source=filePath.slice(1,-1).split(":")[0]||"temporary";return{path:filePath,source,scope:source==="builtin"?"system":"temporary",origin:"top-level"}}let normalizedPath=resolve34(filePath),agentRoots=[join67(this.agentDir,"skills"),join67(this.agentDir,"prompts"),join67(this.agentDir,"themes"),join67(this.agentDir,"extensions")],projectRoots=[join67(this.cwd,CONFIG_DIR_NAME,"skills"),join67(this.cwd,CONFIG_DIR_NAME,"prompts"),join67(this.cwd,CONFIG_DIR_NAME,"themes"),join67(this.cwd,CONFIG_DIR_NAME,"extensions")];for(let root of agentRoots)if(this.isUnderPath(normalizedPath,root))return{path:filePath,source:"local",scope:"user",origin:"top-level",baseDir:root};for(let root of projectRoots)if(this.isUnderPath(normalizedPath,root))return{path:filePath,source:"local",scope:"project",origin:"top-level",baseDir:root};return{path:filePath,source:"local",scope:"temporary",origin:"top-level",baseDir:statSync20(normalizedPath).isDirectory()?normalizedPath:resolve34(normalizedPath,"..")}}mergePaths(primary,additional){let merged=[],seen=new Set;for(let p of[...primary,...additional]){let resolved=this.resolveResourcePath(p),canonicalPath2=canonicalizePath(resolved);seen.has(canonicalPath2)||(seen.add(canonicalPath2),merged.push(resolved))}return merged}resolveResourcePath(p){return resolvePath(p,this.cwd,{trim:!0})}getActiveBuiltinExtensionIds(){let enabledBuiltinExtensions=this.settingsManager.getEnabledBuiltinExtensions(),enabledBuiltinExtensionSet=enabledBuiltinExtensions?new Set(enabledBuiltinExtensions):void 0,disabledBuiltinExtensions=new Set(this.settingsManager.getDisabledBuiltinExtensions()),activeBuiltinExtensionIds=new Set;for(let builtinExtension of this.builtinExtensionFactories)enabledBuiltinExtensionSet&&!enabledBuiltinExtensionSet.has(builtinExtension.id)||disabledBuiltinExtensions.has(builtinExtension.id)||activeBuiltinExtensionIds.add(builtinExtension.id);for(let bundledExtension of bundledBuiltinExtensions)enabledBuiltinExtensionSet&&!enabledBuiltinExtensionSet.has(bundledExtension.id)||disabledBuiltinExtensions.has(bundledExtension.id)||activeBuiltinExtensionIds.add(bundledExtension.id);return activeBuiltinExtensionIds}getShadowedVendoredBuiltinPackageNames(){let activeBuiltinExtensionIds=this.getActiveBuiltinExtensionIds(),packageNames=new Set;for(let{builtinId,packageName}of VENDORED_BUILTIN_EXTENSION_PACKAGES)activeBuiltinExtensionIds.has(builtinId)&&packageNames.add(packageName);return packageNames}shadowVendoredBuiltinExtensionPaths(extensionPaths,metadataByPath){let shadowedPackageNames=this.getShadowedVendoredBuiltinPackageNames();if(shadowedPackageNames.size===0)return extensionPaths;let filteredPaths=[];for(let extensionPath of extensionPaths){if((metadataByPath.get(extensionPath)??metadataByPath.get(resolve34(extensionPath)))?.source==="cli"){filteredPaths.push(extensionPath);continue}let packageIdentity=findNearestPackageIdentity(extensionPath);packageIdentity&&shadowedPackageNames.has(packageIdentity.packageName)||filteredPaths.push(extensionPath)}return filteredPaths}loadThemes(paths,includeDefaults=!0){let themes=[],diagnostics=[];if(includeDefaults){let defaultDirs=[join67(this.agentDir,"themes"),join67(this.cwd,CONFIG_DIR_NAME,"themes")];for(let dir of defaultDirs)this.loadThemesFromDir(dir,themes,diagnostics)}for(let p of paths){let resolved=this.resolveResourcePath(p);if(!existsSync34(resolved)){diagnostics.push({type:"warning",message:"theme path does not exist",path:resolved});continue}try{let stats=statSync20(resolved);stats.isDirectory()?this.loadThemesFromDir(resolved,themes,diagnostics):stats.isFile()&&resolved.endsWith(".json")?this.loadThemeFromFile(resolved,themes,diagnostics):diagnostics.push({type:"warning",message:"theme path is not a json file",path:resolved})}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read theme path";diagnostics.push({type:"warning",message,path:resolved})}}return{themes,diagnostics}}loadThemesFromDir(dir,themes,diagnostics){if(existsSync34(dir))try{let entries=readdirSync9(dir,{withFileTypes:!0});for(let entry of entries){let isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync20(join67(dir,entry.name)).isFile()}catch{continue}isFile&&entry.name.endsWith(".json")&&this.loadThemeFromFile(join67(dir,entry.name),themes,diagnostics)}}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read theme directory";diagnostics.push({type:"warning",message,path:dir})}}loadThemeFromFile(filePath,themes,diagnostics){try{themes.push(loadThemeFromPath(filePath))}catch(error2){let message=error2 instanceof Error?error2.message:"failed to load theme";diagnostics.push({type:"warning",message,path:filePath})}}async loadExtensionFactories(runtime){let extensions=[],errors=[],activeBuiltinExtensionIds=this.getActiveBuiltinExtensionIds();for(let builtinExtension of this.builtinExtensionFactories){if(!activeBuiltinExtensionIds.has(builtinExtension.id))continue;let extensionPath=`<builtin:${builtinExtension.id}>`;try{let extension=await loadExtensionFromFactory(builtinExtension.factory,this.cwd,this.eventBus,runtime,extensionPath,this.extensionSession);extensions.push(extension)}catch(error2){let message=error2 instanceof Error?error2.message:"failed to load extension";errors.push({path:extensionPath,error:message})}}for(let bundledExtension of bundledBuiltinExtensions)if(activeBuiltinExtensionIds.has(bundledExtension.id))try{let packageJsonPath=bundledExtension.resolvePackage(),entries=this.resolvePackageExtensionEntries(packageJsonPath);if(entries.length===0){errors.push({path:`<builtin:${bundledExtension.id}>`,error:`Bundled extension package does not declare pi.extensions: ${packageJsonPath}`});continue}let bundledResult=await loadExtensions(entries,this.cwd,this.eventBus,runtime,this.extensionSession);for(let extension of bundledResult.extensions)isBunBinary&&(extension.path=`<builtin:${bundledExtension.id}>`),extensions.push(extension);errors.push(...bundledResult.errors)}catch(error2){let message=error2 instanceof Error?error2.message:"package resolution failed";errors.push({path:`<builtin:${bundledExtension.id}>`,error:`Bundled extension unavailable: ${message}`})}for(let[index,input]of this.extensionFactories.entries()){let isNamed=typeof input!="function",factory=isNamed?input.factory:input,extensionPath=`<inline:${isNamed?input.name:index+1}>`;try{let extension=await loadExtensionFromFactory(factory,this.cwd,this.eventBus,runtime,extensionPath,this.extensionSession);extension.hidden=isNamed&&input.hidden,extensions.push(extension)}catch(error2){let message=error2 instanceof Error?error2.message:"failed to load extension";errors.push({path:extensionPath,error:message})}}return{extensions,errors}}getBundledExtensionEntryPaths(){return new Set(this.getBundledExtensionPackageRoots().keys())}getHarnessExtensionSourceInfo(extension,bundledPackageRoots){let bundledPackageRoot=bundledPackageRoots.get(extension.resolvedPath);if(bundledPackageRoot!==void 0)return{path:extension.path,source:"builtin",scope:"system",origin:"top-level",baseDir:bundledPackageRoot};if(this.isGeneratedGlobalDefaultExtensionShimPath(extension.resolvedPath))return{path:extension.path,source:"builtin",scope:"system",origin:"top-level",baseDir:join67(this.agentDir,"extensions")}}isGeneratedGlobalDefaultExtensionShimPath(resolvedPath){let shimPath=resolve34(resolvedPath);if(!globalDefaultExtensionIds.some(extensionId=>resolve34(getGlobalDefaultExtensionShimPath(this.agentDir,extensionId))===shimPath))return!1;try{return isGeneratedGlobalDefaultExtensionShim(readFileSync39(shimPath,"utf-8"))}catch{return!1}}getBundledExtensionPackageRoots(){let packageRoots=new Map;for(let bundledExtension of bundledBuiltinExtensions)try{let packageJsonPath=bundledExtension.resolvePackage(),packageRoot=resolve34(packageJsonPath,"..");for(let extensionPath of this.resolvePackageExtensionEntries(packageJsonPath))packageRoots.set(this.resolveExtensionLoadPath(extensionPath),packageRoot)}catch{}return packageRoots}resolvePackageExtensionEntries(packageJsonPath){let extensions=JSON.parse(readFileSync39(packageJsonPath,"utf-8")).pi?.extensions;if(!Array.isArray(extensions))return[];let packageRoot=resolve34(packageJsonPath,"..");return extensions.filter(extensionPath=>typeof extensionPath=="string").map(extensionPath=>resolve34(packageRoot,extensionPath))}dedupePrompts(prompts){let seen=new Map,diagnostics=[];for(let prompt of prompts){let existing=seen.get(prompt.name);existing?diagnostics.push({type:"collision",message:`name "/${prompt.name}" collision`,path:prompt.filePath,collision:{resourceType:"prompt",name:prompt.name,winnerPath:existing.filePath,loserPath:prompt.filePath}}):seen.set(prompt.name,prompt)}return{prompts:Array.from(seen.values()),diagnostics}}dedupeThemes(themes){let seen=new Map,diagnostics=[];for(let t of themes){let name=t.name??"unnamed",existing=seen.get(name);existing?diagnostics.push({type:"collision",message:`name "${name}" collision`,path:t.sourcePath,collision:{resourceType:"theme",name,winnerPath:existing.sourcePath??"<builtin>",loserPath:t.sourcePath??"<builtin>"}}):seen.set(name,t)}return{themes:Array.from(seen.values()),diagnostics}}isUnderPath(target,root){let normalizedRoot=resolve34(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep11)?normalizedRoot:`${normalizedRoot}${sep11}`;return target.startsWith(prefix)}isBuiltinExtensionPath(extensionPath){return extensionPath.startsWith("<builtin:")}shouldSuppressExtensionConflict(existingOwner,candidateOwner){if(this.isBuiltinExtensionPath(existingOwner)||this.isBuiltinExtensionPath(candidateOwner))return!0;let existingPackageIdentity=findNearestPackageIdentity(existingOwner),candidatePackageIdentity=findNearestPackageIdentity(candidateOwner);return existingPackageIdentity!==void 0&&existingPackageIdentity.key===candidatePackageIdentity?.key}rebuildExtensionFlagDefaults(extensionsResult){let rebuiltFlagValues=new Map,seenFlags=new Set;for(let extension of extensionsResult.extensions)for(let[flagName,flag]of extension.flags)seenFlags.has(flagName)||(seenFlags.add(flagName),flag.default!==void 0&&rebuiltFlagValues.set(flagName,flag.default));extensionsResult.runtime.flagValues=rebuiltFlagValues}detectExtensionConflicts(extensions){let conflicts=[],toolOwners=new Map,flagOwners=new Map;for(let ext of extensions){for(let toolName of ext.tools.keys()){let existingOwner=toolOwners.get(toolName);if(existingOwner&&existingOwner!==ext.path){if(this.shouldSuppressExtensionConflict(existingOwner,ext.path))continue;conflicts.push({path:ext.path,message:`Tool "${toolName}" conflicts with ${existingOwner}`})}else toolOwners.set(toolName,ext.path)}for(let flagName of ext.flags.keys()){let existingOwner=flagOwners.get(flagName);if(existingOwner&&existingOwner!==ext.path){if(this.shouldSuppressExtensionConflict(existingOwner,ext.path))continue;conflicts.push({path:ext.path,message:`Flag "--${flagName}" conflicts with ${existingOwner}`})}else flagOwners.set(flagName,ext.path)}}return conflicts}};import{join as join72}from"node:path";function isRecord47(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function errorResult2(toolCallId,toolName,text2){return{role:"toolResult",toolCallId,toolName,content:[{type:"text",text:text2}],isError:!0,timestamp:Date.now()}}function mapCursorPiGrepArgs(args){let known=new Set(["pattern","path","glob","ignoreCase","literal","context","limit"]);for(let key of Object.keys(args))known.has(key)||console.debug(`[cursor-exec] ignoring unknown pi_grep flag: ${key}`);return omitUndefinedArgs({pattern:args.pattern,path:args.path,glob:args.glob,ignoreCase:args.ignoreCase,literal:args.literal,context:args.context,limit:args.limit})}function emptyResult(toolCallId,toolName){return{role:"toolResult",toolCallId,toolName,content:[{type:"text",text:""}],isError:!1,timestamp:Date.now()}}async function executeTool(options,toolName,toolCallId,args){let runSignal=options.getAbortSignal();if(!runSignal||runSignal.aborted)return errorResult2(toolCallId,toolName,"Tool execution has no active run");let tool=options.getTool(toolName);if(!tool)return errorResult2(toolCallId,toolName,`Tool "${toolName}" is not available in this session`);let cleanArgs=omitUndefinedArgs(args),toolCall={type:"toolCall",id:toolCallId,name:toolName,arguments:cleanArgs},params;try{params=validateToolArguments(tool,toolCall),tool.prepareArguments&&(params=tool.prepareArguments(params))}catch(error2){return errorResult2(toolCallId,toolName,error2 instanceof Error?error2.message:String(error2))}await options.emitEvent({type:"tool_execution_start",toolCallId,toolName,args:cleanArgs},runSignal);let toolResult,endEvent;try{if(!isRecord47(params))throw new Error(`Tool "${toolName}" prepared non-object arguments`);let preflight=await options.preflightToolCall?.({type:"tool_call",toolCallId,toolName,input:params});if(runSignal.aborted||options.getAbortSignal()!==runSignal){let message="Tool execution has no active run";toolResult=errorResult2(toolCallId,toolName,message),endEvent={type:"tool_execution_end",toolCallId,toolName,result:{content:[{type:"text",text:message}],details:void 0},isError:!0}}else if(preflight?.block){let message=preflight.reason||"Tool execution was blocked";toolResult=errorResult2(toolCallId,toolName,message),endEvent={type:"tool_execution_end",toolCallId,toolName,result:{content:[{type:"text",text:message}],details:void 0},isError:!0}}else{let result3=await tool.execute(toolCallId,params,runSignal,void 0);toolResult={role:"toolResult",toolCallId,toolName,content:result3.content??[],details:result3.details,usage:result3.usage,isError:!1,timestamp:Date.now()},endEvent={type:"tool_execution_end",toolCallId,toolName,result:result3,isError:!1}}}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);toolResult=errorResult2(toolCallId,toolName,message),endEvent={type:"tool_execution_end",toolCallId,toolName,result:{content:[{type:"text",text:message}],details:void 0},isError:!0}}return await options.emitEvent(endEvent,runSignal),options.emitToolResult&&await options.emitToolResult({toolName,toolCallId,args:params??cleanArgs,result:{content:toolResult.content,details:toolResult.details,usage:toolResult.usage},isError:toolResult.isError===!0}),toolResult}function createCursorExecBridge(options){return{read:async args=>executeTool(options,"read",args.toolCallId,{path:args.path,offset:args.offset,limit:args.limit}),ls:async args=>executeTool(options,"ls",args.toolCallId,{path:piLsPath(args.path)}),grep:async args=>executeTool(options,"grep",args.toolCallId,{pattern:args.pattern,path:args.path||void 0,glob:args.glob||void 0,ignoreCase:args.caseInsensitive===!0?!0:void 0}),write:async args=>executeTool(options,"write",args.toolCallId,{path:args.path,content:args.fileText??new TextDecoder().decode(args.fileBytes??new Uint8Array)}),shell:async args=>executeTool(options,"bash",args.toolCallId,{command:composeShellCommand(args.command,args.workingDirectory||void 0),timeout:args.timeout&&args.timeout>0?args.timeout:void 0}),mcp:async call=>{let toolName=call.toolName||call.name;return options.getTool(toolName)?executeTool(options,toolName,call.toolCallId,call.args):errorResult2(call.toolCallId,toolName,`Tool "${toolName}" is not registered in this session`)},piRead:async call=>{let readArgs=piReadArgs(call.args.path,call.args.offset,call.args.limit);return readArgs===null?emptyResult(call.toolCallId,"read"):executeTool(options,"read",call.toolCallId,readArgs)},piBash:async call=>executeTool(options,"bash",call.toolCallId,{command:call.args.command,timeout:piTimeout(call.args.timeout)}),piEdit:async call=>executeTool(options,"edit",call.toolCallId,{path:call.args.path,edits:call.args.edits.map(edit=>({oldText:edit.oldText,newText:edit.newText}))}),piWrite:async call=>executeTool(options,"write",call.toolCallId,{path:call.args.path,content:call.args.content}),piGrep:async call=>executeTool(options,"grep",call.toolCallId,mapCursorPiGrepArgs({...call.args,ignoreCase:call.args.ignoreCase===!0?!0:void 0,literal:call.args.literal===!0?!0:void 0,limit:piLimit(call.args.limit)})),piFind:async call=>executeTool(options,"find",call.toolCallId,{pattern:call.args.pattern,path:call.args.path||void 0,limit:piLimit(call.args.limit)}),piLs:async call=>executeTool(options,"ls",call.toolCallId,{path:piLsPath(call.args.path),limit:piLimit(call.args.limit)})}}function createSessionCursorExecBridge(sessionRef,getAgent,runSignal){return createCursorExecBridge({getTool:name=>sessionRef.current?.getRegisteredTool(name),preflightToolCall:async event=>sessionRef.current?.preflightToolCall({type:"toolCall",id:event.toolCallId,name:event.toolName,arguments:event.input},event.input),emitEvent:async(event,runSignal2)=>await getAgent().emitExternalEvent(event,runSignal2),emitToolResult:async({toolName,toolCallId,args,result:result3,isError})=>{await sessionRef.current?.emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError)},getAbortSignal:()=>{if(!(runSignal===void 0||runSignal.aborted))return runSignal===getAgent().signal?runSignal:void 0}})}function isTruthyEnvFlag(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function isInstallTelemetryEnabled(settingsManager,telemetryEnv=envValue("TELEMETRY")){return telemetryEnv!==void 0?isTruthyEnvFlag(telemetryEnv):settingsManager.getEnableInstallTelemetry()}var OPENROUTER_HOST="openrouter.ai",NVIDIA_NIM_HOST="integrate.api.nvidia.com",CLOUDFLARE_API_HOST="api.cloudflare.com",CLOUDFLARE_AI_GATEWAY_HOST="gateway.ai.cloudflare.com",OPENCODE_HOST="opencode.ai";function matchesHost(baseUrl,expectedHost){try{return new URL(baseUrl).hostname===expectedHost}catch{return!1}}function isOpenRouterModel(model){return model.provider==="openrouter"||model.baseUrl.includes(OPENROUTER_HOST)}function isNvidiaNimModel(model){return model.provider==="nvidia"||matchesHost(model.baseUrl,NVIDIA_NIM_HOST)}function isCloudflareModel(model){return model.provider==="cloudflare-workers-ai"||model.provider==="cloudflare-ai-gateway"||matchesHost(model.baseUrl,CLOUDFLARE_API_HOST)||matchesHost(model.baseUrl,CLOUDFLARE_AI_GATEWAY_HOST)}function getDefaultAttributionHeaders(model,settingsManager){if(isInstallTelemetryEnabled(settingsManager)){if(isOpenRouterModel(model))return{"HTTP-Referer":"https://pi.dev","X-OpenRouter-Title":APP_NAME,"X-OpenRouter-Categories":"cli-agent"};if(isNvidiaNimModel(model))return{"X-BILLING-INVOKE-ORIGIN":"Pi"};if(isCloudflareModel(model))return{"User-Agent":`${APP_NAME}-coding-agent`}}}function getSessionHeaders(model,sessionId){if(sessionId&&!(model.provider!=="opencode"&&model.provider!=="opencode-go"&&!matchesHost(model.baseUrl,OPENCODE_HOST)))return{"x-opencode-session":sessionId,"x-opencode-client":"pi"}}function mergeProviderAttributionHeaders(model,settingsManager,sessionId,...headerSources){let merged={...getSessionHeaders(model,sessionId),...getDefaultAttributionHeaders(model,settingsManager)};for(let headers of headerSources)headers&&Object.assign(merged,headers);return Object.keys(merged).length>0?merged:void 0}import{constants as constants4}from"node:fs";import{access as fsAccess}from"node:fs/promises";import{spawn as spawn7}from"child_process";import{randomBytes as randomBytes7}from"node:crypto";import{createWriteStream as createWriteStream2}from"node:fs";import{rm as rm12}from"node:fs/promises";import{tmpdir as tmpdir5}from"node:os";import{join as join68}from"node:path";function byteLength2(text2){return Buffer.byteLength(text2,"utf-8")}var TailWindow=class{constructor(maxBytes){this.chunks=[],this.bytes=0,this.startsAtBoundary=!0,this.maxBytes=maxBytes}append(text2,bytes,startsAtLineBoundary){if(bytes!==0){if(bytes>=this.maxBytes){this.replaceWithTail(text2,startsAtLineBoundary);return}this.chunks.push(text2),this.bytes+=bytes,this.chunks.length>10&&this.compact(),this.bytes>this.maxBytes*2&&this.trimToMax()}}text(){return this.trimToMax(),this.joined()}get startsAtLineBoundary(){return this.startsAtBoundary}replaceWithTail(text2,startsAtLineBoundary){let buffer=Buffer.from(text2,"utf-8"),start=Math.max(0,buffer.length-this.maxBytes);for(;start<buffer.length&&(buffer[start]&192)===128;)start++;this.startsAtBoundary=start===0?startsAtLineBoundary:buffer[start-1]===10;let tail=buffer.subarray(start).toString("utf-8");this.chunks=tail.length>0?[tail]:[],this.bytes=byteLength2(tail)}joined(){return this.chunks.length===0?"":(this.chunks.length>1&&this.compact(),this.chunks[0]??"")}compact(){let joined=this.chunks.join("");this.chunks=joined.length>0?[joined]:[]}trimToMax(){if(this.bytes<=this.maxBytes)return;let buffer=Buffer.from(this.joined(),"utf-8"),start=Math.max(0,buffer.length-this.maxBytes);for(;start<buffer.length&&(buffer[start]&192)===128;)start++;this.startsAtBoundary=start===0?this.startsAtBoundary:buffer[start-1]===10;let tail=buffer.subarray(start).toString("utf-8");this.chunks=tail.length>0?[tail]:[],this.bytes=byteLength2(tail)}};function defaultTempFilePath(prefix){let id=randomBytes7(8).toString("hex");return join68(tmpdir5(),`${prefix}-${id}.log`)}function byteLength3(text2){return Buffer.byteLength(text2,"utf-8")}var OutputAccumulator=class{constructor(options={}){this.decoder=new TextDecoder,this.rawChunks=[],this.totalRawBytes=0,this.totalDecodedBytes=0,this.completedLines=0,this.totalLines=0,this.currentLineBytes=0,this.hasOpenLine=!1,this.finished=!1,this.maxLines=options.maxLines??2e3,this.maxBytes=options.maxBytes??51200,this.tempFilePrefix=options.tempFilePrefix??"pi-output",this.tail=new TailWindow(Math.max(this.maxBytes*2,1))}append(data){if(this.finished)throw new Error("Cannot append to a finished output accumulator");let text2=this.decoder.decode(data,{stream:!0});this.totalRawBytes+=data.length,this.appendDecodedText(text2,byteLength3(text2)),this.tempFileStream||this.shouldUseTempFile()?(this.ensureTempFile(),this.tempFileStream?.write(data)):data.length>0&&this.rawChunks.push(data)}appendText(text2){if(this.finished)throw new Error("Cannot append to a finished output accumulator");if(text2.length===0)return;let bytes=byteLength3(text2);this.totalRawBytes+=bytes,this.appendDecodedText(text2,bytes),this.tempFileStream||this.shouldUseTempFile()?(this.ensureTempFile(),this.tempFileStream?.write(text2)):this.rawChunks.push(text2)}finish(){if(this.finished)return;this.finished=!0;let finalText=this.decoder.decode();this.appendDecodedText(finalText,byteLength3(finalText)),this.shouldUseTempFile()&&this.ensureTempFile()}snapshot(options={}){let tailTruncation=truncateTail2(this.getSnapshotText(),{maxLines:this.maxLines,maxBytes:this.maxBytes}),truncated=this.totalLines>this.maxLines||this.totalDecodedBytes>this.maxBytes,truncatedBy=truncated?tailTruncation.truncatedBy??(this.totalDecodedBytes>this.maxBytes?"bytes":"lines"):null,truncation={...tailTruncation,truncated,truncatedBy,totalLines:this.totalLines,totalBytes:this.totalDecodedBytes,maxLines:this.maxLines,maxBytes:this.maxBytes};return options.persistIfTruncated&&truncation.truncated&&this.ensureTempFile(),{content:truncation.content,truncation,fullOutputPath:this.tempFilePath}}async closeTempFile(){let stream2=this.takeTempFileStream();if(stream2){if(this.tempFileError){await new Promise(resolve44=>{if(stream2.closed){resolve44();return}stream2.once("close",resolve44),stream2.destroy()});try{await this.removeTempFile()}catch(unlinkError){throw new AggregateError([this.tempFileError,unlinkError],"Output spill cleanup failed")}throw this.tempFileError}try{await new Promise((resolve44,reject)=>{let finished=!1,closed=!1,streamError,settle=()=>{closed&&(stream2.off("finish",onFinish),stream2.off("error",onError),stream2.off("close",onClose),streamError?reject(streamError):finished?resolve44():reject(new Error("Output spill stream closed before finish")))},onError=error2=>{streamError??=error2},onFinish=()=>{finished=!0},onClose=()=>{closed=!0,!finished&&!stream2.destroyed&&stream2.destroy(),settle()};stream2.once("error",onError),stream2.once("finish",onFinish),stream2.once("close",onClose),stream2.end()})}catch(error2){try{await this.removeTempFile()}catch(unlinkError){throw new AggregateError([error2,unlinkError],"Output spill cleanup failed")}throw error2}}}getLastLineBytes(){return this.currentLineBytes}appendDecodedText(text2,bytes){if(text2.length===0)return;this.totalDecodedBytes+=bytes,this.tail.append(text2,bytes,!this.hasOpenLine);let newlines=0,lastNewline=-1;for(let i=text2.indexOf(`
2330
2337
  `);i!==-1;i=text2.indexOf(`
2331
2338
  `,i+1))newlines++,lastNewline=i;if(newlines===0)this.currentLineBytes+=bytes,this.hasOpenLine=!0;else{this.completedLines+=newlines;let tail=text2.slice(lastNewline+1);this.currentLineBytes=byteLength3(tail),this.hasOpenLine=tail.length>0}this.totalLines=this.completedLines+(this.hasOpenLine?1:0)}getSnapshotText(){let text2=this.tail.text();if(this.tail.startsAtLineBoundary)return text2;let firstNewline=text2.indexOf(`
@@ -2383,7 +2390,7 @@ ${lines.join(`
2383
2390
  `),maxLines=options.expanded?lines.length:COLLAPSED_LINE_BUDGET,displayLines=lines.slice(0,maxLines),remaining=lines.length-maxLines,text2=`
2384
2391
  ${displayLines.map(line=>theme2.fg("toolOutput",line)).join(`
2385
2392
  `)}`;return remaining>0&&(text2+=`
2386
- ${overflowHint(remaining,remaining===1?"line":"lines",theme2)}`),text2}function formatGrepResult(result3,options,theme2,showImages,cwd){return isV1Details(result3.details)?formatGroupedResult(result3.details,options,theme2,cwd):formatTextFallback(result3,options,theme2,showImages)}var grepRenderers={renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatGrepCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatGrepResult(result3,options,theme2,context.showImages,context.cwd)),text2}};function recoverPattern(pattern){let stack=[],escapedIndices=new Set,inClass=!1;for(let i=0;i<pattern.length;i++){let char=pattern[i];if(char==="\\"){i++;continue}if(char==="["&&(inClass=!0),char==="]"&&(inClass=!1),!inClass){if(char==="{"&&/^\{\d+(,\d*)?\}/.test(pattern.slice(i))){i+=pattern.slice(i).indexOf("}");continue}if(char==="{"||char==="}"){escapedIndices.add(i);continue}char==="("&&stack.push({char,index:i}),char===")"&&(stack.length?stack.pop():escapedIndices.add(i))}}for(let entry of stack)escapedIndices.add(entry.index);return pattern.split("").map((char,i)=>`${escapedIndices.has(i)?"\\":""}${char}`).join("")}async function searchPattern(engine,request2,signal){let active=engine,search=async input=>{try{return await active.search(input,signal)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="UNSUPPORTED_REGEX")throw error2;return active=createRgEngine(),active.search({...input,pcre2:!0},signal)}},effectivePattern=request2.pattern,patternKind=request2.literal?"literal":"regex",result3;try{result3=await search(request2)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="INVALID_PATTERN"||request2.literal)throw error2;effectivePattern=recoverPattern(request2.pattern),patternKind="sanitized";try{result3=await search({...request2,pattern:effectivePattern})}catch(retryError){if(!(retryError instanceof GrepEngineError)||retryError.code!=="INVALID_PATTERN")throw retryError;effectivePattern=request2.pattern,patternKind="literal",result3=await search({...request2,literal:!0})}}return{result:{...result3,effectivePattern,patternKind},engine:active}}var singleton;function resolveGrepEngine(options={}){let useSingleton=Object.keys(options).length===0;if(useSingleton&&singleton)return singleton;let promise=selectEngine(options);return useSingleton&&(singleton=promise),promise}async function selectEngine(options){let env=options.env??process.env,requested=env.SENPI_GREP_ENGINE??"auto";if(requested!=="auto"&&requested!=="rg"&&requested!=="native")throw new GrepEngineError("ENGINE_UNAVAILABLE",`Unknown SENPI_GREP_ENGINE value: ${requested}`);if(requested==="rg")return loadRgEngine();if(requested==="native")return loadNativeEngine(options,env);try{return await loadNativeEngine(options,env)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="ENGINE_UNAVAILABLE")throw error2;return console.warn(`[grep] native engine unavailable; falling back to rg: ${error2.message}`),loadRgEngine()}}async function loadRgEngine(){return(await import("./rg-engine-G2YTYL2T.js")).createRgEngine()}async function loadNativeEngine(options,env){let{loadNativeGrep}=await import("./native-loader-WM7NDPEO.js"),loaded2=loadNativeGrep({...options,env});if(!loaded2.native)throw new GrepEngineError("ENGINE_UNAVAILABLE",`${loaded2.diagnostic.message} ${loaded2.diagnostic.cause}`);let{createNativeEngine}=await import("./native-engine-PDPNVTZX.js");return createNativeEngine(loaded2.native)}var strings2=()=>typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Array(typebox_exports.String())])),grepSchema=typebox_exports.Object({pattern:typebox_exports.String(),path:strings2(),glob:strings2(),type:typebox_exports.Optional(typebox_exports.String()),ignoreCase:typebox_exports.Optional(typebox_exports.Boolean()),literal:typebox_exports.Optional(typebox_exports.Boolean()),multiline:typebox_exports.Optional(typebox_exports.Boolean()),context:typebox_exports.Optional(typebox_exports.Number()),before:typebox_exports.Optional(typebox_exports.Number()),after:typebox_exports.Optional(typebox_exports.Number()),mode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("content"),typebox_exports.Literal("count"),typebox_exports.Literal("files")])),limit:typebox_exports.Optional(typebox_exports.Number()),skip:typebox_exports.Optional(typebox_exports.Number()),timeoutMs:typebox_exports.Optional(typebox_exports.Number()),hidden:typebox_exports.Optional(typebox_exports.Boolean()),gitignore:typebox_exports.Optional(typebox_exports.Boolean())}),grepToolSystemPromptContribution={snippet:"Search file contents (regex/literal) across paths with structured results; respects .gitignore",guidelines:["Use tool.grep for content search instead of rg/grep in a shell; paginate with skip and narrow with glob/path when a page is full"]};async function pathStat(path13){try{return await stat11(path13)}catch(error2){if(error2.code==="ENOENT")return;throw error2}}function createGrepToolDefinition(cwd,options){if(options&&"operations"in options)throw new TypeError("GrepToolOptions.operations is deprecated and no longer supported; removed next release");return{name:"grep",label:"grep",exposure:"eval",description:"Search file contents with tool.grep({ pattern, path }) inside eval. Supports regex/literal patterns, file pages with skip, context, count/files modes, and structured results. Respects .gitignore.",promptSnippet:grepToolSystemPromptContribution.snippet,promptGuidelines:grepToolSystemPromptContribution.guidelines,parameters:grepSchema,async execute(_id,input,signal,_update,ctx){let started=Date.now();if(!input.pattern)throw new Error("Pattern must not be empty");let requested=input.path===void 0?["."]:Array.isArray(input.path)?input.path:[input.path];if(!requested.length||requested.some(p=>typeof p!="string"||!p.length))throw new Error("path must be a non-empty string or array of non-empty strings");let limit=input.limit??100;if(!Number.isInteger(input.skip??0)||(input.skip??0)<0)throw new Error("skip must be a non-negative integer");if(!Number.isInteger(limit)||limit<=0)throw new Error("limit must be a positive integer");let workingCwd=ctx?.cwd||cwd,paths=[],missingPaths=[],lineStart,lineEnd,singleFile=!1;for(let raw of requested){let path13=resolveToCwd(raw,workingCwd),info=await pathStat(path13);if(!info){let selector=/^(.*):L(\d+)-L?(\d+)$/.exec(path13);if(selector){let prefix=await pathStat(selector[1]);if(prefix?.isFile()){if(requested.length!==1||+selector[2]<1||+selector[3]<+selector[2])throw new Error("Invalid line selector");path13=selector[1],info=prefix,lineStart=+selector[2],lineEnd=+selector[3]}}}let canonicalPath2=await canonicalizeFilesystemPath(path13);if(options?.filesystemPolicy){let decision=await options.filesystemPolicy({operation:"enumerate",canonicalPath:canonicalPath2,toolName:"grep"});if(!decision.allow)throw new Error(decision.reason)}if(!info){missingPaths.push(path13);continue}paths.push(path13),singleFile=info.isFile()}if(!paths.length)throw new Error(`Path not found: ${missingPaths.join(", ")}`);singleFile=paths.length===1&&singleFile;let skip=singleFile?0:input.skip??0,mode=input.mode??"content",pageSize=Math.min(20,limit),cap=singleFile?200:20,before=input.before??input.context??0,after=input.after??input.context??0,request2={pattern:input.pattern,paths,cwd:workingCwd,glob:input.glob===void 0?void 0:Array.isArray(input.glob)?input.glob:[input.glob],type:input.type,ignoreCase:input.ignoreCase,literal:input.literal,multiline:input.multiline??(input.pattern.includes(`
2393
+ ${overflowHint(remaining,remaining===1?"line":"lines",theme2)}`),text2}function formatGrepResult(result3,options,theme2,showImages,cwd){return isV1Details(result3.details)?formatGroupedResult(result3.details,options,theme2,cwd):formatTextFallback(result3,options,theme2,showImages)}var grepRenderers={renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatGrepCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatGrepResult(result3,options,theme2,context.showImages,context.cwd)),text2}};function recoverPattern(pattern){let stack=[],escapedIndices=new Set,inClass=!1;for(let i=0;i<pattern.length;i++){let char=pattern[i];if(char==="\\"){i++;continue}if(char==="["&&(inClass=!0),char==="]"&&(inClass=!1),!inClass){if(char==="{"&&/^\{\d+(,\d*)?\}/.test(pattern.slice(i))){i+=pattern.slice(i).indexOf("}");continue}if(char==="{"||char==="}"){escapedIndices.add(i);continue}char==="("&&stack.push({char,index:i}),char===")"&&(stack.length?stack.pop():escapedIndices.add(i))}}for(let entry of stack)escapedIndices.add(entry.index);return pattern.split("").map((char,i)=>`${escapedIndices.has(i)?"\\":""}${char}`).join("")}async function searchPattern(engine,request2,signal){let active=engine,search=async input=>{try{return await active.search(input,signal)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="UNSUPPORTED_REGEX")throw error2;return active=createRgEngine(),active.search({...input,pcre2:!0},signal)}},effectivePattern=request2.pattern,patternKind=request2.literal?"literal":"regex",result3;try{result3=await search(request2)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="INVALID_PATTERN"||request2.literal)throw error2;effectivePattern=recoverPattern(request2.pattern),patternKind="sanitized";try{result3=await search({...request2,pattern:effectivePattern})}catch(retryError){if(!(retryError instanceof GrepEngineError)||retryError.code!=="INVALID_PATTERN")throw retryError;effectivePattern=request2.pattern,patternKind="literal",result3=await search({...request2,literal:!0})}}return{result:{...result3,effectivePattern,patternKind},engine:active}}var singleton;function resolveGrepEngine(options={}){let useSingleton=Object.keys(options).length===0;if(useSingleton&&singleton)return singleton;let promise=selectEngine(options);return useSingleton&&(singleton=promise),promise}async function selectEngine(options){let env=options.env??process.env,requested=env.SENPI_GREP_ENGINE??"auto";if(requested!=="auto"&&requested!=="rg"&&requested!=="native")throw new GrepEngineError("ENGINE_UNAVAILABLE",`Unknown SENPI_GREP_ENGINE value: ${requested}`);if(requested==="rg")return loadRgEngine();if(requested==="native")return loadNativeEngine(options,env);try{return await loadNativeEngine(options,env)}catch(error2){if(!(error2 instanceof GrepEngineError)||error2.code!=="ENGINE_UNAVAILABLE")throw error2;return console.warn(`[grep] native engine unavailable; falling back to rg: ${error2.message}`),loadRgEngine()}}async function loadRgEngine(){return(await import("./rg-engine-LWZA7TRH.js")).createRgEngine()}async function loadNativeEngine(options,env){let{loadNativeGrep}=await import("./native-loader-HW7GQYPY.js"),loaded2=loadNativeGrep({...options,env});if(!loaded2.native)throw new GrepEngineError("ENGINE_UNAVAILABLE",`${loaded2.diagnostic.message} ${loaded2.diagnostic.cause}`);let{createNativeEngine}=await import("./native-engine-PDPNVTZX.js");return createNativeEngine(loaded2.native)}var strings2=()=>typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Array(typebox_exports.String())])),grepSchema=typebox_exports.Object({pattern:typebox_exports.String(),path:strings2(),glob:strings2(),type:typebox_exports.Optional(typebox_exports.String()),ignoreCase:typebox_exports.Optional(typebox_exports.Boolean()),literal:typebox_exports.Optional(typebox_exports.Boolean()),multiline:typebox_exports.Optional(typebox_exports.Boolean()),context:typebox_exports.Optional(typebox_exports.Number()),before:typebox_exports.Optional(typebox_exports.Number()),after:typebox_exports.Optional(typebox_exports.Number()),mode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("content"),typebox_exports.Literal("count"),typebox_exports.Literal("files")])),limit:typebox_exports.Optional(typebox_exports.Number()),skip:typebox_exports.Optional(typebox_exports.Number()),timeoutMs:typebox_exports.Optional(typebox_exports.Number()),hidden:typebox_exports.Optional(typebox_exports.Boolean()),gitignore:typebox_exports.Optional(typebox_exports.Boolean())}),grepToolSystemPromptContribution={snippet:"Search file contents (regex/literal) across paths with structured results; respects .gitignore",guidelines:["Use tool.grep for content search instead of rg/grep in a shell; paginate with skip and narrow with glob/path when a page is full"]};async function pathStat(path13){try{return await stat11(path13)}catch(error2){if(error2.code==="ENOENT")return;throw error2}}function createGrepToolDefinition(cwd,options){if(options&&"operations"in options)throw new TypeError("GrepToolOptions.operations is deprecated and no longer supported; removed next release");return{name:"grep",label:"grep",exposure:"eval",description:"Search file contents with tool.grep({ pattern, path }) inside eval. Supports regex/literal patterns, file pages with skip, context, count/files modes, and structured results. Respects .gitignore.",promptSnippet:grepToolSystemPromptContribution.snippet,promptGuidelines:grepToolSystemPromptContribution.guidelines,parameters:grepSchema,async execute(_id,input,signal,_update,ctx){let started=Date.now();if(!input.pattern)throw new Error("Pattern must not be empty");let requested=input.path===void 0?["."]:Array.isArray(input.path)?input.path:[input.path];if(!requested.length||requested.some(p=>typeof p!="string"||!p.length))throw new Error("path must be a non-empty string or array of non-empty strings");let limit=input.limit??100;if(!Number.isInteger(input.skip??0)||(input.skip??0)<0)throw new Error("skip must be a non-negative integer");if(!Number.isInteger(limit)||limit<=0)throw new Error("limit must be a positive integer");let workingCwd=ctx?.cwd||cwd,paths=[],missingPaths=[],lineStart,lineEnd,singleFile=!1;for(let raw of requested){let path13=resolveToCwd(raw,workingCwd),info=await pathStat(path13);if(!info){let selector=/^(.*):L(\d+)-L?(\d+)$/.exec(path13);if(selector){let prefix=await pathStat(selector[1]);if(prefix?.isFile()){if(requested.length!==1||+selector[2]<1||+selector[3]<+selector[2])throw new Error("Invalid line selector");path13=selector[1],info=prefix,lineStart=+selector[2],lineEnd=+selector[3]}}}let canonicalPath2=await canonicalizeFilesystemPath(path13);if(options?.filesystemPolicy){let decision=await options.filesystemPolicy({operation:"enumerate",canonicalPath:canonicalPath2,toolName:"grep"});if(!decision.allow)throw new Error(decision.reason)}if(!info){missingPaths.push(path13);continue}paths.push(path13),singleFile=info.isFile()}if(!paths.length)throw new Error(`Path not found: ${missingPaths.join(", ")}`);singleFile=paths.length===1&&singleFile;let skip=singleFile?0:input.skip??0,mode=input.mode??"content",pageSize=Math.min(20,limit),cap=singleFile?200:20,before=input.before??input.context??0,after=input.after??input.context??0,request2={pattern:input.pattern,paths,cwd:workingCwd,glob:input.glob===void 0?void 0:Array.isArray(input.glob)?input.glob:[input.glob],type:input.type,ignoreCase:input.ignoreCase,literal:input.literal,multiline:input.multiline??(input.pattern.includes(`
2387
2394
  `)||input.pattern.includes("\\n")),hidden:input.hidden,gitignore:input.gitignore,contextBefore:before,contextAfter:after,maxColumns:500,timeoutMs:input.timeoutMs??3e4,lineStart,lineEnd,mode},engine=await resolveGrepEngine(),preselection,selected=[],more=!1;if(!singleFile){let first=await searchPattern(engine,{...request2,mode:"files",maxCount:skip+pageSize+1},signal);engine=first.engine,preselection=first.result,selected=first.result.fileCounts.slice(skip,skip+pageSize).map(file=>file.path),more=first.result.fileCounts.length>skip+selected.length}let result3;if(!singleFile&&!selected.length)result3=preselection;else if(mode==="files"&&preselection)result3={...preselection,fileCounts:preselection.fileCounts.slice(skip,skip+pageSize)};else{let response=await searchPattern(engine,{...request2,paths:singleFile?paths:selected.map(path13=>resolve36(workingCwd,path13)),maxCountPerFile:mode==="content"?cap+1:void 0,timeoutMs:Math.max(0,(input.timeoutMs??3e4)-(Date.now()-started))},signal);engine=response.engine,result3=response.result}let matches=[],fileMatches=[],perFileLimitReached=!1,totalLimitReached=!1;if(mode==="content"){let groups=new Map;for(let row of result3.matches)if(!row.isContext){let rows=groups.get(row.path)??[];rows.push(row),groups.set(row.path,rows)}let admitted=new Set;for(let round=0;round<cap&&admitted.size<limit;round++)for(let rows of groups.values())rows[round]&&admitted.size<limit&&admitted.add(rows[round]);perFileLimitReached=[...groups.values()].some(rows=>rows.length>cap),totalLimitReached=[...groups.values()].reduce((n,rows)=>n+Math.min(cap,rows.length),0)>admitted.size,matches=result3.matches.filter(row=>admitted.has(row)||row.isContext&&[...admitted].some(match=>match.path===row.path&&row.line>=match.line-before&&row.line<=match.line+after));let bytes=0;matches=matches.filter(row=>(bytes+=Buffer.byteLength(`${row.path}
2388
2395
  ${row.line}: ${row.text}
2389
2396
  `),bytes>49152?(totalLimitReached=!0,!1):!0));let counts=new Map;for(let row of matches)row.isContext||counts.set(row.path,(counts.get(row.path)??0)+1);matches=matches.filter(row=>counts.has(row.path)),fileMatches=[...counts].map(([path13,count])=>({path:path13,count}))}else(singleFile||selected.length)&&(fileMatches=result3.fileCounts.map(({path:path13,count})=>({path:path13,count})));let{matches:_matches,fileCounts:_fileCounts,...scan2}=preselection??result3;scan2.missingPaths=missingPaths,scan2.elapsedMs=Date.now()-started,scan2.effectivePattern=result3.effectivePattern,scan2.patternKind=result3.patternKind,scan2.regexEngine=result3.regexEngine,scan2.timedOut||=result3.timedOut,result3.timedOut&&preselection&&(scan2.warnings=[...scan2.warnings,...result3.warnings]);let partial=scan2.timedOut||scan2.prefixSearched>0||scan2.skippedOversized>0,details={version:1,engine:engine.name,status:partial?"partial":fileMatches.length?"ok":skip?"pageEnd":"noMatch",cwd:workingCwd,paths,matches,fileMatches,matchCount:mode==="files"?null:fileMatches.reduce((n,file)=>n+(file.count??0),0),fileCount:fileMatches.length,skip,nextSkip:more?skip+selected.length:null,fileLimitReached:more,perFileLimitReached,totalLimitReached,scan:scan2,linesTruncated:matches.some(row=>row.truncated)};return{content:formatGrepContent(details),details}},...grepRenderers}}function createGrepTool(cwd,options){return wrapToolDefinition(createGrepToolDefinition(cwd,options))}import{readdir as fsReaddir,stat as fsStat2}from"node:fs/promises";import nodePath from"path";function formatLsCall(args,theme2,cwd){let limit=args?.limit,pathDisplay=renderToolPath(str2(args?.path),theme2,cwd,{emptyFallback:"."}),text2=`${theme2.fg("toolTitle",theme2.bold("ls"))} ${pathDisplay}`;return limit!==void 0&&(text2+=theme2.fg("toolOutput",` (limit ${limit})`)),text2}function formatLsResult(result3,options,theme2,showImages){let output=getTextOutput(result3,showImages).trim(),text2="";if(output){let lines=output.split(`
@@ -2440,7 +2447,7 @@ $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.ex
2440
2447
  pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
2441
2448
  pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
2442
2449
 
2443
- Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync38}from"node:fs";import{readdir as readdir5}from"node:fs/promises";import{join as join73}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync38(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir5(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join73(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync38(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir5(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join73(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync38(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-JJ5R7UWV.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-JJ5R7UWV.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-32AFWZEH.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-V2LDNNXB.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-D6JNRP3D.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat12}from"node:fs/promises";import{resolve as resolve38}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve38(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat12(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>
2450
+ Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync38}from"node:fs";import{readdir as readdir5}from"node:fs/promises";import{join as join73}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync38(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir5(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join73(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync38(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir5(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join73(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync38(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-LNQOWI3A.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-LNQOWI3A.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-B3ZYM2WN.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-PUOIPEBI.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-BUFJOM5L.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat12}from"node:fs/promises";import{resolve as resolve38}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve38(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat12(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>
2444
2451
  `;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(`
2445
2452
  `)}</file>
2446
2453
  `:text2+=`<file name="${absolutePath}"></file>
@@ -2499,11 +2506,11 @@ Press any key to continue...`)),await new Promise(resolve44=>{process.stdin.setR
2499
2506
  `)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});if(mode==="text"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");if(lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted"){let described=describeProviderFailureForUser(assistantMsg.errorMessage);console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`)),exitCode=1}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
2500
2507
  `):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
2501
2508
  `),writeRawStdout(`${formatProviderNativeBody(content,!1)}
2502
- `))}}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()}}import{readdirSync as readdirSync17,readFileSync as readFileSync46}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform4){return platform4==="darwin"||platform4==="linux"?platform4:void 0}async function loadChildReaperSyscalls(platform4=process.platform){let supported=supportedPlatform(platform4);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync17("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat13=linuxStat(pid),tail=stat13?.slice(stat13.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat13=linuxStat(pid),open9=stat13?.indexOf("(")??-1,close=stat13?.lastIndexOf(")")??-1;return stat13===void 0||open9===-1||close<=open9?"":stat13.slice(open9+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-PFLJRXEN.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 randomUUID13}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync47,mkdirSync as mkdirSync27,renameSync as renameSync21,rmSync as rmSync18}from"node:fs";import{basename as basename28,dirname as dirname46,join as join85,relative as relative18,resolve as resolve40,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve40(path13))}function getQuarantineRoot(packageDir){let current=resolve40(packageDir);for(;;){if(basename28(current).toLowerCase()==="node_modules")return join85(current,QUARANTINE_DIR_NAME);let parent=dirname46(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{rmSync18(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=join85(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID13()}`);for(let loadedFile of loadedFiles){if(!existsSync47(loadedFile))continue;let quarantinePath=join85(quarantineRunDir,relative18(resolvedPackageDir,loadedFile));mkdirSync27(dirname46(quarantinePath),{recursive:!0}),renameSync21(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve44=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve44(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(`
2509
+ `))}}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()}}import{readdirSync as readdirSync17,readFileSync as readFileSync46}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform4){return platform4==="darwin"||platform4==="linux"?platform4:void 0}async function loadChildReaperSyscalls(platform4=process.platform){let supported=supportedPlatform(platform4);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync17("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat13=linuxStat(pid),tail=stat13?.slice(stat13.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat13=linuxStat(pid),open9=stat13?.indexOf("(")??-1,close=stat13?.lastIndexOf(")")??-1;return stat13===void 0||open9===-1||close<=open9?"":stat13.slice(open9+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-4VJUHV5U.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 randomUUID13}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync47,mkdirSync as mkdirSync27,renameSync as renameSync21,rmSync as rmSync18}from"node:fs";import{basename as basename28,dirname as dirname46,join as join85,relative as relative18,resolve as resolve40,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve40(path13))}function getQuarantineRoot(packageDir){let current=resolve40(packageDir);for(;;){if(basename28(current).toLowerCase()==="node_modules")return join85(current,QUARANTINE_DIR_NAME);let parent=dirname46(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{rmSync18(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=join85(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID13()}`);for(let loadedFile of loadedFiles){if(!existsSync47(loadedFile))continue;let quarantinePath=join85(quarantineRunDir,relative18(resolvedPackageDir,loadedFile));mkdirSync27(dirname46(quarantinePath),{recursive:!0}),renameSync21(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve44=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve44(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(`
2503
2510
  `));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}
2504
2511
  `),!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}
2505
- `),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(resolve44=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve44(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(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 rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-K5FIKV6C.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync48(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.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),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return{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:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,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-ASETMEFS.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-IBVJ3WN7.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join86(agentDir,"auth.json")),authPath:join86(agentDir,"auth.json"),agentDir,modelsPath:join86(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2506
- `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-ITND2BVC.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-J6KGDRR7.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve44=>setTimeout(resolve44,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve44=>process.stdout.once("drain",resolve44)),process.stderr.writableLength>0&&await new Promise(resolve44=>process.stderr.once("drain",resolve44)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=6e5/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve44=>setTimeout(resolve44,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}async stop(){if(this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve44=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve44()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve44()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path13){let secret=socketNeedsHandshake(path13)?await readSocketSecret(socketSecretPath(path13)):void 0,socket=createConnection3(resolveSocketTransportAddress(path13,process.platform,secret));this.socket=socket,await new Promise((resolve44,reject)=>{let onConnect=()=>{cleanup(),resolve44()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{await this.send({type:"close_session",sessionId},!1)}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0)}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new Error(failure2.error)}}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async steer(message,images,recovery){await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder})}async followUp(message,images,recovery){await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder})}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path13){await this.send({type:"cleanup_bash_output",path:path13})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve44,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve44())})})}collectEvents(timeout=6e4){return new Promise((resolve44,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve44(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of this.eventListeners)listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of this.eventListeners)listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};return expectResponse?new Promise((resolve44,reject)=>{let deadline=armRequestDeadline(3e4,()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,timeoutError=>{let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)});this.pendingRequests.set(id,{resolve:response=>{deadline.clear(),resolve44(response)},reject:error2=>{deadline.clear(),reject(error2)},...command.type==="open_session"?{onQueued:position=>deadline.extend(6e5,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}}):(stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0}))}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2512
+ `),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(resolve44=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve44(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(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 rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-P53MTWTS.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync48(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.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),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return{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:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,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-GWRRD5UC.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-ZFT6RM2S.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join86(agentDir,"auth.json")),authPath:join86(agentDir,"auth.json"),agentDir,modelsPath:join86(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2513
+ `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-H7QGQI4P.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-KM454JPC.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve44=>setTimeout(resolve44,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve44=>process.stdout.once("drain",resolve44)),process.stderr.writableLength>0&&await new Promise(resolve44=>process.stderr.once("drain",resolve44)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=6e5/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve44=>setTimeout(resolve44,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}async stop(){if(this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve44=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve44()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve44()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path13){let secret=socketNeedsHandshake(path13)?await readSocketSecret(socketSecretPath(path13)):void 0,socket=createConnection3(resolveSocketTransportAddress(path13,process.platform,secret));this.socket=socket,await new Promise((resolve44,reject)=>{let onConnect=()=>{cleanup(),resolve44()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{await this.send({type:"close_session",sessionId},!1)}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0)}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new Error(failure2.error)}}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async steer(message,images,recovery){await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder})}async followUp(message,images,recovery){await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder})}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path13){await this.send({type:"cleanup_bash_output",path:path13})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve44,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve44())})})}collectEvents(timeout=6e4){return new Promise((resolve44,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve44(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of this.eventListeners)listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of this.eventListeners)listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};return expectResponse?new Promise((resolve44,reject)=>{let deadline=armRequestDeadline(3e4,()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,timeoutError=>{let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)});this.pendingRequests.set(id,{resolve:response=>{deadline.clear(),resolve44(response)},reject:error2=>{deadline.clear(),reject(error2)},...command.type==="open_session"?{onQueued:position=>deadline.extend(6e5,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}}):(stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0}))}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2507
2514
 
2508
2515
  `),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
2509
2516
 
@@ -2591,7 +2598,7 @@ ${command}`:command;try{let result3=await executeBashWithOperations(resolvedComm
2591
2598
  `),filePath}getLastAssistantText(){let lastAssistant=this.messages.slice().reverse().find(m=>{if(m.role!=="assistant")return!1;let msg=m;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text2="";for(let content of lastAssistant.content)content.type==="text"&&(text2+=content.text);return text2.trim()||void 0}createReplacedSessionContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()));return context.sendMessage=(message,options)=>this.sendCustomMessage(message,options),context.sendUserMessage=(content,options)=>this.sendUserMessage(content,options),context}hasExtensionHandlers(eventType){return this._extensionRunner.hasHandlers(eventType)}get extensionRunner(){return this._extensionRunner}};function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals.missedTokens+=miss.missedTokens,totals.missedCost+=miss.missedCost,totals.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}function createAllToolRenderers(){return{read:readRenderers,bash:createShellRenderers("$"),powershell:createShellRenderers("PS>"),edit:editRenderers,write:writeRenderers,grep:grepRenderers,find:findRenderers,ls:lsRenderers}}function withBuiltInRenderers(toolName,definition){let builtIn=createAllToolRenderers()[toolName];return definition?builtIn?{...definition,renderCall:definition.renderCall??builtIn.renderCall,renderResult:definition.renderResult??builtIn.renderResult}:definition:builtIn}var import_semver=__toESM(require_semver(),1);import path10 from"node:path";import{existsSync as existsSync51,readFileSync as readFileSync49}from"fs";var GITHUB_REPO="earendil-works/pi",CHANGELOG_LINK_BASE_PATH="packages/coding-agent",LEGACY_REPO_RE=/^https:\/\/github\.com\/(?:badlogic|earendil-works)\/pi-mono(?=\/|$)/,URL_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,INLINE_MARKDOWN_LINK_RE=/(!?\[[^\]\n]+\]\()([^\s)]+)((?:\s+[^)]*)?\))/g;function entryVersion(entry){return entry.version??`${entry.major}.${entry.minor}.${entry.patch}${entry.suffix?`-${entry.suffix}`:""}`}var VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/,CALVER_RE=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([2-9]\d*))?$/;function isValidDate(value2){let match=/^(\d{4})-(\d{2})-(\d{2})$/.exec(value2);if(!match)return!1;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]),date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}function isForeignVersion(version){return version.startsWith("0.0.0-omob.")||/^\d+\.\d+\.\d+-0\.beta\./.test(version)}function compareVersionStrings(left,right){let leftCalver=CALVER_RE.exec(left),rightCalver=CALVER_RE.exec(right);if(leftCalver&&rightCalver){let leftParts=[Number(leftCalver[1]),Number(leftCalver[2]),Number(leftCalver[3]),Number(leftCalver[4]??1)],rightParts=[Number(rightCalver[1]),Number(rightCalver[2]),Number(rightCalver[3]),Number(rightCalver[4]??1)];for(let index=0;index<leftParts.length;index+=1)if(leftParts[index]!==rightParts[index])return leftParts[index]<rightParts[index]?-1:1;return 0}let leftValid=(0,import_semver.valid)(left),rightValid=(0,import_semver.valid)(right);if(!(!leftValid||!rightValid||isForeignVersion(left)!==isForeignVersion(right)))return Math.sign((0,import_semver.compare)(leftValid,rightValid))}function normalizeTag(version){let versionString=typeof version=="string"?version:entryVersion(version);return versionString.startsWith("v")?versionString:`v${versionString}`}function splitLocalTarget(target){let hashIndex=target.indexOf("#"),beforeHash=hashIndex===-1?target:target.slice(0,hashIndex),fragment=hashIndex===-1?"":target.slice(hashIndex),queryIndex=beforeHash.indexOf("?");return queryIndex===-1?{fragment,pathPart:beforeHash,query:""}:{fragment,pathPart:beforeHash.slice(0,queryIndex),query:beforeHash.slice(queryIndex)}}function normalizePathPart(value2){return value2.replaceAll("\\","/")}function resolveRepositoryPath(targetPath){let normalizedTarget=normalizePathPart(targetPath),joined=normalizedTarget.startsWith("/")?path10.posix.normalize(normalizedTarget.replace(/^\/+/,"")):path10.posix.normalize(path10.posix.join(CHANGELOG_LINK_BASE_PATH,normalizedTarget));if(!(joined==="."||joined.startsWith("../")||joined===".."))return joined}function isDirectoryTarget(originalPath,repositoryPath){return originalPath.endsWith("/")?!0:!path10.posix.basename(repositoryPath).includes(".")}function normalizeChangelogLinkTarget(target,tag){let canonicalTarget=target.replace(LEGACY_REPO_RE,`https://github.com/${GITHUB_REPO}`),repoUrl=`https://github.com/${GITHUB_REPO}`;for(let route2 of["blob","tree"])for(let branch of["main","master"]){let floatingRefPrefix=`${repoUrl}/${route2}/${branch}/`;canonicalTarget.startsWith(floatingRefPrefix)&&(canonicalTarget=`${repoUrl}/${route2}/${tag}/${canonicalTarget.slice(floatingRefPrefix.length)}`)}if(canonicalTarget.startsWith("#")||canonicalTarget.startsWith("//")||URL_SCHEME_RE.test(canonicalTarget))return canonicalTarget;let{fragment,pathPart,query}=splitLocalTarget(canonicalTarget);if(!pathPart)return canonicalTarget;let repositoryPath=resolveRepositoryPath(pathPart);if(!repositoryPath)return canonicalTarget;let route=isDirectoryTarget(pathPart,repositoryPath)?"tree":"blob";return`https://github.com/${GITHUB_REPO}/${route}/${tag}/${encodeURI(repositoryPath)}${query}${fragment}`}function normalizeChangelogLinks(markdown,version){let tag=normalizeTag(version);return markdown.replace(INLINE_MARKDOWN_LINK_RE,(_match,prefix,target,suffix)=>`${prefix}${normalizeChangelogLinkTarget(target,tag)}${suffix}`)}function parseChangelog(changelogPath){if(!existsSync51(changelogPath))return[];try{let lines=readFileSync49(changelogPath,"utf-8").split(`
2592
2599
  `),entries=[],currentLines=[],currentVersion=null,fence=null;for(let line of lines){let fenceMatch=/^ {0,3}(`{3,}|~{3,})/.exec(line);if(fenceMatch){let character=fenceMatch[1][0]==="`"?"`":"~";fence?fence.character===character&&fenceMatch[1].length>=fence.length&&(fence=null):fence={character,length:fenceMatch[1].length}}let headerMatch=fence===null?/^##[ \t]+(?:\[([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?)\]|([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)))(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/.exec(line):null;if(headerMatch||fence===null&&/^##[ \t]+\[?Unreleased\]?[ \t]*(?:-[ \t]+\d{4}-\d{2}-\d{2})?[ \t]*$/.test(line))if(currentVersion&&currentLines.length>0&&entries.push({...currentVersion,content:currentLines.join(`
2593
2600
  `).trim()}),headerMatch&&isValidDate(headerMatch[3]??"2026-01-01")){let parts=/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/.exec(headerMatch[1]??headerMatch[2]);if(!parts){currentVersion=null,currentLines=[];continue}currentVersion={major:Number(parts[1]),minor:Number(parts[2]),patch:Number(parts[3]),suffix:parts[4],version:`${parts[1]}.${parts[2]}.${parts[3]}${parts[4]?`-${parts[4]}`:""}`},currentLines=[]}else currentVersion=null,currentLines=[];else currentVersion&&currentLines.push(line)}return currentVersion&&currentLines.length>0&&entries.push({...currentVersion,content:currentLines.join(`
2594
- `).trim()}),entries}catch(error2){return console.error(`Warning: Could not parse changelog: ${error2}`),[]}}function getNewEntries(entries,lastVersion,currentVersion){if(!lastVersion.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/)||isForeignVersion(lastVersion))return[];let current=currentVersion&&VERSION_RE.test(currentVersion)?currentVersion:void 0;return current&&(isForeignVersion(current)||compareVersionStrings(lastVersion,current)===void 0)?[]:entries.filter((entry,index,all)=>{let version=entryVersion(entry),lower=compareVersionStrings(version,lastVersion),upper=current?compareVersionStrings(version,current):0;return lower!==void 0&&lower>0&&(upper===void 0||upper<=0)&&all.findIndex(candidate=>entryVersion(candidate)===version)===index})}import{randomUUID as randomUUID15}from"crypto";import{readFileSync as readFileSync50,unlinkSync as unlinkSync3}from"fs";import{tmpdir as tmpdir7}from"os";import{join as join90}from"path";var SUPPORTED_IMAGE_MIME_TYPES=["image/png","image/jpeg","image/webp","image/gif"],DEFAULT_LIST_TIMEOUT_MS=1e3,DEFAULT_POWERSHELL_TIMEOUT_MS=5e3;function isWaylandSession(env=process.env){return!!env.WAYLAND_DISPLAY||env.XDG_SESSION_TYPE==="wayland"}function baseMimeType2(mimeType){return mimeType.split(";")[0]?.trim().toLowerCase()??mimeType.toLowerCase()}function selectPreferredImageMimeType(mimeTypes){let normalized2=mimeTypes.map(t=>t.trim()).filter(Boolean).map(t=>({raw:t,base:baseMimeType2(t)}));for(let preferred of SUPPORTED_IMAGE_MIME_TYPES){let match=normalized2.find(t=>t.base===preferred);if(match)return match.raw}return normalized2.find(t=>t.base.startsWith("image/"))?.raw??null}function isSupportedImageMimeType(mimeType){let base=baseMimeType2(mimeType);return SUPPORTED_IMAGE_MIME_TYPES.some(t=>t===base)}async function convertToPng2(bytes){let photon=await loadPhoton();if(!photon)return null;try{let image=photon.PhotonImage.new_from_byteslice(bytes);try{return image.get_bytes()}finally{image.free()}}catch{return null}}async function readClipboardImageViaWlPaste(){let list4=await runClipboardCommand("wl-paste",["--list-types"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(list4===void 0)return;let types=list4.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean),selectedType=selectPreferredImageMimeType(types);if(!selectedType)return null;let data=await runClipboardCommand("wl-paste",["--type",selectedType,"--no-newline"]);if(data!==void 0)return data.length===0?null:{bytes:data,mimeType:baseMimeType2(selectedType)}}function isWSL(env=process.env){if(env.WSL_DISTRO_NAME||env.WSLENV)return!0;try{let release3=readFileSync50("/proc/version","utf-8");return/microsoft|wsl/i.test(release3)}catch{return!1}}async function readClipboardImageViaPowerShell(){let tmpFile=join90(tmpdir7(),`pi-wsl-clip-${randomUUID15()}.png`);try{let winPathResult=await runClipboardCommand("wslpath",["-w",tmpFile],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(winPathResult===void 0)return null;let winPath=winPathResult.toString("utf-8").trim();if(!winPath)return null;let psScript=["Add-Type -AssemblyName System.Windows.Forms","Add-Type -AssemblyName System.Drawing",`$path = '${winPath.replaceAll("'","''")}'`,"$img = [System.Windows.Forms.Clipboard]::GetImage()","if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }"].join("; "),result3=await runClipboardCommand("powershell.exe",["-NoProfile","-Command",psScript],{timeoutMs:DEFAULT_POWERSHELL_TIMEOUT_MS});if(result3===void 0||result3.toString("utf-8").trim()!=="ok")return null;let bytes=readFileSync50(tmpFile);return bytes.length===0?null:{bytes:new Uint8Array(bytes),mimeType:"image/png"}}catch{return null}finally{try{unlinkSync3(tmpFile)}catch{}}}async function readClipboardImageViaXclip(){let targets=await runClipboardCommand("xclip",["-selection","clipboard","-t","TARGETS","-o"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS}),candidateTypes=[];targets!==void 0&&(candidateTypes=targets.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean));let preferred=selectPreferredImageMimeType(candidateTypes);if(targets!==void 0&&!preferred)return null;let tryTypes=new Set(preferred?[preferred,...SUPPORTED_IMAGE_MIME_TYPES]:SUPPORTED_IMAGE_MIME_TYPES);for(let mimeType of tryTypes){let data=await runClipboardCommand("xclip",["-selection","clipboard","-t",mimeType,"-o"]);if(data!==void 0&&data.length>0)return{bytes:data,mimeType:baseMimeType2(mimeType)}}}async function readClipboardImageViaNativeClipboard(){let bytes=await getNativeClipboard()?.getImage();if(bytes!==void 0)return bytes?.length?{bytes,mimeType:detectSupportedImageMimeType2(bytes)??"application/octet-stream"}:null}async function readClipboardImage(options){let env=options?.env??process.env,platform4=options?.platform??process.platform;if(env.TERMUX_VERSION)return null;let image;if(platform4==="linux"){let wsl=isWSL(env);(isWaylandSession(env)||wsl)&&(image=await readClipboardImageViaWlPaste()),image===void 0&&(image=await readClipboardImageViaXclip()),!image&&wsl&&(image=await readClipboardImageViaPowerShell()??image),image===void 0&&(image=await readClipboardImageViaNativeClipboard())}else image=await readClipboardImageViaNativeClipboard();if(!image)return null;if(!isSupportedImageMimeType(image.mimeType)){let pngBytes=await convertToPng2(image.bytes);return pngBytes?{bytes:pngBytes,mimeType:"image/png"}:null}return image}var PERSISTED_SOURCE_LABELS=new Set(["Operation aborted","System operation aborted"]),PERSISTED_PROVIDER_LABEL_RE=/^(?:Provider retry failed after \d+ attempts?|Provider request failed(?::.*)?)$/;function abortedMessageForRendering(message,retryAttempt,abortSource){return message.stopReason!=="aborted"?message:{...message,errorMessage:abortedErrorLabel(message.errorMessage,retryAttempt,abortSource)}}function abortedErrorLabel(persisted,retryAttempt,abortSource){if(abortSource==="user")return"Operation aborted";if(abortSource==="system")return"System operation aborted";if(abortSource==="provider")return persisted??"Provider request failed";if(persisted!==void 0&&PERSISTED_SOURCE_LABELS.has(persisted)||persisted!==void 0&&PERSISTED_PROVIDER_LABEL_RE.test(persisted))return persisted;let legacyRetry=persisted?.match(/^Aborted after (\d+) retry attempts?$/);return legacyRetry?`Provider retry failed after ${legacyRetry[1]} attempt${legacyRetry[1]==="1"?"":"s"}`:retryAttempt>0?`Provider retry failed after ${retryAttempt} attempt${retryAttempt===1?"":"s"}`:persisted!==void 0&&persisted!=="Request was aborted"?`Provider request failed: ${persisted}`:"Provider request failed"}function createChatViewport(options){let transcript=new ScrollView(options.document,{follow:"end",primary:!0,overscroll:"chain",scrollbar:options.scrollbar??"auto",...options.scrollbarTrackStyle===void 0?{}:{scrollbarTrackStyle:options.scrollbarTrackStyle},...options.scrollbarThumbStyle===void 0?{}:{scrollbarThumbStyle:options.scrollbarThumbStyle}}),dock=new VStack([{component:options.pendingMessages,shrink:1,minSize:0},{component:options.status,shrink:1,minSize:0},...options.hookStatus===void 0?[]:[{component:options.hookStatus,shrink:1,minSize:0}],...options.widgetsAbove===void 0?[]:[{component:options.widgetsAbove,shrink:1,minSize:0}],{component:options.editor,shrink:1,minSize:3},...options.widgetsBelow===void 0?[]:[{component:options.widgetsBelow,shrink:1,minSize:0}],{component:options.footer,shrink:1,minSize:0}]);return{transcript,root:new VStack([{component:transcript,basis:0,grow:1,shrink:1,minSize:1},{component:dock,basis:"auto",grow:0,shrink:1,minSize:1}])}}async function transferCompactionQueue(dependencies,options={}){let batch=dependencies.takeBatch();if(batch.length===0)return;let acceptedCount=0;try{if(options.willRetry||options.deferAdmission){for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):await dependencies.deliverQueued(message),!dependencies.commitAccepted(message))return;acceptedCount+=1}return}let promptWorkOwned=!1;for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):promptWorkOwned?await dependencies.deliverQueued(message):promptWorkOwned=await dependencies.deliverFirstPrompt(message)!=="handled",!dependencies.commitAccepted(message))return;acceptedCount+=1}}catch(error2){let failure2=error2 instanceof Error?error2:new Error(String(error2)),undelivered=batch.slice(acceptedCount),restoredCount=dependencies.restoreUndelivered(undelivered);restoredCount>0&&dependencies.reportFailure(failure2,restoredCount)}}function waitForPromptDisposition(startPrompt,reportPostAcceptanceFailure){return new Promise((resolve44,reject)=>{let accepted=!1,rejectedAtPreflight=!1,disposition,resolveAcceptedDisposition=()=>{accepted&&disposition&&resolve44(disposition)};startPrompt(success=>{success?(accepted=!0,resolveAcceptedDisposition()):rejectedAtPreflight=!0},nextDisposition=>{disposition=nextDisposition,resolveAcceptedDisposition()}).then(()=>{rejectedAtPreflight&&!accepted&&reject(new Error("Queued prompt was rejected before acceptance"))},error2=>{accepted?reportPostAcceptanceFailure(error2):reject(error2)})})}var ASK_USER_ANSWER_KEYBINDING="app.question.answer";function askUserAnswerKeyHint(env=process.env){let keys=getKeybindings().getKeys(ASK_USER_ANSWER_KEYBINDING),preferred=env.TMUX||["Apple_Terminal","WarpTerminal","vscode"].includes(env.TERM_PROGRAM??"")?QUESTION_ANSWER_FALLBACK_KEY:QUESTION_ANSWER_PRIMARY_KEY;return keys.includes(preferred)?formatKeyText(preferred):keyText(ASK_USER_ANSWER_KEYBINDING)}var DARWIN_OPTION_GLYPHS={a:["\xE5","\xC5"],b:["\u222B","\u0131"],c:["\xE7","\xC7"],d:["\u2202","\xCE"],f:["\u0192","\xCF"],g:["\xA9","\u02DD"],h:["\u02D9","\xD3"],j:["\u2206","\xD4"],k:["\u02DA","\uF8FF"],l:["\xAC","\xD2"],m:["\xB5","\xC2"],o:["\xF8","\xD8"],p:["\u03C0","\u220F"],q:["\u0153","\u0152"],r:["\xAE","\u2030"],s:["\xDF","\xCD"],t:["\u2020","\u02C7"],v:["\u221A","\u25CA"],w:["\u2211","\u201E"],x:["\u2248","\u02DB"],y:["\xA5","\xC1"],z:["\u03A9","\xB8"]};function darwinOptionGlyphs(keys){let glyphs=new Set;for(let key of keys){let letter=/^alt\+([a-z])$/i.exec(key)?.[1]?.toLowerCase();if(letter!==void 0)for(let glyph of DARWIN_OPTION_GLYPHS[letter]??[])glyphs.add(glyph)}return glyphs}function matchesAskUserAnswerKey(data,platform4=process.platform,keybindings=getKeybindings()){return keybindings.matches(data,ASK_USER_ANSWER_KEYBINDING)?!0:platform4!=="darwin"?!1:darwinOptionGlyphs(keybindings.getKeys(ASK_USER_ANSWER_KEYBINDING)).has(decodeKittyPrintable(data)??data)}var AskUserCountdown=class{constructor(timeoutMs,tui,onTick,onExpire,getDeadlineAtMs){let deadline=Date.now()+timeoutMs,tick=()=>{let remaining=Math.max(0,(getDeadlineAtMs?.()??deadline)-Date.now());onTick(remaining),tui?.requestRender(),remaining===0&&!getDeadlineAtMs&&(this.dispose(),onExpire())};this.timer=setInterval(tick,1e3),this.timer.unref(),tick()}dispose(){clearInterval(this.timer),this.timer=void 0}};var COMMENT_LABEL="Comment (optional; unanswered questions are reported)",OWN_ANSWER_LABEL="Type your own answer...",NOT_ANSWERED_NOTICE="You have not answered all questions",DISMISS_NOTICE="Press Esc again to dismiss (answers will be discarded)";function formatCountdownLabel(remainingMs2){let totalSeconds=Math.max(0,Math.ceil(remainingMs2/1e3));if(totalSeconds>=300)return`${Math.ceil(totalSeconds/60)}m`;let minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60;return`${String(minutes).padStart(2,"0")}:${String(seconds).padStart(2,"0")}`}var AskUserQuestionState=class{constructor(request2){this.activeIndex=0,this.highlightIndex=0,this.focus="options",this.dismissPending=!1,this.selected=new Map,this.texts=new Map,this.request=request2,this.submitRowIndex=this.commentRowIndex}get activeQuestion(){return this.request.questions[this.activeIndex]}get ownAnswerRowIndex(){return this.activeQuestion.options.length}get rowCount(){return this.ownAnswerRowIndex+1}get activeTabIndex(){return this.focus==="submit"?this.request.questions.length:this.activeIndex}get commentRowIndex(){return this.request.questions.length}get isCommentFocused(){return this.focus==="submit"&&this.submitRowIndex===this.commentRowIndex}switchQuestion(delta){this.switchTab(delta)}switchTab(delta){let count=this.request.questions.length+1,next=(this.activeTabIndex+delta+count)%count;next===this.request.questions.length?this.enterSubmit():this.jumpToQuestion(next)}advance(){if(this.activeIndex+1<this.request.questions.length){this.jumpToQuestion(this.activeIndex+1);return}this.enterSubmit()}jumpToQuestion(index){this.focus="options",this.activeIndex=index,this.highlightIndex=0,this.clearTransient()}enterSubmit(){this.focus="submit",this.submitRowIndex=this.commentRowIndex,this.highlightIndex=0,this.clearTransient()}returnToOptions(){this.leaveOwnAnswer(0)}leaveOwnAnswer(row){this.focus="options",this.highlightIndex=Math.min(Math.max(0,row),this.ownAnswerRowIndex),this.clearTransient()}moveSubmitRow(delta){this.submitRowIndex=Math.min(Math.max(0,this.submitRowIndex+delta),this.commentRowIndex),this.clearTransient()}focusComment(){this.submitRowIndex=this.commentRowIndex}clearTransient(){this.notice=void 0,this.dismissPending=!1}requestDismiss(){return this.hasDraft()?this.dismissPending?"cancel":(this.dismissPending=!0,this.notice=DISMISS_NOTICE,"confirm"):"cancel"}acceptPartialSubmit(){this.dismissPending=!1,this.notice=void 0}hasDraft(){return(this.comment??"").trim()!==""?!0:this.request.questions.some(question=>this.isAnswered(question.id))}selectedFor(questionId){return this.selected.get(questionId)??[]}textFor(questionId){return this.texts.get(questionId)}isSelected(questionId,label3){return this.selectedFor(questionId).includes(label3)}isAnswered(questionId){return this.selectedFor(questionId).length>0?!0:(this.texts.get(questionId)??"").trim()!==""}answeredCount(){return this.request.questions.filter(question=>this.isAnswered(question.id)).length}activateOption(questionId,label3){let question=this.request.questions.find(entry=>entry.id===questionId);if(question?.options.some(option=>option.label===label3)){if(question.multiSelect){let next=[...this.selectedFor(questionId)],index=next.indexOf(label3);index>=0?next.splice(index,1):next.push(label3),this.selected.set(questionId,next)}else this.selected.set(questionId,[label3]);this.notice=void 0}}setOwnAnswer(questionId,text2){let trimmed=text2.trim();trimmed!==""&&(this.selected.delete(questionId),this.texts.set(questionId,trimmed),this.notice=void 0)}clearAnswer(questionId){this.selected.delete(questionId),this.texts.delete(questionId),this.notice=void 0}restoreDraft(draft){for(let question of this.request.questions){let answer=draft.answers?.[question.id];if(!answer)continue;let selected=answer.selected.filter(label3=>question.options.some(option=>option.label===label3));selected.length>0&&this.selected.set(question.id,selected),answer.text!==void 0&&answer.text.trim()!==""&&this.texts.set(question.id,answer.text.trim())}draft.comment!==void 0&&draft.comment.trim()!==""&&(this.comment=draft.comment)}answers(){let result3={};for(let question of this.request.questions){let selected=this.selectedFor(question.id),text2=this.texts.get(question.id);selected.length===0&&text2===void 0||(result3[question.id]={selected,...text2!==void 0?{text:text2}:{}})}return result3}unanswered(){return this.request.questions.filter(question=>!this.isAnswered(question.id)).map(q=>q.id)}submitOutcome(forcePartial=!1){if((this.comment??"").trim()!=="")return"comment-submitted";if(this.unanswered().length===0||this.answeredCount()>0||forcePartial)return"answered"}buildResponse(status,autoResolvedAfterMs){let comment=this.comment!==void 0&&this.comment.trim()!==""?this.comment:void 0;return{status,answers:this.answers(),...comment!==void 0?{comment}:{},unanswered:this.unanswered(),...autoResolvedAfterMs!==void 0?{autoResolvedAfterMs}:{}}}refreshDraft(){let comment=this.comment!==void 0&&this.comment.trim()!==""?this.comment:void 0;return{answers:this.answers(),...comment!==void 0?{comment}:{}}}};var ASK_USER_WIDGET_KEY="ask-user",INDENT=" ";function hasAnswer2(answer){return answer?answer.selected.length>0?!0:(answer.text??"").trim()!=="":!1}function unansweredIds2(request2,draft){return request2.questions.filter(question=>!hasAnswer2(draft.answers?.[question.id])).map(q=>q.id)}function buildCommentResponse(request2,draft,comment){return{status:"comment-submitted",answers:draft.answers??{},comment,unanswered:unansweredIds2(request2,draft)}}function buildTimedOutResponse(request2,draft,autoResolvedAfterMs){let comment=draft.comment?.trim();return{status:"timed_out",answers:draft.answers??{},...comment?{comment}:{},unanswered:unansweredIds2(request2,draft),autoResolvedAfterMs}}function renderStatusLine(unanswered,countdownLabel,pendingCount=1){let countdown=countdownLabel===""?"":theme.fg("muted",` \xB7 ${countdownLabel}`);return theme.fg("accent",theme.bold("?"))+theme.fg("text",pendingCount>1?` ${pendingCount} questions pending`:` Question pending (${unanswered} unanswered)`)+countdown}function renderQuestionLine(question){return INDENT+theme.fg("text",theme.bold(question.header))+theme.fg("muted"," \u2014 ")+theme.fg("text",question.question)}function renderAnswerHint(){let shortcut=askUserAnswerKeyHint(),keys=shortcut===""?"enter":`enter or ${shortcut}`;return[theme.fg("dim",keys)+theme.fg("muted"," to answer"),theme.fg("dim","/answer"),theme.fg("muted","or just type your reply")].join(theme.fg("muted"," \xB7 "))}var AskUserAsyncWidget=class{constructor(options){this.countdownLabel="",this.hits=[],this.renderedWidth=0,this.options=options,this.request=options.request,this.draft=options.draft,this.pendingCount=options.pendingCount??1,(options.timeoutMs>0||options.getDeadlineAtMs)&&(this.countdown=new AskUserCountdown(options.timeoutMs,options.tui,remainingMs2=>{this.countdownLabel=formatCountdownLabel(remainingMs2),this.update()},options.onExpire,options.getDeadlineAtMs)),this.update()}dispose(){this.countdown?.dispose()}invalidate(){}update(){this.options.tui?.requestRender()}render(width){if(this.hits=[],this.renderedWidth=width,width<5)return[truncateToWidth("Use keys to answer",width)];let pending=unansweredIds2(this.request,this.draft),shown=this.request.questions.find(question=>question.id===pending[0]),lines=[],addAction=(text2,action)=>{let line=truncateToWidth(text2,width);this.hits.push({action,row:lines.length,startColumn:0,endColumn:visibleWidth(line)}),lines.push(line)};if(addAction(renderStatusLine(pending.length,this.countdownLabel,this.pendingCount),"expand"),shown){addAction(renderQuestionLine({...shown,header:sanitizeTerminalLabel(shown.header),question:sanitizeTerminalLabel(shown.question)}),"expand");let line="",labels=[...shown.options.map(option=>sanitizeTerminalLabel(option.label)),"own answer\u2026"];for(let[index,label3]of labels.entries()){let button=`[ ${truncateToWidth(label3,width-4,"\u2026")} ]`;line!==""&&visibleWidth(line)+2+visibleWidth(button)>width&&(lines.push(line),line=""),line!==""&&(line+=" ");let startColumn=visibleWidth(line);line+=theme.fg("muted",button),this.hits.push({action:index===shown.options.length?"own-answer":index,row:lines.length,startColumn,endColumn:visibleWidth(line)})}line!==""&&lines.push(line),pending.length>1&&lines.push(truncateToWidth(theme.fg("muted",`+${pending.length-1} more question${pending.length===2?"":"s"}`),width))}if(this.pendingCount>1&&addAction(theme.fg("muted",`\u25B8 +${this.pendingCount-1} more \xB7 ${keyText("app.question.next")} next question`),"next"),this.options.mouseCaptureActive){let bypass=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM??"")?"option+drag":"shift+drag";lines.push(...new Text(theme.fg("muted",`click an option \xB7 ${bypass} to select text`),0,0).render(width))}return lines.push(...new Text(renderAnswerHint(),0,0).render(width)),lines}handleMouse(event){if(event.width!==this.renderedWidth||event.button!=="left"||event.shift||event.alt||event.ctrl||event.type!=="press"&&(event.type!=="click"||event.clickCount!==1))return;let hit=this.hits.find(span=>span.row===event.y&&event.x>=span.startColumn&&event.x<span.endColumn);if(hit)return event.type==="click"&&(typeof hit.action=="number"?this.options.onOptionClick?.(hit.action):hit.action==="own-answer"?this.options.onOwnAnswerClick?.():hit.action==="expand"?this.options.onExpandClick?.():this.options.onNextQuestion?.()),{handled:!0}}};var DEL="\x7F";function isPrintable(data){return data.length===1&&data>=" "&&data!==DEL}function handleAskUserKeyInput(ctx,data){let kb=getKeybindings();if(matchesKey(data,"ctrl+c")){ctx.finish("cancelled");return}if(ctx.state.focus==="own-answer"){handleOwnAnswerKey(ctx,data,kb);return}if(ctx.state.focus==="submit"){handleSubmitKey(ctx,data,kb);return}handleOptionsKey(ctx,data,kb)}function saveTypedOwnAnswer(ctx){ctx.ownAnswerInput.getValue().trim()!==""?ctx.commitOwnAnswer():ctx.ownAnswerInput.setValue("")}function handleOwnAnswerKey(ctx,data,kb){let state=ctx.state;if(matchesKey(data,"ctrl+enter")){ctx.commitOwnAnswer(),ctx.attemptSubmit();return}if(kb.matches(data,"tui.select.confirm")||data===`
2601
+ `).trim()}),entries}catch(error2){return console.error(`Warning: Could not parse changelog: ${error2}`),[]}}function getNewEntries(entries,lastVersion,currentVersion){if(!lastVersion.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/)||isForeignVersion(lastVersion))return[];let current=currentVersion&&VERSION_RE.test(currentVersion)?currentVersion:void 0;return current&&(isForeignVersion(current)||compareVersionStrings(lastVersion,current)===void 0)?[]:entries.filter((entry,index,all)=>{let version=entryVersion(entry),lower=compareVersionStrings(version,lastVersion),upper=current?compareVersionStrings(version,current):0;return lower!==void 0&&lower>0&&(upper===void 0||upper<=0)&&all.findIndex(candidate=>entryVersion(candidate)===version)===index})}import{randomUUID as randomUUID15}from"crypto";import{readFileSync as readFileSync50,unlinkSync as unlinkSync3}from"fs";import{tmpdir as tmpdir7}from"os";import{join as join90}from"path";var SUPPORTED_IMAGE_MIME_TYPES=["image/png","image/jpeg","image/webp","image/gif"],DEFAULT_LIST_TIMEOUT_MS=1e3,DEFAULT_POWERSHELL_TIMEOUT_MS=5e3;function isWaylandSession(env=process.env){return!!env.WAYLAND_DISPLAY||env.XDG_SESSION_TYPE==="wayland"}function baseMimeType2(mimeType){return mimeType.split(";")[0]?.trim().toLowerCase()??mimeType.toLowerCase()}function selectPreferredImageMimeType(mimeTypes){let normalized2=mimeTypes.map(t=>t.trim()).filter(Boolean).map(t=>({raw:t,base:baseMimeType2(t)}));for(let preferred of SUPPORTED_IMAGE_MIME_TYPES){let match=normalized2.find(t=>t.base===preferred);if(match)return match.raw}return normalized2.find(t=>t.base.startsWith("image/"))?.raw??null}function isSupportedImageMimeType(mimeType){let base=baseMimeType2(mimeType);return SUPPORTED_IMAGE_MIME_TYPES.some(t=>t===base)}async function convertToPng2(bytes){let photon=await loadPhoton();if(!photon)return null;try{let image=photon.PhotonImage.new_from_byteslice(bytes);try{return image.get_bytes()}finally{image.free()}}catch{return null}}async function readClipboardImageViaWlPaste(){let list4=await runClipboardCommand("wl-paste",["--list-types"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(list4===void 0)return;let types=list4.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean),selectedType=selectPreferredImageMimeType(types);if(!selectedType)return null;let data=await runClipboardCommand("wl-paste",["--type",selectedType,"--no-newline"]);if(data!==void 0)return data.length===0?null:{bytes:data,mimeType:baseMimeType2(selectedType)}}function isWSL(env=process.env){if(env.WSL_DISTRO_NAME||env.WSLENV)return!0;try{let release3=readFileSync50("/proc/version","utf-8");return/microsoft|wsl/i.test(release3)}catch{return!1}}async function readClipboardImageViaPowerShell(){let tmpFile=join90(tmpdir7(),`pi-wsl-clip-${randomUUID15()}.png`);try{let winPathResult=await runClipboardCommand("wslpath",["-w",tmpFile],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(winPathResult===void 0)return null;let winPath=winPathResult.toString("utf-8").trim();if(!winPath)return null;let psScript=["Add-Type -AssemblyName System.Windows.Forms","Add-Type -AssemblyName System.Drawing",`$path = '${winPath.replaceAll("'","''")}'`,"$img = [System.Windows.Forms.Clipboard]::GetImage()","if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }"].join("; "),result3=await runClipboardCommand("powershell.exe",["-NoProfile","-Command",psScript],{timeoutMs:DEFAULT_POWERSHELL_TIMEOUT_MS});if(result3===void 0||result3.toString("utf-8").trim()!=="ok")return null;let bytes=readFileSync50(tmpFile);return bytes.length===0?null:{bytes:new Uint8Array(bytes),mimeType:"image/png"}}catch{return null}finally{try{unlinkSync3(tmpFile)}catch{}}}async function readClipboardImageViaXclip(){let targets=await runClipboardCommand("xclip",["-selection","clipboard","-t","TARGETS","-o"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS}),candidateTypes=[];targets!==void 0&&(candidateTypes=targets.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean));let preferred=selectPreferredImageMimeType(candidateTypes);if(targets!==void 0&&!preferred)return null;let tryTypes=new Set(preferred?[preferred,...SUPPORTED_IMAGE_MIME_TYPES]:SUPPORTED_IMAGE_MIME_TYPES);for(let mimeType of tryTypes){let data=await runClipboardCommand("xclip",["-selection","clipboard","-t",mimeType,"-o"]);if(data!==void 0&&data.length>0)return{bytes:data,mimeType:baseMimeType2(mimeType)}}}async function readClipboardImageViaNativeClipboard(){let bytes=await getNativeClipboard()?.getImage();if(bytes!==void 0)return bytes?.length?{bytes,mimeType:detectSupportedImageMimeType2(bytes)??"application/octet-stream"}:null}async function readClipboardImage(options){let env=options?.env??process.env,platform4=options?.platform??process.platform;if(env.TERMUX_VERSION)return null;let image;if(platform4==="linux"){let wsl=isWSL(env);(isWaylandSession(env)||wsl)&&(image=await readClipboardImageViaWlPaste()),image===void 0&&(image=await readClipboardImageViaXclip()),!image&&wsl&&(image=await readClipboardImageViaPowerShell()??image),image===void 0&&(image=await readClipboardImageViaNativeClipboard())}else image=await readClipboardImageViaNativeClipboard();if(!image)return null;if(!isSupportedImageMimeType(image.mimeType)){let pngBytes=await convertToPng2(image.bytes);return pngBytes?{bytes:pngBytes,mimeType:"image/png"}:null}return image}var PERSISTED_SOURCE_LABELS=new Set(["Operation aborted","System operation aborted"]),PERSISTED_PROVIDER_LABEL_RE=/^(?:Provider retry failed after \d+ attempts?|Provider request failed(?::.*)?)$/;function abortedMessageForRendering(message,retryAttempt,abortSource){return message.stopReason!=="aborted"?message:{...message,errorMessage:abortedErrorLabel(message.errorMessage,retryAttempt,abortSource)}}function abortedErrorLabel(persisted,retryAttempt,abortSource){if(abortSource==="user")return"Operation aborted";if(abortSource==="system")return"System operation aborted";if(abortSource==="provider")return persisted??"Provider request failed";if(persisted!==void 0&&PERSISTED_SOURCE_LABELS.has(persisted)||persisted!==void 0&&PERSISTED_PROVIDER_LABEL_RE.test(persisted))return persisted;let legacyRetry=persisted?.match(/^Aborted after (\d+) retry attempts?$/);return legacyRetry?`Provider retry failed after ${legacyRetry[1]} attempt${legacyRetry[1]==="1"?"":"s"}`:retryAttempt>0?`Provider retry failed after ${retryAttempt} attempt${retryAttempt===1?"":"s"}`:persisted!==void 0&&persisted!=="Request was aborted"?`Provider request failed: ${persisted}`:"Provider request failed"}function createChatViewport(options){let transcript=new ScrollView(options.document,{follow:"end",primary:!0,overscroll:"chain",scrollbar:options.scrollbar??"auto",...options.scrollbarTrackStyle===void 0?{}:{scrollbarTrackStyle:options.scrollbarTrackStyle},...options.scrollbarThumbStyle===void 0?{}:{scrollbarThumbStyle:options.scrollbarThumbStyle}}),dock=new VStack([{component:options.pendingMessages,shrink:1,minSize:0},{component:options.status,shrink:1,minSize:0},...options.hookStatus===void 0?[]:[{component:options.hookStatus,shrink:1,minSize:0}],...options.widgetsAbove===void 0?[]:[{component:options.widgetsAbove,shrink:1,minSize:0}],{component:options.editor,shrink:1,minSize:3},...options.widgetsBelow===void 0?[]:[{component:options.widgetsBelow,shrink:1,minSize:0}],{component:options.footer,shrink:1,minSize:0}]);return{transcript,root:new VStack([{component:transcript,basis:0,grow:1,shrink:1,minSize:1},{component:dock,basis:"auto",grow:0,shrink:1,minSize:1}])}}async function transferCompactionQueue(dependencies,options={}){let batch=dependencies.takeBatch();if(batch.length===0)return;let acceptedCount=0;try{if(options.willRetry||options.deferAdmission){for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):await dependencies.deliverQueued(message),!dependencies.commitAccepted(message))return;acceptedCount+=1}return}let promptWorkOwned=!1;for(let message of batch){if(dependencies.isCommand(message)?await dependencies.deliverCommand(message):promptWorkOwned?await dependencies.deliverQueued(message):promptWorkOwned=await dependencies.deliverFirstPrompt(message)!=="handled",!dependencies.commitAccepted(message))return;acceptedCount+=1}}catch(error2){let failure2=error2 instanceof Error?error2:new Error(String(error2)),undelivered=batch.slice(acceptedCount),restoredCount=dependencies.restoreUndelivered(undelivered);restoredCount>0&&dependencies.reportFailure(failure2,restoredCount)}}function waitForPromptDisposition(startPrompt,reportPostAcceptanceFailure){return new Promise((resolve44,reject)=>{let accepted=!1,rejectedAtPreflight=!1,disposition,resolveAcceptedDisposition=()=>{accepted&&disposition&&resolve44(disposition)};startPrompt(success=>{success?(accepted=!0,resolveAcceptedDisposition()):rejectedAtPreflight=!0},nextDisposition=>{disposition=nextDisposition,resolveAcceptedDisposition()}).then(()=>{rejectedAtPreflight&&!accepted&&reject(new Error("Queued prompt was rejected before acceptance"))},error2=>{accepted?reportPostAcceptanceFailure(error2):reject(error2)})})}var ASK_USER_ANSWER_KEYBINDING="app.question.answer";function askUserAnswerKeyHint(env=process.env){let keys=getKeybindings().getKeys(ASK_USER_ANSWER_KEYBINDING),preferred=env.TMUX||["Apple_Terminal","WarpTerminal","vscode"].includes(env.TERM_PROGRAM??"")?QUESTION_ANSWER_FALLBACK_KEY:QUESTION_ANSWER_PRIMARY_KEY;return keys.includes(preferred)?formatKeyText(preferred):keyText(ASK_USER_ANSWER_KEYBINDING)}var DARWIN_OPTION_GLYPHS={a:["\xE5","\xC5"],b:["\u222B","\u0131"],c:["\xE7","\xC7"],d:["\u2202","\xCE"],f:["\u0192","\xCF"],g:["\xA9","\u02DD"],h:["\u02D9","\xD3"],j:["\u2206","\xD4"],k:["\u02DA","\uF8FF"],l:["\xAC","\xD2"],m:["\xB5","\xC2"],o:["\xF8","\xD8"],p:["\u03C0","\u220F"],q:["\u0153","\u0152"],r:["\xAE","\u2030"],s:["\xDF","\xCD"],t:["\u2020","\u02C7"],v:["\u221A","\u25CA"],w:["\u2211","\u201E"],x:["\u2248","\u02DB"],y:["\xA5","\xC1"],z:["\u03A9","\xB8"]};function darwinOptionGlyphs(keys){let glyphs=new Set;for(let key of keys){let letter=/^alt\+([a-z])$/i.exec(key)?.[1]?.toLowerCase();if(letter!==void 0)for(let glyph of DARWIN_OPTION_GLYPHS[letter]??[])glyphs.add(glyph)}return glyphs}function matchesAskUserAnswerKey(data,platform4=process.platform,keybindings=getKeybindings()){return keybindings.matches(data,ASK_USER_ANSWER_KEYBINDING)?!0:platform4!=="darwin"?!1:darwinOptionGlyphs(keybindings.getKeys(ASK_USER_ANSWER_KEYBINDING)).has(decodeKittyPrintable(data)??data)}var AskUserCountdown=class{constructor(timeoutMs,tui,onTick,onExpire,getDeadlineAtMs){let deadline=Date.now()+timeoutMs,tick=()=>{let remaining=Math.max(0,(getDeadlineAtMs?.()??deadline)-Date.now());onTick(remaining),tui?.requestRender(),remaining===0&&!getDeadlineAtMs&&(this.dispose(),onExpire())};this.timer=setInterval(tick,1e3),this.timer.unref(),tick()}dispose(){clearInterval(this.timer),this.timer=void 0}};var COMMENT_LABEL="Comment (optional; unanswered questions are reported)",OWN_ANSWER_LABEL="Type your own answer...",NOT_ANSWERED_NOTICE="You have not answered all questions",DISMISS_NOTICE="Press Esc again to dismiss (answers will be discarded)";function formatCountdownLabel(remainingMs2){let totalSeconds=Math.max(0,Math.ceil(remainingMs2/1e3));if(totalSeconds>=300)return`${Math.ceil(totalSeconds/60)}m`;let minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60;return`${String(minutes).padStart(2,"0")}:${String(seconds).padStart(2,"0")}`}var AskUserQuestionState=class{constructor(request2){this.activeIndex=0,this.highlightIndex=0,this.focus="options",this.dismissPending=!1,this.selected=new Map,this.texts=new Map,this.request=request2,this.submitRowIndex=this.commentRowIndex}get activeQuestion(){return this.request.questions[this.activeIndex]}get ownAnswerRowIndex(){return this.activeQuestion.options.length}get rowCount(){return this.ownAnswerRowIndex+1}get activeTabIndex(){return this.focus==="submit"?this.request.questions.length:this.activeIndex}get commentRowIndex(){return this.request.questions.length}get isCommentFocused(){return this.focus==="submit"&&this.submitRowIndex===this.commentRowIndex}switchQuestion(delta){this.switchTab(delta)}switchTab(delta){let count=this.request.questions.length+1,next=(this.activeTabIndex+delta+count)%count;next===this.request.questions.length?this.enterSubmit():this.jumpToQuestion(next)}advance(){if(this.activeIndex+1<this.request.questions.length){this.jumpToQuestion(this.activeIndex+1);return}this.enterSubmit()}jumpToQuestion(index){this.focus="options";let whole=Number.isFinite(index)?Math.trunc(index):0;this.activeIndex=Math.min(Math.max(0,whole),this.request.questions.length-1),this.highlightIndex=0,this.clearTransient()}enterSubmit(){this.focus="submit",this.submitRowIndex=this.commentRowIndex,this.highlightIndex=0,this.clearTransient()}returnToOptions(){this.leaveOwnAnswer(0)}leaveOwnAnswer(row){this.focus="options",this.highlightIndex=Math.min(Math.max(0,row),this.ownAnswerRowIndex),this.clearTransient()}moveSubmitRow(delta){this.submitRowIndex=Math.min(Math.max(0,this.submitRowIndex+delta),this.commentRowIndex),this.clearTransient()}focusComment(){this.submitRowIndex=this.commentRowIndex}clearTransient(){this.notice=void 0,this.dismissPending=!1}requestDismiss(){return this.hasDraft()?this.dismissPending?"cancel":(this.dismissPending=!0,this.notice=DISMISS_NOTICE,"confirm"):"cancel"}acceptPartialSubmit(){this.dismissPending=!1,this.notice=void 0}hasDraft(){return(this.comment??"").trim()!==""?!0:this.request.questions.some(question=>this.isAnswered(question.id))}selectedFor(questionId){return this.selected.get(questionId)??[]}textFor(questionId){return this.texts.get(questionId)}isSelected(questionId,label3){return this.selectedFor(questionId).includes(label3)}isAnswered(questionId){return this.selectedFor(questionId).length>0?!0:(this.texts.get(questionId)??"").trim()!==""}answeredCount(){return this.request.questions.filter(question=>this.isAnswered(question.id)).length}activateOption(questionId,label3){let question=this.request.questions.find(entry=>entry.id===questionId);if(question?.options.some(option=>option.label===label3)){if(question.multiSelect){let next=[...this.selectedFor(questionId)],index=next.indexOf(label3);index>=0?next.splice(index,1):next.push(label3),this.selected.set(questionId,next)}else this.selected.set(questionId,[label3]);this.notice=void 0}}setOwnAnswer(questionId,text2){let trimmed=text2.trim();trimmed!==""&&(this.selected.delete(questionId),this.texts.set(questionId,trimmed),this.notice=void 0)}clearAnswer(questionId){this.selected.delete(questionId),this.texts.delete(questionId),this.notice=void 0}restoreDraft(draft){for(let question of this.request.questions){let answer=draft.answers?.[question.id];if(!answer)continue;let selected=answer.selected.filter(label3=>question.options.some(option=>option.label===label3));selected.length>0&&this.selected.set(question.id,selected),answer.text!==void 0&&answer.text.trim()!==""&&this.texts.set(question.id,answer.text.trim())}draft.comment!==void 0&&draft.comment.trim()!==""&&(this.comment=draft.comment)}answers(){let result3={};for(let question of this.request.questions){let selected=this.selectedFor(question.id),text2=this.texts.get(question.id);selected.length===0&&text2===void 0||(result3[question.id]={selected,...text2!==void 0?{text:text2}:{}})}return result3}unanswered(){return this.request.questions.filter(question=>!this.isAnswered(question.id)).map(q=>q.id)}submitOutcome(forcePartial=!1){if((this.comment??"").trim()!=="")return"comment-submitted";if(this.unanswered().length===0||this.answeredCount()>0||forcePartial)return"answered"}buildResponse(status,autoResolvedAfterMs){let comment=this.comment!==void 0&&this.comment.trim()!==""?this.comment:void 0;return{status,answers:this.answers(),...comment!==void 0?{comment}:{},unanswered:this.unanswered(),...autoResolvedAfterMs!==void 0?{autoResolvedAfterMs}:{}}}refreshDraft(){let comment=this.comment!==void 0&&this.comment.trim()!==""?this.comment:void 0;return{answers:this.answers(),...comment!==void 0?{comment}:{}}}};var ASK_USER_WIDGET_KEY="ask-user",INDENT=" ";function hasAnswer2(answer){return answer?answer.selected.length>0?!0:(answer.text??"").trim()!=="":!1}function unansweredIds2(request2,draft){return request2.questions.filter(question=>!hasAnswer2(draft.answers?.[question.id])).map(q=>q.id)}function buildAnsweredResponse(request2,draft){let comment=draft.comment?.trim();return{status:comment?"comment-submitted":"answered",answers:draft.answers??{},...comment?{comment:draft.comment}:{},unanswered:unansweredIds2(request2,draft)}}function buildCommentResponse(request2,draft,comment){return{status:"comment-submitted",answers:draft.answers??{},comment,unanswered:unansweredIds2(request2,draft)}}function buildTimedOutResponse(request2,draft,autoResolvedAfterMs){let comment=draft.comment?.trim();return{status:"timed_out",answers:draft.answers??{},...comment?{comment}:{},unanswered:unansweredIds2(request2,draft),autoResolvedAfterMs}}function renderStatusLine(unanswered,countdownLabel,pendingCount=1){let countdown=countdownLabel===""?"":theme.fg("muted",` \xB7 ${countdownLabel}`);return theme.fg("accent",theme.bold("?"))+theme.fg("text",pendingCount>1?` ${pendingCount} questions pending`:` Question pending (${unanswered} unanswered)`)+countdown}function renderQuestionLine(question){return INDENT+theme.fg("text",theme.bold(question.header))+theme.fg("muted"," \u2014 ")+theme.fg("text",question.question)}function renderAnswerHint(){let shortcut=askUserAnswerKeyHint(),keys=shortcut===""?"enter":`enter or ${shortcut}`;return[theme.fg("dim",keys)+theme.fg("muted"," to answer"),theme.fg("dim","/answer"),theme.fg("muted","or just type your reply")].join(theme.fg("muted"," \xB7 "))}var AskUserAsyncWidget=class{constructor(options){this.countdownLabel="",this.hits=[],this.renderedWidth=0,this.options=options,this.request=options.request,this.draft=options.draft,this.pendingCount=options.pendingCount??1,(options.timeoutMs>0||options.getDeadlineAtMs)&&(this.countdown=new AskUserCountdown(options.timeoutMs,options.tui,remainingMs2=>{this.countdownLabel=formatCountdownLabel(remainingMs2),this.update()},options.onExpire,options.getDeadlineAtMs)),this.update()}dispose(){this.countdown?.dispose()}invalidate(){}update(){this.options.tui?.requestRender()}render(width){if(this.hits=[],this.renderedWidth=width,width<5)return[truncateToWidth("Use keys to answer",width)];let pending=unansweredIds2(this.request,this.draft),shown=this.request.questions.find(question=>question.id===pending[0]),lines=[],addAction=(text2,action)=>{let line=truncateToWidth(text2,width);this.hits.push({action,row:lines.length,startColumn:0,endColumn:visibleWidth(line)}),lines.push(line)};if(addAction(renderStatusLine(pending.length,this.countdownLabel,this.pendingCount),"expand"),shown){addAction(renderQuestionLine({...shown,header:sanitizeTerminalLabel(shown.header),question:sanitizeTerminalLabel(shown.question)}),"expand");let line="",labels=[...shown.options.map(option=>sanitizeTerminalLabel(option.label)),"own answer\u2026"];for(let[index,label3]of labels.entries()){let button=`[ ${truncateToWidth(label3,width-4,"\u2026")} ]`;line!==""&&visibleWidth(line)+2+visibleWidth(button)>width&&(lines.push(line),line=""),line!==""&&(line+=" ");let startColumn=visibleWidth(line);line+=theme.fg("muted",button),this.hits.push({action:index===shown.options.length?"own-answer":index,row:lines.length,startColumn,endColumn:visibleWidth(line)})}line!==""&&lines.push(line),pending.length>1&&lines.push(truncateToWidth(theme.fg("muted",`+${pending.length-1} more question${pending.length===2?"":"s"}`),width))}if(this.pendingCount>1&&addAction(theme.fg("muted",`\u25B8 +${this.pendingCount-1} more \xB7 ${keyText("app.question.next")} next question`),"next"),this.options.mouseCaptureActive){let bypass=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM??"")?"option+drag":"shift+drag";lines.push(...new Text(theme.fg("muted",`click an option \xB7 ${bypass} to select text`),0,0).render(width))}return lines.push(...new Text(renderAnswerHint(),0,0).render(width)),lines}handleMouse(event){if(event.width!==this.renderedWidth||event.button!=="left"||event.shift||event.alt||event.ctrl||event.type!=="press"&&(event.type!=="click"||event.clickCount!==1))return;let hit=this.hits.find(span=>span.row===event.y&&event.x>=span.startColumn&&event.x<span.endColumn);if(hit)return event.type==="click"&&(typeof hit.action=="number"?this.options.onOptionClick?.(hit.action):hit.action==="own-answer"?this.options.onOwnAnswerClick?.():hit.action==="expand"?this.options.onExpandClick?.():this.options.onNextQuestion?.()),{handled:!0}}};var DEL="\x7F";function isPrintable(data){return data.length===1&&data>=" "&&data!==DEL}function handleAskUserKeyInput(ctx,data){let kb=getKeybindings();if(matchesKey(data,"ctrl+c")){ctx.finish("cancelled");return}if(ctx.state.focus==="own-answer"){handleOwnAnswerKey(ctx,data,kb);return}if(ctx.state.focus==="submit"){handleSubmitKey(ctx,data,kb);return}handleOptionsKey(ctx,data,kb)}function saveTypedOwnAnswer(ctx){ctx.ownAnswerInput.getValue().trim()!==""?ctx.commitOwnAnswer():ctx.ownAnswerInput.setValue("")}function handleOwnAnswerKey(ctx,data,kb){let state=ctx.state;if(matchesKey(data,"ctrl+enter")){ctx.commitOwnAnswer(),ctx.attemptSubmit();return}if(kb.matches(data,"tui.select.confirm")||data===`
2595
2602
  `){ctx.commitOwnAnswer(),state.advance(),ctx.updateAll();return}if(kb.matches(data,"tui.select.cancel")){ctx.ownAnswerInput.setValue(""),state.leaveOwnAnswer(state.ownAnswerRowIndex),ctx.updateAll();return}if(kb.matches(data,"tui.select.up")){saveTypedOwnAnswer(ctx),state.leaveOwnAnswer(state.ownAnswerRowIndex-1),ctx.updateAll();return}if(kb.matches(data,"tui.select.down")){saveTypedOwnAnswer(ctx),state.leaveOwnAnswer(state.ownAnswerRowIndex),ctx.updateAll();return}if(matchesKey(data,"tab")||matchesKey(data,"shift+tab")){saveTypedOwnAnswer(ctx),state.switchTab(matchesKey(data,"tab")?1:-1),ctx.updateAll();return}if(matchesKey(data,"backspace")&&ctx.ownAnswerInput.getValue()===""){state.leaveOwnAnswer(state.ownAnswerRowIndex),ctx.updateAll();return}ctx.ownAnswerInput.handleInput(data),ctx.emitProgress()}function handleSubmitKey(ctx,data,kb){let state=ctx.state;if(matchesKey(data,"ctrl+enter")){ctx.attemptSubmit();return}if(kb.matches(data,"tui.input.submit")||data===`
2596
2603
  `){state.isCommentFocused?ctx.attemptSubmit():(state.jumpToQuestion(state.submitRowIndex),ctx.updateAll());return}if(kb.matches(data,"tui.select.cancel")){state.request.waitForAnswer?state.returnToOptions():ctx.finish("cancelled"),ctx.updateAll();return}if(kb.matches(data,"tui.select.up")||kb.matches(data,"tui.select.down")){state.moveSubmitRow(kb.matches(data,"tui.select.up")?-1:1),ctx.updateAll();return}if(matchesKey(data,"shift+tab")||matchesKey(data,"tab")){state.switchTab(matchesKey(data,"tab")?1:-1),ctx.updateAll();return}let commentHasText=ctx.commentInput.getValue()!=="";if((matchesKey(data,"left")||matchesKey(data,"right"))&&(!state.isCommentFocused||!commentHasText)){state.switchTab(matchesKey(data,"right")?1:-1),ctx.updateAll();return}if(matchesKey(data,"backspace")&&state.isCommentFocused&&!commentHasText){state.moveSubmitRow(-1),ctx.updateAll();return}if(!state.isCommentFocused){if(!isPrintable(data))return;state.focusComment()}ctx.commentInput.handleInput(data),state.comment=ctx.commentInput.getValue(),ctx.updateAll(),ctx.emitProgress()}function handleOptionsKey(ctx,data,kb){let state=ctx.state;if(matchesKey(data,"ctrl+enter")){ctx.attemptSubmit();return}if(kb.matches(data,"tui.select.cancel")){!state.request.waitForAnswer||state.requestDismiss()==="cancel"?ctx.finish("cancelled"):ctx.updateAll();return}if(matchesKey(data,"tab")||matchesKey(data,"right")){state.switchTab(1),ctx.updateAll();return}if(matchesKey(data,"shift+tab")||matchesKey(data,"left")){state.switchTab(-1),ctx.updateAll();return}if(kb.matches(data,"tui.select.up")||data==="k"){state.highlightIndex=Math.max(0,state.highlightIndex-1),ctx.updateAll();return}if(kb.matches(data,"tui.select.down")||data==="j"){state.highlightIndex=Math.min(state.ownAnswerRowIndex,state.highlightIndex+1),ctx.updateAll();return}if(matchesKey(data,"backspace")){state.clearAnswer(state.activeQuestion.id),ctx.emitProgress(),ctx.updateAll();return}if(data.length===1&&data>="1"&&data<="9"){let option=state.activeQuestion.options[Number(data)-1];option&&(state.activateOption(state.activeQuestion.id,option.label),ctx.emitProgress(),state.activeQuestion.multiSelect||(state.request.questions.length===1?ctx.attemptSubmit():state.advance()),ctx.updateAll());return}if(matchesKey(data,"space")){activateHighlighted(ctx,!1);return}if(kb.matches(data,"tui.select.confirm")||data===`
2597
2604
  `){activateHighlighted(ctx,!0);return}if(data==="c"){state.enterSubmit(),ctx.updateAll();return}isPrintable(data)&&(ctx.openOwnAnswer(data),ctx.updateAll())}function activateHighlighted(ctx,confirm){let state=ctx.state;if(state.highlightIndex===state.ownAnswerRowIndex){ctx.openOwnAnswer();return}let option=state.activeQuestion.options[state.highlightIndex];option&&(state.activateOption(state.activeQuestion.id,option.label),ctx.emitProgress(),ctx.updateAll(),confirm&&(!state.activeQuestion.multiSelect&&state.request.questions.length===1?ctx.attemptSubmit():state.activeQuestion.multiSelect||(state.advance(),ctx.updateAll())))}function isQuestionMouseAction(event){return event.button==="left"&&!event.shift&&!event.alt&&!event.ctrl&&(event.type==="press"||event.type==="click"&&event.clickCount===1)}function questionMouseRegion(child,onClick){return new MouseRegion(child,event=>{if(!(!isQuestionMouseAction(event)||event.y!==0))return event.type==="click"&&onClick(),{handled:!0,focus:!0}})}var AskUserQuestionTabs=class{constructor(onClick){this.tabs=[],this.hits=[],this.width=0,this.onClick=onClick}setTabs(tabs){this.tabs=tabs}invalidate(){}render(width){if(this.hits=[],this.width=width,width<5)return[truncateToWidth("Use keys",width)];let lines=[],line=" ";for(let[index,tab]of this.tabs.entries()){let label3=truncateToWidth(tab,width-2);visibleWidth(line)>1&&visibleWidth(line)+2+visibleWidth(label3)>width-1&&(lines.push(line),line=" "),visibleWidth(line)>1&&(line+=" ");let start=visibleWidth(line);line+=label3,this.hits.push({index,row:lines.length,start,end:visibleWidth(line)})}return lines.push(line),lines}handleMouse(event){if(!isQuestionMouseAction(event)||event.width!==this.width)return;let hit=this.hits.find(span=>event.y===span.row&&event.x>=span.start&&event.x<span.end);if(hit)return event.type==="click"&&this.onClick(hit.index),{handled:!0,focus:!0}}};function renderTitle(countdownLabel){let suffix=countdownLabel===""?"":theme.fg("muted",` \xB7 ${countdownLabel}`);return theme.fg("accent",theme.bold("Ask user"))+suffix}function renderTabLabels(state){let tabs=state.request.questions.map((question,index)=>{let answered=state.isAnswered(question.id)?theme.fg("success"," \u2713"):"",label3=`${question.header}${answered}`;return index===state.activeTabIndex?theme.fg("accent",theme.bold(`\u2192 ${label3}`)):theme.fg("muted",` ${label3}`)}),submit=state.activeTabIndex===state.request.questions.length?theme.fg("accent",theme.bold("\u2192 Submit")):theme.fg("muted"," Submit");return[...tabs,submit]}function renderQuestionLine2(question){return theme.fg("text",question.question)}function renderQuestionList(state){let lines=[],active=state.activeQuestion;active.options.forEach((option,index)=>{let highlighted=index===state.highlightIndex&&state.focus==="options",marker=state.isSelected(active.id,option.label)?theme.fg("success"," \u2713"):"",prefix=highlighted?theme.fg("accent","\u2192 "):" ";lines.push(`${prefix}${index+1}. ${theme.fg("text",option.label)}${marker}`),option.description&&lines.push(theme.fg("muted",` ${option.description}`))});let ownText=state.textFor(active.id),ownSuffix=ownText!==void 0?theme.fg("text",`: ${ownText}`):"",ownPrefix=state.highlightIndex===state.ownAnswerRowIndex&&state.focus==="options"?theme.fg("accent","\u2192 "):" ";return lines.push(`${ownPrefix}${theme.fg("muted",OWN_ANSWER_LABEL)}${ownSuffix}`),lines}function renderSubmitSummary(state){return state.request.questions.map((question,index)=>{let prefix=state.focus==="submit"&&state.submitRowIndex===index?theme.fg("accent","\u2192 "):" ",answer=state.answers()[question.id];if(!answer)return`${prefix}${theme.fg("warning",`${question.header}: unanswered`)}`;let value2=answer.selected.length>0?answer.selected.join(", "):answer.text??"";return`${prefix}${question.header}: ${value2}`})}function renderOwnAnswerLabel(){return theme.fg("muted","Your answer (enter to save, \u2191\u2193 back to options, esc to discard)")}function renderCommentLabel(){return theme.fg("muted",COMMENT_LABEL)}function renderNotice(notice2){return notice2===void 0?"":theme.fg("warning",`! ${notice2}`)}function renderSubmitLine(state){let answered=state.answeredCount(),total=state.request.questions.length;if(state.focus==="submit")return theme.fg("accent",theme.bold(`Submit (${answered}/${total} answered)`));let hint=state.focus==="options"&&state.activeQuestion.multiSelect?" \u2014 Enter toggles; Tab to Submit":" \u2014 Enter advances";return theme.fg("accent",theme.bold(`Submit (${answered}/${total} answered)`))+theme.fg("muted",hint)}function renderHintsLine(state){return state.focus==="submit"?state.isCommentFocused?rawKeyHint("enter","submit")+" "+rawKeyHint("\u2191","review answers")+" "+rawKeyHint("shift+tab","back")+" "+rawKeyHint("tab","next question")+" "+rawKeyHint("esc","back"):rawKeyHint("enter","edit answer")+" "+rawKeyHint("\u2191\u2193","move")+" "+rawKeyHint("tab","next question")+" "+rawKeyHint("esc","back"):state.focus==="own-answer"?rawKeyHint("enter","save and next")+" "+rawKeyHint("\u2191\u2193","back to options")+" "+rawKeyHint("tab","next question")+" "+rawKeyHint("esc","discard"):rawKeyHint("\u2191\u2193","move")+" "+rawKeyHint("1-9","select")+" "+rawKeyHint("space",state.activeQuestion.multiSelect?"toggle":"select")+" "+rawKeyHint("enter",state.activeQuestion.multiSelect?"toggle":"next")+" "+rawKeyHint("tab",state.activeQuestion.multiSelect?"next / Submit":"next question")+" "+rawKeyHint("c","comment")+" "+rawKeyHint("esc","cancel")}var AskUserQuestionComponent=class extends Container{constructor(request2,done,opts={}){super(),this.ownAnswerInput=new Input,this.commentInput=new Input,this.listContainer=new Container,this.ownAnswerContainer=new Container,this.submitContainer=new Container,this.countdownLabel="",this.settled=!1,this._focused=!1,this.state=new AskUserQuestionState(request2),this.doneCallback=done,this.options=opts,this.keyHandlerContext={state:this.state,ownAnswerInput:this.ownAnswerInput,commentInput:this.commentInput,finish:(status,autoResolvedAfterMs)=>this.finish(status,autoResolvedAfterMs),attemptSubmit:()=>this.attemptSubmit(),openOwnAnswer:initialText=>this.openOwnAnswer(initialText),commitOwnAnswer:()=>this.commitOwnAnswer(),emitProgress:()=>this.emitProgress(),updateAll:()=>this.updateAll()},this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.titleText=new Text("",1,0),this.addChild(this.titleText),this.tabText=new AskUserQuestionTabs(index=>{index===this.state.request.questions.length?this.clickSubmit():(this.state.jumpToQuestion(index),this.updateAll())}),this.addChild(this.tabText),this.questionText=new Text("",1,0),this.addChild(this.questionText),this.addChild(this.listContainer),this.addChild(this.ownAnswerContainer),this.addChild(this.submitContainer),this.noticeText=new Text("",1,0),this.addChild(this.noticeText),this.submitText=new Text("",1,0),this.addChild(questionMouseRegion(this.submitText,()=>this.clickSubmit())),this.hintsText=new Text("",1,0),this.addChild(this.hintsText),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),opts.initialDraft&&(this.state.restoreDraft(opts.initialDraft),this.state.comment!==void 0&&this.commentInput.setValue(this.state.comment)),opts.initialQuestionIndex!==void 0&&this.state.jumpToQuestion(opts.initialQuestionIndex);let timeoutMs=opts.timeoutMs??request2.timeoutMs;(timeoutMs>0||opts.getDeadlineAtMs)&&(this.countdown=new AskUserCountdown(timeoutMs,opts.tui,remainingMs2=>{this.countdownLabel=formatCountdownLabel(remainingMs2),this.updateTitle(),this.options.tui?.requestRender()},()=>this.finish("timed_out",timeoutMs),opts.getDeadlineAtMs)),this.updateAll()}get focused(){return this._focused}set focused(value2){this._focused=value2,this.applyFocusFlags()}handleInput(data){handleAskUserKeyInput(this.keyHandlerContext,data)}handleMouse(event){if(!(this.settled||!isQuestionMouseAction(event)))return super.handleMouse(event)}dispose(){this.countdown?.dispose()}clickSubmit(){this.state.focus==="submit"?this.attemptSubmit():(this.state.enterSubmit(),this.updateAll())}clickOption(index,submitSingleQuestion=!1){let question=this.state.activeQuestion,immediate=submitSingleQuestion&&this.state.request.questions.length===1&&!question.multiSelect;this.state.highlightIndex=index,this.state.activateOption(question.id,question.options[index].label),!question.multiSelect&&!immediate&&this.state.advance(),this.emitProgress(),this.updateAll(),immediate&&(this.options.tui?.renderNow(),this.attemptSubmit())}openOwnAnswer(initialText){this.state.focus="own-answer";let existing=this.state.textFor(this.state.activeQuestion.id)??"";this.ownAnswerInput.setValue(""),existing!==""&&this.ownAnswerInput.handleInput(existing),initialText!==void 0&&this.ownAnswerInput.handleInput(initialText),this.updateAll()}commitOwnAnswer(){this.state.setOwnAnswer(this.state.activeQuestion.id,this.ownAnswerInput.getValue()),this.ownAnswerInput.setValue(""),this.emitProgress()}attemptSubmit(){this.state.comment=this.commentInput.getValue();let outcome=this.state.submitOutcome(this.state.notice!==void 0);if(!outcome){this.state.notice=NOT_ANSWERED_NOTICE,this.updateAll();return}this.state.acceptPartialSubmit(),this.finish(outcome)}emitProgress(){let draft=this.state.refreshDraft();if(this.state.focus==="own-answer"){let live=this.ownAnswerInput.getValue().trim();live!==""&&(draft.answers={...draft.answers,[this.state.activeQuestion.id]:{selected:[],text:live}})}this.options.onProgress?.(draft)}finish(status,autoResolvedAfterMs){this.settled||(this.settled=!0,this.countdown?.dispose(),this.state.comment=this.commentInput.getValue(),this.doneCallback(this.state.buildResponse(status,autoResolvedAfterMs)))}applyFocusFlags(){this.ownAnswerInput.focused=this._focused&&this.state.focus==="own-answer",this.commentInput.focused=this._focused&&this.state.isCommentFocused}updateTitle(){this.titleText.setText(renderTitle(this.countdownLabel))}updateAll(){this.updateTitle(),this.applyFocusFlags(),this.tabText.setTabs(renderTabLabels(this.state)),this.questionText.setText(this.state.focus==="submit"?"Review your answers":renderQuestionLine2(this.state.activeQuestion)),this.listContainer.clear();let lines=this.state.focus==="submit"?renderSubmitSummary(this.state):renderQuestionList(this.state),optionIndex=0,description=!1;for(let line of lines){let text2=new Text(line,1,0);if(this.state.focus==="submit"||description)this.listContainer.addChild(text2),description=!1;else if(optionIndex<this.state.activeQuestion.options.length){let index=optionIndex++;this.listContainer.addChild(questionMouseRegion(text2,()=>this.clickOption(index))),description=!!this.state.activeQuestion.options[index].description}else this.listContainer.addChild(questionMouseRegion(text2,()=>this.openOwnAnswer()))}this.ownAnswerContainer.clear(),this.state.focus==="own-answer"&&(this.ownAnswerContainer.addChild(new Text(renderOwnAnswerLabel(),1,0)),this.ownAnswerContainer.addChild(this.ownAnswerInput)),this.submitContainer.clear(),this.state.focus==="submit"&&(this.submitContainer.addChild(new Spacer(1)),this.submitContainer.addChild(new Text(renderCommentLabel(),1,0)),this.submitContainer.addChild(this.commentInput)),this.noticeText.setText(renderNotice(this.state.notice)),this.submitText.setText(renderSubmitLine(this.state)),this.hintsText.setText(renderHintsLine(this.state))}};var CONTINUITY_DIAGNOSTIC_TYPE="claude_sdk_oauth_session_continuity",RESUME_FALLBACK_DIAGNOSTIC_TYPE="claude_sdk_oauth_resume_fallback",DEGRADATION_KINDS=new Set(["flatten","disabled"]),KIND_LABELS={flatten:"Session continuity lost - resent the full conversation",disabled:"Session continuity disabled (resumeMode: off) - resending the conversation each turn"},RESUME_FALLBACK_LABEL="Session continuity lost - resume failed, resent the full conversation";function continuityDetails(diagnostic2){if(diagnostic2.type!==CONTINUITY_DIAGNOSTIC_TYPE)return;let details=diagnostic2.details;if(!(!details||typeof details.kind!="string"))return{kind:details.kind,...typeof details.reason=="string"?{reason:details.reason}:{},...typeof details.payloadBytes=="number"?{payloadBytes:details.payloadBytes}:{},...typeof details.collapsedDirectives=="number"?{collapsedDirectives:details.collapsedDirectives}:{}}}function formatBytes3(bytes){return bytes<1024?`${bytes}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(1)}MB`}function payloadSuffix(details){if(details.payloadBytes===void 0)return"";let collapsed=details.collapsedDirectives!==void 0&&details.collapsedDirectives>0?`, ${details.collapsedDirectives} duplicate ultrawork blocks collapsed`:"";return` - sent ${formatBytes3(details.payloadBytes)}${collapsed}`}var ContinuityNoticeTracker=class{constructor(){this.renderedDisabled=!1}reset(){this.renderedDisabled=!1}noticeFor(message){for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type===RESUME_FALLBACK_DIAGNOSTIC_TYPE)return this.format(RESUME_FALLBACK_LABEL);let details=continuityDetails(diagnostic2);if(!details||!DEGRADATION_KINDS.has(details.kind))continue;if(details.kind==="disabled"){if(this.renderedDisabled)continue;this.renderedDisabled=!0}let label3=KIND_LABELS[details.kind]??"Session continuity degraded",base=details.reason?`${label3} (${details.reason})`:label3;return this.format(`${base}${payloadSuffix(details)}`)}}format(text2){return theme.fg("muted",text2)}};var CustomEntryComponent=class extends Container{constructor(entry,renderer){super(),this._expanded=!1,this.entry=entry,this.renderer=renderer,this.rebuild()}get customEntry(){return this.entry}hasContent(){return this.customComponent!==void 0}setExpanded(expanded){this._expanded!==expanded&&(this._expanded=expanded,this.rebuild())}invalidate(){super.invalidate(),this.rebuild()}rebuild(){this.clear(),this.customComponent=void 0;let component;try{component=this.renderer(this.entry,{expanded:this._expanded},theme)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2),box2=new Box(1,1,text2=>theme.bg("customMessageBg",text2));box2.addChild(new Text(theme.fg("error",`[${this.entry.customType}] renderer failed: ${message}`),0,0)),component=box2}component&&(this.customComponent=component,this.addChild(new Spacer(1)),this.addChild(component))}};function replacedEntryCardIndex(children,insertIndex,entry,options,isTransient=()=>!1){if(options?.replaces===void 0)return-1;let previousIndex=insertIndex-1;for(;previousIndex>=0&&isTransient(children[previousIndex]);)previousIndex--;let previous=children[previousIndex];return!(previous instanceof CustomEntryComponent)||previous.customEntry.customType!==entry.customType?-1:options.replaces(previous.customEntry,entry)?previousIndex:-1}import*as fs4 from"node:fs";var BLOG_URL="https://mariozechner.at/posts/2026-04-08-ive-sold-out/",IMAGE_FILENAME="clankolas.png",cachedImageBase64,attemptedImageLoad=!1;function loadImageBase64(){if(attemptedImageLoad)return cachedImageBase64;attemptedImageLoad=!0;try{cachedImageBase64=fs4.readFileSync(getBundledInteractiveAssetPath(IMAGE_FILENAME)).toString("base64")}catch{cachedImageBase64=void 0}return cachedImageBase64}var EarendilAnnouncementComponent=class extends Container{constructor(){super(),this.addChild(buildNoticeBox({title:"pi has joined Earendil",tone:"accent",why:"Read the blog post:",extra:[{text:BLOG_URL,tone:"accent"}]},{expanded:!1},theme)),this.addChild(new Spacer(1));let imageBase64=loadImageBase64();imageBase64&&(this.addChild(new Image(imageBase64,"image/png",{fallbackColor:text2=>theme.fg("muted",text2)},{maxWidthCells:56,filename:IMAGE_FILENAME})),this.addChild(new Spacer(1)))}};import{basename as basename29}from"node:path";var BUILT_IN_RENDERERS={read:readRenderers,grep:grepRenderers,find:findRenderers,ls:lsRenderers};function stringArg(args,...keys){if(!(args===null||typeof args!="object"))for(let key of keys){let value2=Reflect.get(args,key);if(typeof value2=="string"&&value2)return value2}}function isReadRenderArgs(args){return args!==null&&typeof args=="object"}function isSemanticRead(args,cwd){let kind=getCompactReadClassification(isReadRenderArgs(args)?args:void 0,cwd)?.kind;return kind==="skill"||kind==="memory"}function explorationCall(component){let{identity,state,presentation}=component.presentationSnapshot;if(presentation!=="classic")return;let toolName=identity.toolName;if(toolName!=="read"&&toolName!=="grep"&&toolName!=="find"&&toolName!=="ls")return;let expected=BUILT_IN_RENDERERS[toolName],actual=identity.toolDefinition;if(actual&&(actual.renderCall!==expected.renderCall||actual.renderResult!==expected.renderResult))return;let pending=state.isPartial,failed=state.result?.isError??!1,path13=stringArg(state.args,"file_path","path");if(toolName==="read")return isSemanticRead(state.args,identity.cwd)?void 0:{action:"Read",label:path13?getSkillReadPath(resolveToCwd(path13,identity.cwd),identity.cwd)??basename29(path13):"",pending,failed};if(toolName==="grep"){let pattern=stringArg(state.args,"pattern")??"",dir=path13?formatPathRelativeToCwdOrAbsolute(resolveToCwd(path13,identity.cwd),identity.cwd):"";return{action:"Search",label:dir?`${pattern} in ${dir}`:pattern,pending,failed}}return{action:"List",label:path13&&basename29(path13)||path13||".",pending,failed}}var MAX_BODY_LINES=8,SPINNER_FRAME_MS=80;function bodyLines(calls){let lines=[];for(let index=0;index<calls.length;){let first=calls[index];if(index++,first.action==="Read"&&!first.failed){let names=[first.label];for(;index<calls.length&&calls[index].action==="Read"&&!calls[index].failed;)names.push(calls[index].label),index++;let unique3=[...new Set(names.filter(Boolean))];lines.push(`${theme.fg("accent","Read")} ${unique3.join(theme.fg("dim",", "))}`.trimEnd());continue}let failed=first.failed?theme.fg("error"," (failed)"):"";lines.push(`${theme.fg("accent",first.action)} ${first.label}`.trimEnd()+failed)}return lines}var ExplorationGroup=class extends Container{constructor(){super(...arguments),this.calls=[],this.rules=[]}get expanded(){return this.calls.some(({component})=>component.presentationSnapshot.state.expanded)}render(width){let pending=this.calls.some(({call})=>call.pending),failed=this.calls.filter(({call})=>call.failed).length,header2=`${pending?theme.fg("accent",toolSpinnerGlyph(Math.floor(Date.now()/SPINNER_FRAME_MS))):theme.fg("dim","\u2022")} ${theme.bold(pending?"Exploring":"Explored")}`+(failed?theme.fg("error",` \xB7 ${failed} failed`):""),lines=["",truncateToWidth(header2,width)];if(this.expanded)return[...lines,...super.render(width)];let body=bodyLines(this.calls.map(({call})=>call)),ruleCount=new Set(this.rules).size;ruleCount>0&&body.push(`${theme.fg("accent","Applied")} ${ruleCount} project ${ruleCount===1?"rule":"rules"}`);let shown=body.length>MAX_BODY_LINES?body.slice(0,MAX_BODY_LINES):body;body.length>shown.length&&shown.push(theme.fg("dim",`\u2026 +${body.length-shown.length} more`));for(let[index,line]of shown.entries())lines.push(truncateToWidth(`${index===0?theme.fg("dim"," \u2514 "):" "}${line}`,width));return lines}handleMouse(event){if((event.type==="press"||event.type==="click")&&event.button==="left"&&(event.y===1||!this.expanded)){if(event.type==="click"){let expanded=!this.expanded;for(let{component}of this.calls)component.setExpanded(expanded)}return{handled:!0,target:{component:this,originX:event.screenX-event.x,originY:event.screenY-event.y,width:event.width,height:event.height}}}if(this.expanded&&event.y>=2)return super.handleMouse({...event,y:event.y-2,height:event.height-2})}setMembers(members,calls,rules=[]){this.children=members,this.calls=calls,this.rules=rules}};function projectRulesOfCall(card,calls){let entry=card.customEntry;if(entry.customType!==RULE_ACTIVATION_ENTRY_TYPE)return;let details=parseRuleActivationDetails(entry.data);if(details?.kind!=="project-rules"||details.toolCallId===void 0)return;let toolCallId=details.toolCallId;return calls.some(({component})=>component.presentationSnapshot.identity.toolCallId===toolCallId)?details.rules:void 0}var DEFAULT_TAIL_BUDGET=60,DEFAULT_WARM_CHUNK_SIZE=100,PENDING_FIRST_PAINT=-1,ProgressiveTranscriptContainer=class extends Container{constructor(options){super(),this.hydratedFrom=PENDING_FIRST_PAINT,this.hydrationScheduled=!1,this.hydrationGeneration=0,this.hydrationHalted=!1,this.tailBudget=options.tailBudget,this.warmChunkSize=options.warmChunkSize,this.requestRender=options.requestRender}get isFullyHydrated(){return this.hydratedFrom===0&&!this.hydrationScheduled}render(width){this.lastRenderWidth=width;let total=this.children.length;if(this.hydratedFrom===0||total===0)return this.hydratedFrom=0,super.render(width);let firstVisible=Math.max(0,total-this.tailBudget);return firstVisible===0?(this.hydratedFrom=0,super.render(width)):(this.hydratedFrom=this.hydratedFrom===PENDING_FIRST_PAINT?firstVisible:Math.min(this.hydratedFrom,firstVisible),this.scheduleHydration(),this.renderRange(this.hydratedFrom,total,width))}clear(){this.cancelHydration(),this.rearmHydration(),super.clear()}detachAll(){this.cancelHydration(),this.rearmHydration(),super.detachAll()}rearmHydration(){this.hydratedFrom=PENDING_FIRST_PAINT,this.hydrationHalted=!1}dispose(){this.hydrationHalted=!0,this.cancelHydration(),super.dispose()}renderRange(from,to,width){let lines=[];for(let index=from;index<to;index++){let child=this.children[index];if(child===void 0)continue;let childLines;try{childLines=child.render(width)}catch{childLines=[`[render error: ${child.constructor.name||"AnonymousComponent"}]`]}for(let line of childLines)lines.push(line)}return lines}scheduleHydration(){if(this.hydrationScheduled||this.hydrationHalted)return;this.hydrationScheduled=!0;let generation2=this.hydrationGeneration;setImmediate(()=>{this.hydrationScheduled=!1,this.warmNextChunk(generation2)})}warmNextChunk(generation2){if(this.hydrationHalted||generation2!==this.hydrationGeneration||this.hydratedFrom===0)return;let chunkEnd=this.hydratedFrom,chunkStart=Math.max(0,chunkEnd-this.warmChunkSize),width=this.lastRenderWidth;if(width!==void 0&&this.renderRange(chunkStart,chunkEnd,width),this.hydratedFrom=chunkStart,chunkStart===0){this.requestRender();return}this.scheduleHydration()}cancelHydration(){this.hydrationGeneration+=1,this.hydrationScheduled=!1}};var ExplorationTranscriptContainer=class extends Container{constructor(options){super(),this.groups=new WeakMap,this.display=new ProgressiveTranscriptContainer(options)}render(width){let projected=[],group,members=[],calls=[],rules=[];for(let child of this.children){let call=child instanceof ToolExecutionComponent?explorationCall(child):void 0;child instanceof ToolExecutionComponent&&call?(group||(group=this.groups.get(child)??new ExplorationGroup,this.groups.set(child,group),projected.push(group),members=[],calls=[],rules=[]),members.push(child),calls.push({component:child,call}),group.setMembers(members,calls,rules)):group&&child instanceof AssistantMessageComponent&&child.isExplorationDetail?members.push(child):group&&child instanceof CustomEntryComponent&&projectRulesOfCall(child,calls)?(members.push(child),rules=[...rules,...projectRulesOfCall(child,calls)??[]],group.setMembers(members,calls,rules)):(group=void 0,projected.push(child))}return this.display.children=projected,this.display.render(width)}handleMouse(event){return this.display.handleMouse(event)}clear(){this.display.detachAll(),this.groups=new WeakMap,super.clear()}detachAll(){this.display.detachAll(),this.groups=new WeakMap,super.detachAll()}dispose(){this.display.detachAll(),this.display.dispose(),super.dispose()}};var LoadedResourceSection=class extends Container{constructor(collapsedText,expandedText,expanded){super(),this.body=new Text("",0,0),this.collapsedText=collapsedText,this.expandedText=expandedText,this.setExpanded(expanded)}setExpanded(expanded){let text2=expanded?this.expandedText:this.collapsedText;this.clear(),text2.length!==0&&(this.body.setText(text2),this.addChild(this.body),this.addChild(new Spacer(1)))}};var WIDTHS=[[0,172,1],[173,173,0],[174,767,1],[768,879,0],[880,1154,1],[1155,1161,0],[1162,1424,1],[1425,1469,0],[1470,1470,1],[1471,1471,0],[1472,1472,1],[1473,1474,0],[1475,1475,1],[1476,1477,0],[1478,1478,1],[1479,1479,0],[1480,1540,1],[1541,1541,0],[1542,1551,1],[1552,1562,0],[1563,1563,1],[1564,1564,0],[1565,1610,1],[1611,1631,0],[1632,1647,1],[1648,1648,0],[1649,1749,1],[1750,1756,0],[1757,1758,1],[1759,1764,0],[1765,1766,1],[1767,1768,0],[1769,1769,1],[1770,1773,0],[1774,1806,1],[1807,1807,0],[1808,1808,1],[1809,1809,0],[1810,1839,1],[1840,1866,0],[1867,1957,1],[1958,1968,0],[1969,2026,1],[2027,2035,0],[2036,2044,1],[2045,2045,0],[2046,2069,1],[2070,2073,0],[2074,2074,1],[2075,2083,0],[2084,2084,1],[2085,2087,0],[2088,2088,1],[2089,2093,0],[2094,2136,1],[2137,2139,0],[2140,2191,1],[2192,2193,0],[2194,2199,1],[2200,2207,0],[2208,2249,1],[2250,2306,0],[2307,2361,1],[2362,2362,0],[2363,2363,1],[2364,2364,0],[2365,2368,1],[2369,2376,0],[2377,2380,1],[2381,2381,0],[2382,2384,1],[2385,2391,0],[2392,2401,1],[2402,2403,0],[2404,2432,1],[2433,2433,0],[2434,2491,1],[2492,2492,0],[2493,2493,1],[2494,2494,0],[2495,2496,1],[2497,2500,0],[2501,2508,1],[2509,2509,0],[2510,2518,1],[2519,2519,0],[2520,2529,1],[2530,2531,0],[2532,2557,1],[2558,2558,0],[2559,2560,1],[2561,2562,0],[2563,2619,1],[2620,2620,0],[2621,2624,1],[2625,2626,0],[2627,2630,1],[2631,2632,0],[2633,2634,1],[2635,2637,0],[2638,2640,1],[2641,2641,0],[2642,2671,1],[2672,2673,0],[2674,2676,1],[2677,2677,0],[2678,2688,1],[2689,2690,0],[2691,2747,1],[2748,2748,0],[2749,2752,1],[2753,2757,0],[2758,2758,1],[2759,2760,0],[2761,2764,1],[2765,2765,0],[2766,2785,1],[2786,2787,0],[2788,2809,1],[2810,2815,0],[2816,2816,1],[2817,2817,0],[2818,2875,1],[2876,2876,0],[2877,2877,1],[2878,2879,0],[2880,2880,1],[2881,2884,0],[2885,2892,1],[2893,2893,0],[2894,2900,1],[2901,2903,0],[2904,2913,1],[2914,2915,0],[2916,2945,1],[2946,2946,0],[2947,3005,1],[3006,3006,0],[3007,3007,1],[3008,3008,0],[3009,3020,1],[3021,3021,0],[3022,3030,1],[3031,3031,0],[3032,3071,1],[3072,3072,0],[3073,3075,1],[3076,3076,0],[3077,3131,1],[3132,3132,0],[3133,3133,1],[3134,3136,0],[3137,3141,1],[3142,3144,0],[3145,3145,1],[3146,3149,0],[3150,3156,1],[3157,3158,0],[3159,3169,1],[3170,3171,0],[3172,3200,1],[3201,3201,0],[3202,3259,1],[3260,3260,0],[3261,3262,1],[3263,3264,0],[3265,3265,1],[3266,3266,0],[3267,3269,1],[3270,3272,0],[3273,3273,1],[3274,3277,0],[3278,3284,1],[3285,3286,0],[3287,3297,1],[3298,3299,0],[3300,3327,1],[3328,3329,0],[3330,3386,1],[3387,3388,0],[3389,3389,1],[3390,3390,0],[3391,3392,1],[3393,3396,0],[3397,3404,1],[3405,3406,0],[3407,3414,1],[3415,3415,0],[3416,3425,1],[3426,3427,0],[3428,3456,1],[3457,3457,0],[3458,3529,1],[3530,3530,0],[3531,3534,1],[3535,3535,0],[3536,3537,1],[3538,3540,0],[3541,3541,1],[3542,3542,0],[3543,3550,1],[3551,3551,0],[3552,3632,1],[3633,3633,0],[3634,3635,1],[3636,3642,0],[3643,3654,1],[3655,3662,0],[3663,3760,1],[3761,3761,0],[3762,3763,1],[3764,3772,0],[3773,3783,1],[3784,3790,0],[3791,3863,1],[3864,3865,0],[3866,3892,1],[3893,3893,0],[3894,3894,1],[3895,3895,0],[3896,3896,1],[3897,3897,0],[3898,3952,1],[3953,3966,0],[3967,3967,1],[3968,3972,0],[3973,3973,1],[3974,3975,0],[3976,3980,1],[3981,3991,0],[3992,3992,1],[3993,4028,0],[4029,4037,1],[4038,4038,0],[4039,4140,1],[4141,4144,0],[4145,4145,1],[4146,4151,0],[4152,4152,1],[4153,4154,0],[4155,4156,1],[4157,4158,0],[4159,4183,1],[4184,4185,0],[4186,4189,1],[4190,4192,0],[4193,4208,1],[4209,4212,0],[4213,4225,1],[4226,4226,0],[4227,4228,1],[4229,4230,0],[4231,4236,1],[4237,4237,0],[4238,4252,1],[4253,4253,0],[4254,4351,1],[4352,4447,2],[4448,4607,0],[4608,4956,1],[4957,4959,0],[4960,5905,1],[5906,5908,0],[5909,5937,1],[5938,5939,0],[5940,5969,1],[5970,5971,0],[5972,6001,1],[6002,6003,0],[6004,6051,1],[6052,6052,2],[6053,6067,1],[6068,6069,0],[6070,6070,1],[6071,6077,0],[6078,6085,1],[6086,6086,0],[6087,6088,1],[6089,6099,0],[6100,6103,1],[6104,6104,3],[6105,6108,1],[6109,6109,0],[6110,6154,1],[6155,6159,0],[6160,6276,1],[6277,6278,0],[6279,6312,1],[6313,6313,0],[6314,6431,1],[6432,6434,0],[6435,6438,1],[6439,6440,0],[6441,6449,1],[6450,6450,0],[6451,6456,1],[6457,6459,0],[6460,6678,1],[6679,6680,0],[6681,6682,1],[6683,6683,0],[6684,6741,1],[6742,6742,0],[6743,6743,1],[6744,6750,0],[6751,6751,1],[6752,6752,0],[6753,6753,1],[6754,6754,0],[6755,6756,1],[6757,6764,0],[6765,6770,1],[6771,6780,0],[6781,6782,1],[6783,6783,0],[6784,6831,1],[6832,6862,0],[6863,6911,1],[6912,6915,0],[6916,6963,1],[6964,6973,0],[6974,6977,1],[6978,6979,0],[6980,7018,1],[7019,7027,0],[7028,7039,1],[7040,7041,0],[7042,7073,1],[7074,7077,0],[7078,7079,1],[7080,7081,0],[7082,7082,1],[7083,7085,0],[7086,7141,1],[7142,7142,0],[7143,7143,1],[7144,7145,0],[7146,7148,1],[7149,7149,0],[7150,7150,1],[7151,7153,0],[7154,7211,1],[7212,7219,0],[7220,7221,1],[7222,7223,0],[7224,7375,1],[7376,7378,0],[7379,7379,1],[7380,7392,0],[7393,7393,1],[7394,7400,0],[7401,7404,1],[7405,7405,0],[7406,7411,1],[7412,7412,0],[7413,7415,1],[7416,7417,0],[7418,7615,1],[7616,7679,0],[7680,8202,1],[8203,8207,0],[8208,8233,1],[8234,8238,0],[8239,8287,1],[8288,8303,0],[8304,8399,1],[8400,8432,0],[8433,8985,1],[8986,8987,2],[8988,9e3,1],[9001,9002,2],[9003,9192,1],[9193,9196,2],[9197,9199,1],[9200,9200,2],[9201,9202,1],[9203,9203,2],[9204,9724,1],[9725,9726,2],[9727,9747,1],[9748,9749,2],[9750,9799,1],[9800,9811,2],[9812,9854,1],[9855,9855,2],[9856,9874,1],[9875,9875,2],[9876,9888,1],[9889,9889,2],[9890,9897,1],[9898,9899,2],[9900,9916,1],[9917,9918,2],[9919,9923,1],[9924,9925,2],[9926,9933,1],[9934,9934,2],[9935,9939,1],[9940,9940,2],[9941,9961,1],[9962,9962,2],[9963,9969,1],[9970,9971,2],[9972,9972,1],[9973,9973,2],[9974,9977,1],[9978,9978,2],[9979,9980,1],[9981,9981,2],[9982,9988,1],[9989,9989,2],[9990,9993,1],[9994,9995,2],[9996,10023,1],[10024,10024,2],[10025,10059,1],[10060,10060,2],[10061,10061,1],[10062,10062,2],[10063,10066,1],[10067,10069,2],[10070,10070,1],[10071,10071,2],[10072,10132,1],[10133,10135,2],[10136,10159,1],[10160,10160,2],[10161,10174,1],[10175,10175,2],[10176,11034,1],[11035,11036,2],[11037,11087,1],[11088,11088,2],[11089,11092,1],[11093,11093,2],[11094,11502,1],[11503,11505,0],[11506,11743,1],[11744,11775,0],[11776,11903,1],[11904,11929,2],[11930,11930,1],[11931,12019,2],[12020,12031,1],[12032,12245,2],[12246,12271,1],[12272,12329,2],[12330,12335,0],[12336,12350,2],[12351,12352,1],[12353,12438,2],[12439,12440,1],[12441,12442,0],[12443,12543,2],[12544,12548,1],[12549,12591,2],[12592,12592,1],[12593,12643,2],[12644,12644,0],[12645,12686,2],[12687,12687,1],[12688,12771,2],[12772,12782,1],[12783,12830,2],[12831,12831,1],[12832,12871,2],[12872,12879,1],[12880,19903,2],[19904,19967,1],[19968,42124,2],[42125,42127,1],[42128,42182,2],[42183,42606,1],[42607,42610,0],[42611,42611,1],[42612,42621,0],[42622,42653,1],[42654,42655,0],[42656,42735,1],[42736,42737,0],[42738,43009,1],[43010,43010,0],[43011,43013,1],[43014,43014,0],[43015,43018,1],[43019,43019,0],[43020,43044,1],[43045,43046,0],[43047,43051,1],[43052,43052,0],[43053,43203,1],[43204,43205,0],[43206,43231,1],[43232,43249,0],[43250,43257,1],[43258,43258,0],[43259,43262,1],[43263,43263,0],[43264,43301,1],[43302,43309,0],[43310,43334,1],[43335,43345,0],[43346,43359,1],[43360,43388,2],[43389,43391,1],[43392,43394,0],[43395,43442,1],[43443,43443,0],[43444,43445,1],[43446,43449,0],[43450,43451,1],[43452,43453,0],[43454,43492,1],[43493,43493,0],[43494,43560,1],[43561,43566,0],[43567,43568,1],[43569,43570,0],[43571,43572,1],[43573,43574,0],[43575,43586,1],[43587,43587,0],[43588,43595,1],[43596,43596,0],[43597,43643,1],[43644,43644,0],[43645,43695,1],[43696,43696,0],[43697,43697,1],[43698,43700,0],[43701,43702,1],[43703,43704,0],[43705,43709,1],[43710,43711,0],[43712,43712,1],[43713,43713,0],[43714,43755,1],[43756,43757,0],[43758,43765,1],[43766,43766,0],[43767,44004,1],[44005,44005,0],[44006,44007,1],[44008,44008,0],[44009,44012,1],[44013,44013,0],[44014,44031,1],[44032,55203,2],[55204,55215,1],[55216,55238,0],[55239,55242,1],[55243,55291,0],[55292,63743,1],[63744,64255,2],[64256,64285,1],[64286,64286,0],[64287,65023,1],[65024,65039,0],[65040,65049,2],[65050,65055,1],[65056,65071,0],[65072,65106,2],[65107,65107,1],[65108,65126,2],[65127,65127,1],[65128,65131,2],[65132,65278,1],[65279,65279,0],[65280,65280,1],[65281,65376,2],[65377,65437,1],[65438,65440,0],[65441,65503,1],[65504,65510,2],[65511,65519,1],[65520,65528,0],[65529,66044,1],[66045,66045,0],[66046,66271,1],[66272,66272,0],[66273,66421,1],[66422,66426,0],[66427,68096,1],[68097,68099,0],[68100,68100,1],[68101,68102,0],[68103,68107,1],[68108,68111,0],[68112,68151,1],[68152,68154,0],[68155,68158,1],[68159,68159,0],[68160,68324,1],[68325,68326,0],[68327,68899,1],[68900,68903,0],[68904,69290,1],[69291,69292,0],[69293,69372,1],[69373,69375,0],[69376,69445,1],[69446,69456,0],[69457,69505,1],[69506,69509,0],[69510,69632,1],[69633,69633,0],[69634,69687,1],[69688,69702,0],[69703,69743,1],[69744,69744,0],[69745,69746,1],[69747,69748,0],[69749,69758,1],[69759,69761,0],[69762,69810,1],[69811,69814,0],[69815,69816,1],[69817,69818,0],[69819,69825,1],[69826,69826,0],[69827,69887,1],[69888,69890,0],[69891,69926,1],[69927,69931,0],[69932,69932,1],[69933,69940,0],[69941,70002,1],[70003,70003,0],[70004,70015,1],[70016,70017,0],[70018,70069,1],[70070,70078,0],[70079,70081,1],[70082,70083,0],[70084,70088,1],[70089,70092,0],[70093,70094,1],[70095,70095,0],[70096,70190,1],[70191,70193,0],[70194,70195,1],[70196,70196,0],[70197,70197,1],[70198,70199,0],[70200,70205,1],[70206,70206,0],[70207,70208,1],[70209,70209,0],[70210,70366,1],[70367,70367,0],[70368,70370,1],[70371,70378,0],[70379,70399,1],[70400,70401,0],[70402,70458,1],[70459,70460,0],[70461,70461,1],[70462,70462,0],[70463,70463,1],[70464,70464,0],[70465,70486,1],[70487,70487,0],[70488,70501,1],[70502,70508,0],[70509,70511,1],[70512,70516,0],[70517,70711,1],[70712,70719,0],[70720,70721,1],[70722,70724,0],[70725,70725,1],[70726,70726,0],[70727,70749,1],[70750,70750,0],[70751,70831,1],[70832,70832,0],[70833,70834,1],[70835,70840,0],[70841,70841,1],[70842,70842,0],[70843,70844,1],[70845,70845,0],[70846,70846,1],[70847,70848,0],[70849,70849,1],[70850,70851,0],[70852,71086,1],[71087,71087,0],[71088,71089,1],[71090,71093,0],[71094,71099,1],[71100,71101,0],[71102,71102,1],[71103,71104,0],[71105,71131,1],[71132,71133,0],[71134,71218,1],[71219,71226,0],[71227,71228,1],[71229,71229,0],[71230,71230,1],[71231,71232,0],[71233,71338,1],[71339,71339,0],[71340,71340,1],[71341,71341,0],[71342,71343,1],[71344,71349,0],[71350,71350,1],[71351,71351,0],[71352,71452,1],[71453,71455,0],[71456,71457,1],[71458,71461,0],[71462,71462,1],[71463,71467,0],[71468,71726,1],[71727,71735,0],[71736,71736,1],[71737,71738,0],[71739,71983,1],[71984,71984,0],[71985,71994,1],[71995,71996,0],[71997,71997,1],[71998,71999,0],[72e3,72e3,1],[72001,72001,0],[72002,72002,1],[72003,72003,0],[72004,72147,1],[72148,72151,0],[72152,72153,1],[72154,72155,0],[72156,72159,1],[72160,72160,0],[72161,72192,1],[72193,72202,0],[72203,72242,1],[72243,72248,0],[72249,72249,1],[72250,72254,0],[72255,72262,1],[72263,72263,0],[72264,72272,1],[72273,72278,0],[72279,72280,1],[72281,72283,0],[72284,72323,1],[72324,72342,0],[72343,72343,1],[72344,72345,0],[72346,72751,1],[72752,72758,0],[72759,72759,1],[72760,72765,0],[72766,72766,1],[72767,72767,0],[72768,72849,1],[72850,72871,0],[72872,72873,1],[72874,72880,0],[72881,72881,1],[72882,72883,0],[72884,72884,1],[72885,72886,0],[72887,73008,1],[73009,73014,0],[73015,73017,1],[73018,73018,0],[73019,73019,1],[73020,73021,0],[73022,73022,1],[73023,73031,0],[73032,73103,1],[73104,73105,0],[73106,73108,1],[73109,73109,0],[73110,73110,1],[73111,73111,0],[73112,73458,1],[73459,73460,0],[73461,73471,1],[73472,73474,0],[73475,73525,1],[73526,73530,0],[73531,73535,1],[73536,73536,0],[73537,73537,1],[73538,73538,0],[73539,78911,1],[78912,78912,0],[78913,78918,1],[78919,78933,0],[78934,92911,1],[92912,92916,0],[92917,92975,1],[92976,92982,0],[92983,94030,1],[94031,94031,0],[94032,94094,1],[94095,94098,0],[94099,94175,1],[94176,94179,2],[94180,94180,0],[94181,94191,1],[94192,94193,2],[94194,94207,1],[94208,100343,2],[100344,100351,1],[100352,101589,2],[101590,101631,1],[101632,101640,2],[101641,110575,1],[110576,110579,2],[110580,110580,1],[110581,110587,2],[110588,110588,1],[110589,110590,2],[110591,110591,1],[110592,110882,2],[110883,110897,1],[110898,110898,2],[110899,110927,1],[110928,110930,2],[110931,110932,1],[110933,110933,2],[110934,110947,1],[110948,110951,2],[110952,110959,1],[110960,111355,2],[111356,113820,1],[113821,113822,0],[113823,113823,1],[113824,113827,0],[113828,118527,1],[118528,118573,0],[118574,118575,1],[118576,118598,0],[118599,119140,1],[119141,119141,0],[119142,119142,1],[119143,119145,0],[119146,119149,1],[119150,119170,0],[119171,119172,1],[119173,119179,0],[119180,119209,1],[119210,119213,0],[119214,119361,1],[119362,119364,0],[119365,121343,1],[121344,121398,0],[121399,121402,1],[121403,121452,0],[121453,121460,1],[121461,121461,0],[121462,121475,1],[121476,121476,0],[121477,121498,1],[121499,121503,0],[121504,121504,1],[121505,121519,0],[121520,122879,1],[122880,122886,0],[122887,122887,1],[122888,122904,0],[122905,122906,1],[122907,122913,0],[122914,122914,1],[122915,122916,0],[122917,122917,1],[122918,122922,0],[122923,123022,1],[123023,123023,0],[123024,123183,1],[123184,123190,0],[123191,123565,1],[123566,123566,0],[123567,123627,1],[123628,123631,0],[123632,124139,1],[124140,124143,0],[124144,125135,1],[125136,125142,0],[125143,125251,1],[125252,125258,0],[125259,126979,1],[126980,126980,2],[126981,127182,1],[127183,127183,2],[127184,127373,1],[127374,127374,2],[127375,127376,1],[127377,127386,2],[127387,127487,1],[127488,127490,2],[127491,127503,1],[127504,127547,2],[127548,127551,1],[127552,127560,2],[127561,127567,1],[127568,127569,2],[127570,127583,1],[127584,127589,2],[127590,127743,1],[127744,127776,2],[127777,127788,1],[127789,127797,2],[127798,127798,1],[127799,127868,2],[127869,127869,1],[127870,127891,2],[127892,127903,1],[127904,127946,2],[127947,127950,1],[127951,127955,2],[127956,127967,1],[127968,127984,2],[127985,127987,1],[127988,127988,2],[127989,127991,1],[127992,128062,2],[128063,128063,1],[128064,128064,2],[128065,128065,1],[128066,128252,2],[128253,128254,1],[128255,128317,2],[128318,128330,1],[128331,128334,2],[128335,128335,1],[128336,128359,2],[128360,128377,1],[128378,128378,2],[128379,128404,1],[128405,128406,2],[128407,128419,1],[128420,128420,2],[128421,128506,1],[128507,128591,2],[128592,128639,1],[128640,128709,2],[128710,128715,1],[128716,128716,2],[128717,128719,1],[128720,128722,2],[128723,128724,1],[128725,128727,2],[128728,128731,1],[128732,128735,2],[128736,128746,1],[128747,128748,2],[128749,128755,1],[128756,128764,2],[128765,128991,1],[128992,129003,2],[129004,129007,1],[129008,129008,2],[129009,129291,1],[129292,129338,2],[129339,129339,1],[129340,129349,2],[129350,129350,1],[129351,129535,2],[129536,129647,1],[129648,129660,2],[129661,129663,1],[129664,129672,2],[129673,129679,1],[129680,129725,2],[129726,129726,1],[129727,129733,2],[129734,129741,1],[129742,129755,2],[129756,129759,1],[129760,129768,2],[129769,129775,1],[129776,129784,2],[129785,131071,1],[131072,196605,2],[196606,196607,1],[196608,262141,2],[262142,917503,1],[917504,921599,0],[921600,1114111,1]];var segmenter=new Intl.Segmenter("en",{granularity:"grapheme"}),VS16=65039,isRegionalIndicator=cp=>cp>=127462&&cp<=127487;function codePointWidth(cp){let lo=0,hi=WIDTHS.length-1;for(;lo<=hi;){let mid=lo+hi>>1,run2=WIDTHS[mid];if(cp<run2[0])hi=mid-1;else if(cp>run2[1])lo=mid+1;else return run2[2]}return 1}function clusterWidth(cluster){let w=0,vs16=!1,regional=0;for(let ch of cluster){let cp=ch.codePointAt(0);cp===VS16&&(vs16=!0),isRegionalIndicator(cp)&&regional++;let cw=codePointWidth(cp);cw>w&&(w=cw)}return vs16||regional>=2?2:w}function*measured(s){for(let{segment:segment2}of segmenter.segment(s))yield[segment2,clusterWidth(segment2)]}function stringWidth(s){let w=0;for(let{segment:segment2}of segmenter.segment(s))w+=clusterWidth(segment2);return w}var WRAP_WIDTH=24,MAX_LINES=4,MAX_LABEL=28,LABEL_BREAK_CHARS=["_","-",".","/"],asciiLower=s=>s.replace(/[A-Z]/g,c=>c.toLowerCase()),asciiUpper=s=>s.replace(/[a-z]/g,c=>c.toUpperCase()),CONTROLS=/[\0-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,stripControls=src=>src.replace(CONTROLS,"");function srcLines(src){let out=src.split(`
@@ -2612,7 +2619,7 @@ ${codeSpan(styledWarning)}
2612
2619
  `)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.notice?.setSummary(void 0)}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source){return source.usesDefaultSessionDir()?{}:{sessionDir:source.getSessionDir()}}function currentScopeSessions(source,onProgress){let cwd=source.getCwd();return withMovedSessions(SessionManager.list(cwd,source.getSessionDir(),onProgress),cwd,sharedSessionDir(source))}async function allScopeSessions(source,onProgress){let sessions2=source.usesDefaultSessionDir()?await SessionManager.listAll(onProgress):await SessionManager.listAll(source.getSessionDir(),onProgress);return markMovedSessions(sessions2,source.getCwd())}async function chooseResumePath(sessionPath,source,ui){let cwd=source.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
2613
2620
  This directory is the same git repository: ${cwd}
2614
2621
  Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync52,mkdirSync as mkdirSync31,readFileSync as readFileSync53,realpathSync as realpathSync11,writeFileSync as writeFileSync27}from"node:fs";import{join as join91}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform4){return platform4==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync53(join91(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync31(agentDir,{recursive:!0}),writeFileSync27(join91(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
2615
- `)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync52,realpathSync11)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-UJJGG4WI.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
2622
+ `)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync52,realpathSync11)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-QIIA6MFR.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
2616
2623
  ${theme.bold("Failures")}
2617
2624
  `;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
2618
2625
  `,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
@@ -2639,7 +2646,7 @@ ${onboarding}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.hea
2639
2646
  ${collapsedBody}`,`${sectionHeader(name,color)}
2640
2647
  ${expandedBody}`,this.getStartupExpansionState());this.loadedResourcesContainer.addChild(section)},skillsResult=this.session.resourceLoader.getSkills(),promptsResult=this.session.resourceLoader.getPrompts(),themesResult=this.session.resourceLoader.getThemes(),extensions=options?.extensions??this.session.resourceLoader.getExtensions().extensions.filter(extension=>!extension.hidden).map(extension=>({path:extension.path,sourceInfo:extension.sourceInfo})),sourceInfos=new Map;for(let extension of extensions)extension.sourceInfo&&sourceInfos.set(extension.path,extension.sourceInfo);for(let skill of skillsResult.skills)skill.sourceInfo&&sourceInfos.set(skill.filePath,skill.sourceInfo);for(let prompt of promptsResult.prompts)prompt.sourceInfo&&sourceInfos.set(prompt.filePath,prompt.sourceInfo);for(let loadedTheme of themesResult.themes)loadedTheme.sourcePath&&loadedTheme.sourceInfo&&sourceInfos.set(loadedTheme.sourcePath,loadedTheme.sourceInfo);if(showListing){let systemPromptSource=this.session.resourceLoader.getSystemPromptSource(),contextFiles=[...systemPromptSource?[systemPromptSource]:[],...this.session.resourceLoader.getAppendSystemPromptSources(),...this.session.resourceLoader.getAgentsFiles().agentsFiles];if(contextFiles.length>0){this.loadedResourcesContainer.addChild(new Spacer(1));let contextList=contextFiles.map(f=>theme.fg("dim",` ${this.formatDisplayPath(f.path)}`)).join(`
2641
2648
  `),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(){await this.sessionControlHost?.disposeActive(),this.session.setControlEndpointHost?.(this.sessionControlHost);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(),time("render","switch")),await this.bindCurrentSessionExtensions(),time("bindExtensions","switch"),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`),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,label3,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label3,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}setExtensionStatus(key,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 label3=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(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(label3){this.hiddenThinkingLabel=label3??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let 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:label3=>this.setHiddenThinkingLabel(label3),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor: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(resolve44=>{if(opts?.signal?.aborted){resolve44(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve44(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve44(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve44(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}
2642
- ${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(resolve44=>{if(opts?.signal?.aborted){resolve44(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve44(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve44(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve44(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(resolve44=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve44(value2)},()=>{this.hideExtensionEditor(),resolve44(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(resolve44=>{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(),resolve44(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve44({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled2()),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,this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}sessionControlContext(){return{session:this.session,agentDir:this.session.agentDir,surface:{draftHold:()=>this.sessionControlHost.submissionInFlight()?"draft":this.composerHold(),blockingQuestion:()=>this.askUserQuestion!==void 0,pendingQuestionIds:()=>[...this.pendingQuestions.keys()],answerQuestion:(requestId,response)=>{let state=this.pendingQuestions.get(requestId);return state?.finish(response),state!==void 0},notice:line=>this.showWarning(line)}}}composerHold(){return this.pendingImages.size>0?"attachment":this.editor.getText().trim()===""?void 0:"draft"}refreshAsyncWidget(){this.sessionControlHost?.questionsChanged(),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 list4=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"};list4.onCancel=close,list4.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list4,{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((resolve44,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve44(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),errorText6=new Text(theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
2649
+ ${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(resolve44=>{if(opts?.signal?.aborted){resolve44(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve44(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve44(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve44(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(resolve44=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve44(value2)},()=>{this.hideExtensionEditor(),resolve44(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(resolve44=>{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(),resolve44(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve44({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled2()),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,this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}sessionControlContext(){return{session:this.session,agentDir:this.session.agentDir,surface:{draftHold:()=>this.sessionControlHost.submissionInFlight()?"draft":this.composerHold(),blockingQuestion:()=>this.askUserQuestion!==void 0,pendingQuestionIds:()=>[...this.pendingQuestions.keys()],pendingQuestion:requestId=>this.pendingQuestions.get(requestId)?.request,answerQuestion:(requestId,response)=>{let state=this.pendingQuestions.get(requestId);return state?.finish(response),state!==void 0},notice:line=>this.showWarning(line)}}}composerHold(){return this.pendingImages.size>0?"attachment":this.editor.getText().trim()===""?void 0:"draft"}refreshAsyncWidget(){this.sessionControlHost?.questionsChanged(),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]);if(index<0){state.finish(buildAnsweredResponse(state.request,state.draft));return}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 list4=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"};list4.onCancel=close,list4.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list4,{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((resolve44,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve44(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),errorText6=new Text(theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
2643
2650
  `).slice(1).map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
2644
2651
  `);stackLines&&this.chatContainer.addChild(new Text(stackLines,1,0))}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.refusedUnknownCommandText=void 0,this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=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,details)=>{try{let preResolvedImages=this.preResolvedSubmissionImages;this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim();let unknownCommandAsText=_InteractiveMode.confirmsRefusedUnknownCommand(this,text2)||submitsCommandAsText(text2,details);if(!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==="/thinking"||text2.startsWith("/thinking ")){let searchTerm=text2.startsWith("/thinking ")?text2.slice(10).trim():void 0;this.editor.setText(""),await this.handleThinkingCommand(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("");let hold=this.session.externalAdmission?.beginInput({command:!0});try{await this.handleAnswerCommand(text2.slice(7).trim())}finally{hold?.end()}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"||text2==="/sessions"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(isBareSkillNamespace(text2)){this.openSkillPickerForBareNamespace();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",unknownCommandAsText);return}if(this.session.isStreaming){let ticket2=this.sessionControlHost?.claimHandoff(),images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2),echoOptions=this.optimisticUserEchoes.promptOptions(pendingEchoId2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...echoOptions,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),ticket2?.release()}})}catch(error2){if(this.optimisticUserEchoes.reject(pendingEchoId2),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,text2))return;throw error2}finally{ticket2?.release()}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),ticket=this.sessionControlHost?.claimHandoff(),submission={text:text2,pendingEchoId,...images.length>0?{images}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...ticket?{ticket}:{}};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.transcriptWriteNoticeShown=!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 label3=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,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"transcript_write_failed":{if(this.transcriptWriteNoticeShown)break;this.transcriptWriteNoticeShown=!0;let reason=/^[A-Z][A-Z0-9_]+(?=:)/.exec(event.errorMessage)?.[0]??sanitizeTerminalLabel(event.errorMessage);this.showWarning(`This turn was not saved to the session file (${reason}); the model will not see it after the next prompt.`);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=createCompactionSummaryMessage2(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:`${usageLimitCause(event.from,event.limit)??`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:event.cause==="fallback-unusable"?`${event.from} cannot serve right now (its account hit a billing or usage limit), so the session is back on the original model.`:"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)??builtInMessageRenderer(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.copilotToolLimitNoticeSessionId=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=sessionEntryToContextMessages2(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)})`:"",label3=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label3}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="github_copilot_tool_limit")continue;let notice2=diagnostic2.details?.message,sessionId=this.sessionManager.getSessionId();typeof notice2!="string"||this.copilotToolLimitNoticeSessionId===sessionId||(this.copilotToolLimitNoticeSessionId=sessionId,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",notice2),1,0)))}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}`,label3="Cache miss";miss.modelChanged?label3="Cache miss after model switch":miss.idleMs>=3e5&&(label3=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label3}: ${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(resolve44=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve44(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},...userInput.unknownCommandAsText?{unknownCommandAsText:!0}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),userInput.ticket?.release(),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.sessionControlHost?.disposeActive(),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.sessionControlHost?.disposeActive(),await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
2645
2652
  `),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{}let logged=!1;try{appendUncaughtCrashLog(origin,error2),logged=!0}catch{}restoreInteractiveStderr();let storageMessage=storageWriteCrashMessage(error2);storageMessage!==void 0&&console.error(storageMessage);let summary=(error2 instanceof Error?`${error2.name}: ${error2.message}`:String(error2)).split(`
@@ -2731,4 +2738,4 @@ ${theme.fg("dim","Cache Re-billed:")} ${detail}`}}info+=formatSessionFailureInfo
2731
2738
  |-----|--------|
2732
2739
  `;for(let[key,shortcut]of shortcuts){let description=shortcut.description??shortcut.extensionPath,keyDisplay=formatKeyText(key,{capitalize:!0});hotkeys+=`| \`${keyDisplay}\` | ${description} |
2733
2740
  `}}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent","Keyboard Shortcuts")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(hotkeys.trim(),1,1,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new DynamicBorder),this.ui.requestRender()}async handleClearCommand(){this.clearStatusIndicator();try{if((await this.runtimeHost.newSession()).cancelled)return;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(`${theme.fg("accent","\u2713 New session started")}`,1,1)),this.ui.requestRender()}catch(error2){await this.handleFatalRuntimeError("Failed to create session",error2)}}handleDebugCommand(){let width=this.ui.terminal.columns,height=this.ui.terminal.rows,allLines=this.ui.render(width),debugLogPath=getDebugLogPath(),debugData=[`Debug output at ${new Date().toISOString()}`,`Terminal: ${width}x${height}`,`Total lines: ${allLines.length}`,"","=== All rendered lines with visible widths ===",...allLines.map((line,idx)=>{let vw=visibleWidth(line),escaped=JSON.stringify(line);return`[${idx}] (w=${vw}) ${escaped}`}),"","=== Agent messages (JSONL) ===",...this.session.messages.map(msg=>JSON.stringify(msg)),""].join(`
2734
- `);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let eventResult=await this.session.extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()});if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,convertToLlm2 as convertToLlm,CURRENT_SESSION_VERSION,assertValidSessionId,migrateSessionEntries,parseSessionEntries,getLatestCompactionEntry,sessionEntryToContextMessages2 as sessionEntryToContextMessages,buildContextEntries2 as buildContextEntries,buildSessionContext2 as buildSessionContext,loadEntriesFromFile,SessionManager,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,createSyntheticSourceInfo,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,isSessionBusySnapshot,parseSkillBlock,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,readOwnFootprint,readProcessFootprint,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,copyToClipboard,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatResumeCommand,OptimisticUserEchoController,InteractiveMode,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};
2741
+ `);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let eventResult=await this.session.extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()});if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,convertToLlm2 as convertToLlm,CURRENT_SESSION_VERSION,assertValidSessionId,migrateSessionEntries,parseSessionEntries,getLatestCompactionEntry,sessionEntryToContextMessages2 as sessionEntryToContextMessages,buildContextEntries2 as buildContextEntries,buildSessionContext2 as buildSessionContext,loadEntriesFromFile,SessionManager,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,createSyntheticSourceInfo,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,isSessionBusySnapshot,parseSkillBlock,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,readOwnFootprint,readProcessFootprint,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,copyToClipboard,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatResumeCommand,OptimisticUserEchoController,InteractiveMode,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};