@code-yeongyu/senpi 2026.9.23-3 → 2026.9.23-5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/bundle/chunks/{app-server-command-U5Y46LHO.js → app-server-command-BGT65PGC.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-UCTYTLP3.js → chunk-3RN6BFG2.js} +2 -2
  4. package/dist/bundle/chunks/{chunk-XTXBPXZZ.js → chunk-EN6KDFY2.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-2NFHX2FJ.js → chunk-J3QXPP4T.js} +1 -1
  6. package/dist/bundle/chunks/chunk-LTIMMSDM.js +8 -0
  7. package/dist/bundle/chunks/{chunk-67Z5WNA4.js → chunk-PSMTQDII.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-TH4PERSI.js → chunk-RRSND33J.js} +50 -64
  9. package/dist/bundle/chunks/{chunk-Y4AJLTFT.js → chunk-WUYBEF7C.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-IDSOMHWS.js → chunk-WXIRFRXY.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-R6F525XB.js → chunk-XDSQYM4F.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-TUVSARCZ.js → chunk-ZEFQYQOU.js} +1 -1
  13. package/dist/bundle/chunks/{cli-main-65WMMIRT.js → cli-main-W55CWPEI.js} +1 -1
  14. package/dist/bundle/chunks/cursor-agent.js +1 -1
  15. package/dist/bundle/chunks/{help-fast-path-VXAZDQ3Z.js → help-fast-path-QXVCHTP3.js} +1 -1
  16. package/dist/bundle/chunks/{host-command-5PEFD4N6.js → host-command-3PUZYQOK.js} +1 -1
  17. package/dist/bundle/chunks/{host-lifecycle-BXW5C4JT.js → host-lifecycle-OHPSU5VU.js} +1 -1
  18. package/dist/bundle/chunks/{interactive-host-runtime-DUNYT24Q.js → interactive-host-runtime-57LEAJPU.js} +1 -1
  19. package/dist/bundle/chunks/{interactive-mode-SCG5PQZ6.js → interactive-mode-EDJZ4CSY.js} +1 -1
  20. package/dist/bundle/chunks/{multi-session-host-QC6BZZNH.js → multi-session-host-GFSDQQUJ.js} +1 -1
  21. package/dist/bundle/chunks/{package-manager-cli-23GULCVL.js → package-manager-cli-J7244EJE.js} +1 -1
  22. package/dist/bundle/chunks/{pi-messages-B6RSUQKL.js → pi-messages-CAS467IY.js} +1 -1
  23. package/dist/bundle/chunks/{rotation-stream-ZIYWOB2N.js → rotation-stream-CZT4TRPD.js} +1 -1
  24. package/dist/bundle/chunks/{rpc-mode-ZQ4E6FFA.js → rpc-mode-75CRTY24.js} +1 -1
  25. package/dist/bundle/chunks/{session-picker-CO2ZK3EC.js → session-picker-ZIBANFBQ.js} +1 -1
  26. package/dist/bundle/chunks/session-worker.js +56 -70
  27. package/dist/bundle/cli.js +1 -1
  28. package/dist/bundle/index.js +1 -1
  29. package/dist/bundle/rpc-entry.js +1 -1
  30. package/dist/core/agent-session.d.ts +9 -2
  31. package/dist/core/agent-session.d.ts.map +1 -1
  32. package/dist/core/agent-session.js +14 -1
  33. package/dist/core/agent-session.js.map +1 -1
  34. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +43 -26
  36. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  37. package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -1
  38. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  39. package/dist/core/extensions/builtin/rule-activation/types.d.ts +2 -0
  40. package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/rule-activation/types.js +7 -1
  42. package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -1
  43. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/rules/index.js +2 -1
  45. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  46. package/dist/core/extensions/builtin/terminal/output-format.d.ts +15 -0
  47. package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -1
  48. package/dist/core/extensions/builtin/terminal/output-format.js +43 -2
  49. package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -1
  50. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  51. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +4 -3
  52. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  53. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/terminal/tools/bash.js +3 -3
  55. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  56. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -4
  57. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/terminal/tools/context.js +5 -0
  59. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  60. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
  62. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
  63. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +3 -1
  64. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +9 -3
  66. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
  67. package/dist/core/model-resolver.d.ts.map +1 -1
  68. package/dist/core/model-resolver.js +87 -14
  69. package/dist/core/model-resolver.js.map +1 -1
  70. package/dist/core/tool-call-display-name.d.ts +15 -0
  71. package/dist/core/tool-call-display-name.d.ts.map +1 -0
  72. package/dist/core/tool-call-display-name.js +14 -0
  73. package/dist/core/tool-call-display-name.js.map +1 -0
  74. package/dist/core/tools/bash.d.ts.map +1 -1
  75. package/dist/core/tools/bash.js +12 -7
  76. package/dist/core/tools/bash.js.map +1 -1
  77. package/dist/core/tools/find.d.ts.map +1 -1
  78. package/dist/core/tools/find.js +9 -6
  79. package/dist/core/tools/find.js.map +1 -1
  80. package/dist/core/tools/grep/format.d.ts +3 -2
  81. package/dist/core/tools/grep/format.d.ts.map +1 -1
  82. package/dist/core/tools/grep/format.js +5 -3
  83. package/dist/core/tools/grep/format.js.map +1 -1
  84. package/dist/core/tools/grep/index.js +2 -2
  85. package/dist/core/tools/grep/index.js.map +1 -1
  86. package/dist/core/tools/ls.d.ts.map +1 -1
  87. package/dist/core/tools/ls.js +5 -3
  88. package/dist/core/tools/ls.js.map +1 -1
  89. package/dist/core/tools/model-only-text.d.ts +4 -0
  90. package/dist/core/tools/model-only-text.d.ts.map +1 -0
  91. package/dist/core/tools/model-only-text.js +12 -0
  92. package/dist/core/tools/model-only-text.js.map +1 -0
  93. package/dist/core/tools/read.d.ts.map +1 -1
  94. package/dist/core/tools/read.js +15 -5
  95. package/dist/core/tools/read.js.map +1 -1
  96. package/dist/core/tools/render-utils.d.ts.map +1 -1
  97. package/dist/core/tools/render-utils.js +2 -1
  98. package/dist/core/tools/render-utils.js.map +1 -1
  99. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  100. package/dist/core/tools/renderers/bash.js +1 -25
  101. package/dist/core/tools/renderers/bash.js.map +1 -1
  102. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  103. package/dist/core/tools/renderers/grep.js +0 -25
  104. package/dist/core/tools/renderers/grep.js.map +1 -1
  105. package/dist/core/tools/renderers/read.d.ts +8 -0
  106. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  107. package/dist/core/tools/renderers/read.js +2 -14
  108. package/dist/core/tools/renderers/read.js.map +1 -1
  109. package/dist/modes/interactive/components/exploration-call.d.ts +4 -1
  110. package/dist/modes/interactive/components/exploration-call.d.ts.map +1 -1
  111. package/dist/modes/interactive/components/exploration-call.js +17 -2
  112. package/dist/modes/interactive/components/exploration-call.js.map +1 -1
  113. package/dist/modes/interactive/components/exploration-group.d.ts +3 -1
  114. package/dist/modes/interactive/components/exploration-group.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/exploration-group.js +7 -1
  116. package/dist/modes/interactive/components/exploration-group.js.map +1 -1
  117. package/dist/modes/interactive/components/exploration-rules.d.ts +5 -0
  118. package/dist/modes/interactive/components/exploration-rules.d.ts.map +1 -0
  119. package/dist/modes/interactive/components/exploration-rules.js +15 -0
  120. package/dist/modes/interactive/components/exploration-rules.js.map +1 -0
  121. package/dist/modes/interactive/components/exploration-transcript-container.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/exploration-transcript-container.js +10 -1
  123. package/dist/modes/interactive/components/exploration-transcript-container.js.map +1 -1
  124. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/tool-execution.js +4 -1
  126. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  127. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  128. package/dist/modes/interactive/interactive-mode.js +3 -1
  129. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  130. package/dist/modes/json-event.d.ts +1 -0
  131. package/dist/modes/json-event.d.ts.map +1 -1
  132. package/dist/modes/json-event.js +1 -0
  133. package/dist/modes/json-event.js.map +1 -1
  134. package/docs/json.md +4 -1
  135. package/docs/rpc.md +7 -1
  136. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  137. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  138. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +4 -19
  139. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  140. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -23
  141. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  142. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts +8 -0
  143. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts.map +1 -1
  144. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js +27 -0
  145. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js.map +1 -1
  146. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  147. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +17 -1
  149. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts +18 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js +103 -3
  153. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts +3 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts.map +1 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js +15 -3
  157. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts +7 -2
  159. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +92 -20
  161. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +9 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +1 -0
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  174. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  175. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  176. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  177. package/package.json +7 -7
  178. package/dist/bundle/chunks/chunk-XPDV6SIX.js +0 -8
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-R6F525XB.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-BBOQ5H4W.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-67Z5WNA4.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-GFUZPFHN.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-XPDV6SIX.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-Y4AJLTFT.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-ORCF262V.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-XTXBPXZZ.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-TUVSARCZ.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-DUV3UFKX.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-3XHWW7SQ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-7PANH3NB.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-NNHFMZD5.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-IDSOMHWS.js";import{discoverEnvSlots}from"./chunk-2NFHX2FJ.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-HKE42SWX.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VKBY4F76.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-UCTYTLP3.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-KLDLZHHS.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-34HMVB33.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-XYM54ZWK.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-IVYZMSFY.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open7.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync37,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname44}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}var GATEWAY_TOOL_NAMESPACE=/^mcp__[^_]+__(.+)$/;function foldToolName(name){return name.toLowerCase().replaceAll(/[-_]/g,"")}function resolveToolNameAlias(requested,available){let names=[...new Set(available)];if(names.includes(requested))return requested;let unnamespaced=GATEWAY_TOOL_NAMESPACE.exec(requested)?.[1]??requested;if(names.includes(unnamespaced))return unnamespaced;let key=foldToolName(unnamespaced),matches=names.filter(name=>foldToolName(name)===key);return matches.length===1?matches[0]:void 0}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emit);finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emit);return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};let tool=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(!tool&&config.resolveUnknownToolCall&&(tool=await config.resolveUnknownToolCall(toolCall.name,currentContext)),!tool){let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));tool=currentContext.tools?.find(candidate=>candidate.name===aliasedName)}if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName)},...result3.content??[]]}}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
2
+ import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-XDSQYM4F.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-BBOQ5H4W.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-PSMTQDII.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-GFUZPFHN.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-LTIMMSDM.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-WUYBEF7C.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-ORCF262V.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-EN6KDFY2.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-ZEFQYQOU.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-DUV3UFKX.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-3XHWW7SQ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-7PANH3NB.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-NNHFMZD5.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-WXIRFRXY.js";import{discoverEnvSlots}from"./chunk-J3QXPP4T.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-HKE42SWX.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VKBY4F76.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-3RN6BFG2.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-KLDLZHHS.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-34HMVB33.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-XYM54ZWK.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-IVYZMSFY.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open7.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync37,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname44}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}var GATEWAY_TOOL_NAMESPACE=/^mcp__[^_]+__(.+)$/;function foldToolName(name){return name.toLowerCase().replaceAll(/[-_]/g,"")}function resolveToolNameAlias(requested,available){let names=[...new Set(available)];if(names.includes(requested))return requested;let unnamespaced=GATEWAY_TOOL_NAMESPACE.exec(requested)?.[1]??requested;if(names.includes(unnamespaced))return unnamespaced;let key=foldToolName(unnamespaced),matches=names.filter(name=>foldToolName(name)===key);return matches.length===1?matches[0]:void 0}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emit);finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emit);return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
3
3
 
4
4
  <summary>
5
5
  `,COMPACTION_SUMMARY_SUFFIX=`
@@ -700,7 +700,7 @@ File: ${path13}`)}return _ModelConfig.parseAndMigrate(content,path13)}static loa
700
700
 
701
701
  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 join6}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=join6(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(readState,data,revision){readState.data=data,readState.revision=revision}reloadFromStorage(readState,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState.revision)return readState.data;if(!readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState,{signal:controller.signal}),readers:0};readState.reload=reload2,reload2.promise.then(()=>{readState.reload===reload2&&(readState.reload=void 0)},()=>{readState.reload===reload2&&(readState.reload=void 0)})}let reload=readState.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState.reload===reload&&(readState.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 resolve42=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 resolve42(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve42}}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,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((resolve42,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;resolve42(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run){let release3=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run();return stream2.result().then(release3,release3),stream2}catch(error2){throw release3(),error2}}return{resize,bracket(providerId,signal,run){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run)}}}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(field=>!isDeepStrictEqual2(staticModel[field],model[field]));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)&&isFiniteNumber(value2.contextWindow)&&isFiniteNumber(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)?isFiniteNumber(value2.input)&&isFiniteNumber(value2.output)&&isFiniteNumber(value2.cacheRead)&&isFiniteNumber(value2.cacheWrite):!1}function isFiniteNumber(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 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??join7(getAgentDir(),"models.json"),config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join7(dirname6(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?join7(options.agentDir,"credential-pool-state.json"):options.authPath?join7(dirname6(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??join7(getAgentDir(),"models.json"),config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join7(dirname6(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?join7(options.agentDir,"credential-pool-state.json"):options.authPath?join7(dirname6(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(`
702
702
 
703
- `):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(resolve42=>{markStarted=resolve42}),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}:{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}});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;return{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-ZIYWOB2N.js"),import("./state-store-Q5EWEAFG.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:async slot=>{let prepared2=await this.prepareRequest(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name}),attempt2=await this.providerSemaphores.bracket(prepared2.model.provider,prepared2.options.signal,()=>prepared2.provider.stream(prepared2.model,context,withPayloadRequestMetadata(prepared2.options,prepared2.model)));return wrapStreamWithModelRecovery(attempt2,model,context.tools??[])}})}let prepared=await this.prepareRequest(model,streamOptions),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)));return wrapStreamWithModelRecovery(inner,model,context.tools??[])})}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:async slot=>{let prepared2=await this.prepareRequest(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name});return wrapStreamWithModelRecovery(await this.providerSemaphores.bracket(prepared2.model.provider,prepared2.options.signal,()=>prepared2.provider.streamSimple(prepared2.model,context,withPayloadRequestMetadata(prepared2.options,prepared2.model))),model,context.tools??[])}})}let prepared=await this.prepareRequest(model,options),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)));return wrapStreamWithModelRecovery(inner,model,context.tools??[])})}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=join8(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()}};var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6-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-k2p6",together:"moonshotai/Kimi-K2.6",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k2.6","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 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);if(!alias)return;let candidates=availableModels2.filter(model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase())&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}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}`);return[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId)}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}}}}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:legacySelection(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()];if(availableModels2.length>0){for(let provider of Object.keys(defaultModelPerProvider)){let defaultId=defaultModelPerProvider[provider],match=availableModels2.find(m=>m.provider===provider&&m.id===defaultId);if(match)return{model:match,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"provider-default"}}return{model:availableModels2[0],thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}return{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync29,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync34,realpathSync as realpathSync7,statSync as statSync17,writeFileSync as writeFileSync15}from"node:fs";import{createRequire as createRequire3}from"node:module";import{basename as basename18,dirname as dirname35,join as join58,resolve as resolve31,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.
703
+ `):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(resolve42=>{markStarted=resolve42}),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}:{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}});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;return{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-CZT4TRPD.js"),import("./state-store-Q5EWEAFG.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:async slot=>{let prepared2=await this.prepareRequest(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name}),attempt2=await this.providerSemaphores.bracket(prepared2.model.provider,prepared2.options.signal,()=>prepared2.provider.stream(prepared2.model,context,withPayloadRequestMetadata(prepared2.options,prepared2.model)));return wrapStreamWithModelRecovery(attempt2,model,context.tools??[])}})}let prepared=await this.prepareRequest(model,streamOptions),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>prepared.provider.stream(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)));return wrapStreamWithModelRecovery(inner,model,context.tools??[])})}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:async slot=>{let prepared2=await this.prepareRequest(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name});return wrapStreamWithModelRecovery(await this.providerSemaphores.bracket(prepared2.model.provider,prepared2.options.signal,()=>prepared2.provider.streamSimple(prepared2.model,context,withPayloadRequestMetadata(prepared2.options,prepared2.model))),model,context.tools??[])}})}let prepared=await this.prepareRequest(model,options),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>prepared.provider.streamSimple(prepared.model,context,withPayloadRequestMetadata(prepared.options,prepared.model)));return wrapStreamWithModelRecovery(inner,model,context.tools??[])})}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=join8(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()}};var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6-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-k2p6",together:"moonshotai/Kimi-K2.6",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k2.6","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()];if(availableModels2.length>0){for(let provider of Object.keys(defaultModelPerProvider)){let defaultId=defaultModelPerProvider[provider],match=availableModels2.find(m=>m.provider===provider&&m.id===defaultId);if(match)return{model:match,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"provider-default"}}return{model:availableModels2[0],thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}return{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync29,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync34,realpathSync as realpathSync7,statSync as statSync17,writeFileSync as writeFileSync15}from"node:fs";import{createRequire as createRequire3}from"node:module";import{basename as basename18,dirname as dirname35,join as join58,resolve as resolve31,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.
704
704
  `,HISTORICAL_SHIM_BANNERS=[`// Generated by senpi. Delete this file to stop loading the default global extension.
705
705
  `,`// Generated by pi-coding-agent. Delete this file to stop loading the default global extension.
706
706
  `],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 label2=await ctx.ui.select(prompt.message,prompt.options.map(option=>option.label),dialogOptions);return prompt.options.find(option=>option.label===label2)?.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(`
@@ -1064,8 +1064,8 @@ ${prompt}`}function shrinkToCeiling(recap,rawPrompt,ceilingBytes){if(recap!==voi
1064
1064
  Type "yes" to acknowledge and allow unattended Cursor CLI tool execution; anything else leaves it off.`})).trim().toLowerCase();return ACKNOWLEDGEMENT_ACCEPTANCE.has(answer)?now2().toISOString():void 0}function createCursorCliOauthConfig(deps){return{name:CURSOR_CLI_OAUTH_NAME,isSubscription:!0,async check(input){let outcome=await assessConfiguration(deps);if(!(outcome.status==="disabled"||outcome.status==="no-accounts"))return outcome.status==="not-installed"?input.credential===void 0?void 0:{type:"oauth",source:installationMessage(outcome.error)}:{type:"oauth",source:outcome.assessment.message}},async login(callbacks){let stored=await deps.readCurrent(),current=isCursorCliOauthCredential(stored)?stored:emptyCredential2(),existing=listAccounts2(current),loggedIn=await(await(deps.loadOAuth??loadCursorOAuthFlow)()).login(providerInteraction(callbacks)),name=await accountName(existing,callbacks.onPrompt),acknowledgedAt=await confirmCursorCliNoApprovalAcknowledgement(callbacks.onPrompt,deps.now??(()=>new Date));acknowledgedAt!==void 0&&deps.persistAcknowledgement?.(acknowledgedAt);let credential=addAccount3(current,slotFromCredential(loggedIn,name,"login"));return deps.persistEnabled?.(!0),credential},async refreshToken(credentials,signal){if(!isCursorCliOauthCredential(credentials))return credentials;let flow=await(deps.loadOAuth??loadCursorOAuthFlow)(),accounts=[];for(let slot of listAccounts2(credentials)){if(Date.now()<slot.expires){accounts.push(slot);continue}let refreshed=await flow.refresh({type:"oauth",access:slot.access,refresh:slot.refresh,expires:slot.expires},signal);accounts.push({...slot,access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires})}return{...credentials,...SENTINEL_OAUTH_FIELDS2,accounts}},getApiKey(){return SENTINEL_OAUTH_FIELDS2.access}}}function execFileOutput(file,args){return new Promise(resolve42=>{nodeExecFile2(file,args,{encoding:"utf8"},(error2,stdout)=>{if(error2){resolve42(void 0);return}let value2=stdout.trim();resolve42(value2.length>0?value2:void 0)})})}async function defaultKeychainCredential(){if(process.platform!=="darwin")return;let[access6,refresh]=await Promise.all([execFileOutput("security",["find-generic-password","-a","cursor-user","-s","cursor-access-token","-w"]),execFileOutput("security",["find-generic-password","-a","cursor-user","-s","cursor-refresh-token","-w"])]);return access6&&refresh?{access:access6,refresh}:void 0}function localCursorAuthPath(platform4){switch(platform4){case"darwin":return join22(homedir2(),".cursor","auth.json");case"linux":return join22(process.env.XDG_CONFIG_HOME??join22(homedir2(),".config"),"cursor","auth.json");case"win32":{let appData=process.env.APPDATA;return appData?join22(appData,"Cursor","auth.json"):void 0}default:return}}async function defaultFileCredential(platform4){let path13=localCursorAuthPath(platform4);if(path13)try{let parsed=JSON.parse(await nodeReadFile(path13,"utf8"));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let record7=parsed,access6=record7.accessToken,refresh=record7.refreshToken;return typeof access6!="string"||access6.length===0||typeof refresh!="string"||refresh.length===0?void 0:{access:access6,refresh}}catch{return}}async function importLocalCursorCredential(current,deps={}){let platform4=deps.platform??process.platform,readKeychain=deps.readCursorKeychain??defaultKeychainCredential,readFile21=deps.readCursorFile??(()=>defaultFileCredential(platform4)),imported=platform4==="darwin"?await readKeychain()??await readFile21():await readFile21();if(!imported)throw new Error("No local Cursor OAuth credential found");let existing=listAccounts2(current),name=await accountName(existing,deps.onPrompt);return addAccount3(current,slotFromCredential({access:imported.access,refresh:imported.refresh,expires:imported.expires??Date.now()+DEFAULT_IMPORTED_EXPIRY_MS},name,"import"))}function isUsableFlatOAuthCredential(value2){return value2?.type==="oauth"&&typeof value2.access=="string"&&value2.access.length>0&&typeof value2.refresh=="string"&&value2.refresh.length>0&&typeof value2.expires=="number"&&Number.isFinite(value2.expires)}function nativeAccountName(existing){let names=new Set(existing.map(account=>account.name));if(!names.has("native"))return"native";for(let index=2;index<=1e4;index++){let candidate=`native-${index}`;if(!names.has(candidate))return candidate}throw new Error("Could not allocate a Cursor CLI OAuth native account name")}async function importNativeCursorCredential(current,readNativeCredential){let native=await readNativeCredential();if(!isUsableFlatOAuthCredential(native))throw new Error("No stored native Cursor OAuth credential found");return addAccount3(current,slotFromCredential(native,nativeAccountName(listAccounts2(current)),"import"))}var USAGE="Usage: /cursor-account [list | add | remove <name> | pin <name> | unpin | import [local | native] | acknowledge | status]";function asCursorCredential2(value2){return value2!==void 0&&value2.type==="oauth"?value2:emptyCredential2()}function parseArgs4(rawArgs){return rawArgs.trim().split(/\s+/).filter(Boolean)}function slotStatus2(slot,now2){return slot.blockReason==="auth_error"?"blocked until re-login":slot.blockedUntil!==void 0&&slot.blockedUntil>now2?`blocked until ${new Date(slot.blockedUntil).toISOString()} (${slot.blockReason??"rate_limit"})`:"available"}function authEventMessage(event){if(event===null||typeof event!="object")return"Cursor CLI (OAuth) authentication update.";let value2=event;return value2.type==="auth_url"&&typeof value2.url=="string"?`Open this URL to authorize Cursor CLI (OAuth):
1065
1065
  ${value2.url}`:value2.type==="device_code"&&typeof value2.verificationUri=="string"?`Open this URL to authorize Cursor CLI (OAuth):
1066
1066
  ${value2.verificationUri}`:typeof value2.message=="string"?value2.message:"Cursor CLI (OAuth) authentication update."}function registerCursorCliAccountCommand(pi,deps={}){let loadSettings=deps.loadSettings??(cwd=>loadCursorCliOauthProviderSettingsFromDisk(cwd)),now2=deps.now??Date.now,generation2=registerCursorCliShutdownSafety(pi,{generation:deps.generation});pi.registerCommand("cursor-account",{description:"List and manage Cursor CLI (OAuth) accounts.",argumentHint:"[list | add | remove <name> | pin <name> | unpin | import | acknowledge | status]",handler:async(rawArgs,ctx)=>{try{let args=parseArgs4(rawArgs),action=args[0]??"list";if(action==="list"){showAccounts3(ctx,loadSettings(ctx.cwd),generation2,now2);return}if(action==="add"){await addAccount4(ctx);return}if(action==="remove"){await removeNamedAccount2(ctx,args[1]);return}if(action==="pin"&&args[1]!==void 0){await pinNamedAccount2(ctx,args[1]);return}if(action==="unpin"){await unpinAccount2(ctx);return}if(action==="import"){let source=args[1]??"local";if(source!=="local"&&source!=="native"){ctx.ui.notify(USAGE,"error");return}await importAccount(ctx,deps,source);return}if(action==="acknowledge"){await acknowledgeNoApproval(ctx,deps,generation2);return}if(action==="status"){await showStatus(ctx,deps,{loadSettings,generation:generation2,now:now2});return}ctx.ui.notify(USAGE,"error")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}})}function showAccounts3(ctx,settings,generation2,now2){let credential=asCursorCredential2(ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID)),accounts=listAccounts2(credential),pinned=settings.pinnedAccount??credential.pinned,pinSource=settings.pinnedAccount!==void 0?"settings":"stored",affinityPick,affinityError;if(accounts.length>0)try{affinityPick=selectAccount2(accounts,{sessionId:ctx.sessionManager.getSessionId(),pinnedAccount:pinned,now:now2()}).name}catch(error2){affinityError=error2 instanceof Error?error2.message:String(error2)}let lines=["Cursor CLI (OAuth) accounts:"];accounts.length===0&&lines.push(" (none)");for(let account of accounts){let states2=[accountLabel(account),account.source,slotStatus2(account,now2())];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})`}`),lines.push(`Affinity pick: ${affinityPick===void 0?affinityError?`unavailable - ${affinityError}`:"none":labelFor(affinityPick)}`),generation2.runFencedSync(ctx,()=>ctx.ui.notify(lines.join(`
1067
- `),"info"))}async function addAccount4(ctx){if(!ctx.hasUI){ctx.ui.notify("/cursor-account add requires an interactive UI.","error");return}try{await ctx.modelRegistry.modelRuntime.login(CURSOR_CLI_OAUTH_PROVIDER_ID,"oauth",{signal:ctx.signal,prompt:async prompt=>{let answer=await ctx.ui.input(prompt.message);if(answer===void 0)throw new Error("Login cancelled");return answer},notify:event=>ctx.ui.notify(authEventMessage(event),"info")}),emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify("Cursor CLI (OAuth) account added.","info")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!=="Login cancelled"&&ctx.ui.notify(`Failed to add Cursor CLI (OAuth) account: ${message}`,"error")}}async function removeNamedAccount2(ctx,name){if(!name){ctx.ui.notify("Usage: /cursor-account remove <name>","error");return}let removed=!1;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);return listAccounts2(credential).some(account=>account.name===name)?(removed=!0,removeAccount(credential,name)):current})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}if(!removed){ctx.ui.notify(`Cursor CLI (OAuth) account '${name}' does not exist.`,"error");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Removed Cursor CLI (OAuth) account: ${name}.`,"info")}async function pinNamedAccount2(ctx,name){try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);if(!listAccounts2(credential).some(account=>account.name===name))throw new Error(`Cursor CLI (OAuth) account '${name}' does not exist.`);return pinAccount(credential,name)})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Pinned Cursor CLI (OAuth) account: ${name}.`,"info")}async function unpinAccount2(ctx){let hadPin=!1;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);if(credential.pinned===void 0)return current;hadPin=!0;let{pinned:_pinned,...unpinned}=credential;return unpinned})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}if(!hadPin){ctx.ui.notify("No stored Cursor CLI (OAuth) account pin is set.","info");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify("Unpinned Cursor CLI (OAuth) account.","info")}async function importAccount(ctx,deps,source){let importCredential=deps.importCredential??importLocalCursorCredential,importNativeCredential=deps.importNativeCredential??importNativeCursorCredential,importDeps={...deps.importDeps};importDeps.onPrompt===void 0&&ctx.hasUI&&(importDeps.onPrompt=async prompt=>{let answer=await ctx.ui.input(prompt.message);if(answer===void 0)throw new Error("Import cancelled");return answer});let importedName;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let before=asCursorCredential2(current),updated=source==="native"?await importNativeCredential(before,deps.readNativeCredential??(()=>ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID))):await importCredential(before,importDeps),existing=new Set(listAccounts2(before).map(account=>account.name));return importedName=listAccounts2(updated).find(account=>!existing.has(account.name))?.name,updated})}catch(error2){ctx.ui.notify(`Failed to import local Cursor credential: ${error2 instanceof Error?error2.message:String(error2)}`,"error");return}let persistEnabled=deps.persistEnabled??persistCursorCliOauthEnabled;try{persistEnabled(ctx.cwd,!0),await ctx.modelRegistry.modelRuntime.refresh({allowNetwork:!1,providers:[CURSOR_CLI_OAUTH_PROVIDER_ID]})}catch(error2){ctx.ui.notify(`Imported ${source==="native"?"native ":""}Cursor credential, but provider activation failed: ${error2 instanceof Error?error2.message:String(error2)}`,"warning");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Imported ${source==="native"?"native ":"local "}Cursor credential as '${importedName??"a new account"}' (copied into this provider's store).`,"info")}async function acknowledgeNoApproval(ctx,deps,generation2){if(!ctx.hasUI){ctx.ui.notify("/cursor-account acknowledge requires an interactive UI.","error");return}let persist=deps.persistAcknowledgement??persistCursorCliNoApprovalAcknowledgement,acknowledgedAt=await confirmCursorCliNoApprovalAcknowledgement(async ask=>await ctx.ui.input(ask.message)??"",()=>new Date((deps.now??Date.now)()));if(acknowledgedAt===void 0){generation2.runFencedSync(ctx,()=>ctx.ui.notify("No acknowledgement written: unattended Cursor CLI execution stays off until you acknowledge.","info"));return}persist(ctx.cwd,acknowledgedAt),generation2.runFencedSync(ctx,()=>ctx.ui.notify(`Acknowledged unattended Cursor CLI tool execution at ${acknowledgedAt}.`,"info"))}async function showStatus(ctx,deps,bound){let sessionId=ctx.sessionManager.getSessionId(),report=await collectCursorCliStatus({sessionId,settings:bound.loadSettings(ctx.cwd),readCredential:()=>ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID),readNativeCredential:deps.readNativeCredential??(()=>ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),router:deps.router??cursorCliSessionRouter,resolveExecutable:deps.resolveExecutable,probeVersion:deps.probeVersion,now:bound.now});bound.generation.runFencedSync(ctx,()=>ctx.ui.notify(renderCursorCliStatus(report),"info"))}import{chmodSync as chmodSync7,mkdirSync as mkdirSync8,readFileSync as readFileSync20,writeFileSync as writeFileSync8}from"node:fs";import{isAbsolute as isAbsolute2,relative as relative6,resolve as resolve11,sep as sep6}from"node:path";var PRIVATE_DIRECTORY_MODE=448,PRIVATE_FILE_MODE=384;function isRecord22(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isInside(root,candidate){let pathFromRoot=relative6(root,candidate);return pathFromRoot!==""&&!isAbsolute2(pathFromRoot)&&pathFromRoot!==".."&&!pathFromRoot.startsWith(`..${sep6}`)}function accountPaths(agentDir,accountName2){assertValidAccountName2(accountName2);let extensionRoot=resolve11(agentDir,"cursor-cli-oauth"),accountsRoot=resolve11(extensionRoot,"accounts"),slotRoot=resolve11(accountsRoot,accountName2),home=resolve11(slotRoot,"home");if(!isInside(accountsRoot,slotRoot)||!isInside(accountsRoot,home))throw new Error(`Cursor account HOME for '${accountName2}' escapes the accounts root`);let cursorDirectory=resolve11(home,".cursor");if(!isInside(home,cursorDirectory))throw new Error(`Cursor credential directory for '${accountName2}' escapes its HOME`);return{home,authPath:resolve11(cursorDirectory,"auth.json"),directories:[extensionRoot,accountsRoot,slotRoot,home,cursorDirectory]}}function ensurePrivateDirectories(directories){for(let directory of directories)mkdirSync8(directory,{recursive:!0,mode:PRIVATE_DIRECTORY_MODE}),chmodSync7(directory,PRIVATE_DIRECTORY_MODE)}function serializeCredential(slot){let credential={accessToken:slot.access,refreshToken:slot.refresh,apiKey:null,bedrockCredentials:null};return JSON.stringify(credential)}function parseCredential(contents){let parsed;try{parsed=JSON.parse(contents)}catch{throw new Error("Invalid Cursor credential: auth.json is not valid JSON")}if(!isRecord22(parsed)||typeof parsed.accessToken!="string"||parsed.accessToken.length===0||typeof parsed.refreshToken!="string"||parsed.refreshToken.length===0||parsed.apiKey!==null||parsed.bedrockCredentials!==null)throw new Error("Invalid Cursor credential: auth.json does not match the file-store contract");return{accessToken:parsed.accessToken,refreshToken:parsed.refreshToken,apiKey:null,bedrockCredentials:null}}function prepareAccountHome(paths,slot,log){ensurePrivateDirectories(paths.directories),writeFileSync8(paths.authPath,serializeCredential(slot),{encoding:"utf8",mode:PRIVATE_FILE_MODE}),chmodSync7(paths.authPath,PRIVATE_FILE_MODE),log?.(`cursor_cli_oauth_credential_written accessBytes=${Buffer.byteLength(slot.access,"utf8")} refreshBytes=${Buffer.byteLength(slot.refresh,"utf8")}`)}function readBackSlot(paths,slot,log){let credential=parseCredential(readFileSync20(paths.authPath,"utf8"));return log?.(`cursor_cli_oauth_credential_read accessBytes=${Buffer.byteLength(credential.accessToken,"utf8")} refreshBytes=${Buffer.byteLength(credential.refreshToken,"utf8")} rotated=${credential.refreshToken!==slot.refresh}`),credential.refreshToken===slot.refresh?slot:{...slot,refresh:credential.refreshToken}}async function runInCursorAccountHome(agentDir,slot,run,log){let paths=accountPaths(agentDir,slot.name);prepareAccountHome(paths,slot,log);let result3=await run({home:paths.home,authPath:paths.authPath}),updatedSlot=readBackSlot(paths,slot,log);return{result:result3,slot:updatedSlot,home:paths.home}}import{mkdir as mkdir2,mkdtemp,readFile as readFile4,rename as rename3,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{tmpdir as tmpdir2}from"node:os";import{join as join23}from"node:path";var MODEL_PROBE_TIMEOUT_MS=15e3,DEFAULT_MODEL_CATALOG_TTL_HOURS=24,ANSI_ESCAPE_SEQUENCE=/\u001B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,MODEL_LINE=/^(\S+)\s+-\s+(.+)$/,MODEL_ID=/^[A-Za-z0-9][A-Za-z0-9._/:+-]*$/,MISLEADING_ERROR_LINE=/^\s*(?:error|failed|failure)(?=\s|:|-|$)/i,STATIC_MODEL_DEFINITIONS=[{id:"auto",label:"Auto"},{id:"composer-2.5",label:"Composer 2.5 (200K context)"},{id:"composer-2.5-fast",label:"Composer 2.5 Fast (200K context)"},{id:"gpt-5.6-sol-high",label:"GPT 5.6 SOL High (272K context)"},{id:"gpt-5.6-luna-high",label:"GPT 5.6 Luna High (272K context)"},{id:"gpt-5.5-high",label:"GPT 5.5 High (272K context)"},{id:"gpt-5.3-codex",label:"GPT 5.3 Codex (272K context)"},{id:"gpt-5.2",label:"GPT 5.2 (272K context)"},{id:"claude-opus-5-high",label:"Claude Opus 5 High (300K context)"},{id:"claude-opus-5-thinking-high",label:"Claude Opus 5 Thinking High (300K context)"},{id:"claude-opus-4-8-thinking-high",label:"Claude Opus 4.8 Thinking High (300K context)"},{id:"claude-fable-5-thinking-high",label:"Claude Fable 5 Thinking High (300K context)"},{id:"claude-sonnet-5-thinking-high",label:"Claude Sonnet 5 Thinking High (300K context)"},{id:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash High (1M context)"},{id:"cursor-grok-4.6-high",label:"Cursor Grok 4.6 High (200K context)"}];function stripAnsi2(value2){return value2.replace(ANSI_ESCAPE_SEQUENCE,"")}function normalizeEntries(raw){return normalizeCursorCatalog(raw.map(({id,label:label2})=>({id,name:label2,input:["text"],cursorMaxMode:!1}))).map(entry=>({id:entry.id,name:entry.name,reasoning:entry.reasoning,...entry.thinkingLevelMap?{thinkingLevelMap:entry.thinkingLevelMap}:{},input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:resolveCursorContextWindow2(entry.id,entry.window),maxTokens:64e3,...entry.representativeVariantId!==void 0&&entry.representativeVariantId!==entry.id?{upstreamModelId:entry.representativeVariantId}:{},compat:{...entry.capabilityId!==void 0&&entry.representativeVariantId!==void 0?{cursorReasoning:{capabilityId:entry.capabilityId,...entry.thinkingMode!==void 0?{thinkingMode:entry.thinkingMode}:{},representativeVariantId:entry.representativeVariantId}}:{}}}))}var STATIC_CURSOR_CLI_MODELS=normalizeEntries(STATIC_MODEL_DEFINITIONS);function parseCursorAgentModelsListing(listing){let lines=stripAnsi2(listing).split(/\r?\n/);if(lines.some(line=>MISLEADING_ERROR_LINE.test(line)))return[];let seen=new Set,raw=[];for(let rawLine of lines){let match=MODEL_LINE.exec(rawLine.trim());if(!match)continue;let id=match[1],label2=match[2].trim();!MODEL_ID.test(id)||label2.length===0||seen.has(id)||(seen.add(id),raw.push({id,label:label2}))}return normalizeEntries(raw)}function defaultDeps2(settings){return{now:Date.now,resolveExecutable:()=>{let executableDeps=defaultCursorAgentExecutableDeps();return resolveCursorAgentExecutable({...executableDeps,settings:{executablePath:settings.executablePath}})},makeTemporaryDirectory:prefix=>mkdtemp(prefix),readTextFile:path13=>readFile4(path13,"utf8"),makeDirectory:async path13=>{await mkdir2(path13,{recursive:!0})},writeTextFile:async(path13,contents)=>{await writeFile3(path13,contents,"utf8")},renameFile:async(from,to)=>{await rename3(from,to)},removeDirectory:async path13=>{await rm3(path13,{recursive:!0,force:!0})}}}function catalogTtlMs(settings){let hours=settings.modelCatalogTtlHours;return(typeof hours=="number"&&Number.isFinite(hours)&&hours>0?hours:DEFAULT_MODEL_CATALOG_TTL_HOURS)*60*60*1e3}function parseCachedCatalog(contents){let parsed;try{parsed=JSON.parse(contents)}catch{return}if(typeof parsed!="object"||parsed===null||!("cachedAt"in parsed)||!("models"in parsed))return;let cachedAt=parsed.cachedAt,models=parsed.models;if(typeof cachedAt!="number"||!Number.isFinite(cachedAt)||!Array.isArray(models)||models.length===0)return;let rawCached=[],seen=new Set;for(let candidate of models){if(typeof candidate!="object"||candidate===null||!("id"in candidate)||!("name"in candidate))return;let id=candidate.id,name=candidate.name;if(typeof id!="string"||!MODEL_ID.test(id)||typeof name!="string"||name.length===0||seen.has(id))return;seen.add(id),rawCached.push({id,label:name})}return{cachedAt,models:normalizeEntries(rawCached)}}async function readFreshCache(cachePath,now2,ttlMs,deps){try{let cached=parseCachedCatalog(await deps.readTextFile(cachePath));return!cached||now2<cached.cachedAt||now2-cached.cachedAt>=ttlMs?void 0:cached.models}catch{return}}async function writeCache(cacheDirectory,cachePath,catalog,deps){let temporaryPath=`${cachePath}.${process.pid}.${catalog.cachedAt}.tmp`;await deps.makeDirectory(cacheDirectory),await deps.writeTextFile(temporaryPath,`${JSON.stringify(catalog,null,2)}
1068
- `),await deps.renameFile(temporaryPath,cachePath)}async function resolveCursorCliModelCatalog(options){let settings=options.settings??{},deps={...defaultDeps2(settings),...options.deps},cacheDirectory=join23(options.agentDir,"cursor-cli-oauth"),cachePath=join23(cacheDirectory,"models.json"),now2=deps.now(),cached=await readFreshCache(cachePath,now2,catalogTtlMs(settings),deps);if(cached)return cached;let temporaryDirectory;try{let executable=deps.resolveExecutable();temporaryDirectory=await deps.makeTemporaryDirectory(join23(tmpdir2(),"senpi-cursor-models-"));let stdoutPath=join23(temporaryDirectory,"stdout.txt");await deps.runProbe(executable,stdoutPath,MODEL_PROBE_TIMEOUT_MS);let models=parseCursorAgentModelsListing(await deps.readTextFile(stdoutPath));if(models.length===0)return STATIC_CURSOR_CLI_MODELS;try{await writeCache(cacheDirectory,cachePath,{cachedAt:now2,models},deps)}catch{}return models}catch{return STATIC_CURSOR_CLI_MODELS}finally{if(temporaryDirectory!==void 0)try{await deps.removeDirectory(temporaryDirectory)}catch{}}}import{spawn as spawn4}from"node:child_process";import{open}from"node:fs/promises";var CursorCliModelProbeTimeoutError=class extends Error{constructor(timeoutMs){super(`cursor-agent models exceeded its ${timeoutMs}ms deadline`),this.name="CursorCliModelProbeTimeoutError",this.timeoutMs=timeoutMs}},CursorCliModelProbeExitError=class extends Error{constructor(exitCode,signal){super(`cursor-agent models failed with code ${String(exitCode)} and signal ${String(signal)}`),this.name="CursorCliModelProbeExitError",this.exitCode=exitCode,this.signal=signal}},runModelsProbe=async({executable,stdoutPath,timeoutMs,home})=>{let output=await open(stdoutPath,"w");try{await new Promise((resolve42,reject)=>{let child=spawn4(executable,["models"],{env:cursorAgentEnvironment(home),stdio:["ignore",output.fd,"ignore"]}),timedOut=!1,settled=!1,finish=error2=>{settled||(settled=!0,clearTimeout(deadline),error2?reject(error2):resolve42())},deadline=setTimeout(()=>{timedOut=!0,child.kill("SIGKILL")},timeoutMs);child.once("error",error2=>finish(error2)),child.once("close",(code,signal)=>{if(timedOut){finish(new CursorCliModelProbeTimeoutError(timeoutMs));return}if(code!==0){finish(new CursorCliModelProbeExitError(code,signal));return}finish()})})}finally{await output.close()}};async function refreshCursorCliModelCatalogForLane(input){let outcome=await assessConfiguration({readCurrent:input.readCurrent,readSettings:()=>input.settings,resolveExecutable:input.resolveExecutable});switch(outcome.status){case"disabled":case"not-installed":case"no-accounts":return;case"configured":{let{accounts}=outcome.assessment,account=accounts.find(slot=>slot.name===input.settings.pinnedAccount)??accounts[0];if(account===void 0)return;let probe=input.runProbe??runModelsProbe;return resolveCursorCliModelCatalog({agentDir:input.agentDir,settings:{modelCatalogTtlHours:input.settings.modelCatalogTtlHours,executablePath:input.settings.executablePath},deps:{resolveExecutable:()=>input.resolveExecutable({executablePath:input.settings.executablePath}),runProbe:async(executable,stdoutPath,timeoutMs)=>{await runInCursorAccountHome(input.agentDir,account,({home})=>probe({executable,stdoutPath,timeoutMs,home}),input.log)}}})}default:return outcome}}function asManagedCredential(credential){if(credential?.type!=="oauth")return;let managed=credential;return Array.isArray(managed.accounts)&&managed.access===SENTINEL_OAUTH_FIELDS2.access&&managed.refresh===SENTINEL_OAUTH_FIELDS2.refresh&&managed.expires===SENTINEL_OAUTH_FIELDS2.expires?managed:void 0}async function bootstrapNativeCredential(deps){let current;try{current=await deps.store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);let managed=asManagedCredential(current);if(managed&&listAccounts2(managed).length>0||current!==void 0&&!managed||deps.canBootstrap!==void 0&&!await deps.canBootstrap())return current;let native=await deps.readNativeCredential();return native===void 0?current:await deps.store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async latest=>{let latestManaged=asManagedCredential(latest);return latestManaged&&listAccounts2(latestManaged).length>0||latest!==void 0&&!latestManaged?latest:importNativeCursorCredential(latestManaged??emptyCredential2(),async()=>native)})}catch{return current}}function createCursorCliOauthCredentialReader(deps){let inFlight;return()=>inFlight||(inFlight=bootstrapNativeCredential(deps).finally(()=>{inFlight=void 0}),inFlight)}var CursorCliFailoverError=class extends Error{constructor(classification,original,visibleAssistantDeltaEmitted){super(errorMessage4(original)),this.name="CursorCliFailoverError",this.classification=classification,this.original=original,this.visibleAssistantDeltaEmitted=visibleAssistantDeltaEmitted}},CursorCliNoAssistantOutputError2=class extends Error{constructor(){super("Cursor CLI attempt completed without visible assistant text"),this.name="CursorCliNoAssistantOutputError"}};function record6(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}function errorMessage4(error2){if(error2 instanceof Error)return error2.message;if(typeof error2=="string")return error2;let message=record6(error2)?.message;return typeof message=="string"?message:"Cursor CLI attempt failed"}function errorInput2(error2){let value2=record6(error2);return value2&&("exitCode"in value2||"stderr"in value2||"resultEvent"in value2||"thrown"in value2)?error2:{thrown:error2}}function defaultErrorFromEvent3(event){let value2=record6(event);if(value2?.type==="malformed_stream")return{thrown:event};if(value2?.type==="result"&&(value2.is_error===!0||value2.subtype==="error"))return{resultEvent:event}}function defaultIsVisibleAssistantDelta2(event){let value2=record6(event);if(!value2)return!1;if(value2.type==="assistant"){let message=record6(value2.message);return Array.isArray(message?.content)?message.content.some(item=>{let block=record6(item);return block?.type==="text"&&typeof block.text=="string"&&block.text.length>0}):!1}return(value2.type==="assistant_delta"||value2.type==="text_delta")&&typeof value2.delta=="string"&&value2.delta.length>0}function notice(fromAccount,toAccount){return{type:"cursor_account_changed",message:`Cursor account changed from '${fromAccount}' to '${toAccount}'; a fresh chat was started and prior context was not carried over.`,fromAccount,toAccount,freshChat:!0,priorContextCarriedOver:!1}}async function readCredential(store,providerId){let current=await store.read(providerId);return current?.type==="oauth"?current:void 0}async function selectStoredAccount(options,now2){let credential=await readCredential(options.store,options.providerId),accounts=credential?listAccounts2(credential):[];return selectAccount2(accounts,{...options.affinity,pinnedAccount:options.affinity?.pinnedAccount??credential?.pinned,now:now2})}function blockedAccount2(account,classification,now2){if(classification.kind==="auth_error"){let{blockedUntil:_blockedUntil,...withoutExpiry}=account;return{...withoutExpiry,blockReason:"auth_error"}}let duration=Math.min(1728e5,classification.blockMs??6e4);return{...account,blockedUntil:now2+duration,blockReason:"rate_limit"}}async function persistBlock2(store,providerId,account){await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current;return{...credential,accounts:(credential.accounts??[]).map(existing=>existing.name===account.name?{...existing,blockedUntil:account.blockedUntil,blockReason:account.blockReason}:existing)}})}function isFailoverKind(classification){return classification.kind==="rate_limit"||classification.kind==="auth_error"}async function*runCursorCliFailover(options){let now2=options.now??Date.now,classify=options.classify??classifyCursorCliError,errorFromEvent=options.errorFromEvent??defaultErrorFromEvent3,isVisibleAssistantDelta=options.isVisibleAssistantDelta??defaultIsVisibleAssistantDelta2,account=await selectStoredAccount(options,now2()),freshChat=!1;for(;;){let visibleAssistantDeltaEmitted=!1;try{let attemptStream=await options.runAttempt(account,{freshChat});for await(let event of attemptStream){let failure2=errorFromEvent(event);if(failure2!==void 0)throw failure2;visibleAssistantDeltaEmitted||=isVisibleAssistantDelta(event),yield event}if(!visibleAssistantDeltaEmitted)throw new CursorCliNoAssistantOutputError2;return}catch(error2){let classification=classify(errorInput2(error2)),surfaced=new CursorCliFailoverError(classification,error2,visibleAssistantDeltaEmitted);if(!isFailoverKind(classification))throw surfaced;let blocked=blockedAccount2(account,classification,now2());if(await persistBlock2(options.store,options.providerId,blocked),visibleAssistantDeltaEmitted)throw surfaced;let nextAccount=await selectStoredAccount(options,now2());yield notice(account.name,nextAccount.name),account=nextAccount,freshChat=!0}}}function resolveCursorCliSpawnModel(model,selection){return renderCursorCliModelString(model,selection)}var DISABLED_MESSAGE="disabled by settings",NO_ACCOUNTS_MESSAGE="no accounts: run /login cursor-cli-oauth",RECENT_EXCHANGE_LIMIT=12,CursorCliProcessFailureError=class extends Error{constructor(exitCode,stderr){super(stderr.trim().length>0?stderr.trim():`cursor-agent exited with code ${String(exitCode)}`),this.name="CursorCliProcessFailureError",this.exitCode=exitCode,this.stderr=stderr}},CursorCliEventBuffer=class{constructor(){this.values=[],this.waiters=[],this.ended=!1,this.settled=!1}wake(error2){let waiter=this.waiters.shift();waiter&&waiter(error2)}push(value2){this.ended||this.failure!==void 0||(this.values.push(value2),this.wake())}close(){if(!this.settled){this.settled=!0,this.ended=!0;for(let waiter of this.waiters.splice(0))waiter()}}fail(error2){if(!this.settled){this.settled=!0,this.failure=error2;for(let waiter of this.waiters.splice(0))waiter(error2)}}async*events(){for(;;){let value2=this.values.shift();if(value2!==void 0){yield value2;continue}if(this.failure!==void 0)throw this.failure;if(this.ended)return;await new Promise((resolve42,reject)=>{this.waiters.push(error2=>{error2!==void 0?reject(error2):resolve42()})})}}};function emptyCursorCliOutput(model){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()}}function ensureStarted(mapper){mapper.started||(mapper.started=!0,mapper.stream.push({type:"start",partial:mapper.output}))}function openBlock2(mapper,kind){ensureStarted(mapper),kind==="thinking"?mapper.output.content.push({type:"thinking",thinking:""}):mapper.output.content.push({type:"text",text:""}),mapper.openKind=kind,mapper.openIndex=mapper.output.content.length-1,mapper.openText="",mapper.textAccumulated="",mapper.stream.push({type:kind==="thinking"?"thinking_start":"text_start",contentIndex:mapper.openIndex,partial:mapper.output})}function closeOpen(mapper){if(mapper.openKind===void 0)return;let block=mapper.output.content[mapper.openIndex];mapper.openKind==="thinking"?(block!==void 0&&block.type==="thinking"&&(block.thinking=mapper.openText),mapper.stream.push({type:"thinking_end",contentIndex:mapper.openIndex,content:mapper.openText,partial:mapper.output})):(block!==void 0&&block.type==="text"&&(block.text=mapper.openText),mapper.stream.push({type:"text_end",contentIndex:mapper.openIndex,content:mapper.openText,partial:mapper.output})),mapper.openKind=void 0}function ensureOpen(mapper,kind){mapper.openKind!==kind&&(closeOpen(mapper),openBlock2(mapper,kind))}function resetTextSegment(mapper){closeOpen(mapper),mapper.textAccumulated=""}function pushTextDelta(mapper,delta){let block=mapper.output.content[mapper.openIndex];mapper.openText+=delta,block!==void 0&&block.type==="text"&&(block.text=mapper.openText),mapper.stream.push({type:"text_delta",contentIndex:mapper.openIndex,delta,partial:mapper.output})}function pushThinkingDelta(mapper,delta){let block=mapper.output.content[mapper.openIndex];mapper.openText+=delta,block!==void 0&&block.type==="thinking"&&(block.thinking=mapper.openText),mapper.stream.push({type:"thinking_delta",contentIndex:mapper.openIndex,delta,partial:mapper.output})}function appendAssistantFragment(mapper,fragment){if(fragment.length===0)return;ensureOpen(mapper,"text");let delta;fragment.length>=mapper.textAccumulated.length&&(mapper.textAccumulated.length===0||fragment.startsWith(mapper.textAccumulated))?(delta=fragment.slice(mapper.textAccumulated.length),mapper.textAccumulated=fragment):(delta=fragment,mapper.textAccumulated+=fragment),delta.length>0&&pushTextDelta(mapper,delta)}function appendNotice(mapper,message){ensureOpen(mapper,"text"),pushTextDelta(mapper,`${message}
1067
+ `),"info"))}async function addAccount4(ctx){if(!ctx.hasUI){ctx.ui.notify("/cursor-account add requires an interactive UI.","error");return}try{await ctx.modelRegistry.modelRuntime.login(CURSOR_CLI_OAUTH_PROVIDER_ID,"oauth",{signal:ctx.signal,prompt:async prompt=>{let answer=await ctx.ui.input(prompt.message);if(answer===void 0)throw new Error("Login cancelled");return answer},notify:event=>ctx.ui.notify(authEventMessage(event),"info")}),emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify("Cursor CLI (OAuth) account added.","info")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!=="Login cancelled"&&ctx.ui.notify(`Failed to add Cursor CLI (OAuth) account: ${message}`,"error")}}async function removeNamedAccount2(ctx,name){if(!name){ctx.ui.notify("Usage: /cursor-account remove <name>","error");return}let removed=!1;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);return listAccounts2(credential).some(account=>account.name===name)?(removed=!0,removeAccount(credential,name)):current})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}if(!removed){ctx.ui.notify(`Cursor CLI (OAuth) account '${name}' does not exist.`,"error");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Removed Cursor CLI (OAuth) account: ${name}.`,"info")}async function pinNamedAccount2(ctx,name){try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);if(!listAccounts2(credential).some(account=>account.name===name))throw new Error(`Cursor CLI (OAuth) account '${name}' does not exist.`);return pinAccount(credential,name)})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Pinned Cursor CLI (OAuth) account: ${name}.`,"info")}async function unpinAccount2(ctx){let hadPin=!1;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let credential=asCursorCredential2(current);if(credential.pinned===void 0)return current;hadPin=!0;let{pinned:_pinned,...unpinned}=credential;return unpinned})}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error");return}if(!hadPin){ctx.ui.notify("No stored Cursor CLI (OAuth) account pin is set.","info");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify("Unpinned Cursor CLI (OAuth) account.","info")}async function importAccount(ctx,deps,source){let importCredential=deps.importCredential??importLocalCursorCredential,importNativeCredential=deps.importNativeCredential??importNativeCursorCredential,importDeps={...deps.importDeps};importDeps.onPrompt===void 0&&ctx.hasUI&&(importDeps.onPrompt=async prompt=>{let answer=await ctx.ui.input(prompt.message);if(answer===void 0)throw new Error("Import cancelled");return answer});let importedName;try{await ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async current=>{let before=asCursorCredential2(current),updated=source==="native"?await importNativeCredential(before,deps.readNativeCredential??(()=>ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID))):await importCredential(before,importDeps),existing=new Set(listAccounts2(before).map(account=>account.name));return importedName=listAccounts2(updated).find(account=>!existing.has(account.name))?.name,updated})}catch(error2){ctx.ui.notify(`Failed to import local Cursor credential: ${error2 instanceof Error?error2.message:String(error2)}`,"error");return}let persistEnabled=deps.persistEnabled??persistCursorCliOauthEnabled;try{persistEnabled(ctx.cwd,!0),await ctx.modelRegistry.modelRuntime.refresh({allowNetwork:!1,providers:[CURSOR_CLI_OAUTH_PROVIDER_ID]})}catch(error2){ctx.ui.notify(`Imported ${source==="native"?"native ":""}Cursor credential, but provider activation failed: ${error2 instanceof Error?error2.message:String(error2)}`,"warning");return}emitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID),ctx.ui.notify(`Imported ${source==="native"?"native ":"local "}Cursor credential as '${importedName??"a new account"}' (copied into this provider's store).`,"info")}async function acknowledgeNoApproval(ctx,deps,generation2){if(!ctx.hasUI){ctx.ui.notify("/cursor-account acknowledge requires an interactive UI.","error");return}let persist=deps.persistAcknowledgement??persistCursorCliNoApprovalAcknowledgement,acknowledgedAt=await confirmCursorCliNoApprovalAcknowledgement(async ask=>await ctx.ui.input(ask.message)??"",()=>new Date((deps.now??Date.now)()));if(acknowledgedAt===void 0){generation2.runFencedSync(ctx,()=>ctx.ui.notify("No acknowledgement written: unattended Cursor CLI execution stays off until you acknowledge.","info"));return}persist(ctx.cwd,acknowledgedAt),generation2.runFencedSync(ctx,()=>ctx.ui.notify(`Acknowledged unattended Cursor CLI tool execution at ${acknowledgedAt}.`,"info"))}async function showStatus(ctx,deps,bound){let sessionId=ctx.sessionManager.getSessionId(),report=await collectCursorCliStatus({sessionId,settings:bound.loadSettings(ctx.cwd),readCredential:()=>ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID),readNativeCredential:deps.readNativeCredential??(()=>ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),router:deps.router??cursorCliSessionRouter,resolveExecutable:deps.resolveExecutable,probeVersion:deps.probeVersion,now:bound.now});bound.generation.runFencedSync(ctx,()=>ctx.ui.notify(renderCursorCliStatus(report),"info"))}import{chmodSync as chmodSync7,mkdirSync as mkdirSync8,readFileSync as readFileSync20,writeFileSync as writeFileSync8}from"node:fs";import{isAbsolute as isAbsolute2,relative as relative6,resolve as resolve11,sep as sep6}from"node:path";var PRIVATE_DIRECTORY_MODE=448,PRIVATE_FILE_MODE=384;function isRecord22(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isInside(root,candidate){let pathFromRoot=relative6(root,candidate);return pathFromRoot!==""&&!isAbsolute2(pathFromRoot)&&pathFromRoot!==".."&&!pathFromRoot.startsWith(`..${sep6}`)}function accountPaths(agentDir,accountName2){assertValidAccountName2(accountName2);let extensionRoot=resolve11(agentDir,"cursor-cli-oauth"),accountsRoot=resolve11(extensionRoot,"accounts"),slotRoot=resolve11(accountsRoot,accountName2),home=resolve11(slotRoot,"home");if(!isInside(accountsRoot,slotRoot)||!isInside(accountsRoot,home))throw new Error(`Cursor account HOME for '${accountName2}' escapes the accounts root`);let cursorDirectory=resolve11(home,".cursor");if(!isInside(home,cursorDirectory))throw new Error(`Cursor credential directory for '${accountName2}' escapes its HOME`);return{home,authPath:resolve11(cursorDirectory,"auth.json"),directories:[extensionRoot,accountsRoot,slotRoot,home,cursorDirectory]}}function ensurePrivateDirectories(directories){for(let directory of directories)mkdirSync8(directory,{recursive:!0,mode:PRIVATE_DIRECTORY_MODE}),chmodSync7(directory,PRIVATE_DIRECTORY_MODE)}function serializeCredential(slot){let credential={accessToken:slot.access,refreshToken:slot.refresh,apiKey:null,bedrockCredentials:null};return JSON.stringify(credential)}function parseCredential(contents){let parsed;try{parsed=JSON.parse(contents)}catch{throw new Error("Invalid Cursor credential: auth.json is not valid JSON")}if(!isRecord22(parsed)||typeof parsed.accessToken!="string"||parsed.accessToken.length===0||typeof parsed.refreshToken!="string"||parsed.refreshToken.length===0||parsed.apiKey!==null||parsed.bedrockCredentials!==null)throw new Error("Invalid Cursor credential: auth.json does not match the file-store contract");return{accessToken:parsed.accessToken,refreshToken:parsed.refreshToken,apiKey:null,bedrockCredentials:null}}function prepareAccountHome(paths,slot,log){ensurePrivateDirectories(paths.directories),writeFileSync8(paths.authPath,serializeCredential(slot),{encoding:"utf8",mode:PRIVATE_FILE_MODE}),chmodSync7(paths.authPath,PRIVATE_FILE_MODE),log?.(`cursor_cli_oauth_credential_written accessBytes=${Buffer.byteLength(slot.access,"utf8")} refreshBytes=${Buffer.byteLength(slot.refresh,"utf8")}`)}function readBackSlot(paths,slot,log){let credential=parseCredential(readFileSync20(paths.authPath,"utf8"));return log?.(`cursor_cli_oauth_credential_read accessBytes=${Buffer.byteLength(credential.accessToken,"utf8")} refreshBytes=${Buffer.byteLength(credential.refreshToken,"utf8")} rotated=${credential.refreshToken!==slot.refresh}`),credential.refreshToken===slot.refresh?slot:{...slot,refresh:credential.refreshToken}}async function runInCursorAccountHome(agentDir,slot,run,log){let paths=accountPaths(agentDir,slot.name);prepareAccountHome(paths,slot,log);let result3=await run({home:paths.home,authPath:paths.authPath}),updatedSlot=readBackSlot(paths,slot,log);return{result:result3,slot:updatedSlot,home:paths.home}}import{mkdir as mkdir2,mkdtemp,readFile as readFile4,rename as rename3,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{tmpdir as tmpdir2}from"node:os";import{join as join23}from"node:path";var MODEL_PROBE_TIMEOUT_MS=15e3,DEFAULT_MODEL_CATALOG_TTL_HOURS=24,ANSI_ESCAPE_SEQUENCE=/\u001B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,MODEL_LINE=/^(\S+)\s+-\s+(.+)$/,MODEL_ID=/^[A-Za-z0-9][A-Za-z0-9._/:+-]*$/,MISLEADING_ERROR_LINE=/^\s*(?:error|failed|failure)(?=\s|:|-|$)/i,STATIC_MODEL_DEFINITIONS=[{id:"auto",label:"Auto"},{id:"composer-2.5",label:"Composer 2.5 (200K context)"},{id:"composer-2.5-fast",label:"Composer 2.5 Fast (200K context)"},{id:"gpt-5.6-sol-high",label:"GPT 5.6 SOL High (272K context)"},{id:"gpt-5.6-luna-high",label:"GPT 5.6 Luna High (272K context)"},{id:"gpt-5.5-high",label:"GPT 5.5 High (272K context)"},{id:"gpt-5.3-codex",label:"GPT 5.3 Codex (272K context)"},{id:"gpt-5.2",label:"GPT 5.2 (272K context)"},{id:"claude-opus-5-high",label:"Claude Opus 5 High (300K context)"},{id:"claude-opus-5-thinking-high",label:"Claude Opus 5 Thinking High (300K context)"},{id:"claude-opus-4-8-thinking-high",label:"Claude Opus 4.8 Thinking High (300K context)"},{id:"claude-fable-5-thinking-high",label:"Claude Fable 5 Thinking High (300K context)"},{id:"claude-sonnet-5-thinking-high",label:"Claude Sonnet 5 Thinking High (300K context)"},{id:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash High (1M context)"},{id:"cursor-grok-4.6-high",label:"Cursor Grok 4.6 High (200K context)"}];function stripAnsi2(value2){return value2.replace(ANSI_ESCAPE_SEQUENCE,"")}function normalizeEntries(raw){return normalizeCursorCatalog(raw.map(({id,label:label2})=>({id,name:label2,input:["text"],cursorMaxMode:!1}))).map(entry=>({id:entry.id,name:entry.name,reasoning:entry.reasoning,...entry.thinkingLevelMap?{thinkingLevelMap:entry.thinkingLevelMap}:{},input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:resolveCursorContextWindow2(entry.id,entry.window),maxTokens:64e3,...entry.representativeVariantId!==void 0&&entry.representativeVariantId!==entry.id?{upstreamModelId:entry.representativeVariantId}:{},compat:{...entry.capabilityId!==void 0&&entry.representativeVariantId!==void 0?{cursorReasoning:{capabilityId:entry.capabilityId,...entry.thinkingMode!==void 0?{thinkingMode:entry.thinkingMode}:{},representativeVariantId:entry.representativeVariantId,...entry.variantIds!==void 0?{variantIds:entry.variantIds}:{}}}:{}}}))}var STATIC_CURSOR_CLI_MODELS=normalizeEntries(STATIC_MODEL_DEFINITIONS);function parseCursorAgentModelsListing(listing){let lines=stripAnsi2(listing).split(/\r?\n/);if(lines.some(line=>MISLEADING_ERROR_LINE.test(line)))return[];let seen=new Set,raw=[];for(let rawLine of lines){let match=MODEL_LINE.exec(rawLine.trim());if(!match)continue;let id=match[1],label2=match[2].trim();!MODEL_ID.test(id)||label2.length===0||seen.has(id)||(seen.add(id),raw.push({id,label:label2}))}return normalizeEntries(raw)}function defaultDeps2(settings){return{now:Date.now,resolveExecutable:()=>{let executableDeps=defaultCursorAgentExecutableDeps();return resolveCursorAgentExecutable({...executableDeps,settings:{executablePath:settings.executablePath}})},makeTemporaryDirectory:prefix=>mkdtemp(prefix),readTextFile:path13=>readFile4(path13,"utf8"),makeDirectory:async path13=>{await mkdir2(path13,{recursive:!0})},writeTextFile:async(path13,contents)=>{await writeFile3(path13,contents,"utf8")},renameFile:async(from,to)=>{await rename3(from,to)},removeDirectory:async path13=>{await rm3(path13,{recursive:!0,force:!0})}}}function catalogTtlMs(settings){let hours=settings.modelCatalogTtlHours;return(typeof hours=="number"&&Number.isFinite(hours)&&hours>0?hours:DEFAULT_MODEL_CATALOG_TTL_HOURS)*60*60*1e3}function parseLegacyCachedModels(models){let rawCached=[],seen=new Set;for(let candidate of models){if(typeof candidate!="object"||candidate===null||!("id"in candidate)||!("name"in candidate))return;let{id,name}=candidate;if(typeof id!="string"||!MODEL_ID.test(id)||typeof name!="string"||name.length===0||seen.has(id))return;seen.add(id),rawCached.push({id,label:name})}return normalizeEntries(rawCached)}function parseCachedCatalog(contents){let parsed;try{parsed=JSON.parse(contents)}catch{return}if(typeof parsed!="object"||parsed===null||!("cachedAt"in parsed)||!("models"in parsed))return;let cachedAt=parsed.cachedAt,listing="listing"in parsed?parsed.listing:void 0,models=parsed.models;if(typeof cachedAt!="number"||!Number.isFinite(cachedAt)||!Array.isArray(models)||models.length===0)return;if(listing===void 0){let legacy=parseLegacyCachedModels(models);return legacy===void 0?void 0:{kind:"legacy",cachedAt,models:legacy}}if(typeof listing!="string")return;let rebuilt=parseCursorAgentModelsListing(listing);if(rebuilt.length!==0)return{kind:"listing",cachedAt,models:rebuilt}}async function readFreshCache(cachePath,now2,ttlMs,deps){try{let cached=parseCachedCatalog(await deps.readTextFile(cachePath));return!cached||now2<cached.cachedAt||now2-cached.cachedAt>=ttlMs?void 0:cached}catch{return}}async function writeCache(cacheDirectory,cachePath,catalog,deps){let temporaryPath=`${cachePath}.${process.pid}.${catalog.cachedAt}.tmp`;await deps.makeDirectory(cacheDirectory),await deps.writeTextFile(temporaryPath,`${JSON.stringify(catalog,null,2)}
1068
+ `),await deps.renameFile(temporaryPath,cachePath)}async function resolveCursorCliModelCatalog(options){let settings=options.settings??{},deps={...defaultDeps2(settings),...options.deps},cacheDirectory=join23(options.agentDir,"cursor-cli-oauth"),cachePath=join23(cacheDirectory,"models.json"),now2=deps.now(),cached=await readFreshCache(cachePath,now2,catalogTtlMs(settings),deps);if(cached?.kind==="listing")return cached.models;let offlineFallback=cached?.models??STATIC_CURSOR_CLI_MODELS,temporaryDirectory;try{let executable=deps.resolveExecutable();temporaryDirectory=await deps.makeTemporaryDirectory(join23(tmpdir2(),"senpi-cursor-models-"));let stdoutPath=join23(temporaryDirectory,"stdout.txt");await deps.runProbe(executable,stdoutPath,MODEL_PROBE_TIMEOUT_MS);let listing=await deps.readTextFile(stdoutPath),models=parseCursorAgentModelsListing(listing);if(models.length===0)return offlineFallback;try{await writeCache(cacheDirectory,cachePath,{cachedAt:now2,listing,models},deps)}catch{}return models}catch{return offlineFallback}finally{if(temporaryDirectory!==void 0)try{await deps.removeDirectory(temporaryDirectory)}catch{}}}import{spawn as spawn4}from"node:child_process";import{open}from"node:fs/promises";var CursorCliModelProbeTimeoutError=class extends Error{constructor(timeoutMs){super(`cursor-agent models exceeded its ${timeoutMs}ms deadline`),this.name="CursorCliModelProbeTimeoutError",this.timeoutMs=timeoutMs}},CursorCliModelProbeExitError=class extends Error{constructor(exitCode,signal){super(`cursor-agent models failed with code ${String(exitCode)} and signal ${String(signal)}`),this.name="CursorCliModelProbeExitError",this.exitCode=exitCode,this.signal=signal}},runModelsProbe=async({executable,stdoutPath,timeoutMs,home})=>{let output=await open(stdoutPath,"w");try{await new Promise((resolve42,reject)=>{let child=spawn4(executable,["models"],{env:cursorAgentEnvironment(home),stdio:["ignore",output.fd,"ignore"]}),timedOut=!1,settled=!1,finish=error2=>{settled||(settled=!0,clearTimeout(deadline),error2?reject(error2):resolve42())},deadline=setTimeout(()=>{timedOut=!0,child.kill("SIGKILL")},timeoutMs);child.once("error",error2=>finish(error2)),child.once("close",(code,signal)=>{if(timedOut){finish(new CursorCliModelProbeTimeoutError(timeoutMs));return}if(code!==0){finish(new CursorCliModelProbeExitError(code,signal));return}finish()})})}finally{await output.close()}};async function refreshCursorCliModelCatalogForLane(input){let outcome=await assessConfiguration({readCurrent:input.readCurrent,readSettings:()=>input.settings,resolveExecutable:input.resolveExecutable});switch(outcome.status){case"disabled":case"not-installed":case"no-accounts":return;case"configured":{let{accounts}=outcome.assessment,account=accounts.find(slot=>slot.name===input.settings.pinnedAccount)??accounts[0];if(account===void 0)return;let probe=input.runProbe??runModelsProbe;return resolveCursorCliModelCatalog({agentDir:input.agentDir,settings:{modelCatalogTtlHours:input.settings.modelCatalogTtlHours,executablePath:input.settings.executablePath},deps:{resolveExecutable:()=>input.resolveExecutable({executablePath:input.settings.executablePath}),runProbe:async(executable,stdoutPath,timeoutMs)=>{await runInCursorAccountHome(input.agentDir,account,({home})=>probe({executable,stdoutPath,timeoutMs,home}),input.log)}}})}default:return outcome}}function asManagedCredential(credential){if(credential?.type!=="oauth")return;let managed=credential;return Array.isArray(managed.accounts)&&managed.access===SENTINEL_OAUTH_FIELDS2.access&&managed.refresh===SENTINEL_OAUTH_FIELDS2.refresh&&managed.expires===SENTINEL_OAUTH_FIELDS2.expires?managed:void 0}async function bootstrapNativeCredential(deps){let current;try{current=await deps.store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);let managed=asManagedCredential(current);if(managed&&listAccounts2(managed).length>0||current!==void 0&&!managed||deps.canBootstrap!==void 0&&!await deps.canBootstrap())return current;let native=await deps.readNativeCredential();return native===void 0?current:await deps.store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async latest=>{let latestManaged=asManagedCredential(latest);return latestManaged&&listAccounts2(latestManaged).length>0||latest!==void 0&&!latestManaged?latest:importNativeCursorCredential(latestManaged??emptyCredential2(),async()=>native)})}catch{return current}}function createCursorCliOauthCredentialReader(deps){let inFlight;return()=>inFlight||(inFlight=bootstrapNativeCredential(deps).finally(()=>{inFlight=void 0}),inFlight)}var CursorCliFailoverError=class extends Error{constructor(classification,original,visibleAssistantDeltaEmitted){super(errorMessage4(original)),this.name="CursorCliFailoverError",this.classification=classification,this.original=original,this.visibleAssistantDeltaEmitted=visibleAssistantDeltaEmitted}},CursorCliNoAssistantOutputError2=class extends Error{constructor(){super("Cursor CLI attempt completed without visible assistant text"),this.name="CursorCliNoAssistantOutputError"}};function record6(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}function errorMessage4(error2){if(error2 instanceof Error)return error2.message;if(typeof error2=="string")return error2;let message=record6(error2)?.message;return typeof message=="string"?message:"Cursor CLI attempt failed"}function errorInput2(error2){let value2=record6(error2);return value2&&("exitCode"in value2||"stderr"in value2||"resultEvent"in value2||"thrown"in value2)?error2:{thrown:error2}}function defaultErrorFromEvent3(event){let value2=record6(event);if(value2?.type==="malformed_stream")return{thrown:event};if(value2?.type==="result"&&(value2.is_error===!0||value2.subtype==="error"))return{resultEvent:event}}function defaultIsVisibleAssistantDelta2(event){let value2=record6(event);if(!value2)return!1;if(value2.type==="assistant"){let message=record6(value2.message);return Array.isArray(message?.content)?message.content.some(item=>{let block=record6(item);return block?.type==="text"&&typeof block.text=="string"&&block.text.length>0}):!1}return(value2.type==="assistant_delta"||value2.type==="text_delta")&&typeof value2.delta=="string"&&value2.delta.length>0}function notice(fromAccount,toAccount){return{type:"cursor_account_changed",message:`Cursor account changed from '${fromAccount}' to '${toAccount}'; a fresh chat was started and prior context was not carried over.`,fromAccount,toAccount,freshChat:!0,priorContextCarriedOver:!1}}async function readCredential(store,providerId){let current=await store.read(providerId);return current?.type==="oauth"?current:void 0}async function selectStoredAccount(options,now2){let credential=await readCredential(options.store,options.providerId),accounts=credential?listAccounts2(credential):[];return selectAccount2(accounts,{...options.affinity,pinnedAccount:options.affinity?.pinnedAccount??credential?.pinned,now:now2})}function blockedAccount2(account,classification,now2){if(classification.kind==="auth_error"){let{blockedUntil:_blockedUntil,...withoutExpiry}=account;return{...withoutExpiry,blockReason:"auth_error"}}let duration=Math.min(1728e5,classification.blockMs??6e4);return{...account,blockedUntil:now2+duration,blockReason:"rate_limit"}}async function persistBlock2(store,providerId,account){await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current;return{...credential,accounts:(credential.accounts??[]).map(existing=>existing.name===account.name?{...existing,blockedUntil:account.blockedUntil,blockReason:account.blockReason}:existing)}})}function isFailoverKind(classification){return classification.kind==="rate_limit"||classification.kind==="auth_error"}async function*runCursorCliFailover(options){let now2=options.now??Date.now,classify=options.classify??classifyCursorCliError,errorFromEvent=options.errorFromEvent??defaultErrorFromEvent3,isVisibleAssistantDelta=options.isVisibleAssistantDelta??defaultIsVisibleAssistantDelta2,account=await selectStoredAccount(options,now2()),freshChat=!1;for(;;){let visibleAssistantDeltaEmitted=!1;try{let attemptStream=await options.runAttempt(account,{freshChat});for await(let event of attemptStream){let failure2=errorFromEvent(event);if(failure2!==void 0)throw failure2;visibleAssistantDeltaEmitted||=isVisibleAssistantDelta(event),yield event}if(!visibleAssistantDeltaEmitted)throw new CursorCliNoAssistantOutputError2;return}catch(error2){let classification=classify(errorInput2(error2)),surfaced=new CursorCliFailoverError(classification,error2,visibleAssistantDeltaEmitted);if(!isFailoverKind(classification))throw surfaced;let blocked=blockedAccount2(account,classification,now2());if(await persistBlock2(options.store,options.providerId,blocked),visibleAssistantDeltaEmitted)throw surfaced;let nextAccount=await selectStoredAccount(options,now2());yield notice(account.name,nextAccount.name),account=nextAccount,freshChat=!0}}}function resolveCursorCliSpawnModel(model,selection){return renderCursorCliModelString(model,selection)}var DISABLED_MESSAGE="disabled by settings",NO_ACCOUNTS_MESSAGE="no accounts: run /login cursor-cli-oauth",RECENT_EXCHANGE_LIMIT=12,CursorCliProcessFailureError=class extends Error{constructor(exitCode,stderr){super(stderr.trim().length>0?stderr.trim():`cursor-agent exited with code ${String(exitCode)}`),this.name="CursorCliProcessFailureError",this.exitCode=exitCode,this.stderr=stderr}},CursorCliEventBuffer=class{constructor(){this.values=[],this.waiters=[],this.ended=!1,this.settled=!1}wake(error2){let waiter=this.waiters.shift();waiter&&waiter(error2)}push(value2){this.ended||this.failure!==void 0||(this.values.push(value2),this.wake())}close(){if(!this.settled){this.settled=!0,this.ended=!0;for(let waiter of this.waiters.splice(0))waiter()}}fail(error2){if(!this.settled){this.settled=!0,this.failure=error2;for(let waiter of this.waiters.splice(0))waiter(error2)}}async*events(){for(;;){let value2=this.values.shift();if(value2!==void 0){yield value2;continue}if(this.failure!==void 0)throw this.failure;if(this.ended)return;await new Promise((resolve42,reject)=>{this.waiters.push(error2=>{error2!==void 0?reject(error2):resolve42()})})}}};function emptyCursorCliOutput(model){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()}}function ensureStarted(mapper){mapper.started||(mapper.started=!0,mapper.stream.push({type:"start",partial:mapper.output}))}function openBlock2(mapper,kind){ensureStarted(mapper),kind==="thinking"?mapper.output.content.push({type:"thinking",thinking:""}):mapper.output.content.push({type:"text",text:""}),mapper.openKind=kind,mapper.openIndex=mapper.output.content.length-1,mapper.openText="",mapper.textAccumulated="",mapper.stream.push({type:kind==="thinking"?"thinking_start":"text_start",contentIndex:mapper.openIndex,partial:mapper.output})}function closeOpen(mapper){if(mapper.openKind===void 0)return;let block=mapper.output.content[mapper.openIndex];mapper.openKind==="thinking"?(block!==void 0&&block.type==="thinking"&&(block.thinking=mapper.openText),mapper.stream.push({type:"thinking_end",contentIndex:mapper.openIndex,content:mapper.openText,partial:mapper.output})):(block!==void 0&&block.type==="text"&&(block.text=mapper.openText),mapper.stream.push({type:"text_end",contentIndex:mapper.openIndex,content:mapper.openText,partial:mapper.output})),mapper.openKind=void 0}function ensureOpen(mapper,kind){mapper.openKind!==kind&&(closeOpen(mapper),openBlock2(mapper,kind))}function resetTextSegment(mapper){closeOpen(mapper),mapper.textAccumulated=""}function pushTextDelta(mapper,delta){let block=mapper.output.content[mapper.openIndex];mapper.openText+=delta,block!==void 0&&block.type==="text"&&(block.text=mapper.openText),mapper.stream.push({type:"text_delta",contentIndex:mapper.openIndex,delta,partial:mapper.output})}function pushThinkingDelta(mapper,delta){let block=mapper.output.content[mapper.openIndex];mapper.openText+=delta,block!==void 0&&block.type==="thinking"&&(block.thinking=mapper.openText),mapper.stream.push({type:"thinking_delta",contentIndex:mapper.openIndex,delta,partial:mapper.output})}function appendAssistantFragment(mapper,fragment){if(fragment.length===0)return;ensureOpen(mapper,"text");let delta;fragment.length>=mapper.textAccumulated.length&&(mapper.textAccumulated.length===0||fragment.startsWith(mapper.textAccumulated))?(delta=fragment.slice(mapper.textAccumulated.length),mapper.textAccumulated=fragment):(delta=fragment,mapper.textAccumulated+=fragment),delta.length>0&&pushTextDelta(mapper,delta)}function appendNotice(mapper,message){ensureOpen(mapper,"text"),pushTextDelta(mapper,`${message}
1069
1069
  `)}function applyResultEvent(mapper,model,sentPromptTokens,usage3,requestId,durationMs){let output=mapper.output;output.usage.input=sentPromptTokens,output.usage.output=usage3.outputTokens,output.usage.cacheRead=0,output.usage.cacheWrite=0,output.usage.totalTokens=0,output.usage.cost=calculateCost(model,output.usage),output.stopReason="stop",output.diagnostics=[...output.diagnostics??[],createAssistantMessageDiagnostic("cursor_cli_oauth_cli_usage","cursor-agent reported usage (telemetry only; never used for senpi context accounting)",{inputTokens:usage3.inputTokens,outputTokens:usage3.outputTokens,cacheReadTokens:usage3.cacheReadTokens,cacheWriteTokens:usage3.cacheWriteTokens,requestId,durationMs})]}function blockText(blocks){let parts=[];for(let block of blocks){if(typeof block!="object"||block===null)continue;let candidate=block;candidate.type==="text"&&typeof candidate.text=="string"&&candidate.text.length>0&&parts.push(candidate.text)}return parts.join(`
1070
1070
  `)}function lastUserPrompt(context){for(let index=context.messages.length-1;index>=0;index-=1){let message=context.messages[index];if(!(message===void 0||message.role!=="user"))return typeof message.content=="string"?message.content:blockText(message.content)}throw new Error("cursor-cli-oauth needs a user message to prompt the Cursor CLI")}function recapExchanges(context){let exchanges=[];for(let message of context.messages)if(message.role==="user"){let text2=typeof message.content=="string"?message.content:blockText(message.content);text2.length>0&&exchanges.push({role:"user",text:text2})}else if(message.role==="assistant"){let text2=blockText(message.content);text2.length>0&&exchanges.push({role:"assistant",text:text2})}return exchanges.slice(-RECENT_EXCHANGE_LIMIT)}function isFailoverNotice(event){return event.type==="cursor_account_changed"}function isRestartNotice(event){return event.type==="cursor_chat_restarted"}function turnErrorMessage(error2){let detail=error2;for(let depth=0;depth<3&&typeof detail=="object"&&detail!==null;depth+=1){let wrapper=detail;if(wrapper.original!==void 0)detail=wrapper.original;else if(wrapper.thrown!==void 0)detail=wrapper.thrown;else break}if(detail instanceof Error)return detail.message;if(typeof detail=="string")return detail;let message=detail?.message;return typeof message=="string"&&message.length>0?message:"Cursor CLI turn failed"}function streamCursorCliOauth(model,context,options,deps={}){let stream2=createAssistantMessageEventStream();return(async()=>{let mapper={stream:stream2,output:emptyCursorCliOutput(model),started:!1,openKind:void 0,openIndex:-1,openText:"",textAccumulated:""},now2=deps.now??Date.now,cwdDirectory=deps.cwd??process.cwd(),agentDir=deps.agentDir??getAgentDir(),store=deps.store??AuthStorage.create(),router=deps.router??cursorCliSessionRouter,signal=options?.signal,wasAborted=signal?.aborted===!0,sentPromptTokens=0,runningHandle,handleRunning=!1,onAbort=()=>{wasAborted=!0};wasAborted||signal?.addEventListener("abort",onAbort,{once:!0});try{let settings=deps.settings??loadCursorCliOauthProviderSettingsFromDisk(cwdDirectory);if(settings.explicitlyDisabled)throw new Error(DISABLED_MESSAGE);let executableDeps={...defaultCursorAgentExecutableDeps(),settings:{executablePath:settings.executablePath}};try{resolveCursorAgentExecutable(deps.executableDeps??executableDeps)}catch(error2){throw cursorAgentNotInstalledError(error2)}let guardrailSession=createCursorCliGuardrailSession(),policy=resolveCursorCliExecutionPolicy({forceExecution:settings.forceExecution,noApprovalAcknowledgedAt:settings.noApprovalAcknowledgedAt,executionMode:settings.executionMode,sandboxMode:settings.sandboxMode},guardrailSession,settings.denyCommands??[]);if(policy.status==="refused")throw new CursorCliExecutionRefusalError(policy.refusal);for(let warning of policy.warnings)appendNotice(mapper,warning.message);let stored=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),storedAccounts2=stored?.type==="oauth"?listAccounts2(stored):[];if(!isCursorCliOauthLaneEnabled(settings,storedAccounts2.length))throw new Error(DISABLED_MESSAGE);if(storedAccounts2.length===0)throw new Error(NO_ACCOUNTS_MESSAGE);let prompt=lastUserPrompt(context),senpiSessionId=options?.affinitySessionId??options?.sessionId??DEFAULT_CURSOR_AFFINITY_KEY,spawnModel=resolveCursorCliSpawnModel(model,options?.thinkingSelection),turnInput={prompt,model:spawnModel,recentExchanges:recapExchanges(context)},spawnAndStream=(attempt2,slot)=>{sentPromptTokens=estimateTokens2({role:"user",content:attempt2.prompt,timestamp:now2()});let buffer=new CursorCliEventBuffer;return(async()=>{let sawResult=!1,heldMalformed=[];try{await runInCursorAccountHome(agentDir,slot,async({home})=>{applyCursorCliDenyConfig(home,policy.denyCommands);let handle=spawnCursorCli({prompt:attempt2.prompt,model:spawnModel,resumeChatId:attempt2.resumeChatId,force:policy.force,executionMode:policy.executionMode,sandboxMode:policy.sandboxMode,accountHome:home,cwd:cwdDirectory,signal,executableDeps:deps.executableDeps??executableDeps});runningHandle=handle,handleRunning=!0,wasAborted&&handle.abort();try{for await(let event of handle.events){if(event instanceof CursorCliAbortError){buffer.fail(event);return}if(event.type==="result"&&(sawResult=!0),event.type==="malformed_stream"){heldMalformed.push(event);continue}buffer.push(event)}let outcome=await handle.completed;if(outcome.type==="completed"&&outcome.exitCode!==0&&!sawResult){buffer.fail(new CursorCliProcessFailureError(outcome.exitCode,outcome.stderr));return}for(let event of heldMalformed)buffer.push(event);buffer.close()}finally{handleRunning=!1}},deps.log),buffer.close()}catch(error2){buffer.fail(error2)}})(),buffer.events()},turn=runCursorCliFailover({store,providerId:CURSOR_CLI_OAUTH_PROVIDER_ID,affinity:{sessionId:senpiSessionId,pinnedAccount:settings.pinnedAccount,now:now2()},now:()=>now2(),runAttempt:async(selected,_options)=>{let slot=selected,current=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);if(current?.type==="oauth"){let fresh=current.accounts?.find(candidate=>candidate.name===slot.name);fresh&&(slot=fresh)}if(now2()>=slot.expires){let oauth=deps.oauth??createCursorCliOauthConfig({readCurrent:()=>store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),readSettings:()=>settings,resolveExecutable:oauthSettings=>resolveCursorAgentExecutable({...deps.executableDeps??executableDeps,settings:{executablePath:oauthSettings.executablePath}})}),storedCredential=current?.type==="oauth"?current:emptyCredential2(),refreshed=await oauth.refreshToken(storedCredential,signal??new AbortController().signal);await store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async()=>refreshed);let reread=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),updated=reread?.type==="oauth"?reread.accounts?.find(candidate=>candidate.name===slot.name):void 0;if(!updated)throw new Error(`cursor-cli-oauth account '${slot.name}' disappeared during token refresh`);slot=updated}return router.runTurn({senpiSessionId,accountName:slot.name,runAttempt:attempt2=>spawnAndStream(attempt2,slot),resumeMode:settings.resumeMode,contextRecapOnModelSwitch:settings.contextRecapOnModelSwitch,now:()=>now2()},turnInput)}});for await(let event of turn){if(isFailoverNotice(event)||isRestartNotice(event)){appendNotice(mapper,event.message);continue}switch(event.type){case"system":break;case"thinking":event.subtype==="completed"?mapper.openKind==="thinking"&&closeOpen(mapper):event.text.length>0&&(ensureOpen(mapper,"thinking"),pushThinkingDelta(mapper,event.text));break;case"assistant":for(let block of event.message.content)appendAssistantFragment(mapper,block.text);break;case"tool_call":resetTextSegment(mapper);break;case"result":event.subtype==="success"&&!event.is_error&&applyResultEvent(mapper,model,sentPromptTokens,event.usage,event.request_id,event.duration_ms);break;default:break}}closeOpen(mapper),stream2.push({type:"done",reason:"stop",message:mapper.output})}catch(error2){closeOpen(mapper);let aborted=wasAborted||signal?.aborted===!0;mapper.output.stopReason=aborted?"aborted":"error",mapper.output.errorMessage=turnErrorMessage(error2),stream2.push({type:"error",reason:mapper.output.stopReason,error:mapper.output})}finally{signal?.removeEventListener("abort",onAbort),handleRunning&&runningHandle?.abort(),stream2.end()}})(),stream2}var defaultResolveExecutable2=settings=>resolveCursorAgentExecutable({...defaultCursorAgentExecutableDeps(),settings});function registerCursorCliOauthExtension(pi,deps={}){let cwd=deps.cwd??process.cwd(),agentDir=deps.agentDir??getAgentDir(),store=deps.store??AuthStorage.create(),readCurrent=deps.readCurrent??createCursorCliOauthCredentialReader({store,readNativeCredential:deps.readNativeCredential??(()=>store.read("cursor")),canBootstrap:()=>{let settings=loadSettings(cwd);if(!settings.enabled||settings.explicitlyDisabled)return!1;try{return resolveExecutable(settings),!0}catch{return!1}}}),loadSettings=deps.loadSettings??loadCursorCliOauthProviderSettingsFromDisk,resolveExecutable=deps.resolveExecutable??defaultResolveExecutable2;registerCursorCliAccountCommand(pi);let register=models=>{pi.registerProvider(CURSOR_CLI_OAUTH_PROVIDER_ID,{baseUrl:CURSOR_CLI_OAUTH_PROVIDER_ID,api:CURSOR_CLI_OAUTH_PROVIDER_ID,models:models.map(entry=>({...entry})),streamSimple:(model,context,options)=>streamCursorCliOauth(model,context,options,{cwd,agentDir,store}),fallbackEligible:()=>{let current=loadSettings(cwd);return!current.explicitlyDisabled&&!cursorCliForceRefusalPending(current)},oauth:createCursorCliOauthConfig({readCurrent,readSettings:()=>loadSettings(cwd),resolveExecutable,persistAcknowledgement:acknowledgedAt=>persistCursorCliNoApprovalAcknowledgement(cwd,acknowledgedAt),persistEnabled:enabled=>persistCursorCliOauthEnabled(cwd,enabled)})})};register(STATIC_CURSOR_CLI_MODELS),refreshCursorCliModelCatalogForLane({agentDir,settings:loadSettings(cwd),readCurrent,resolveExecutable,...deps.runModelsProbe===void 0?{}:{runProbe:deps.runModelsProbe}}).then(models=>{if(models===void 0)return;models.map(entry=>entry.id).join(`
1071
1071
  `)!==STATIC_CURSOR_CLI_MODELS.map(entry=>entry.id).join(`
@@ -1251,7 +1251,7 @@ Live retry state: ${live}`}async function runFallbackMenu(ctx,settings,actions){
1251
1251
  [Note: Content was truncated to save context window space. For full context, please read the file directly: ${input.absolutePath}]`:"";return`
1252
1252
 
1253
1253
  [Directory Context: ${input.absolutePath}]
1254
- ${input.content}${notice2}`}var TEXT_ENCODER=new TextEncoder;function truncateBytes(content,maxBytes){let bytes=TEXT_ENCODER.encode(content);if(bytes.byteLength<=maxBytes)return{result:content,truncated:!1,originalBytes:bytes.byteLength,resultBytes:bytes.byteLength};let decoded=new TextDecoder("utf-8",{fatal:!1}).decode(bytes.subarray(0,maxBytes));for(;decoded.endsWith("\uFFFD");)decoded=decoded.slice(0,-1);let finalBytes=TEXT_ENCODER.encode(decoded).byteLength;return{result:decoded,truncated:!0,originalBytes:bytes.byteLength,resultBytes:finalBytes}}var EMPTY_RESULT=Object.freeze({injectedText:"",injectedFiles:[],errors:[]});async function injectDirectoryContext(input){let config=resolveConfig(input.config),contained=await resolveAndContain({filePath:input.filePath,rootDir:input.rootDir});if(!contained)return cloneEmpty();let candidates=await findAgentsMdUp({startDir:dirname25(contained.canonicalPath),rootDir:contained.canonicalRoot,fileNames:config.fileNames}),injectedFiles=[],errors=[],injectedText="",bytesBudget=config.maxBytesPerRead;for(let agentsPath of candidates){let agentsDir=dirname25(agentsPath);if(input.cache.hasInjected(input.sessionKey,agentsDir))continue;if(bytesBudget<=0)break;let content;try{content=await readFile13(agentsPath,"utf-8")}catch(error2){errors.push({path:agentsPath,error:new InjectionFileReadError(agentsPath,error2)});continue}let perFileCap=Math.min(config.maxBytesPerFile,bytesBudget),truncated=truncateBytes(content,perFileCap);injectedFiles.push({absolutePath:agentsPath,directory:agentsDir,truncated:truncated.truncated,originalBytes:truncated.originalBytes,injectedBytes:truncated.resultBytes}),injectedText+=formatDirectoryContext({absolutePath:agentsPath,content:truncated.result,truncated:truncated.truncated}),input.cache.markInjected(input.sessionKey,agentsDir),bytesBudget-=truncated.resultBytes}return{injectedText,injectedFiles,errors}}function resolveConfig(partial){return{fileNames:partial?.fileNames??DEFAULT_FILE_NAMES,maxBytesPerFile:partial?.maxBytesPerFile??32768,maxBytesPerRead:partial?.maxBytesPerRead??131072}}function cloneEmpty(){return{injectedText:EMPTY_RESULT.injectedText,injectedFiles:[],errors:[]}}var InjectionCache=class{constructor(){this.sessions=new Map}getOrCreate(sessionKey){let set=this.sessions.get(sessionKey);return set||(set=new Set,this.sessions.set(sessionKey,set)),set}hasInjected(sessionKey,canonicalDir){return this.sessions.get(sessionKey)?.has(canonicalDir)??!1}markInjected(sessionKey,canonicalDir){this.getOrCreate(sessionKey).add(canonicalDir)}getCacheSize(sessionKey){return this.sessions.get(sessionKey)?.size??0}listInjected(sessionKey){let set=this.sessions.get(sessionKey);return set?Array.from(set):[]}clearSession(sessionKey){this.sessions.delete(sessionKey)}clearAll(){this.sessions.clear()}};var SINGLETON_SESSION_KEY="__pi_nested_agents_md_singleton__";function getSessionKey(ctx){let file=ctx.sessionManager?.getSessionFile?.();return typeof file=="string"&&file.length>0?file:SINGLETON_SESSION_KEY}import{isAbsolute as isAbsolute9,relative as relative10}from"node:path";var STATUS_KEY3="ext:nested-agents:status",WIDGET_KEY3="ext:nested-agents:widget";function updateStatus(ctx,cache,sessionKey,hasErrors){if(!ctx.hasUI||!ctx.ui?.setStatus)return;let count=cache.getCacheSize(sessionKey);if(count===0){ctx.ui.setStatus(STATUS_KEY3,void 0);return}let theme2=ctx.ui.theme??identityTheme,text2=theme2.fg("dim",`\u{1F916} ${count}`);hasErrors&&(text2+=theme2.fg("warning"," \u26A0\uFE0F")),ctx.ui.setStatus(STATUS_KEY3,text2)}function clearStatus(ctx){!ctx.hasUI||!ctx.ui?.setStatus||ctx.ui.setStatus(STATUS_KEY3,void 0)}function updateWidget(ctx,visible,files){if(!ctx.hasUI||!ctx.ui?.setWidget)return;if(!visible||files.length===0){ctx.ui.setWidget(WIDGET_KEY3,void 0);return}let theme2=ctx.ui.theme??identityTheme,lines=[theme2.fg("accent","Nested Context:")];for(let file of files){let display=displayPath3(ctx.cwd,file.absolutePath),text2=file.truncated?` ${display} (truncated)`:` ${display}`;lines.push(theme2.fg(file.truncated?"warning":"dim",text2))}ctx.ui.setWidget(WIDGET_KEY3,lines,{placement:"aboveEditor"})}function clearWidget(ctx){!ctx.hasUI||!ctx.ui?.setWidget||ctx.ui.setWidget(WIDGET_KEY3,void 0)}function buildDebugRecord(input){return{sessionKey:input.sessionKey,cacheSize:input.cache.getCacheSize(input.sessionKey),injectedDirectories:input.cache.listInjected(input.sessionKey),injectedFiles:input.files.map(f=>({path:f.absolutePath,truncated:f.truncated}))}}function displayPath3(cwd,absolutePath){if(!isAbsolute9(absolutePath))return absolutePath;let rel=relative10(cwd,absolutePath);return rel===""||rel===".."||rel.startsWith("../")||isAbsolute9(rel)?absolutePath:rel}var identityTheme={fg:(_color,text2)=>text2};var FLAG_DISABLE="no-nested-agents",COMMAND_TOGGLE="nested-agents",ENTRY_TYPE_DEBUG="nested-agents-md:debug";function nestedAgentsMd(pi){pi.registerFlag(FLAG_DISABLE,{description:"Disable nested AGENTS.md context injection.",type:"boolean",default:!1});let cache=new InjectionCache,filesPerSession=new Map,errorsPerSession=new Map,widgetVisible=!1,disabled2=!1;pi.on("session_start",async(_event,ctx)=>{disabled2=pi.getFlag(FLAG_DISABLE)===!0,disabled2&&(clearStatus(ctx),clearWidget(ctx))}),pi.on("tool_result",async(event,ctx)=>{if(disabled2||!isReadToolResult(event)||event.isError)return;let filePath=event.input.path;if(typeof filePath!="string"||filePath.length===0||!event.content.some(block=>block.type==="text"))return;let sessionKey=getSessionKey(ctx),result3=await injectDirectoryContext({filePath,rootDir:ctx.cwd,cache,sessionKey}),hasErrors=errorsPerSession.get(sessionKey)===!0||result3.errors.length>0;if(result3.errors.length>0&&errorsPerSession.set(sessionKey,!0),!result3.injectedText){updateStatus(ctx,cache,sessionKey,hasErrors);return}let metaMap=filesPerSession.get(sessionKey);metaMap||(metaMap=new Map,filesPerSession.set(sessionKey,metaMap));for(let file of result3.injectedFiles)metaMap.set(file.absolutePath,{absolutePath:file.absolutePath,truncated:file.truncated});updateStatus(ctx,cache,sessionKey,hasErrors),widgetVisible&&updateWidget(ctx,!0,[...metaMap.values()]);let textBlock={type:"text",text:result3.injectedText};return{content:[...event.content,textBlock]}}),pi.on("session_compact",async(event,ctx)=>{if(!event.accepted)return;let sessionKey=getSessionKey(ctx);cache.clearSession(sessionKey),filesPerSession.delete(sessionKey),errorsPerSession.delete(sessionKey),updateStatus(ctx,cache,sessionKey,!1),widgetVisible&&updateWidget(ctx,!0,[])}),pi.on("session_shutdown",async(_event,ctx)=>{let sessionKey=getSessionKey(ctx);cache.clearSession(sessionKey),filesPerSession.delete(sessionKey),errorsPerSession.delete(sessionKey)}),pi.registerCommand(COMMAND_TOGGLE,{description:"Toggle the nested AGENTS.md context widget and dump cache state.",handler:async(_args,ctx)=>{if(disabled2){ctx.ui.notify("nested-agents-md is disabled via --no-nested-agents","info");return}widgetVisible=!widgetVisible;let sessionKey=getSessionKey(ctx),files=[...filesPerSession.get(sessionKey)?.values()??[]];updateWidget(ctx,widgetVisible,files),pi.appendEntry(ENTRY_TYPE_DEBUG,buildDebugRecord({cache,sessionKey,files})),ctx.ui.notify(widgetVisible?"Nested AGENTS.md context widget shown":"Nested AGENTS.md context widget hidden","info")}})}import{mkdir as mkdir9,writeFile as writeFile10}from"node:fs/promises";import{dirname as dirname26,join as join43}from"node:path";var IMAGE_GENERATION_CALL_SUBTYPE="image_generation_call",MAX_COLLISION_ATTEMPTS=100;function readString(record7,key){let value2=record7[key];return typeof value2=="string"?value2:void 0}function readCompletedNativeImage(raw){if(typeof raw!="object"||raw===null)return;let record7={...raw};if(readString(record7,"type")!==IMAGE_GENERATION_CALL_SUBTYPE||readString(record7,"status")!=="completed")return;let result3=readString(record7,"result");if(result3===void 0||result3.length===0)return;let id=readString(record7,"id"),revisedPrompt=readString(record7,"revised_prompt");return{...id===void 0?{}:{id},result:result3,...revisedPrompt?.trim()?{revisedPrompt}:{}}}function detectImageExtension(bytes){return bytes.length>=8&&bytes.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"png":bytes.length>=3&&bytes[0]===255&&bytes[1]===216&&bytes[2]===255?"jpg":bytes.length>=12&&bytes.subarray(0,4).toString("ascii")==="RIFF"&&bytes.subarray(8,12).toString("ascii")==="WEBP"?"webp":"png"}function fileStem(image,responseId,outputIndex){return image.id!==void 0?sanitizeImageStem(image.id):sanitizeImageStem(`${responseId??"image"}-${outputIndex}`)}function decodeBase642(result3){let bytes=Buffer.from(result3,"base64");if(bytes.length===0)throw new Error("decoded to zero bytes");return bytes}async function writeWithoutOverwrite(directory,stem,extension,bytes){await mkdir9(directory,{recursive:!0});for(let attempt2=1;attempt2<=MAX_COLLISION_ATTEMPTS;attempt2++){let suffix=attempt2===1?"":`-${attempt2}`,target=join43(directory,`${stem}${suffix}.${extension}`);try{return await mkdir9(dirname26(target),{recursive:!0}),await writeFile10(target,bytes,{flag:"wx"}),target}catch(error2){if((error2 instanceof Error&&"code"in error2?error2.code:void 0)!=="EEXIST")throw error2}}throw new Error(`no free filename for ${stem}.${extension}`)}function successText(cwd,target,revisedPrompt){let lines=[`Generated image: ${displayPath2(cwd,target)}`];return revisedPrompt!==void 0&&lines.push(`Revised prompt: ${revisedPrompt}`),{type:"text",text:lines.join(`
1254
+ ${input.content}${notice2}`}var TEXT_ENCODER=new TextEncoder;function truncateBytes(content,maxBytes){let bytes=TEXT_ENCODER.encode(content);if(bytes.byteLength<=maxBytes)return{result:content,truncated:!1,originalBytes:bytes.byteLength,resultBytes:bytes.byteLength};let decoded=new TextDecoder("utf-8",{fatal:!1}).decode(bytes.subarray(0,maxBytes));for(;decoded.endsWith("\uFFFD");)decoded=decoded.slice(0,-1);let finalBytes=TEXT_ENCODER.encode(decoded).byteLength;return{result:decoded,truncated:!0,originalBytes:bytes.byteLength,resultBytes:finalBytes}}var EMPTY_RESULT=Object.freeze({injectedText:"",injectedFiles:[],errors:[]});async function injectDirectoryContext(input){let config=resolveConfig(input.config),contained=await resolveAndContain({filePath:input.filePath,rootDir:input.rootDir});if(!contained)return cloneEmpty();let candidates=await findAgentsMdUp({startDir:dirname25(contained.canonicalPath),rootDir:contained.canonicalRoot,fileNames:config.fileNames}),injectedFiles=[],errors=[],injectedText="",bytesBudget=config.maxBytesPerRead;for(let agentsPath of candidates){let agentsDir=dirname25(agentsPath);if(input.cache.hasInjected(input.sessionKey,agentsDir))continue;if(bytesBudget<=0)break;let content;try{content=await readFile13(agentsPath,"utf-8")}catch(error2){errors.push({path:agentsPath,error:new InjectionFileReadError(agentsPath,error2)});continue}let perFileCap=Math.min(config.maxBytesPerFile,bytesBudget),truncated=truncateBytes(content,perFileCap);injectedFiles.push({absolutePath:agentsPath,directory:agentsDir,truncated:truncated.truncated,originalBytes:truncated.originalBytes,injectedBytes:truncated.resultBytes}),injectedText+=formatDirectoryContext({absolutePath:agentsPath,content:truncated.result,truncated:truncated.truncated}),input.cache.markInjected(input.sessionKey,agentsDir),bytesBudget-=truncated.resultBytes}return{injectedText,injectedFiles,errors}}function resolveConfig(partial){return{fileNames:partial?.fileNames??DEFAULT_FILE_NAMES,maxBytesPerFile:partial?.maxBytesPerFile??32768,maxBytesPerRead:partial?.maxBytesPerRead??131072}}function cloneEmpty(){return{injectedText:EMPTY_RESULT.injectedText,injectedFiles:[],errors:[]}}var InjectionCache=class{constructor(){this.sessions=new Map}getOrCreate(sessionKey){let set=this.sessions.get(sessionKey);return set||(set=new Set,this.sessions.set(sessionKey,set)),set}hasInjected(sessionKey,canonicalDir){return this.sessions.get(sessionKey)?.has(canonicalDir)??!1}markInjected(sessionKey,canonicalDir){this.getOrCreate(sessionKey).add(canonicalDir)}getCacheSize(sessionKey){return this.sessions.get(sessionKey)?.size??0}listInjected(sessionKey){let set=this.sessions.get(sessionKey);return set?Array.from(set):[]}clearSession(sessionKey){this.sessions.delete(sessionKey)}clearAll(){this.sessions.clear()}};var SINGLETON_SESSION_KEY="__pi_nested_agents_md_singleton__";function getSessionKey(ctx){let file=ctx.sessionManager?.getSessionFile?.();return typeof file=="string"&&file.length>0?file:SINGLETON_SESSION_KEY}import{isAbsolute as isAbsolute9,relative as relative10}from"node:path";var STATUS_KEY3="ext:nested-agents:status",WIDGET_KEY3="ext:nested-agents:widget";function updateStatus(ctx,cache,sessionKey,hasErrors){if(!ctx.hasUI||!ctx.ui?.setStatus)return;let count=cache.getCacheSize(sessionKey);if(count===0){ctx.ui.setStatus(STATUS_KEY3,void 0);return}let theme2=ctx.ui.theme??identityTheme,text2=theme2.fg("dim",`\u{1F916} ${count}`);hasErrors&&(text2+=theme2.fg("warning"," \u26A0\uFE0F")),ctx.ui.setStatus(STATUS_KEY3,text2)}function clearStatus(ctx){!ctx.hasUI||!ctx.ui?.setStatus||ctx.ui.setStatus(STATUS_KEY3,void 0)}function updateWidget(ctx,visible,files){if(!ctx.hasUI||!ctx.ui?.setWidget)return;if(!visible||files.length===0){ctx.ui.setWidget(WIDGET_KEY3,void 0);return}let theme2=ctx.ui.theme??identityTheme,lines=[theme2.fg("accent","Nested Context:")];for(let file of files){let display=displayPath3(ctx.cwd,file.absolutePath),text2=file.truncated?` ${display} (truncated)`:` ${display}`;lines.push(theme2.fg(file.truncated?"warning":"dim",text2))}ctx.ui.setWidget(WIDGET_KEY3,lines,{placement:"aboveEditor"})}function clearWidget(ctx){!ctx.hasUI||!ctx.ui?.setWidget||ctx.ui.setWidget(WIDGET_KEY3,void 0)}function buildDebugRecord(input){return{sessionKey:input.sessionKey,cacheSize:input.cache.getCacheSize(input.sessionKey),injectedDirectories:input.cache.listInjected(input.sessionKey),injectedFiles:input.files.map(f=>({path:f.absolutePath,truncated:f.truncated}))}}function displayPath3(cwd,absolutePath){if(!isAbsolute9(absolutePath))return absolutePath;let rel=relative10(cwd,absolutePath);return rel===""||rel===".."||rel.startsWith("../")||isAbsolute9(rel)?absolutePath:rel}var identityTheme={fg:(_color,text2)=>text2};var FLAG_DISABLE="no-nested-agents",COMMAND_TOGGLE="nested-agents",ENTRY_TYPE_DEBUG="nested-agents-md:debug";function nestedAgentsMd(pi){pi.registerFlag(FLAG_DISABLE,{description:"Disable nested AGENTS.md context injection.",type:"boolean",default:!1});let cache=new InjectionCache,filesPerSession=new Map,errorsPerSession=new Map,widgetVisible=!1,disabled2=!1;pi.on("session_start",async(_event,ctx)=>{disabled2=pi.getFlag(FLAG_DISABLE)===!0,disabled2&&(clearStatus(ctx),clearWidget(ctx))}),pi.on("tool_result",async(event,ctx)=>{if(disabled2||!isReadToolResult(event)||event.isError)return;let filePath=event.input.path;if(typeof filePath!="string"||filePath.length===0||!event.content.some(block=>block.type==="text"))return;let sessionKey=getSessionKey(ctx),result3=await injectDirectoryContext({filePath,rootDir:ctx.cwd,cache,sessionKey}),hasErrors=errorsPerSession.get(sessionKey)===!0||result3.errors.length>0;if(result3.errors.length>0&&errorsPerSession.set(sessionKey,!0),!result3.injectedText){updateStatus(ctx,cache,sessionKey,hasErrors);return}let metaMap=filesPerSession.get(sessionKey);metaMap||(metaMap=new Map,filesPerSession.set(sessionKey,metaMap));for(let file of result3.injectedFiles)metaMap.set(file.absolutePath,{absolutePath:file.absolutePath,truncated:file.truncated});updateStatus(ctx,cache,sessionKey,hasErrors),widgetVisible&&updateWidget(ctx,!0,[...metaMap.values()]);let textBlock={type:"text",text:result3.injectedText,audience:"model"};return{content:[...event.content,textBlock]}}),pi.on("session_compact",async(event,ctx)=>{if(!event.accepted)return;let sessionKey=getSessionKey(ctx);cache.clearSession(sessionKey),filesPerSession.delete(sessionKey),errorsPerSession.delete(sessionKey),updateStatus(ctx,cache,sessionKey,!1),widgetVisible&&updateWidget(ctx,!0,[])}),pi.on("session_shutdown",async(_event,ctx)=>{let sessionKey=getSessionKey(ctx);cache.clearSession(sessionKey),filesPerSession.delete(sessionKey),errorsPerSession.delete(sessionKey)}),pi.registerCommand(COMMAND_TOGGLE,{description:"Toggle the nested AGENTS.md context widget and dump cache state.",handler:async(_args,ctx)=>{if(disabled2){ctx.ui.notify("nested-agents-md is disabled via --no-nested-agents","info");return}widgetVisible=!widgetVisible;let sessionKey=getSessionKey(ctx),files=[...filesPerSession.get(sessionKey)?.values()??[]];updateWidget(ctx,widgetVisible,files),pi.appendEntry(ENTRY_TYPE_DEBUG,buildDebugRecord({cache,sessionKey,files})),ctx.ui.notify(widgetVisible?"Nested AGENTS.md context widget shown":"Nested AGENTS.md context widget hidden","info")}})}import{mkdir as mkdir9,writeFile as writeFile10}from"node:fs/promises";import{dirname as dirname26,join as join43}from"node:path";var IMAGE_GENERATION_CALL_SUBTYPE="image_generation_call",MAX_COLLISION_ATTEMPTS=100;function readString(record7,key){let value2=record7[key];return typeof value2=="string"?value2:void 0}function readCompletedNativeImage(raw){if(typeof raw!="object"||raw===null)return;let record7={...raw};if(readString(record7,"type")!==IMAGE_GENERATION_CALL_SUBTYPE||readString(record7,"status")!=="completed")return;let result3=readString(record7,"result");if(result3===void 0||result3.length===0)return;let id=readString(record7,"id"),revisedPrompt=readString(record7,"revised_prompt");return{...id===void 0?{}:{id},result:result3,...revisedPrompt?.trim()?{revisedPrompt}:{}}}function detectImageExtension(bytes){return bytes.length>=8&&bytes.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"png":bytes.length>=3&&bytes[0]===255&&bytes[1]===216&&bytes[2]===255?"jpg":bytes.length>=12&&bytes.subarray(0,4).toString("ascii")==="RIFF"&&bytes.subarray(8,12).toString("ascii")==="WEBP"?"webp":"png"}function fileStem(image,responseId,outputIndex){return image.id!==void 0?sanitizeImageStem(image.id):sanitizeImageStem(`${responseId??"image"}-${outputIndex}`)}function decodeBase642(result3){let bytes=Buffer.from(result3,"base64");if(bytes.length===0)throw new Error("decoded to zero bytes");return bytes}async function writeWithoutOverwrite(directory,stem,extension,bytes){await mkdir9(directory,{recursive:!0});for(let attempt2=1;attempt2<=MAX_COLLISION_ATTEMPTS;attempt2++){let suffix=attempt2===1?"":`-${attempt2}`,target=join43(directory,`${stem}${suffix}.${extension}`);try{return await mkdir9(dirname26(target),{recursive:!0}),await writeFile10(target,bytes,{flag:"wx"}),target}catch(error2){if((error2 instanceof Error&&"code"in error2?error2.code:void 0)!=="EEXIST")throw error2}}throw new Error(`no free filename for ${stem}.${extension}`)}function successText(cwd,target,revisedPrompt){let lines=[`Generated image: ${displayPath2(cwd,target)}`];return revisedPrompt!==void 0&&lines.push(`Revised prompt: ${revisedPrompt}`),{type:"text",text:lines.join(`
1255
1255
  `)}}function failureText(reason){return{type:"text",text:`Generated image could not be saved: ${reason}.`}}async function externalizeBlock(cwd,image,responseId,outputIndex){try{let bytes=decodeBase642(image.result),target=await writeWithoutOverwrite(join43(cwd,GENERATED_IMAGE_DIRECTORY),fileStem(image,responseId,outputIndex),detectImageExtension(bytes),bytes);return successText(cwd,target,image.revisedPrompt)}catch(error2){return failureText(error2 instanceof Error?error2.message:String(error2))}}function isImageGenerationCall(block){return block.type==="providerNative"&&block.subtype===IMAGE_GENERATION_CALL_SUBTYPE}async function externalizeNativeImages(message,cwd){let content=[],replaced=!1;for(let[outputIndex,block]of message.content.entries()){let image=isImageGenerationCall(block)?readCompletedNativeImage(block.raw):void 0;if(image===void 0){content.push(block);continue}content.push(await externalizeBlock(cwd,image,message.responseId,outputIndex)),replaced=!0}return replaced?{...message,content}:void 0}var ENABLE_ENV2="PI_OPENAI_IMAGE_GEN",OFFICIAL_OPENAI_HOST="api.openai.com",OFFICIAL_OPENAI_BASE_URL="https://api.openai.com/v1";function parseEnableEnv2(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isOpenAiImageGenEnabled(){return parseEnableEnv2(ENABLE_ENV2)}function compatImageGenerationOverride(compat){if(typeof compat!="object"||compat===null||!("supportsImageGeneration"in compat))return;let value2=compat.supportsImageGeneration;return typeof value2=="boolean"?value2:void 0}function isOfficialOpenAiEndpoint(baseUrl){try{return new URL(baseUrl||OFFICIAL_OPENAI_BASE_URL).hostname===OFFICIAL_OPENAI_HOST}catch{return!1}}function supportsNativeOpenAiImageGeneration(target){return target===void 0||target.api!=="openai-responses"?!1:compatImageGenerationOverride(target.compat)??isOfficialOpenAiEndpoint(target.baseUrl)}function nativeImageGenModelKey(target){return target===void 0?"":`${target.provider}|${target.api}|${target.baseUrl}|${target.id}`}var NATIVE_IMAGE_GEN_TOOL_TYPE="image_generation";function isRecord42(value2){return typeof value2=="object"&&value2!==null}function isNativeImageGenTool(tool){if(!isRecord42(tool))return!1;let type2=tool.type;return typeof type2=="string"&&(type2===NATIVE_IMAGE_GEN_TOOL_TYPE||type2.startsWith(`${NATIVE_IMAGE_GEN_TOOL_TYPE}_`))}function isGenerateImageFunctionTool(tool){return isRecord42(tool)&&tool.name===GENERATE_IMAGE_TOOL_NAME}function applyImageGenerationTools(payload,mode){if(!isRecord42(payload))return payload;let tools=Array.isArray(payload.tools)?payload.tools:void 0,stripFunctionTool=mode!=="client",kept=(tools??[]).filter(tool=>!isNativeImageGenTool(tool)&&!(stripFunctionTool&&isGenerateImageFunctionTool(tool))),removed=(tools?.length??0)!==kept.length;return mode!=="native"?removed?{...payload,tools:kept}:payload:{...payload,tools:[...kept,{type:NATIVE_IMAGE_GEN_TOOL_TYPE,model:DEFAULT_IMAGE_MODEL}]}}var OPENAI_IMAGE_GEN_SECTION=`
1256
1256
  ## Image Generation
1257
1257
 
@@ -2001,7 +2001,7 @@ Have an opinion: agree or disagree plainly, and say why; raise only real problem
2001
2001
  Plain, literal prose; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. Write the final summary 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-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[._-](?: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-(?:high|max|low|high-lite)(?:$|[/@:._-])/.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")}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";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-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??[]}}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}}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}
2002
2002
 
2003
2003
  ${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){pi.on("before_agent_start",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("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 label2=match.kind==="pr"?"PR":"Issue",trimmedTitle=title?.trim(),fallbackName=`${label2}: ${match.url}`,desiredName=trimmedTitle?`${label2}: ${trimmedTitle} (${match.url})`:fallbackName,currentName=pi.getSessionName()?.trim();if(!currentName){pi.setSessionName(desiredName);return}(currentName===match.url||currentName===fallbackName)&&pi.setSessionName(desiredName)};pi.on("before_agent_start",async(event,ctx)=>{if(!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)}))});let getUserText=content=>content?typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(`
2004
- `)??"":"",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(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"],RECOMMENDED_DEFAULT_MODELS=[["kimi-k3","max"],["gpt-6-astra","high"],["gpt-6-sol","medium"],["gpt-5.6-sol","medium"],["claude-fable-5-1","high"],["claude-opus-5-5","max"],["glm-5.2","max"]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel])=>({modelId,thinkingLevel})),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"})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let model=available.find(candidate=>canonicalModelId(candidate.id)===recommendation.modelId);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")}})}import{readFileSync as readFileSync30,realpathSync as realpathSync6}from"node:fs";import{isAbsolute as isAbsolute14,relative as relative13}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject(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{kind:"project-rules",targetPath,rules}}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 isObject(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(`
2004
+ `)??"":"",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(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"],RECOMMENDED_DEFAULT_MODELS=[["kimi-k3","max"],["gpt-6-astra","high"],["gpt-6-sol","medium"],["gpt-5.6-sol","medium"],["claude-fable-5-1","high"],["claude-opus-5-5","max"],["glm-5.2","max"]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel])=>({modelId,thinkingLevel})),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"})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let model=available.find(candidate=>canonicalModelId(candidate.id)===recommendation.modelId);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")}})}import{readFileSync as readFileSync30,realpathSync as realpathSync6}from"node:fs";import{isAbsolute as isAbsolute14,relative as relative13}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject(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 isObject(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(`
2005
2005
  `);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]??"",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(`
2006
2006
  `));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(`
2007
2007
  `)}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 realpathSync5,statSync as statSync13}from"node:fs";import{basename as basename14,dirname as dirname30,isAbsolute as isAbsolute12,join as join48,relative as relative12,resolve as resolve22}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 existsSync25,realpathSync as realpathSync4,statSync as statSync12}from"node:fs";import{homedir as homedir6}from"node:os";import{dirname as dirname29,join as join47,posix as posix3,relative as relative11,resolve as resolve21}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 existsSync24,lstatSync as lstatSync4,readdirSync as readdirSync5,realpathSync as realpathSync3,statSync as statSync11}from"node:fs";import{isAbsolute as isAbsolute11,join as join46,resolve as resolve20}from"node:path";function scanRuleFiles(options){let rootPath=toAbsolutePath(options.rootDir);if(!existsSync24(rootPath))return[];let rootStats;try{rootStats=statSync11(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:resolve20(filePath)}function scanDirectory(directoryPath,depth,maxDepth,excludedDirs,visitedDirectories,results){let realDirectoryPath;try{realDirectoryPath=realpathSync3.native(directoryPath)}catch{return}if(visitedDirectories.has(realDirectoryPath))return;visitedDirectories.add(realDirectoryPath);let entries;try{entries=readdirSync5(directoryPath,{withFileTypes:!0}).sort((leftEntry,rightEntry)=>leftEntry.name.localeCompare(rightEntry.name))}catch{return}for(let entry of entries){let entryPath=join46(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=statSync11(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=realpathSync3.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=resolve21(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,cache){let rootDirectory=resolve21(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=join47(walkDirectory.directory,parentDirectory,subDirectory);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))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=join47(walkDirectory.directory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);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,cache){let candidates=[];for(let ruleSubdir of USER_HOME_RULE_SUBDIRS){let source=toUserHomeRuleSource(ruleSubdir);if(disabledSources.has(source))continue;let ruleDirectory=join47(homeDirectory,ruleSubdir);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))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=join47(homeDirectory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);fileInfo!==null&&candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!0,relativePath:toRelativePath(homeDirectory,filePath)})}return candidates}function scanRuleFilesCached(rootDir,cache){if(cache===void 0)return scanRuleFiles({rootDir});let cached=cache.scannedRuleFiles.get(rootDir);if(cached!==void 0)return cached;let scannedFiles=scanRuleFiles({rootDir});return cache.scannedRuleFiles.set(rootDir,scannedFiles),scannedFiles}function singleFileInfoCached(filePath,cache){if(cache===void 0)return readSingleFileInfo(filePath);let cached=cache.singleFileInfo.get(filePath);if(cached!==void 0)return cached;let fileInfo=readSingleFileInfo(filePath);return cache.singleFileInfo.set(filePath,fileInfo),fileInfo}function getWalkDirectories(projectRoot,targetFile){if(targetFile===null)return[{directory:projectRoot,distance:0}];let startDirectory=dirname29(resolve21(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=dirname29(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(!existsSync25(filePath))return null;try{if(!statSync12(filePath).isFile())return null}catch{return null}return{path:filePath,realPath:resolveRealPath2(filePath)}}function resolveRealPath2(filePath){try{return realpathSync4.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".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"~/.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}
@@ -2025,13 +2025,16 @@ ${truncatedRules.map(formatRule).join(`
2025
2025
  `;function parseRule(content){let normalizedContent=stripBom3(content),openingLength=getOpeningDelimiterLength(normalizedContent);if(openingLength===0)return{frontmatter:{},body:normalizedContent};let closingDelimiter=findClosingDelimiter(normalizedContent,openingLength);if(closingDelimiter===null)return{frontmatter:{},body:normalizedContent,diagnostic:"Missing closing frontmatter delimiter"};let yamlContent=normalizedContent.slice(openingLength,closingDelimiter.start),body=normalizedContent.slice(closingDelimiter.bodyStart);try{return{frontmatter:parseYamlFrontmatter(yamlContent),body}}catch(error2){let message=error2 instanceof Error?error2.message:"Invalid YAML frontmatter";return{frontmatter:{},body:normalizedContent,diagnostic:`Malformed frontmatter: ${message}`}}}function stripBom3(content){return content.startsWith("\uFEFF")?content.slice(1):content}function getOpeningDelimiterLength(content){return content.startsWith(FRONTMATTER_OPENING_CRLF)?FRONTMATTER_OPENING_CRLF.length:content.startsWith(FRONTMATTER_OPENING)?FRONTMATTER_OPENING.length:0}function findClosingDelimiter(content,openingLength){let lineStart=openingLength;for(;lineStart<=content.length;){let nextNewline=content.indexOf(`
2026
2026
  `,lineStart),lineEnd=nextNewline===-1?content.length:nextNewline;if(content.slice(lineStart,lineEnd).replace(/\r$/,"")==="---")return{start:lineStart,bodyStart:nextNewline===-1?content.length:nextNewline+1};if(nextNewline===-1)break;lineStart=nextNewline+1}return null}function parseYamlFrontmatter(yamlContent){let lines=yamlContent.replace(/\r\n/g,`
2027
2027
  `).split(`
2028
- `),frontmatter={},globValues=[],lineIndex=0;for(;lineIndex<lines.length;){let rawLine=lines[lineIndex];if(rawLine===void 0)break;let line=stripComment(rawLine).trim();if(line.length===0){lineIndex+=1;continue}let colonIndex=line.indexOf(":");if(colonIndex===-1)throw new RuleFrontmatterParseError(`Expected key-value pair on line ${lineIndex+1}`);let key=line.slice(0,colonIndex).trim(),rawValue=line.slice(colonIndex+1).trim();if(key==="description"){frontmatter.description=parseStringValue(rawValue),lineIndex+=1;continue}if(key==="alwaysApply"){frontmatter.alwaysApply=parseBooleanValue(rawValue,lineIndex+1),lineIndex+=1;continue}if(key==="globs"||key==="paths"||key==="applyTo"){let parsed=parseGlobValue(rawValue,lines,lineIndex);for(let glob of parsed.values)globValues.includes(glob)||globValues.push(glob);lineIndex+=parsed.consumed;continue}lineIndex+=1}if(globValues.length===1){let singleGlob=globValues[0];singleGlob!==void 0&&(frontmatter.globs=singleGlob)}else globValues.length>1&&(frontmatter.globs=globValues);return frontmatter}function parseBooleanValue(value2,lineNumber){if(value2==="true")return!0;if(value2==="false")return!1;throw new RuleFrontmatterParseError(`Expected boolean on line ${lineNumber}`)}function parseGlobValue(rawValue,lines,lineIndex){if(rawValue.startsWith("["))return{values:parseInlineArray(rawValue),consumed:1};if(rawValue.length===0)return parseMultilineArray(lines,lineIndex);let value2=parseStringValue(rawValue);return value2.includes(",")?{values:value2.split(",").map(item=>item.trim()).filter(Boolean),consumed:1}:{values:[value2],consumed:1}}function parseMultilineArray(lines,lineIndex){let values=[],consumed=1;for(let index=lineIndex+1;index<lines.length;index+=1){let rawLine=lines[index];if(rawLine===void 0)break;let lineWithoutComment=stripComment(rawLine);if(lineWithoutComment.trim().length===0){consumed+=1;continue}let arrayItem=lineWithoutComment.match(/^\s+-\s*(.*)$/);if(arrayItem===null)break;values.push(parseStringValue(arrayItem[1]??"")),consumed+=1}return{values:values.filter(Boolean),consumed}}function parseInlineArray(value2){let closingBracketIndex=findClosingBracket(value2);if(closingBracketIndex===-1)throw new RuleFrontmatterParseError("Unclosed inline array");if(value2.slice(closingBracketIndex+1).trim().length>0)throw new RuleFrontmatterParseError("Unexpected content after inline array");let content=value2.slice(1,closingBracketIndex).trim();return content.length===0?[]:splitCommaSeparated(content).map(parseStringValue).filter(Boolean)}function findClosingBracket(value2){let quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="]")return index}}return-1}function splitCommaSeparated(value2){let values=[],current="",quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){current+=character,escaped=!1;continue}if(quote!==null&&character==="\\"){current+=character,escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null),current+=character;continue}if(quote===null&&character===","){values.push(current.trim()),current="";continue}current+=character}}if(quote!==null)throw new RuleFrontmatterParseError("Unclosed quoted value");return values.push(current.trim()),values.filter(Boolean)}function parseStringValue(value2){if(value2.length===0)return"";if(value2.startsWith('"'))return parseJsonString(value2);if(value2.startsWith("'")&&value2.endsWith("'"))return value2.slice(1,-1);if(value2.startsWith("'"))throw new RuleFrontmatterParseError("Unclosed quoted value");return value2}function parseJsonString(value2){let parsedValue;try{parsedValue=JSON.parse(value2)}catch{throw new RuleFrontmatterParseError("Invalid JSON-quoted string")}if(typeof parsedValue!="string")throw new RuleFrontmatterParseError("Expected JSON-quoted string");return parsedValue}function stripComment(line){let quote=null,escaped=!1;for(let index=0;index<line.length;index+=1){let character=line[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="#")return line.slice(0,index)}}return line}var MAX_DYNAMIC_MATCH_CACHE_ENTRIES=4096,ROOT_SINGLE_FILE_SOURCES=new Set(PROJECT_SINGLE_FILES.filter(source=>!source.includes("/")));function defaultConfig(){return{disabled:!1,mode:"both",maxRuleChars:DEFAULT_MAX_RULE_CHARS,maxResultChars:DEFAULT_MAX_RESULT_CHARS,enabledSources:"auto"}}function createEngine(config,deps){let state=createSessionState(),dynamicMatchCache=new Map;function loadStaticRules(cwd){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="dynamic")return emptyLoadResult(state);let projectRoot=deps.findProjectRoot(cwd),disabledSources=disabledSourcesFor(config),candidates=deps.findCandidates({projectRoot,targetFile:null,...disabledSources===void 0?{}:{disabledSources}}),result3=loadStaticCandidates(candidates,deps,projectRoot,new Map);return storeLastLoad(state,result3.rules,result3.diagnostics),result3}function loadDynamicRules(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return emptyLoadResult(state);let targetFiles=uniqueStrings(targetPaths),shouldCacheLookups=targetFiles.length>1,rules=[],diagnostics=[],seenRules=new Set,loadedRuleContent=new Map,projectMembership=new Map,disabledSources=disabledSourcesFor(config),discoveryCache=shouldCacheLookups?createRuleDiscoveryCache():void 0,candidateDiscoveryCache=new Map,projectRootCache=new Map,realPathCache=new Map;for(let targetFile of targetFiles){let projectRoot=shouldCacheLookups?findProjectRootCached(projectRootCache,targetFile,deps.findProjectRoot):deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,...discoveryCache===void 0?{}:{cache:discoveryCache},...disabledSources===void 0?{}:{disabledSources}},candidates=shouldCacheLookups?findSortedCandidatesCached(candidateDiscoveryCache,deps.findCandidates,findOptions):sortCandidates(deps.findCandidates(findOptions));for(let candidate of candidates){let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{loadedRuleContent,projectMembership,realPathCache});if(loadedRule===null)continue;let matchReason=matchDynamicRuleCached(dynamicMatchCache,projectRoot,targetFile,candidate,loadedRule,deps.matchRule??matchRule);if(matchReason===null)continue;let dedupKey=ruleDedupKey(loadedRule);seenRules.has(dedupKey)||(seenRules.add(dedupKey),rules.push({...loadedRule,matchReason}))}}let sortedRules=sortCandidates(rules);return storeLastLoad(state,sortedRules,diagnostics),{rules:sortedRules,diagnostics}}function fingerprintDynamicTargets(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return[];let fingerprintFn=deps.fileFingerprint??fileStatFingerprint,disabledSources=disabledSourcesFor(config),discoveryCache=createRuleDiscoveryCache(),cwdProjectRoot=deps.findProjectRoot(cwd),fingerprints=[];for(let targetFile of uniqueStrings(targetPaths)){let projectRoot=cwdProjectRoot!==null&&isSameOrChildPath2(targetFile,cwdProjectRoot)?cwdProjectRoot:deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,cache:discoveryCache,...disabledSources===void 0?{}:{disabledSources}},candidates=sortCandidates(deps.findCandidates(findOptions)),cacheKey=dynamicTargetCacheKey(targetFile);fingerprints.push({targetPath:targetFile,cacheKey,fingerprint:computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fingerprintFn)})}return fingerprints}function commitDynamicTargetFingerprints(fingerprints){for(let target of fingerprints)state.dynamicTargetFingerprints.set(target.cacheKey,target.fingerprint)}function isDynamicTargetFingerprintCurrent(target){return state.dynamicTargetFingerprints.get(target.cacheKey)===target.fingerprint}return{state,config,loadStaticRules,loadDynamicRules,formatStatic:rules=>formatStaticBlock(rules,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),formatDynamic:(rules,target)=>formatDynamicBlock(rules,target,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),resetSession:cwd=>{clearSession(state),dynamicMatchCache.clear(),cwd!==void 0&&(state.cwd=cwd)},isStaticInjected:rule=>isStaticInjected(state,rule),isDynamicInjected:(scopeKey,rule)=>isDynamicInjected(state,scopeKey,rule),markStaticInjected:rule=>markStaticInjected(state,rule),markDynamicInjected:(scopeKey,rule)=>markDynamicInjected(state,scopeKey,rule),fingerprintDynamicTargets,isDynamicTargetFingerprintCurrent,commitDynamicTargetFingerprints}}function isSameOrChildPath2(childPath,parentPath){let childRelativePath=relative12(parentPath,resolve22(childPath));return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute12(childRelativePath)}function matchDynamicRuleCached(cache,projectRoot,targetFile,candidate,loadedRule,matchRuleImpl){let cacheKey=dynamicMatchCacheKey(projectRoot,targetFile,candidate,loadedRule.contentHash);if(cache.has(cacheKey)){let cachedReason=cache.get(cacheKey)??null;return cache.delete(cacheKey),cache.set(cacheKey,cachedReason),cachedReason}let matchResult=matchRuleImpl({frontmatter:loadedRule.frontmatter,isSingleFile:candidate.isSingleFile,pathBases:pathBasesForTarget(projectRoot,targetFile,candidate)}),reason=matchResult.matched?matchResult.reason:null;return setDynamicMatchCacheEntry(cache,cacheKey,reason),reason}function setDynamicMatchCacheEntry(cache,cacheKey,reason){if(cache.size>=MAX_DYNAMIC_MATCH_CACHE_ENTRIES){let oldestCacheKey=cache.keys().next().value;oldestCacheKey!==void 0&&cache.delete(oldestCacheKey)}cache.set(cacheKey,reason)}function dynamicMatchCacheKey(projectRoot,targetFile,candidate,contentHash){return[projectRoot??"",toPosixPath2(resolve22(targetFile)),candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),contentHash].join("\0")}function loadStaticCandidates(candidates,deps,projectRoot,realPathCache){let rules=[],diagnostics=[],rootSingleFileSelected=!1;for(let candidate of sortCandidates(candidates)){if(isDedupedRootSingleFile(candidate,rootSingleFileSelected))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{realPathCache});if(loadedRule===null)continue;let matchReason=staticMatchReason(loadedRule);matchReason!==null&&(isRootSingleFile(candidate)&&(rootSingleFileSelected=!0),rules.push({...loadedRule,matchReason}))}return{rules:sortCandidates(rules),diagnostics}}function loadCandidate2(candidate,deps,diagnostics,projectRoot,caches){if(!isCandidateWithinProjectCached(candidate,projectRoot,caches.projectMembership,caches.realPathCache))return diagnostics.push({severity:"warning",source:candidate.path,message:"Rule file resolves outside project root"}),null;let cachedContent=caches.loadedRuleContent?.get(candidate.realPath);if(cachedContent!==void 0)return loadedRuleFromContent(candidate,cachedContent,diagnostics);let content=deps.readFile(candidate.path);if(content===null)return caches.loadedRuleContent?.set(candidate.realPath,null),diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null;let parsed=parseRule(content),loadedContent={frontmatter:parsed.frontmatter,body:parsed.body,contentHash:hashContent(content)};return parsed.diagnostic!==void 0&&(loadedContent.diagnostic=parsed.diagnostic),caches.loadedRuleContent?.set(candidate.realPath,loadedContent),loadedRuleFromContent(candidate,loadedContent,diagnostics)}function loadedRuleFromContent(candidate,content,diagnostics){return content===null?(diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null):(content.diagnostic!==void 0&&diagnostics.push({severity:"warning",source:candidate.path,message:content.diagnostic}),{...candidate,frontmatter:content.frontmatter,body:content.body,contentHash:content.contentHash,matchReason:{kind:"no-match"}})}function ruleDedupKey(rule){return`${rule.realPath}::${rule.contentHash}`}function isCandidateWithinProject(candidate,projectRoot,realPathCache){if(candidate.isGlobal)return!0;if(projectRoot===null)return!1;let relativeRealPath=relative12(realPathOrResolved(projectRoot,realPathCache),resolve22(candidate.realPath));return relativeRealPath===""||!relativeRealPath.startsWith("..")&&!isAbsolute12(relativeRealPath)}function realPathOrResolved(path13,cache){let cached=cache?.get(path13);if(cached!==void 0)return cached;try{let realPath=realpathSync5.native(path13);return cache?.set(path13,realPath),realPath}catch{let resolvedPath=resolve22(path13);return cache?.set(path13,resolvedPath),resolvedPath}}function isCandidateWithinProjectCached(candidate,projectRoot,projectMembership,realPathCache){if(projectMembership===void 0)return isCandidateWithinProject(candidate,projectRoot,realPathCache);let cacheKey=`${projectRoot??""}\0${candidate.realPath}`,cached=projectMembership.get(cacheKey);if(cached!==void 0)return cached;let isWithinProject=isCandidateWithinProject(candidate,projectRoot,realPathCache);return projectMembership.set(cacheKey,isWithinProject),isWithinProject}function findSortedCandidatesCached(cache,findCandidates,options){let cacheKey=candidateDiscoveryCacheKey(options),cached=cache.get(cacheKey);if(cached!==void 0)return cached;let candidates=sortCandidates(findCandidates(options));return cache.set(cacheKey,candidates),candidates}function candidateDiscoveryCacheKey(options){return[options.projectRoot??"",options.targetFile===null?"":dirname30(resolve22(options.targetFile)),...[...options.disabledSources??[]].sort()].join("\0")}function findProjectRootCached(cache,targetFile,findProjectRoot2){let cacheKey=dirname30(resolve22(targetFile));if(cache.has(cacheKey))return cache.get(cacheKey)??null;let projectRoot=findProjectRoot2(targetFile);return cache.set(cacheKey,projectRoot),projectRoot}function staticMatchReason(rule){return rule.frontmatter.alwaysApply===!0?"alwaysApply":rule.isSingleFile?"single-file":null}function disabledSourcesFor(config){if(config.enabledSources==="auto")return;let enabledSources=new Set(config.enabledSources);return new Set([...SOURCE_PRIORITY.keys()].filter(source=>!enabledSources.has(source)))}function isDedupedRootSingleFile(candidate,rootSingleFileSelected){return rootSingleFileSelected&&isRootSingleFile(candidate)}function isRootSingleFile(candidate){return candidate.distance===0&&candidate.isSingleFile&&ROOT_SINGLE_FILE_SOURCES.has(candidate.source)}function pathBasesForTarget(projectRoot,targetFile,candidate){let targetBasename=basename14(targetFile);if(projectRoot===null)return{projectRelative:targetBasename,basename:targetBasename};let projectRelative=toPosixPath2(relative12(projectRoot,targetFile)),scopeDirectory=scopeDirectoryForCandidate(projectRoot,candidate);return scopeDirectory===null?{projectRelative,basename:targetBasename}:{projectRelative,scopeRelative:toPosixPath2(relative12(scopeDirectory,targetFile)),basename:targetBasename}}function scopeDirectoryForCandidate(projectRoot,candidate){if(candidate.isGlobal)return null;if(candidate.isSingleFile)return dirname30(candidate.path);let sourceIndex=candidate.relativePath.indexOf(candidate.source);if(sourceIndex===-1)return projectRoot;let scopeRelativeDirectory=candidate.relativePath.slice(0,sourceIndex).replace(/\/$/,"");return scopeRelativeDirectory.length===0?projectRoot:join48(projectRoot,scopeRelativeDirectory)}function toPosixPath2(path13){return path13.replaceAll("\\","/")}function dynamicTargetCacheKey(targetFile){return toPosixPath2(resolve22(targetFile))}function computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fileFingerprintFn){let candidateFingerprint=candidates.map(candidate=>fingerprintCandidate(candidate,fileFingerprintFn)).join("");return hashContent(["v1",config.enabledSources==="auto"?"auto":config.enabledSources.join(","),projectRoot??"",dynamicTargetCacheKey(targetFile),candidateFingerprint].join("\0"))}function fingerprintCandidate(candidate,fileFingerprintFn){return[candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),fileFingerprintFn(candidate.path)].join("\0")}function fileStatFingerprint(filePath){try{let stats=statSync13(filePath,{bigint:!0});return`${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`}catch{return"missing"}}function uniqueStrings(values){return[...new Set(values)]}function storeLastLoad(state,rules,diagnostics){state.loadedRules.length=0,state.loadedRules.push(...rules),state.diagnostics.length=0,state.diagnostics.push(...diagnostics)}function emptyLoadResult(state){return storeLastLoad(state,[],[]),{rules:[],diagnostics:[]}}var TRUTHY_VALUES=new Set(["1","true","yes","on"]);function configFromEnvironment(env=process.env){let config=defaultConfig(),disabled2=readEnv(env,"PI_RULES_DISABLED");return config.disabled=disabled2!==void 0&&TRUTHY_VALUES.has(disabled2.trim().toLowerCase()),config.maxRuleChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RULE_CHARS"))??config.maxRuleChars,config.maxResultChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RESULT_CHARS"))??config.maxResultChars,config}function readEnv(env,name){let value2=env[name];return typeof value2=="string"&&value2.trim().length>0?value2:void 0}function parsePositiveInteger(value2){if(value2===void 0)return;let normalized2=value2.trim();if(!/^\d+$/.test(normalized2))return;let parsed=Number(normalized2);return Number.isSafeInteger(parsed)&&parsed>0?parsed:void 0}import{existsSync as existsSync26,statSync as statSync14}from"node:fs";import{dirname as dirname31,join as join49,resolve as resolve23}from"node:path";function findProjectRoot(startPath,markers=PROJECT_MARKERS){let resolvedStartPath=resolve23(startPath);if(!existsSync26(resolvedStartPath))return null;let currentDirectory=statSync14(resolvedStartPath).isDirectory()?resolvedStartPath:dirname31(resolvedStartPath),filesystemRoot=resolve23("/");for(;;){for(let marker of markers)if(existsSync26(join49(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname31(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}import{isAbsolute as isAbsolute13,resolve as resolve24}from"node:path";function isTrackedTool(toolName){return TRACKED_BUILTIN_TOOL_SET.has(toolName)}function extractToolPaths(event,cwd){if(event.isError||!isTrackedTool(event.toolName))return[];let filePaths=new Set;return(event.toolName==="read"||event.toolName==="edit")&&(addPath(filePaths,getStringProperty(event.details,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),event.toolName==="write"&&(addPath(filePaths,getStringProperty(event.input,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),[...filePaths]}function addPath(filePaths,filePath,cwd){filePath===void 0||filePath.length===0||filePaths.add(isAbsolute13(filePath)?filePath:resolve24(cwd,filePath))}function getStringProperty(value2,propertyName){if(!isRecord44(value2))return;let propertyValue=value2[propertyName];return typeof propertyValue=="string"?propertyValue:void 0}function isRecord44(value2){return typeof value2=="object"&&value2!==null}var MODE_VALUES=new Set(["static","dynamic","both","off"]),DYNAMIC_CONTEXT_SCOPE="live-context";function piRulesExtension(pi){pi.registerFlag("pi-rules-disabled",{type:"boolean",default:!1,description:"Disable pi-rules hooks."}),pi.registerFlag("pi-rules-mode",{type:"string",default:"both",description:"Rule injection mode: static, dynamic, both, or off."});let config=configFromEnvironment(),envDisabled=config.disabled,engine=createEngine(config,{findCandidates:findRuleCandidates,readFile:path13=>{try{return readFileSync30(path13,"utf-8")}catch{return null}},findProjectRoot,extractToolPaths});registerSlashCommands(pi,engine),registerRuleActivationRenderer(pi);function syncConfigFromFlags(){let disabled2=pi.getFlag("pi-rules-disabled"),mode=pi.getFlag("pi-rules-mode");typeof disabled2=="boolean"&&(engine.config.disabled=disabled2||envDisabled),typeof mode=="string"&&isPiRulesMode(mode)&&(engine.config.mode=mode)}pi.on("session_start",async(event,ctx)=>{syncConfigFromFlags(),!engine.config.disabled&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:event.reason}))}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:"compact"}))}),pi.on("before_agent_start",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="dynamic")return;let loaded2=engine.loadStaticRules(ctx.cwd),nativeContextPaths=new Set(event.systemPromptOptions.contextFiles?.flatMap(contextFile=>pathKeys(contextFile.path))??[]);for(let rule of loaded2.rules)(nativeContextPaths.has(rule.path)||nativeContextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!nativeContextPaths.has(rule.path)&&!nativeContextPaths.has(rule.realPath));if(rules.length===0)return;let block=engine.formatStatic(rules);for(let rule of rules)engine.markStaticInjected(rule);return{systemPrompt:event.systemPrompt+block}}),pi.on("tool_result",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="static"||event.isError)return;let targetPaths=extractToolPaths(event,ctx.cwd),firstTargetPath=targetPaths[0];if(firstTargetPath===void 0)return;let fingerprints=engine.fingerprintDynamicTargets(ctx.cwd,targetPaths),pendingFingerprints=fingerprints.filter(target=>!engine.isDynamicTargetFingerprintCurrent(target));if(pendingFingerprints.length===0){engine.commitDynamicTargetFingerprints(fingerprints);return}let loaded2=engine.loadDynamicRules(ctx.cwd,pendingFingerprints.map(target=>target.targetPath));engine.commitDynamicTargetFingerprints(fingerprints);let rules=loaded2.rules.filter(rule=>!engine.isStaticInjected(rule)&&!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule));if(rules.length===0)return;let firstPendingTarget=pendingFingerprints[0]?.targetPath??firstTargetPath,targetPath=displayPath4(ctx.cwd,firstPendingTarget),block=engine.formatDynamic(rules,targetPath);for(let rule of rules)engine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule);return appendRuleActivation(pi,{kind:"project-rules",targetPath,rules:rules.map(rule=>rule.relativePath)}),{content:[...event.content,{type:"text",text:block}]}})}function isPiRulesMode(value2){return MODE_VALUES.has(value2)}function pathKeys(filePath){try{return[filePath,realpathSync6.native(filePath)]}catch{return[filePath]}}function displayPath4(cwd,filePath){return isAbsolute14(filePath)?relative13(cwd,filePath):filePath}import{isAbsolute as isAbsolute16,join as join53}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}import{stat as stat4}from"node:fs/promises";import{isAbsolute as isAbsolute15}from"node:path";import{join as join50}from"node:path";var TERMINAL_MANIFEST_VERSION=1,TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS=3e4;function createTerminalManifestStore(session){return createSidecarStore({baseDir:join50(session.getSessionDir(),"extensions","terminal"),sessionId:session.getSessionId(),version:TERMINAL_MANIFEST_VERSION,tempPrefix:"terminal",parse:parseTerminalManifest})}var TerminalManifestWriter=class{#sessionId;#debounceMs;#now;#entries=new Map;#backgrounds=new Map;#pending=new Map;#timer;#tail=Promise.resolve();constructor(options){this.store=createTerminalManifestStore(options.session),this.#sessionId=options.session.getSessionId(),this.#debounceMs=options.debounceMs??TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS,this.#now=options.now??Date.now}recordRegister(registration){return this.#entries.set(registration.monitorId,this.#entryFor(registration)),this.#persist()}adoptRestored(entry){this.#entries.set(entry.monitorId,{...entry,suspended:!1})}durableCount(){let count=0;for(let entry of this.#entries.values())entry.durabilityClass!=="ephemeral"&&(count+=1);return count}observeMonitorState(snapshot){let live=new Map;for(let entry of snapshot){if(typeof entry.monitorId!="string"||entry.monitorId.length===0)throw new Error(`terminal manifest writer saw a monitor snapshot entry without a stable monitorId (runtime id ${entry.id}); surfacing instead of silently skipping it`);live.set(entry.monitorId,{paused:entry.paused,fireWindow:entry.fireWindow})}let changed=!1;for(let[monitorId,known]of this.#entries){let current=live.get(monitorId);if(current===void 0){if(known.suspended)continue;this.#entries.delete(monitorId),changed=!0;continue}let fireWindow2=current.fireWindow??known.fireWindow;(known.deliveryPaused!==current.paused||known.fireWindow.count!==fireWindow2.count)&&(this.#entries.set(monitorId,{...known,deliveryPaused:current.paused,fireWindow:fireWindow2}),changed=!0)}return changed?this.#persist():Promise.resolve()}scheduleCheckpoint(monitorId,checkpoint2){this.#pending.set(monitorId,checkpoint2),this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=setTimeout(()=>{this.#timer=void 0,this.#absorbPending(),this.#persist()},this.#debounceMs)}async flush(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#pending.size===0?await this.#tail:(this.#absorbPending(),await this.#persist())}async recordShutdown(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#absorbPending();for(let[monitorId,entry]of this.#entries)this.#entries.set(monitorId,{...entry,suspended:!0});await this.#persist()}recordBackgroundStart(id,command,startedAtMs){return this.#backgrounds.set(id,{id,command,startedAtMs:startedAtMs??this.#now()}),this.#persist()}recordBackgroundExit(id){return this.#backgrounds.delete(id)?this.#persist():Promise.resolve()}#absorbPending(){for(let[monitorId,checkpoint2]of this.#pending){let entry=this.#entries.get(monitorId);entry&&this.#entries.set(monitorId,{...entry,lastCheckpoint:checkpoint2})}this.#pending.clear()}#entryFor({monitorId,spec}){let createdAt=this.#now(),persistent=spec.persistent===!0;return{monitorId,sessionId:this.#sessionId,description:spec.description,runtimeKind:spec.kind,durabilityClass:persistent?spec.kind==="file"?"checkpointed-file":"restartable-command":"ephemeral",command:spec.kind==="command"?spec.command:void 0,path:spec.kind==="file"?spec.path:void 0,event:spec.kind==="file"?spec.event:void 0,filter:spec.kind==="command"?spec.filter:void 0,cwd:spec.cwd,approvedParent:spec.kind==="file"?spec.approvedParent:void 0,createdAt,expiresAt:persistent?createdAt+DURABLE_MONITOR_EXPIRY_MS:null,persistent,suspended:!1,lastCheckpoint:null,deliveryPaused:!1,fireWindow:{startMs:createdAt,count:0}}}#persist(){let run=this.#tail.then(()=>this.store.write({version:TERMINAL_MANIFEST_VERSION,sessionId:this.#sessionId,monitors:[...this.#entries.values()],backgroundSessions:[...this.#backgrounds.values()],updatedAt:this.#now()}));return this.#tail=run.then(()=>{},error2=>{this.persistFailure=error2}),this.#tail}};var InvalidTerminalManifestError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidTerminalManifestError"}},RUNTIME_KINDS=["command","file"],DURABILITY_CLASSES=["ephemeral","restartable-command","checkpointed-file"],FILE_EVENTS=["create","modify"],isStr=value2=>typeof value2=="string"&&value2.length>0,isNum=value2=>typeof value2=="number"&&Number.isFinite(value2),isBool=value2=>typeof value2=="boolean",isObj=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function invalid(message){throw new InvalidTerminalManifestError(`terminal manifest is invalid: ${message}`)}function str(raw,field){return isStr(raw[field])||invalid(`field ${field} must be a non-empty string`),raw[field]}function num(raw,field){return isNum(raw[field])||invalid(`field ${field} must be a finite number`),raw[field]}function digest2(raw,field){return typeof raw[field]!="string"&&invalid(`field ${field} must be a string`),raw[field]}function bool(raw,field){return isBool(raw[field])||invalid(`field ${field} must be a boolean`),raw[field]}function opt(raw,field,required){return raw[field]===void 0?void 0:required(raw,field)}function oneOf(values,raw,field){let value2=raw[field];return(typeof value2!="string"||!values.includes(value2))&&invalid(`field ${field} must be one of: ${values.join(", ")}`),value2}function checkpoint(raw){return isObj(raw)||invalid("field lastCheckpoint must be an object"),{dev:num(raw,"dev"),ino:num(raw,"ino"),size:num(raw,"size"),mtimeMs:num(raw,"mtimeMs"),digest:digest2(raw,"digest"),present:bool(raw,"present")}}function fireWindow(raw){return isObj(raw)||invalid("field fireWindow must be an object"),{startMs:num(raw,"startMs"),count:num(raw,"count")}}function parseMonitor(entry){return isObj(entry)||invalid("a monitor entry must be an object"),{monitorId:str(entry,"monitorId"),sessionId:str(entry,"sessionId"),description:str(entry,"description"),runtimeKind:oneOf(RUNTIME_KINDS,entry,"runtimeKind"),durabilityClass:oneOf(DURABILITY_CLASSES,entry,"durabilityClass"),command:opt(entry,"command",str),path:opt(entry,"path",str),event:opt(entry,"event",(raw,field)=>oneOf(FILE_EVENTS,raw,field)),filter:opt(entry,"filter",str),cwd:opt(entry,"cwd",str),approvedParent:opt(entry,"approvedParent",str),createdAt:num(entry,"createdAt"),expiresAt:entry.expiresAt===void 0||entry.expiresAt===null?null:num(entry,"expiresAt"),persistent:bool(entry,"persistent"),suspended:bool(entry,"suspended"),lastCheckpoint:entry.lastCheckpoint===null?null:checkpoint(entry.lastCheckpoint),deliveryPaused:bool(entry,"deliveryPaused"),fireWindow:fireWindow(entry.fireWindow)}}function parseBackgroundSession(entry){return isObj(entry)||invalid("a background session entry must be an object"),{id:str(entry,"id"),command:str(entry,"command"),startedAtMs:num(entry,"startedAtMs")}}function parseTerminalManifest(raw,ref){return isObj(raw)||invalid("the payload must be an object"),Array.isArray(raw.monitors)||invalid("field monitors must be an array"),Array.isArray(raw.backgroundSessions)||invalid("field backgroundSessions must be an array"),{version:TERMINAL_MANIFEST_VERSION,sessionId:ref.sessionId,monitors:raw.monitors.map(parseMonitor),backgroundSessions:raw.backgroundSessions.map(parseBackgroundSession),updatedAt:num(raw,"updatedAt")}}function reapplyPersistedMute(registry,monitor,runtimeId){return monitor.deliveryPaused?(registry.pause([runtimeId]),"muted"):"restored"}var stubRestoreHandlers={"restartable-command":()=>({outcome:"lost"}),"checkpointed-file":()=>({outcome:"lost"})};async function restoreTerminalState(options){let digest3={restored:0,lost:0,expired:0,muted:0,attachedElsewhere:0,storeError:!1},state;try{state=await options.manifest.read()}catch{return{...digest3,storeError:!0}}if(state===null)return digest3;let now2=(options.now??Date.now)(),handlers={...stubRestoreHandlers,...options.handlers};for(let monitor of state.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=now2){digest3.expired+=1;continue}if(monitor.durabilityClass==="ephemeral"){digest3.lost+=1;continue}let outcome=(await handlers[monitor.durabilityClass](monitor)).outcome;digest3[outcome]+=1}return digest3.lost+=state.backgroundSessions.length,digest3}async function spawnCommandSession(ctx,request2){let shell=getShellConfig(ctx.shellPath),useStdin=shell.commandTransport==="stdin",args=useStdin?[...shell.args]:[...shell.args,request2.command],created=await ctx.manager.create(shell.shell,{command:shell.shell,args,cwd:request2.cwd??ctx.cwd,env:{...ctx.getEnv(),...request2.envOverrides},cols:request2.cols,rows:request2.rows,timeoutMs:request2.timeoutMs});return useStdin&&created.runtime.session.write(`${request2.command}
2029
- `),created}function describeExit(runtime){let exit=runtime.exitResult;return exit?exit.timedOut?"timed_out":exit.cancelled?"killed":exit.exitCode===0?"completed":exit.exitCode!==null?`exited_${exit.exitCode}`:exit.signal?`signal_${exit.signal}`:"exited":null}var LOST={outcome:"lost"};async function defaultDirectoryExists(path13){try{return(await stat4(path13)).isDirectory()}catch{return!1}}function compileFilter(source){if(source!==void 0)try{return new RegExp(source)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function restorable(monitor){if(monitor.runtimeKind!=="command"||!monitor.persistent)return;let{command,cwd}=monitor;if(!(command===void 0||command.length===0)&&!(cwd===void 0||!isAbsolute15(cwd)))return{command,cwd}}function createRestartableCommandHandler(deps){let spawn12=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists;return async monitor=>{let target=restorable(monitor);if(target===void 0||!await directoryExists(target.cwd))return LOST;let spawned;try{spawned=await spawn12(deps.ctx,{command:target.command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd:target.cwd})}catch{return LOST}return deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command:monitor.command,persistent:!0,deadlineMs:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id),deps.onRestored?.(monitor.monitorId,spawned.id),{outcome:reapplyPersistedMute(deps.registry,monitor,spawned.id)}}}import{stat as stat5}from"node:fs/promises";import{resolve as resolve25}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async monitor=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost(`monitor ${monitor.monitorId} is not a restorable file watch`);let saved=monitor.lastCheckpoint;if(saved===null)return lost(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat5(resolve25(monitor.cwd,monitor.path))).isFile())return lost(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,persistent:!0,deadlineMs:null,event:monitor.event??"create",timeoutMs:remainingMs(monitor,now2()),cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{mkdir as mkdir10,open as open4,readFile as readFile14,unlink as unlink2}from"node:fs/promises";import{join as join51}from"node:path";function errorCode2(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&typeof error2.code=="string")return error2.code}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode2(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}async function readLease(path13){let raw;try{raw=await readFile14(path13,"utf8")}catch(error2){if(errorCode2(error2)==="ENOENT")return"missing";throw error2}try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let pid=parsed.pid,startedAtMs=parsed.startedAtMs;return typeof pid!="number"||!Number.isFinite(pid)||typeof startedAtMs!="number"||!Number.isFinite(startedAtMs)?"unparseable":{pid,startedAtMs}}catch{return"unparseable"}}async function exclusiveCreate(path13,record7){let file=await open4(path13,"wx");try{await file.writeFile(JSON.stringify(record7),"utf8")}finally{await file.close()}}async function unlinkIfPresent(path13){try{await unlink2(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}async function tryAcquire(path13,record7,isProcessAlive2,retry){try{return await exclusiveCreate(path13,record7),{acquired:!0,path:path13,pid:record7.pid}}catch(error2){if(errorCode2(error2)!=="EEXIST")throw error2;let existing=await readLease(path13);if((existing==="missing"||existing==="unparseable"||!probeAlive(existing.pid,isProcessAlive2))&&retry)return await unlinkIfPresent(path13),tryAcquire(path13,record7,isProcessAlive2,!1);if(existing==="missing"||existing==="unparseable")throw error2;return{acquired:!1,holder:existing}}}async function acquireTerminalLease(options){let pid=options.pid??process.pid,startedAtMs=(options.now??Date.now)(),path13=join51(options.dir,`${options.encodedSessionId}.lease`);return await mkdir10(options.dir,{recursive:!0}),tryAcquire(path13,{pid,startedAtMs},options.isProcessAlive,!0)}async function releaseTerminalLease(handle){let existing=await readLease(handle.path);existing==="missing"||existing==="unparseable"||existing.pid===handle.pid&&await unlinkIfPresent(handle.path)}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
2028
+ `),frontmatter={},globValues=[],lineIndex=0;for(;lineIndex<lines.length;){let rawLine=lines[lineIndex];if(rawLine===void 0)break;let line=stripComment(rawLine).trim();if(line.length===0){lineIndex+=1;continue}let colonIndex=line.indexOf(":");if(colonIndex===-1)throw new RuleFrontmatterParseError(`Expected key-value pair on line ${lineIndex+1}`);let key=line.slice(0,colonIndex).trim(),rawValue=line.slice(colonIndex+1).trim();if(key==="description"){frontmatter.description=parseStringValue(rawValue),lineIndex+=1;continue}if(key==="alwaysApply"){frontmatter.alwaysApply=parseBooleanValue(rawValue,lineIndex+1),lineIndex+=1;continue}if(key==="globs"||key==="paths"||key==="applyTo"){let parsed=parseGlobValue(rawValue,lines,lineIndex);for(let glob of parsed.values)globValues.includes(glob)||globValues.push(glob);lineIndex+=parsed.consumed;continue}lineIndex+=1}if(globValues.length===1){let singleGlob=globValues[0];singleGlob!==void 0&&(frontmatter.globs=singleGlob)}else globValues.length>1&&(frontmatter.globs=globValues);return frontmatter}function parseBooleanValue(value2,lineNumber){if(value2==="true")return!0;if(value2==="false")return!1;throw new RuleFrontmatterParseError(`Expected boolean on line ${lineNumber}`)}function parseGlobValue(rawValue,lines,lineIndex){if(rawValue.startsWith("["))return{values:parseInlineArray(rawValue),consumed:1};if(rawValue.length===0)return parseMultilineArray(lines,lineIndex);let value2=parseStringValue(rawValue);return value2.includes(",")?{values:value2.split(",").map(item=>item.trim()).filter(Boolean),consumed:1}:{values:[value2],consumed:1}}function parseMultilineArray(lines,lineIndex){let values=[],consumed=1;for(let index=lineIndex+1;index<lines.length;index+=1){let rawLine=lines[index];if(rawLine===void 0)break;let lineWithoutComment=stripComment(rawLine);if(lineWithoutComment.trim().length===0){consumed+=1;continue}let arrayItem=lineWithoutComment.match(/^\s+-\s*(.*)$/);if(arrayItem===null)break;values.push(parseStringValue(arrayItem[1]??"")),consumed+=1}return{values:values.filter(Boolean),consumed}}function parseInlineArray(value2){let closingBracketIndex=findClosingBracket(value2);if(closingBracketIndex===-1)throw new RuleFrontmatterParseError("Unclosed inline array");if(value2.slice(closingBracketIndex+1).trim().length>0)throw new RuleFrontmatterParseError("Unexpected content after inline array");let content=value2.slice(1,closingBracketIndex).trim();return content.length===0?[]:splitCommaSeparated(content).map(parseStringValue).filter(Boolean)}function findClosingBracket(value2){let quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="]")return index}}return-1}function splitCommaSeparated(value2){let values=[],current="",quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){current+=character,escaped=!1;continue}if(quote!==null&&character==="\\"){current+=character,escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null),current+=character;continue}if(quote===null&&character===","){values.push(current.trim()),current="";continue}current+=character}}if(quote!==null)throw new RuleFrontmatterParseError("Unclosed quoted value");return values.push(current.trim()),values.filter(Boolean)}function parseStringValue(value2){if(value2.length===0)return"";if(value2.startsWith('"'))return parseJsonString(value2);if(value2.startsWith("'")&&value2.endsWith("'"))return value2.slice(1,-1);if(value2.startsWith("'"))throw new RuleFrontmatterParseError("Unclosed quoted value");return value2}function parseJsonString(value2){let parsedValue;try{parsedValue=JSON.parse(value2)}catch{throw new RuleFrontmatterParseError("Invalid JSON-quoted string")}if(typeof parsedValue!="string")throw new RuleFrontmatterParseError("Expected JSON-quoted string");return parsedValue}function stripComment(line){let quote=null,escaped=!1;for(let index=0;index<line.length;index+=1){let character=line[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="#")return line.slice(0,index)}}return line}var MAX_DYNAMIC_MATCH_CACHE_ENTRIES=4096,ROOT_SINGLE_FILE_SOURCES=new Set(PROJECT_SINGLE_FILES.filter(source=>!source.includes("/")));function defaultConfig(){return{disabled:!1,mode:"both",maxRuleChars:DEFAULT_MAX_RULE_CHARS,maxResultChars:DEFAULT_MAX_RESULT_CHARS,enabledSources:"auto"}}function createEngine(config,deps){let state=createSessionState(),dynamicMatchCache=new Map;function loadStaticRules(cwd){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="dynamic")return emptyLoadResult(state);let projectRoot=deps.findProjectRoot(cwd),disabledSources=disabledSourcesFor(config),candidates=deps.findCandidates({projectRoot,targetFile:null,...disabledSources===void 0?{}:{disabledSources}}),result3=loadStaticCandidates(candidates,deps,projectRoot,new Map);return storeLastLoad(state,result3.rules,result3.diagnostics),result3}function loadDynamicRules(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return emptyLoadResult(state);let targetFiles=uniqueStrings(targetPaths),shouldCacheLookups=targetFiles.length>1,rules=[],diagnostics=[],seenRules=new Set,loadedRuleContent=new Map,projectMembership=new Map,disabledSources=disabledSourcesFor(config),discoveryCache=shouldCacheLookups?createRuleDiscoveryCache():void 0,candidateDiscoveryCache=new Map,projectRootCache=new Map,realPathCache=new Map;for(let targetFile of targetFiles){let projectRoot=shouldCacheLookups?findProjectRootCached(projectRootCache,targetFile,deps.findProjectRoot):deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,...discoveryCache===void 0?{}:{cache:discoveryCache},...disabledSources===void 0?{}:{disabledSources}},candidates=shouldCacheLookups?findSortedCandidatesCached(candidateDiscoveryCache,deps.findCandidates,findOptions):sortCandidates(deps.findCandidates(findOptions));for(let candidate of candidates){let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{loadedRuleContent,projectMembership,realPathCache});if(loadedRule===null)continue;let matchReason=matchDynamicRuleCached(dynamicMatchCache,projectRoot,targetFile,candidate,loadedRule,deps.matchRule??matchRule);if(matchReason===null)continue;let dedupKey=ruleDedupKey(loadedRule);seenRules.has(dedupKey)||(seenRules.add(dedupKey),rules.push({...loadedRule,matchReason}))}}let sortedRules=sortCandidates(rules);return storeLastLoad(state,sortedRules,diagnostics),{rules:sortedRules,diagnostics}}function fingerprintDynamicTargets(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return[];let fingerprintFn=deps.fileFingerprint??fileStatFingerprint,disabledSources=disabledSourcesFor(config),discoveryCache=createRuleDiscoveryCache(),cwdProjectRoot=deps.findProjectRoot(cwd),fingerprints=[];for(let targetFile of uniqueStrings(targetPaths)){let projectRoot=cwdProjectRoot!==null&&isSameOrChildPath2(targetFile,cwdProjectRoot)?cwdProjectRoot:deps.findProjectRoot(targetFile),findOptions={projectRoot,targetFile,cache:discoveryCache,...disabledSources===void 0?{}:{disabledSources}},candidates=sortCandidates(deps.findCandidates(findOptions)),cacheKey=dynamicTargetCacheKey(targetFile);fingerprints.push({targetPath:targetFile,cacheKey,fingerprint:computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fingerprintFn)})}return fingerprints}function commitDynamicTargetFingerprints(fingerprints){for(let target of fingerprints)state.dynamicTargetFingerprints.set(target.cacheKey,target.fingerprint)}function isDynamicTargetFingerprintCurrent(target){return state.dynamicTargetFingerprints.get(target.cacheKey)===target.fingerprint}return{state,config,loadStaticRules,loadDynamicRules,formatStatic:rules=>formatStaticBlock(rules,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),formatDynamic:(rules,target)=>formatDynamicBlock(rules,target,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),resetSession:cwd=>{clearSession(state),dynamicMatchCache.clear(),cwd!==void 0&&(state.cwd=cwd)},isStaticInjected:rule=>isStaticInjected(state,rule),isDynamicInjected:(scopeKey,rule)=>isDynamicInjected(state,scopeKey,rule),markStaticInjected:rule=>markStaticInjected(state,rule),markDynamicInjected:(scopeKey,rule)=>markDynamicInjected(state,scopeKey,rule),fingerprintDynamicTargets,isDynamicTargetFingerprintCurrent,commitDynamicTargetFingerprints}}function isSameOrChildPath2(childPath,parentPath){let childRelativePath=relative12(parentPath,resolve22(childPath));return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute12(childRelativePath)}function matchDynamicRuleCached(cache,projectRoot,targetFile,candidate,loadedRule,matchRuleImpl){let cacheKey=dynamicMatchCacheKey(projectRoot,targetFile,candidate,loadedRule.contentHash);if(cache.has(cacheKey)){let cachedReason=cache.get(cacheKey)??null;return cache.delete(cacheKey),cache.set(cacheKey,cachedReason),cachedReason}let matchResult=matchRuleImpl({frontmatter:loadedRule.frontmatter,isSingleFile:candidate.isSingleFile,pathBases:pathBasesForTarget(projectRoot,targetFile,candidate)}),reason=matchResult.matched?matchResult.reason:null;return setDynamicMatchCacheEntry(cache,cacheKey,reason),reason}function setDynamicMatchCacheEntry(cache,cacheKey,reason){if(cache.size>=MAX_DYNAMIC_MATCH_CACHE_ENTRIES){let oldestCacheKey=cache.keys().next().value;oldestCacheKey!==void 0&&cache.delete(oldestCacheKey)}cache.set(cacheKey,reason)}function dynamicMatchCacheKey(projectRoot,targetFile,candidate,contentHash){return[projectRoot??"",toPosixPath2(resolve22(targetFile)),candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),contentHash].join("\0")}function loadStaticCandidates(candidates,deps,projectRoot,realPathCache){let rules=[],diagnostics=[],rootSingleFileSelected=!1;for(let candidate of sortCandidates(candidates)){if(isDedupedRootSingleFile(candidate,rootSingleFileSelected))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot,{realPathCache});if(loadedRule===null)continue;let matchReason=staticMatchReason(loadedRule);matchReason!==null&&(isRootSingleFile(candidate)&&(rootSingleFileSelected=!0),rules.push({...loadedRule,matchReason}))}return{rules:sortCandidates(rules),diagnostics}}function loadCandidate2(candidate,deps,diagnostics,projectRoot,caches){if(!isCandidateWithinProjectCached(candidate,projectRoot,caches.projectMembership,caches.realPathCache))return diagnostics.push({severity:"warning",source:candidate.path,message:"Rule file resolves outside project root"}),null;let cachedContent=caches.loadedRuleContent?.get(candidate.realPath);if(cachedContent!==void 0)return loadedRuleFromContent(candidate,cachedContent,diagnostics);let content=deps.readFile(candidate.path);if(content===null)return caches.loadedRuleContent?.set(candidate.realPath,null),diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null;let parsed=parseRule(content),loadedContent={frontmatter:parsed.frontmatter,body:parsed.body,contentHash:hashContent(content)};return parsed.diagnostic!==void 0&&(loadedContent.diagnostic=parsed.diagnostic),caches.loadedRuleContent?.set(candidate.realPath,loadedContent),loadedRuleFromContent(candidate,loadedContent,diagnostics)}function loadedRuleFromContent(candidate,content,diagnostics){return content===null?(diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null):(content.diagnostic!==void 0&&diagnostics.push({severity:"warning",source:candidate.path,message:content.diagnostic}),{...candidate,frontmatter:content.frontmatter,body:content.body,contentHash:content.contentHash,matchReason:{kind:"no-match"}})}function ruleDedupKey(rule){return`${rule.realPath}::${rule.contentHash}`}function isCandidateWithinProject(candidate,projectRoot,realPathCache){if(candidate.isGlobal)return!0;if(projectRoot===null)return!1;let relativeRealPath=relative12(realPathOrResolved(projectRoot,realPathCache),resolve22(candidate.realPath));return relativeRealPath===""||!relativeRealPath.startsWith("..")&&!isAbsolute12(relativeRealPath)}function realPathOrResolved(path13,cache){let cached=cache?.get(path13);if(cached!==void 0)return cached;try{let realPath=realpathSync5.native(path13);return cache?.set(path13,realPath),realPath}catch{let resolvedPath=resolve22(path13);return cache?.set(path13,resolvedPath),resolvedPath}}function isCandidateWithinProjectCached(candidate,projectRoot,projectMembership,realPathCache){if(projectMembership===void 0)return isCandidateWithinProject(candidate,projectRoot,realPathCache);let cacheKey=`${projectRoot??""}\0${candidate.realPath}`,cached=projectMembership.get(cacheKey);if(cached!==void 0)return cached;let isWithinProject=isCandidateWithinProject(candidate,projectRoot,realPathCache);return projectMembership.set(cacheKey,isWithinProject),isWithinProject}function findSortedCandidatesCached(cache,findCandidates,options){let cacheKey=candidateDiscoveryCacheKey(options),cached=cache.get(cacheKey);if(cached!==void 0)return cached;let candidates=sortCandidates(findCandidates(options));return cache.set(cacheKey,candidates),candidates}function candidateDiscoveryCacheKey(options){return[options.projectRoot??"",options.targetFile===null?"":dirname30(resolve22(options.targetFile)),...[...options.disabledSources??[]].sort()].join("\0")}function findProjectRootCached(cache,targetFile,findProjectRoot2){let cacheKey=dirname30(resolve22(targetFile));if(cache.has(cacheKey))return cache.get(cacheKey)??null;let projectRoot=findProjectRoot2(targetFile);return cache.set(cacheKey,projectRoot),projectRoot}function staticMatchReason(rule){return rule.frontmatter.alwaysApply===!0?"alwaysApply":rule.isSingleFile?"single-file":null}function disabledSourcesFor(config){if(config.enabledSources==="auto")return;let enabledSources=new Set(config.enabledSources);return new Set([...SOURCE_PRIORITY.keys()].filter(source=>!enabledSources.has(source)))}function isDedupedRootSingleFile(candidate,rootSingleFileSelected){return rootSingleFileSelected&&isRootSingleFile(candidate)}function isRootSingleFile(candidate){return candidate.distance===0&&candidate.isSingleFile&&ROOT_SINGLE_FILE_SOURCES.has(candidate.source)}function pathBasesForTarget(projectRoot,targetFile,candidate){let targetBasename=basename14(targetFile);if(projectRoot===null)return{projectRelative:targetBasename,basename:targetBasename};let projectRelative=toPosixPath2(relative12(projectRoot,targetFile)),scopeDirectory=scopeDirectoryForCandidate(projectRoot,candidate);return scopeDirectory===null?{projectRelative,basename:targetBasename}:{projectRelative,scopeRelative:toPosixPath2(relative12(scopeDirectory,targetFile)),basename:targetBasename}}function scopeDirectoryForCandidate(projectRoot,candidate){if(candidate.isGlobal)return null;if(candidate.isSingleFile)return dirname30(candidate.path);let sourceIndex=candidate.relativePath.indexOf(candidate.source);if(sourceIndex===-1)return projectRoot;let scopeRelativeDirectory=candidate.relativePath.slice(0,sourceIndex).replace(/\/$/,"");return scopeRelativeDirectory.length===0?projectRoot:join48(projectRoot,scopeRelativeDirectory)}function toPosixPath2(path13){return path13.replaceAll("\\","/")}function dynamicTargetCacheKey(targetFile){return toPosixPath2(resolve22(targetFile))}function computeDynamicTargetFingerprint(targetFile,projectRoot,candidates,config,fileFingerprintFn){let candidateFingerprint=candidates.map(candidate=>fingerprintCandidate(candidate,fileFingerprintFn)).join("");return hashContent(["v1",config.enabledSources==="auto"?"auto":config.enabledSources.join(","),projectRoot??"",dynamicTargetCacheKey(targetFile),candidateFingerprint].join("\0"))}function fingerprintCandidate(candidate,fileFingerprintFn){return[candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),fileFingerprintFn(candidate.path)].join("\0")}function fileStatFingerprint(filePath){try{let stats=statSync13(filePath,{bigint:!0});return`${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`}catch{return"missing"}}function uniqueStrings(values){return[...new Set(values)]}function storeLastLoad(state,rules,diagnostics){state.loadedRules.length=0,state.loadedRules.push(...rules),state.diagnostics.length=0,state.diagnostics.push(...diagnostics)}function emptyLoadResult(state){return storeLastLoad(state,[],[]),{rules:[],diagnostics:[]}}var TRUTHY_VALUES=new Set(["1","true","yes","on"]);function configFromEnvironment(env=process.env){let config=defaultConfig(),disabled2=readEnv(env,"PI_RULES_DISABLED");return config.disabled=disabled2!==void 0&&TRUTHY_VALUES.has(disabled2.trim().toLowerCase()),config.maxRuleChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RULE_CHARS"))??config.maxRuleChars,config.maxResultChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RESULT_CHARS"))??config.maxResultChars,config}function readEnv(env,name){let value2=env[name];return typeof value2=="string"&&value2.trim().length>0?value2:void 0}function parsePositiveInteger(value2){if(value2===void 0)return;let normalized2=value2.trim();if(!/^\d+$/.test(normalized2))return;let parsed=Number(normalized2);return Number.isSafeInteger(parsed)&&parsed>0?parsed:void 0}import{existsSync as existsSync26,statSync as statSync14}from"node:fs";import{dirname as dirname31,join as join49,resolve as resolve23}from"node:path";function findProjectRoot(startPath,markers=PROJECT_MARKERS){let resolvedStartPath=resolve23(startPath);if(!existsSync26(resolvedStartPath))return null;let currentDirectory=statSync14(resolvedStartPath).isDirectory()?resolvedStartPath:dirname31(resolvedStartPath),filesystemRoot=resolve23("/");for(;;){for(let marker of markers)if(existsSync26(join49(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname31(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}import{isAbsolute as isAbsolute13,resolve as resolve24}from"node:path";function isTrackedTool(toolName){return TRACKED_BUILTIN_TOOL_SET.has(toolName)}function extractToolPaths(event,cwd){if(event.isError||!isTrackedTool(event.toolName))return[];let filePaths=new Set;return(event.toolName==="read"||event.toolName==="edit")&&(addPath(filePaths,getStringProperty(event.details,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),event.toolName==="write"&&(addPath(filePaths,getStringProperty(event.input,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),[...filePaths]}function addPath(filePaths,filePath,cwd){filePath===void 0||filePath.length===0||filePaths.add(isAbsolute13(filePath)?filePath:resolve24(cwd,filePath))}function getStringProperty(value2,propertyName){if(!isRecord44(value2))return;let propertyValue=value2[propertyName];return typeof propertyValue=="string"?propertyValue:void 0}function isRecord44(value2){return typeof value2=="object"&&value2!==null}var MODE_VALUES=new Set(["static","dynamic","both","off"]),DYNAMIC_CONTEXT_SCOPE="live-context";function piRulesExtension(pi){pi.registerFlag("pi-rules-disabled",{type:"boolean",default:!1,description:"Disable pi-rules hooks."}),pi.registerFlag("pi-rules-mode",{type:"string",default:"both",description:"Rule injection mode: static, dynamic, both, or off."});let config=configFromEnvironment(),envDisabled=config.disabled,engine=createEngine(config,{findCandidates:findRuleCandidates,readFile:path13=>{try{return readFileSync30(path13,"utf-8")}catch{return null}},findProjectRoot,extractToolPaths});registerSlashCommands(pi,engine),registerRuleActivationRenderer(pi);function syncConfigFromFlags(){let disabled2=pi.getFlag("pi-rules-disabled"),mode=pi.getFlag("pi-rules-mode");typeof disabled2=="boolean"&&(engine.config.disabled=disabled2||envDisabled),typeof mode=="string"&&isPiRulesMode(mode)&&(engine.config.mode=mode)}pi.on("session_start",async(event,ctx)=>{syncConfigFromFlags(),!engine.config.disabled&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:event.reason}))}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:"compact"}))}),pi.on("before_agent_start",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="dynamic")return;let loaded2=engine.loadStaticRules(ctx.cwd),nativeContextPaths=new Set(event.systemPromptOptions.contextFiles?.flatMap(contextFile=>pathKeys(contextFile.path))??[]);for(let rule of loaded2.rules)(nativeContextPaths.has(rule.path)||nativeContextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!nativeContextPaths.has(rule.path)&&!nativeContextPaths.has(rule.realPath));if(rules.length===0)return;let block=engine.formatStatic(rules);for(let rule of rules)engine.markStaticInjected(rule);return{systemPrompt:event.systemPrompt+block}}),pi.on("tool_result",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="static"||event.isError)return;let targetPaths=extractToolPaths(event,ctx.cwd),firstTargetPath=targetPaths[0];if(firstTargetPath===void 0)return;let fingerprints=engine.fingerprintDynamicTargets(ctx.cwd,targetPaths),pendingFingerprints=fingerprints.filter(target=>!engine.isDynamicTargetFingerprintCurrent(target));if(pendingFingerprints.length===0){engine.commitDynamicTargetFingerprints(fingerprints);return}let loaded2=engine.loadDynamicRules(ctx.cwd,pendingFingerprints.map(target=>target.targetPath));engine.commitDynamicTargetFingerprints(fingerprints);let rules=loaded2.rules.filter(rule=>!engine.isStaticInjected(rule)&&!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule));if(rules.length===0)return;let firstPendingTarget=pendingFingerprints[0]?.targetPath??firstTargetPath,targetPath=displayPath4(ctx.cwd,firstPendingTarget),block=engine.formatDynamic(rules,targetPath);for(let rule of rules)engine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule);return appendRuleActivation(pi,{kind:"project-rules",targetPath,rules:rules.map(rule=>rule.relativePath),toolCallId:event.toolCallId}),{content:[...event.content,{type:"text",text:block,audience:"model"}]}})}function isPiRulesMode(value2){return MODE_VALUES.has(value2)}function pathKeys(filePath){try{return[filePath,realpathSync6.native(filePath)]}catch{return[filePath]}}function displayPath4(cwd,filePath){return isAbsolute14(filePath)?relative13(cwd,filePath):filePath}import{isAbsolute as isAbsolute16,join as join53}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}import{stat as stat4}from"node:fs/promises";import{isAbsolute as isAbsolute15}from"node:path";import{join as join50}from"node:path";var TERMINAL_MANIFEST_VERSION=1,TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS=3e4;function createTerminalManifestStore(session){return createSidecarStore({baseDir:join50(session.getSessionDir(),"extensions","terminal"),sessionId:session.getSessionId(),version:TERMINAL_MANIFEST_VERSION,tempPrefix:"terminal",parse:parseTerminalManifest})}var TerminalManifestWriter=class{#sessionId;#debounceMs;#now;#entries=new Map;#backgrounds=new Map;#pending=new Map;#timer;#tail=Promise.resolve();constructor(options){this.store=createTerminalManifestStore(options.session),this.#sessionId=options.session.getSessionId(),this.#debounceMs=options.debounceMs??TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS,this.#now=options.now??Date.now}recordRegister(registration){return this.#entries.set(registration.monitorId,this.#entryFor(registration)),this.#persist()}adoptRestored(entry){this.#entries.set(entry.monitorId,{...entry,suspended:!1})}durableCount(){let count=0;for(let entry of this.#entries.values())entry.durabilityClass!=="ephemeral"&&(count+=1);return count}observeMonitorState(snapshot){let live=new Map;for(let entry of snapshot){if(typeof entry.monitorId!="string"||entry.monitorId.length===0)throw new Error(`terminal manifest writer saw a monitor snapshot entry without a stable monitorId (runtime id ${entry.id}); surfacing instead of silently skipping it`);live.set(entry.monitorId,{paused:entry.paused,fireWindow:entry.fireWindow})}let changed=!1;for(let[monitorId,known]of this.#entries){let current=live.get(monitorId);if(current===void 0){if(known.suspended)continue;this.#entries.delete(monitorId),changed=!0;continue}let fireWindow2=current.fireWindow??known.fireWindow;(known.deliveryPaused!==current.paused||known.fireWindow.count!==fireWindow2.count)&&(this.#entries.set(monitorId,{...known,deliveryPaused:current.paused,fireWindow:fireWindow2}),changed=!0)}return changed?this.#persist():Promise.resolve()}scheduleCheckpoint(monitorId,checkpoint2){this.#pending.set(monitorId,checkpoint2),this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=setTimeout(()=>{this.#timer=void 0,this.#absorbPending(),this.#persist()},this.#debounceMs)}async flush(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#pending.size===0?await this.#tail:(this.#absorbPending(),await this.#persist())}async recordShutdown(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#absorbPending();for(let[monitorId,entry]of this.#entries)this.#entries.set(monitorId,{...entry,suspended:!0});await this.#persist()}recordBackgroundStart(id,command,startedAtMs){return this.#backgrounds.set(id,{id,command,startedAtMs:startedAtMs??this.#now()}),this.#persist()}recordBackgroundExit(id){return this.#backgrounds.delete(id)?this.#persist():Promise.resolve()}#absorbPending(){for(let[monitorId,checkpoint2]of this.#pending){let entry=this.#entries.get(monitorId);entry&&this.#entries.set(monitorId,{...entry,lastCheckpoint:checkpoint2})}this.#pending.clear()}#entryFor({monitorId,spec}){let createdAt=this.#now(),persistent=spec.persistent===!0;return{monitorId,sessionId:this.#sessionId,description:spec.description,runtimeKind:spec.kind,durabilityClass:persistent?spec.kind==="file"?"checkpointed-file":"restartable-command":"ephemeral",command:spec.kind==="command"?spec.command:void 0,path:spec.kind==="file"?spec.path:void 0,event:spec.kind==="file"?spec.event:void 0,filter:spec.kind==="command"?spec.filter:void 0,cwd:spec.cwd,approvedParent:spec.kind==="file"?spec.approvedParent:void 0,createdAt,expiresAt:persistent?createdAt+DURABLE_MONITOR_EXPIRY_MS:null,persistent,suspended:!1,lastCheckpoint:null,deliveryPaused:!1,fireWindow:{startMs:createdAt,count:0}}}#persist(){let run=this.#tail.then(()=>this.store.write({version:TERMINAL_MANIFEST_VERSION,sessionId:this.#sessionId,monitors:[...this.#entries.values()],backgroundSessions:[...this.#backgrounds.values()],updatedAt:this.#now()}));return this.#tail=run.then(()=>{},error2=>{this.persistFailure=error2}),this.#tail}};var InvalidTerminalManifestError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidTerminalManifestError"}},RUNTIME_KINDS=["command","file"],DURABILITY_CLASSES=["ephemeral","restartable-command","checkpointed-file"],FILE_EVENTS=["create","modify"],isStr=value2=>typeof value2=="string"&&value2.length>0,isNum=value2=>typeof value2=="number"&&Number.isFinite(value2),isBool=value2=>typeof value2=="boolean",isObj=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function invalid(message){throw new InvalidTerminalManifestError(`terminal manifest is invalid: ${message}`)}function str(raw,field){return isStr(raw[field])||invalid(`field ${field} must be a non-empty string`),raw[field]}function num(raw,field){return isNum(raw[field])||invalid(`field ${field} must be a finite number`),raw[field]}function digest2(raw,field){return typeof raw[field]!="string"&&invalid(`field ${field} must be a string`),raw[field]}function bool(raw,field){return isBool(raw[field])||invalid(`field ${field} must be a boolean`),raw[field]}function opt(raw,field,required){return raw[field]===void 0?void 0:required(raw,field)}function oneOf(values,raw,field){let value2=raw[field];return(typeof value2!="string"||!values.includes(value2))&&invalid(`field ${field} must be one of: ${values.join(", ")}`),value2}function checkpoint(raw){return isObj(raw)||invalid("field lastCheckpoint must be an object"),{dev:num(raw,"dev"),ino:num(raw,"ino"),size:num(raw,"size"),mtimeMs:num(raw,"mtimeMs"),digest:digest2(raw,"digest"),present:bool(raw,"present")}}function fireWindow(raw){return isObj(raw)||invalid("field fireWindow must be an object"),{startMs:num(raw,"startMs"),count:num(raw,"count")}}function parseMonitor(entry){return isObj(entry)||invalid("a monitor entry must be an object"),{monitorId:str(entry,"monitorId"),sessionId:str(entry,"sessionId"),description:str(entry,"description"),runtimeKind:oneOf(RUNTIME_KINDS,entry,"runtimeKind"),durabilityClass:oneOf(DURABILITY_CLASSES,entry,"durabilityClass"),command:opt(entry,"command",str),path:opt(entry,"path",str),event:opt(entry,"event",(raw,field)=>oneOf(FILE_EVENTS,raw,field)),filter:opt(entry,"filter",str),cwd:opt(entry,"cwd",str),approvedParent:opt(entry,"approvedParent",str),createdAt:num(entry,"createdAt"),expiresAt:entry.expiresAt===void 0||entry.expiresAt===null?null:num(entry,"expiresAt"),persistent:bool(entry,"persistent"),suspended:bool(entry,"suspended"),lastCheckpoint:entry.lastCheckpoint===null?null:checkpoint(entry.lastCheckpoint),deliveryPaused:bool(entry,"deliveryPaused"),fireWindow:fireWindow(entry.fireWindow)}}function parseBackgroundSession(entry){return isObj(entry)||invalid("a background session entry must be an object"),{id:str(entry,"id"),command:str(entry,"command"),startedAtMs:num(entry,"startedAtMs")}}function parseTerminalManifest(raw,ref){return isObj(raw)||invalid("the payload must be an object"),Array.isArray(raw.monitors)||invalid("field monitors must be an array"),Array.isArray(raw.backgroundSessions)||invalid("field backgroundSessions must be an array"),{version:TERMINAL_MANIFEST_VERSION,sessionId:ref.sessionId,monitors:raw.monitors.map(parseMonitor),backgroundSessions:raw.backgroundSessions.map(parseBackgroundSession),updatedAt:num(raw,"updatedAt")}}function reapplyPersistedMute(registry,monitor,runtimeId){return monitor.deliveryPaused?(registry.pause([runtimeId]),"muted"):"restored"}var stubRestoreHandlers={"restartable-command":()=>({outcome:"lost"}),"checkpointed-file":()=>({outcome:"lost"})};async function restoreTerminalState(options){let digest3={restored:0,lost:0,expired:0,muted:0,attachedElsewhere:0,storeError:!1},state;try{state=await options.manifest.read()}catch{return{...digest3,storeError:!0}}if(state===null)return digest3;let now2=(options.now??Date.now)(),handlers={...stubRestoreHandlers,...options.handlers};for(let monitor of state.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=now2){digest3.expired+=1;continue}if(monitor.durabilityClass==="ephemeral"){digest3.lost+=1;continue}let outcome=(await handlers[monitor.durabilityClass](monitor)).outcome;digest3[outcome]+=1}return digest3.lost+=state.backgroundSessions.length,digest3}async function spawnCommandSession(ctx,request2){let shell=getShellConfig(ctx.shellPath),useStdin=shell.commandTransport==="stdin",args=useStdin?[...shell.args]:[...shell.args,request2.command],created=await ctx.manager.create(shell.shell,{command:shell.shell,args,cwd:request2.cwd??ctx.cwd,env:{...ctx.getEnv(),...request2.envOverrides},cols:request2.cols,rows:request2.rows,timeoutMs:request2.timeoutMs});return useStdin&&created.runtime.session.write(`${request2.command}
2029
+ `),created}function describeExit(runtime){let exit=runtime.exitResult;return exit?exit.timedOut?"timed_out":exit.cancelled?"killed":exit.exitCode===0?"completed":exit.exitCode!==null?`exited_${exit.exitCode}`:exit.signal?`signal_${exit.signal}`:"exited":null}var LOST={outcome:"lost"};async function defaultDirectoryExists(path13){try{return(await stat4(path13)).isDirectory()}catch{return!1}}function compileFilter(source){if(source!==void 0)try{return new RegExp(source)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function restorable(monitor){if(monitor.runtimeKind!=="command"||!monitor.persistent)return;let{command,cwd}=monitor;if(!(command===void 0||command.length===0)&&!(cwd===void 0||!isAbsolute15(cwd)))return{command,cwd}}function createRestartableCommandHandler(deps){let spawn12=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists;return async monitor=>{let target=restorable(monitor);if(target===void 0||!await directoryExists(target.cwd))return LOST;let spawned;try{spawned=await spawn12(deps.ctx,{command:target.command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd:target.cwd})}catch{return LOST}return deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command:monitor.command,persistent:!0,deadlineMs:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id),deps.onRestored?.(monitor.monitorId,spawned.id),{outcome:reapplyPersistedMute(deps.registry,monitor,spawned.id)}}}import{stat as stat5}from"node:fs/promises";import{resolve as resolve25}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async monitor=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost(`monitor ${monitor.monitorId} is not a restorable file watch`);let saved=monitor.lastCheckpoint;if(saved===null)return lost(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat5(resolve25(monitor.cwd,monitor.path))).isFile())return lost(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,persistent:!0,deadlineMs:null,event:monitor.event??"create",timeoutMs:remainingMs(monitor,now2()),cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{mkdir as mkdir10,open as open4,readFile as readFile14,unlink as unlink2}from"node:fs/promises";import{join as join51}from"node:path";function errorCode2(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&typeof error2.code=="string")return error2.code}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode2(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}async function readLease(path13){let raw;try{raw=await readFile14(path13,"utf8")}catch(error2){if(errorCode2(error2)==="ENOENT")return"missing";throw error2}try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let pid=parsed.pid,startedAtMs=parsed.startedAtMs;return typeof pid!="number"||!Number.isFinite(pid)||typeof startedAtMs!="number"||!Number.isFinite(startedAtMs)?"unparseable":{pid,startedAtMs}}catch{return"unparseable"}}async function exclusiveCreate(path13,record7){let file=await open4(path13,"wx");try{await file.writeFile(JSON.stringify(record7),"utf8")}finally{await file.close()}}async function unlinkIfPresent(path13){try{await unlink2(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}async function tryAcquire(path13,record7,isProcessAlive2,retry){try{return await exclusiveCreate(path13,record7),{acquired:!0,path:path13,pid:record7.pid}}catch(error2){if(errorCode2(error2)!=="EEXIST")throw error2;let existing=await readLease(path13);if((existing==="missing"||existing==="unparseable"||!probeAlive(existing.pid,isProcessAlive2))&&retry)return await unlinkIfPresent(path13),tryAcquire(path13,record7,isProcessAlive2,!1);if(existing==="missing"||existing==="unparseable")throw error2;return{acquired:!1,holder:existing}}}async function acquireTerminalLease(options){let pid=options.pid??process.pid,startedAtMs=(options.now??Date.now)(),path13=join51(options.dir,`${options.encodedSessionId}.lease`);return await mkdir10(options.dir,{recursive:!0}),tryAcquire(path13,{pid,startedAtMs},options.isProcessAlive,!0)}async function releaseTerminalLease(handle){let existing=await readLease(handle.path);existing==="missing"||existing==="unparseable"||existing.pid===handle.pid&&await unlinkIfPresent(handle.path)}function modelOnlyText(text2){return{type:"text",text:text2,audience:"model"}}function isModelOnlyText(part){return typeof part=="object"&&part!==null&&"type"in part&&part.type==="text"&&"audience"in part&&part.audience==="model"}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
2030
2030
  `).split(`
2031
2031
  `).map(collapseRedraws).join(`
2032
- `)}function formatTerminalToolOutput(raw){let sanitized=sanitizeTerminalOutput(raw).trimEnd(),truncation=truncateTail(sanitized,{maxLines:TERMINAL_TOOL_MAX_LINES,maxBytes:TERMINAL_TOOL_MAX_BYTES});if(!truncation.truncated)return{text:sanitized,truncated:!1,truncation};let marker=truncation.lastLinePartial?`[Showing last ${formatSize(truncation.outputBytes)} of a single line; earlier output dropped]`:`[Showing lines ${truncation.totalLines-truncation.outputLines+1}-${truncation.totalLines} of ${truncation.totalLines}; earlier output dropped]`;return{text:`${truncation.content}
2032
+ `)}function formatTerminalToolOutput(raw){let sanitized=sanitizeTerminalOutput(raw).trimEnd(),truncation=truncateTail(sanitized,{maxLines:TERMINAL_TOOL_MAX_LINES,maxBytes:TERMINAL_TOOL_MAX_BYTES});if(!truncation.truncated)return{text:sanitized,body:sanitized,truncated:!1,truncation};let marker=truncation.lastLinePartial?`[Showing last ${formatSize(truncation.outputBytes)} of a single line; earlier output dropped]`:`[Showing lines ${truncation.totalLines-truncation.outputLines+1}-${truncation.totalLines} of ${truncation.totalLines}; earlier output dropped]`;return{text:`${truncation.content}
2033
2033
 
2034
- ${marker}`,truncated:!0,truncation}}var NON_INTERACTIVE_MODES=new Set(["print","json"]),TERMINAL_NOTIFICATION_CUSTOM_TYPE="senpi-terminal:notification",NOTICE_TAIL_MAX_CHARS=2e3;function getTerminalNotificationDelivery(deps,customType=TERMINAL_NOTIFICATION_CUSTOM_TYPE){let mode=deps.getMode();if(mode==="off")return;let ctx=deps.getContext();if(!(!ctx||NON_INTERACTIVE_MODES.has(ctx.mode)||!ctx.model))return{send:(content,options)=>deps.sendMessage({customType,content,display:!1,...options?.details===void 0?{}:{details:options.details}},{triggerTurn:!0,deliverAs:mode==="wake"||options?.forceWake===!0?"steer":"followUp"})}}function buildNotice(id,runtime){let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`,tail=sanitizeTerminalOutput(runtime.fullOutput()).trimEnd(),tailSection="";if(tail.length>0){let truncated=tail.length>NOTICE_TAIL_MAX_CHARS,shown=truncated?tail.slice(tail.length-NOTICE_TAIL_MAX_CHARS):tail,note=truncated?`
2034
+ ${marker}`,body:truncation.content,marker,truncated:!0,truncation}}function splitModelOnlyNotices(text2,notices){let parts=[],cursor=0,afterNotice=!1;for(let notice2 of notices){if(notice2===void 0||notice2.length===0)continue;let index=text2.indexOf(notice2,cursor);if(index<0)continue;let end=index+notice2.length;if(!(end<text2.length&&text2[end]!==`
2035
+ `)){if(afterNotice&&index===cursor)parts.push(modelOnlyText(notice2));else if(index>cursor&&text2[index-1]===`
2036
+ `)parts.push({type:"text",text:text2.slice(cursor,index-1)},modelOnlyText(notice2));else continue;cursor=end<text2.length?end+1:end,afterNotice=end<text2.length}}return parts.length===0?[{type:"text",text:text2}]:((cursor<text2.length||text2[text2.length-1]===`
2037
+ `)&&parts.push({type:"text",text:text2.slice(cursor)}),parts)}var NON_INTERACTIVE_MODES=new Set(["print","json"]),TERMINAL_NOTIFICATION_CUSTOM_TYPE="senpi-terminal:notification",NOTICE_TAIL_MAX_CHARS=2e3;function getTerminalNotificationDelivery(deps,customType=TERMINAL_NOTIFICATION_CUSTOM_TYPE){let mode=deps.getMode();if(mode==="off")return;let ctx=deps.getContext();if(!(!ctx||NON_INTERACTIVE_MODES.has(ctx.mode)||!ctx.model))return{send:(content,options)=>deps.sendMessage({customType,content,display:!1,...options?.details===void 0?{}:{details:options.details}},{triggerTurn:!0,deliverAs:mode==="wake"||options?.forceWake===!0?"steer":"followUp"})}}function buildNotice(id,runtime){let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`,tail=sanitizeTerminalOutput(runtime.fullOutput()).trimEnd(),tailSection="";if(tail.length>0){let truncated=tail.length>NOTICE_TAIL_MAX_CHARS,shown=truncated?tail.slice(tail.length-NOTICE_TAIL_MAX_CHARS):tail,note=truncated?`
2035
2038
  [Final output truncated to the last ${NOTICE_TAIL_MAX_CHARS} chars; the full history is still peekable.]`:"";tailSection=`
2036
2039
  Final output:
2037
2040
  ${shown}${note}`}return`<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`}var TerminalNotifier=class{constructor(deps){this.notified=new Set,this.deps=deps}notifyCompletion(id,runtime){if(this.notified.has(id))return;let delivery=getTerminalNotificationDelivery(this.deps);delivery&&(this.notified.add(id),delivery.send(buildNotice(id,runtime)))}};var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",QUEUE_OVERHEAD_CHARS=512,MONITOR_NOTIFICATION_CUSTOM_TYPE="senpi-monitor:notification",WAKE_STREAK_QUIET_GAP_MULTIPLIER=2,systemScheduler={now:()=>Date.now(),setTimeout:(callback,delayMs)=>setTimeout(callback,delayMs),clearTimeout:timer=>clearTimeout(timer)};function boundedPositiveInt(value2,fallback,minimum,maximum){return Number.isFinite(value2)?Math.min(Math.max(Math.trunc(value2),minimum),maximum):fallback}function resolveSettings3(settings){return{coalesceWindowMs:boundedPositiveInt(settings.coalesceWindowMs,2e3,1,6e4),rateLimitMs:boundedPositiveInt(settings.rateLimitMs,5e3,1,36e5),maxLinesPerInjection:boundedPositiveInt(settings.maxLinesPerInjection,50,1,200),maxCharsPerInjection:boundedPositiveInt(settings.maxCharsPerInjection,4096,512,16384),wakeBudget:boundedPositiveInt(settings.wakeBudget,5,1,100)}}function eventBody(event){let value2=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value2).replace(/[\r\n]+/g," ").trimEnd()}function clip(text2,maxChars){return text2.length<=maxChars?text2:maxChars<=3?text2.slice(0,maxChars):`${text2.slice(0,maxChars-3)}...`}function formatEvents(events){let groups=new Map;for(let event of events){let group=groups.get(event.id)??{description:event.description,bodies:[]};group.bodies.push(eventBody(event)),groups.set(event.id,group)}return[...groups.values()].map(group=>`Monitor event(${group.description}): ${group.bodies.join(`
@@ -2079,7 +2082,7 @@ manual \`&\` backgrounding \u2014 use the built-in session tools:
2079
2082
  - \`bash_resize({ bash_id, cols, rows })\` resizes the PTY so full-screen programs reflow.
2080
2083
  - \`kill_bash({ bash_id })\` (or \`{ all: true }\`) tears the session tree down with no orphans.
2081
2084
  `}var TerminalManager=class{constructor(options={}){this.runtimes=new Map,this.monitorIds=new Map,this.exited=new Set,this.reservations=0,this.maxSessions=options.maxSessions??DEFAULT_MAX_SESSIONS,this.scrollback=options.scrollback}get size(){return this.runtimes.size}get activeSize(){return this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations}reserve(){if(this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations>=this.maxSessions)return null;this.reservations+=1;let released=!1;return()=>{released||(released=!0,this.reservations-=1)}}async create(command,options){let pty=await loadPty(),release3=this.reserve();if(!release3)throw new pty.SessionRegistryCapacityError(this.maxSessions);this.registry??=new pty.SessionRegistry({maxSessions:this.maxSessions});let registry=this.registry,runtimeOptions={...options,scrollback:this.scrollback},{TerminalRuntimeSession}=await import("./runtime-session-F3EXC44D.js"),runtime=new TerminalRuntimeSession(command,runtimeOptions),entry;try{entry=await registry.create({command,session:runtime.session})}catch(error2){throw release3(),runtime.dispose(),runtime.session.kill(),error2}return this.runtimes.set(entry.id,runtime),runtime.session.onExit(()=>{this.exited.add(entry.id)}),release3(),this.reconcileRuntimes(),{id:entry.id,runtime}}get(id){let registry=this.registry;return!registry||!registry.get(id)?null:this.runtimes.get(id)??null}bindMonitorId(monitorId,sessionId){this.monitorIds.set(monitorId,sessionId)}resolveId(idOrMonitorId){if(idOrMonitorId.startsWith("mon_"))return this.monitorIds.get(idOrMonitorId);let registry=this.registry;if(registry)return registry.get(idOrMonitorId)?idOrMonitorId:void 0}list(){let registry=this.registry;if(!registry)return[];let result3=[];for(let entry of registry.list()){let runtime=this.runtimes.get(entry.id);runtime&&result3.push({id:entry.id,runtime})}return result3}async stop(id){let registry=this.registry;if(!registry)return!1;let stopped=await registry.stop(id);return this.reconcileRuntimes(),stopped}async teardown(){let registry=this.registry;registry&&await registry.teardown(),this.registry=void 0;for(let runtime of this.runtimes.values())runtime.dispose();this.runtimes.clear(),this.exited.clear(),this.monitorIds.clear()}reconcileRuntimes(){let registry=this.registry;if(!registry)return;let liveIds=new Set(registry.list().map(entry=>entry.id));for(let[id,runtime]of this.runtimes)if(!liveIds.has(id)){runtime.dispose(),this.runtimes.delete(id),this.exited.delete(id);for(let[monitorId,sessionId]of this.monitorIds)sessionId===id&&this.monitorIds.delete(monitorId)}}};import{randomBytes as randomBytes4}from"node:crypto";import{watch}from"node:fs";import{access,lstat,open as open5,stat as stat6}from"node:fs/promises";import{basename as basename15,dirname as dirname32,join as join52,resolve as resolve26}from"node:path";import{createHash as createHash16}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash16("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
2082
- `);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var MONITOR_ID_ALPHABET="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function allocateMonitorId(){let id="mon_",buffer=0,bits=0;for(let byte of randomBytes4(10))for(buffer=buffer<<8|byte,bits+=8;bits>=5;)bits-=5,id+=MONITOR_ID_ALPHABET[buffer>>bits&31];return id}var MonitorRegistry=class{#records=new Map;#emit;#onChange;#onEnded;#onFire;#reserve;#files=new Map;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#pending=new Set;#lifecycle=0;constructor(emit,options){this.#emit=emit,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire,this.#reserve=options?.reserve}setParked(parked){if(this.#parked!==parked){this.#parked=parked;for(let record7 of this.#files.values())parked?record7.watch.pause():record7.paused||record7.watch.resume()}}snapshot(){return[...this.#records.values(),...this.#files.values()].map(record7=>({id:record7.id,monitorId:record7.monitorId,description:record7.description,paused:record7.paused,startedAtMs:record7.startedAtMs,command:record7.command,filter:record7.filter?.source??null,persistent:record7.persistent,deadlineMs:record7.deadlineMs,fireCount:record7.fireCount,lastFiredAtMs:record7.lastFiredAtMs,expiresAt:record7.expiresAt,fireWindow:"fireWindow"in record7?record7.fireWindow:void 0}))}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release3=this.#reserve?.();if(this.#reserve&&!release3)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending={release:release3??void 0,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),options.timeoutMs),settled:!1};this.#pending.add(pending);let path13=resolve26(options.cwd,options.path),parent=dirname32(path13),approvedParent;try{await this.#registrationAwait(pending,access(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path13}`);if(initialHandle=await this.#registrationAwait(pending,open5(path13,"r"),async handle=>{await handle.close()}),initial=await this.#registrationAwait(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path13}`);if(realpathWithoutOpen(path13)!==join52(approvedParent,basename15(path13)))throw new Error(`Cannot watch file: target identity changed: ${path13}`);if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path13}`);let reboundStat=await this.#registrationAwait(pending,stat6(path13));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path13}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2}if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#registrationAwait(pending,probeDirectoryOpenable(activationParent)),watcher=watch(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename15(String(name))===basename15(path13))&&this.#checkFile(id)})}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path13}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record8=this.#files.get(id);record8&&this.#settleFile(record8,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#finishPending(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath=join52(approvedParent,basename15(path13)),digest3;try{digest3=initial&&initialHandle?await this.#registrationAwait(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record7={id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent:options.persistent??options.expiresAt!==void 0,deadlineMs:options.persistent??options.expiresAt!==void 0?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path13,canonicalPath,canonicalParent:approvedParent,event:options.event,watcher,release:release3??(()=>{}),watch:new FileWatchLoop(()=>{this.#checkFile(id)}),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:setTimeout(()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")},options.timeoutMs)};if(this.#files.set(id,record7),this.#parked&&record7.watch.pause(),finishRegistration(),this.#finishPending(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record7,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#notifyChange(),{id,monitorId:record7.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}emitFileLine(id,line){let record7=this.#files.get(id);return!record7||record7.settled?!1:(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),!0)}async stopFile(id){let record7=this.#files.get(id);return record7?(this.#settleFile(record7,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record7 of records)this.#settleFile(record7,"watcher killed");for(let pending of[...this.#pending])this.#finishPending(pending);return records.length}#settleFile(record7,summary){if(record7.settled)return;record7.settled=!0,record7.watch.stop(),clearTimeout(record7.deadline),record7.watcher.close(),record7.release(),this.#files.delete(record7.id),this.#notifyChange(),this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#emitEnded(record7,reason,null)}async#checkFile(id){let record7=this.#files.get(id);if(!(!record7||record7.settled||record7.paused||this.#parked)){if(record7.checking){record7.dirty=!0;return}return record7.checking=this.#checkFileImpl(record7).catch(error2=>{record7.settled||this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record7.checking=void 0;let now2=Date.now();now2-record7.dirtyWindowStartedAt>=1e3&&(record7.dirtyWindowStartedAt=now2,record7.dirtyPasses=0),record7.dirty&&!record7.settled&&record7.dirtyPasses<1?(record7.dirty=!1,record7.dirtyPasses+=1,this.#checkFile(id)):record7.dirty=!1}),record7.checking}}async#checkFileImpl(record7){if(record7.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname32(record7.path))!==record7.canonicalParent){this.#settleFile(record7,`watcher error: monitored parent changed: ${dirname32(record7.path)}`);return}if((await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(realpathWithoutOpen(record7.canonicalPath)!==record7.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);handle=await open5(record7.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record7.path}`);if((opened.dev!==record7.device||opened.ino!==record7.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(current=opened,(await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);let reboundPath=await stat6(record7.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await this.#digestHandle(handle):"",present&&handle){let afterDigest=await stat6(record7.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}}finally{await handle?.close()}let changed=record7.event==="create"?!record7.present&&present:record7.present&&present&&(current.mtimeMs!==record7.mtimeMs||current.size!==record7.size||digest3!==record7.digest);record7.pendingChange||=changed,!record7.present&&current&&(record7.device=current.dev,record7.inode=current.ino),record7.present=present,record7.mtimeMs=current?.mtimeMs??0,record7.size=current?.size??0,record7.digest=digest3,!(!record7.pendingChange||record7.paused||record7.settled)&&(record7.pendingChange=!1,!record7.settled&&(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line:`${record7.event} ${record7.path}`}),this.#settleFile(record7,"watcher completed")))}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record7={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,unsubscribeOutput:void 0,unsubscribeExit:void 0};return this.#records.set(record7.id,record7),this.#notifyChange(),this.#consume(record7,record7.runtime.fullOutput()),record7.unsubscribeOutput=record7.runtime.onOutput(chunk=>this.#consume(record7,chunk)),record7.unsubscribeExit=record7.runtime.session.onExit(()=>this.#settle(record7)),record7.runtime.exited&&this.#settle(record7),record7.monitorId}pause(ids){let paused=[];for(let id of ids){let record7=this.#records.get(id)??this.#files.get(id);!record7||record7.paused||(record7.paused=!0,"watch"in record7&&record7.watch.pause(),paused.push(record7.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#records.keys(),...this.#files.keys()])}resume(ids){let candidates=ids??[...this.#records.keys(),...this.#files.keys()],resumed=[];for(let id of candidates){let record7=this.#records.get(id)??this.#files.get(id);if(!record7?.paused)continue;record7.paused=!1;let mutedDropped="mutedDropped"in record7?record7.mutedDropped:0;"mutedDropped"in record7&&(record7.mutedDropped=0),"fireWindow"in record7&&record7.fireWindow!==void 0&&(record7.fireWindow.count=0),resumed.push({id:record7.id,mutedDropped}),"watch"in record7&&!this.#parked&&record7.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#records.get(id)?.mutedDropped??0}rearm(id){let record7=this.#records.get(id)??this.#files.get(id);return record7?record7.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){for(let record7 of this.#records.values())if(record7.monitorId===monitorId)return record7.fireWindow={...fireWindow2},!0;return!1}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record7 of[...this.#records.values()])this.#disposeRecord(record7);for(let record7 of this.#files.values())this.#settleFile(record7,"watcher disposed");for(let pending of this.#pending)this.#finishPending(pending);this.#records.clear(),this.#notifyChange()}#finishPending(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async#registrationAwait(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value2=>lateCleanup?.(value2),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value2=>(aborted&&lateCleanup?.(value2),value2),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}#notifyChange(){this.#onChange?.(this.snapshot())}#consume(record7,chunk){if(!(record7.settled||chunk.length===0)){for(let line of record7.lineBuffer.append(chunk))if(!record7.filter||record7.filter.test(line)){if(record7.paused){record7.mutedDropped+=1;continue}if(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),record7.fireWindow!==void 0){let now2=Date.now();now2-record7.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record7.fireWindow={startMs:now2,count:0}),record7.fireWindow.count+=1,record7.fireWindow.count>=DEFAULT_DURABLE_MONITOR_FIRE_BUDGET&&(record7.paused=!0,this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:FIRE_BUDGET_AUTO_MUTE_SUMMARY}),this.#notifyChange())}}}}#settle(record7){if(record7.settled)return;record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#notifyChange();let status=describeExit(record7.runtime)??"exited",code=record7.runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:`watcher ${status}${codeText}`});let exit=record7.runtime.exitResult;this.#emitEnded(record7,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record7){record7.settled||(record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#emitEnded(record7,"disposed",null))}#emitForRecord(record7,event){record7.fireCount+=1,record7.lastFiredAtMs=Date.now(),this.#emit(event),record7.settled||this.#onFire?.(this.snapshot())}#emitEnded(record7,reason,exitCode){this.#onEnded?.({id:record7.id,description:record7.description,startedAtMs:record7.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record7.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}var TERMINAL_SETTINGS_DEFAULTS={defaultCols:DEFAULT_COLS,defaultRows:DEFAULT_ROWS,scrollback:DEFAULT_SCROLLBACK,maxSessions:DEFAULT_MAX_SESSIONS,timeoutAction:"background",notify:"wake",monitor:{coalesceWindowMs:2e3,rateLimitMs:5e3,maxLinesPerInjection:50,maxCharsPerInjection:4096,wakeBudget:5}};function positiveInt(value2,fallback,maximum=Number.MAX_SAFE_INTEGER){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?fallback:Math.min(Math.trunc(value2),maximum)}function nonNegativeInt(value2,fallback){return typeof value2!="number"||!Number.isFinite(value2)||value2<0?fallback:Math.trunc(value2)}function oneOf2(value2,allowed,fallback){return typeof value2=="string"&&allowed.includes(value2)?value2:fallback}function resolveTerminalSettings(raw){return raw?{defaultCols:positiveInt(raw.defaultCols,TERMINAL_SETTINGS_DEFAULTS.defaultCols),defaultRows:positiveInt(raw.defaultRows,TERMINAL_SETTINGS_DEFAULTS.defaultRows),scrollback:nonNegativeInt(raw.scrollback,TERMINAL_SETTINGS_DEFAULTS.scrollback),maxSessions:positiveInt(raw.maxSessions,TERMINAL_SETTINGS_DEFAULTS.maxSessions),timeoutAction:oneOf2(raw.timeoutAction,["background","kill"],TERMINAL_SETTINGS_DEFAULTS.timeoutAction),notify:oneOf2(raw.notify,["wake","next-turn","off"],TERMINAL_SETTINGS_DEFAULTS.notify),monitor:{coalesceWindowMs:positiveInt(raw.monitorCoalesceWindowMs,TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,6e4),rateLimitMs:positiveInt(raw.monitorRateLimitMs,TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs,36e5),maxLinesPerInjection:positiveInt(raw.monitorMaxLinesPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,200),maxCharsPerInjection:positiveInt(raw.monitorMaxCharsPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,16384),wakeBudget:positiveInt(raw.monitorWakeBudget,TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget,100)}}:TERMINAL_SETTINGS_DEFAULTS}function loadTerminalSettings(settingsManager){let global=settingsManager.getGlobalSettings().terminal,project=settingsManager.getProjectSettings().terminal,merged={...global,...project};return resolveTerminalSettings(merged)}function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function createForegroundDetachGate(options){let cancelled=!1,committed=!1,timer,resolveDetached,detached=new Promise(resolve42=>{resolveDetached=resolve42}),clearDeadline=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)},linearize=()=>{if(cancelled||committed||options.runtime.exited||options.signal?.aborted)return;let exitedAtGate=!1,unsubscribeExit=options.runtime.session.onExit(()=>{committed||(exitedAtGate=!0)});if(cancelled||options.runtime.exited||exitedAtGate||options.signal?.aborted){unsubscribeExit();return}committed=!0,options.removeAbortListener(),unsubscribeExit(),resolveDetached()};return timer=setTimeout(()=>queueMicrotask(linearize),options.delayMs),{detached,cancel(){cancelled=!0,clearDeadline()}}}var SHELL_WRAPPER=/^(?:env\s+(?:[\w.]+=[^\s]*\s+)*)?(?:\/(?:usr\/)?bin\/)?(?:ba|z|da|k)?sh\s+-[a-z]*c\s+/i,POWER_MANAGEMENT=/\b(?:pmset|systemsetup|caffeinate|displaysleep|disksleep)\b/,SLEEP_CALL=/(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+(\d+(?:\.\d+)?)/g,PURE=/^sleep\s+\d+(?:\.\d+)?$/,LEADING=/^\(?\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*(?:[;&|]|$)/,LOOP=/\b(?:while|until|for)\b[\s\S]*?(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+\d/,TRAILING=/[;&|]\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*\)?\s*$/;function unwrap(command){let current=command.trim();for(let depth=0;depth<3;depth+=1){let stripped=current.replace(SHELL_WRAPPER,"");if(stripped===current)break;current=stripped.trim();let quote=current[0];(quote==="'"||quote==='"')&&current.endsWith(quote)&&current.length>1&&(current=current.slice(1,-1).trim())}return current}function longestSleepSeconds(command){SLEEP_CALL.lastIndex=0;let longest;for(let match of command.matchAll(SLEEP_CALL)){let seconds=Number.parseFloat(match[1]??"");Number.isFinite(seconds)&&(longest===void 0||seconds>longest)&&(longest=seconds)}return longest}function classifySleepWait(command){if(POWER_MANAGEMENT.test(command))return;let unwrapped=unwrap(command),seconds=longestSleepSeconds(unwrapped);if(seconds!==void 0){if(LOOP.test(unwrapped))return seconds>=2?{kind:"sleep-wait",rule:"R3",seconds}:void 0;if(!(seconds<10)){if(PURE.test(unwrapped))return{kind:"sleep-wait",rule:"R1",seconds};if(LEADING.test(unwrapped))return{kind:"sleep-wait",rule:"R2",seconds};if(TRAILING.test(unwrapped))return{kind:"sleep-wait",rule:"R4",seconds}}}}var ptyBashSchema=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute in a PTY-backed session."}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Process kill deadline in seconds (default 1800). Foreground blocking stops at the ~60s window: a command still running then auto-detaches to a live background session instead of being killed. Ignored for run_in_background sessions (they live until exit or kill_bash)."})),description:typebox_exports.Optional(typebox_exports.String({description:"Short human-readable label for this command."})),run_in_background:typebox_exports.Optional(typebox_exports.Boolean({description:"Run as a persistent background session. Returns a bash_id immediately; query it with bash_output, steer with bash_input, tear down with kill_bash."})),cols:typebox_exports.Optional(typebox_exports.Number({description:"PTY width in columns (default 120)."})),rows:typebox_exports.Optional(typebox_exports.Number({description:"PTY height in rows (default 40)."}))});function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function delay2(ms){return new Promise(resolve42=>setTimeout(resolve42,ms))}var MAX_TIMEOUT_MS=2147483647,BASH_UPDATE_THROTTLE_MS=100;function createThrottledEmitter(emit,throttleMs=BASH_UPDATE_THROTTLE_MS){let timer,dirty=!1,lastEmissionAt,emitIfDirty=()=>{dirty&&(dirty=!1,lastEmissionAt=Date.now(),emit())},clearTimer=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)};return{schedule(){if(dirty=!0,timer!==void 0)return;let elapsed=lastEmissionAt===void 0?throttleMs:Date.now()-lastEmissionAt;if(elapsed>=throttleMs){emitIfDirty();return}timer=setTimeout(()=>{timer=void 0,emitIfDirty()},throttleMs-elapsed)},flush(){clearTimer(),emitIfDirty()},dispose(){clearTimer(),dirty=!1,lastEmissionAt=void 0}}}function sessionSpawnContext(ctx){return{...ctx,getEnv:()=>({...ctx.getEnv(),PI_SESSION_CWD:void 0,PI_GOAL_STORE_FILE:void 0})}}function sessionEnvOverrides(ctx,execCtx){let session=execCtx??ctx.getSessionContext?.();if(!session?.sessionManager)return{};let env={};env.PI_SESSION_ID=session.sessionManager.getSessionId(),session.cwd&&(env.PI_SESSION_CWD=session.cwd),session.goalStoreFile&&(env.PI_GOAL_STORE_FILE=session.goalStoreFile);let sessionFile=session.sessionManager.getSessionFile();return sessionFile&&(env.PI_SESSION_FILE=sessionFile),session.model&&(env.PI_PROVIDER=session.model.provider,env.PI_MODEL=session.model.id),session.thinkingLevel&&(env.PI_REASONING_LEVEL=session.thinkingLevel),env}function raceExitWithKillGrace(runtime,signal,timeoutMs){return new Promise((resolve42,reject)=>{let settled=!1,abortGraceTimer,timeoutGraceTimer,armAbortGrace,settle=finish=>{settled||(settled=!0,abortGraceTimer&&clearTimeout(abortGraceTimer),timeoutGraceTimer&&clearTimeout(timeoutGraceTimer),signal&&armAbortGrace&&signal.removeEventListener("abort",armAbortGrace),finish())};if(runtime.session.waitExit().then(()=>settle(()=>resolve42("exited")),error2=>settle(()=>reject(error2 instanceof Error?error2:new Error(String(error2))))),timeoutMs!==void 0){let timeoutGraceDeadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;timeoutGraceDeadlineMs<=MAX_TIMEOUT_MS&&(timeoutGraceTimer=setTimeout(()=>settle(()=>resolve42("timeout_grace")),timeoutGraceDeadlineMs))}signal&&(armAbortGrace=()=>{abortGraceTimer??=setTimeout(()=>settle(()=>resolve42("abort_grace")),KILLED_SESSION_EXIT_GRACE_MS)},signal.aborted?armAbortGrace():signal.addEventListener("abort",armAbortGrace,{once:!0}))})}function resolveAutoDetachDelayMs(ctx,input,sleepWait){if(ctx.timeoutAction==="kill")return;let windowSeconds=sleepWait?Math.min(5,resolveForegroundWindowSeconds(process.env)):resolveForegroundWindowSeconds(process.env);if(!((input.timeout!==void 0&&Number.isFinite(input.timeout)?input.timeout:1/0)<=windowSeconds))return Math.max(0,Math.trunc(windowSeconds*1e3))}function scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt){if(timeoutMs===void 0)return;let deadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;if(!Number.isFinite(deadlineMs)||deadlineMs>MAX_TIMEOUT_MS||runtime.exited)return;let remainingMs2=Math.max(0,deadlineMs-(Date.now()-startedAt)),timer,unsubscribeExit,clearSweep=()=>{timer!==void 0&&clearTimeout(timer),timer=void 0,unsubscribeExit?.(),unsubscribeExit=void 0};if(unsubscribeExit=runtime.session.onExit(clearSweep),runtime.exited){clearSweep();return}timer=setTimeout(()=>{clearSweep(),runtime.exited||ctx.manager.stop(id).catch(()=>{})},remainingMs2)}async function runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx){if(signal?.aborted)return errorResult("Command aborted");let timeoutMs=input.timeout!==void 0?Math.trunc(input.timeout*1e3):void 0,{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,timeoutMs,cwd,envOverrides:{...sessionEnvOverrides(ctx,execCtx),...FOREGROUND_ENV_OVERRIDES}}),startedAt=Date.now(),activity=`running ${input.command.slice(0,80)}`,updateEmitter=onUpdate?createThrottledEmitter(()=>{let text2=formatTerminalToolOutput(runtime.fullOutput()).text.slice(-2e3);onUpdate?.({content:[{type:"text",text:text2}],details:{progress:{activity,startedAt}}})}):void 0;onUpdate?.({content:[],details:void 0});let unsubscribeOutput=onUpdate?runtime.onOutput(()=>updateEmitter?.schedule()):void 0,sleepWait=classifySleepWait(input.command),detachDelayMs=resolveAutoDetachDelayMs(ctx,input,sleepWait),outcome;if(detachDelayMs===void 0){let onAbort=()=>runtime.session.kill("SIGKILL");signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));try{outcome=await raceExitWithKillGrace(runtime,signal,timeoutMs)}finally{signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}else{let abortGate=new AbortController,onAbort=()=>{runtime.session.kill("SIGKILL"),abortGate.abort()};signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let detachGate=createForegroundDetachGate({runtime,signal,delayMs:detachDelayMs,removeAbortListener:()=>signal?.removeEventListener("abort",onAbort)});try{outcome=await Promise.race([raceExitWithKillGrace(runtime,abortGate.signal,timeoutMs),detachGate.detached.then(()=>"detached")])}finally{detachGate.cancel(),signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}if(outcome==="detached"){scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt),ctx.onBackgroundStart?.(id,input.description??input.command,startedAt),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime));let delta=runtime.readDelta(),partialOutput=formatTerminalToolOutput(delta.text).text||"(no output yet)",timeoutNote=input.timeout!==void 0&&Number.isFinite(input.timeout)?`not killed; the original ${input.timeout}s timeout still applies`:"not killed; it will run until exit or kill_bash",guidance=sleepWait?`This command is a wait (${sleepWait.seconds}s sleep), so it detached immediately; the wait continues in the background. Do nothing and end your turn \u2014 completion will be reported automatically with exit status and output tail. Do NOT poll bash_output({ bash_id: "${id}" }) for it. When you are waiting for a pattern in a command's output, launch it with monitor({ command, filter }) instead so matching lines arrive as events. Use kill_bash({ bash_id: "${id}" }) to stop this session.`:`Continue other work; completion will be reported automatically with exit status and output tail. Use bash_output({ bash_id: "${id}" }) only to peek at new output. monitor cannot attach to this session; use it for future event-driven launches. Use kill_bash({ bash_id: "${id}" }) to stop this session.`;return textResult2(`Command is still running; auto-detached to background with ID: ${id} (${timeoutNote}).
2085
+ `);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var MONITOR_ID_ALPHABET="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function allocateMonitorId(){let id="mon_",buffer=0,bits=0;for(let byte of randomBytes4(10))for(buffer=buffer<<8|byte,bits+=8;bits>=5;)bits-=5,id+=MONITOR_ID_ALPHABET[buffer>>bits&31];return id}var MonitorRegistry=class{#records=new Map;#emit;#onChange;#onEnded;#onFire;#reserve;#files=new Map;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#pending=new Set;#lifecycle=0;constructor(emit,options){this.#emit=emit,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire,this.#reserve=options?.reserve}setParked(parked){if(this.#parked!==parked){this.#parked=parked;for(let record7 of this.#files.values())parked?record7.watch.pause():record7.paused||record7.watch.resume()}}snapshot(){return[...this.#records.values(),...this.#files.values()].map(record7=>({id:record7.id,monitorId:record7.monitorId,description:record7.description,paused:record7.paused,startedAtMs:record7.startedAtMs,command:record7.command,filter:record7.filter?.source??null,persistent:record7.persistent,deadlineMs:record7.deadlineMs,fireCount:record7.fireCount,lastFiredAtMs:record7.lastFiredAtMs,expiresAt:record7.expiresAt,fireWindow:"fireWindow"in record7?record7.fireWindow:void 0}))}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release3=this.#reserve?.();if(this.#reserve&&!release3)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending={release:release3??void 0,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),options.timeoutMs),settled:!1};this.#pending.add(pending);let path13=resolve26(options.cwd,options.path),parent=dirname32(path13),approvedParent;try{await this.#registrationAwait(pending,access(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path13}`);if(initialHandle=await this.#registrationAwait(pending,open5(path13,"r"),async handle=>{await handle.close()}),initial=await this.#registrationAwait(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path13}`);if(realpathWithoutOpen(path13)!==join52(approvedParent,basename15(path13)))throw new Error(`Cannot watch file: target identity changed: ${path13}`);if((await this.#registrationAwait(pending,lstat(path13))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path13}`);let reboundStat=await this.#registrationAwait(pending,stat6(path13));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path13}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2}if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#registrationAwait(pending,probeDirectoryOpenable(activationParent)),watcher=watch(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename15(String(name))===basename15(path13))&&this.#checkFile(id)})}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path13}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record8=this.#files.get(id);record8&&this.#settleFile(record8,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#finishPending(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath=join52(approvedParent,basename15(path13)),digest3;try{digest3=initial&&initialHandle?await this.#registrationAwait(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let record7={id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent:options.persistent??options.expiresAt!==void 0,deadlineMs:options.persistent??options.expiresAt!==void 0?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path13,canonicalPath,canonicalParent:approvedParent,event:options.event,watcher,release:release3??(()=>{}),watch:new FileWatchLoop(()=>{this.#checkFile(id)}),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:setTimeout(()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")},options.timeoutMs)};if(this.#files.set(id,record7),this.#parked&&record7.watch.pause(),finishRegistration(),this.#finishPending(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record7,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#notifyChange(),{id,monitorId:record7.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}emitFileLine(id,line){let record7=this.#files.get(id);return!record7||record7.settled?!1:(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),!0)}async stopFile(id){let record7=this.#files.get(id);return record7?(this.#settleFile(record7,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record7 of records)this.#settleFile(record7,"watcher killed");for(let pending of[...this.#pending])this.#finishPending(pending);return records.length}#settleFile(record7,summary){if(record7.settled)return;record7.settled=!0,record7.watch.stop(),clearTimeout(record7.deadline),record7.watcher.close(),record7.release(),this.#files.delete(record7.id),this.#notifyChange(),this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#emitEnded(record7,reason,null)}async#checkFile(id){let record7=this.#files.get(id);if(!(!record7||record7.settled||record7.paused||this.#parked)){if(record7.checking){record7.dirty=!0;return}return record7.checking=this.#checkFileImpl(record7).catch(error2=>{record7.settled||this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record7.checking=void 0;let now2=Date.now();now2-record7.dirtyWindowStartedAt>=1e3&&(record7.dirtyWindowStartedAt=now2,record7.dirtyPasses=0),record7.dirty&&!record7.settled&&record7.dirtyPasses<1?(record7.dirty=!1,record7.dirtyPasses+=1,this.#checkFile(id)):record7.dirty=!1}),record7.checking}}async#checkFileImpl(record7){if(record7.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname32(record7.path))!==record7.canonicalParent){this.#settleFile(record7,`watcher error: monitored parent changed: ${dirname32(record7.path)}`);return}if((await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(realpathWithoutOpen(record7.canonicalPath)!==record7.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);handle=await open5(record7.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record7.path}`);if((opened.dev!==record7.device||opened.ino!==record7.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(current=opened,(await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);let reboundPath=await stat6(record7.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await this.#digestHandle(handle):"",present&&handle){let afterDigest=await stat6(record7.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}}finally{await handle?.close()}let changed=record7.event==="create"?!record7.present&&present:record7.present&&present&&(current.mtimeMs!==record7.mtimeMs||current.size!==record7.size||digest3!==record7.digest);record7.pendingChange||=changed,!record7.present&&current&&(record7.device=current.dev,record7.inode=current.ino),record7.present=present,record7.mtimeMs=current?.mtimeMs??0,record7.size=current?.size??0,record7.digest=digest3,!(!record7.pendingChange||record7.paused||record7.settled)&&(record7.pendingChange=!1,!record7.settled&&(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line:`${record7.event} ${record7.path}`}),this.#settleFile(record7,"watcher completed")))}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record7={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,unsubscribeOutput:void 0,unsubscribeExit:void 0};return this.#records.set(record7.id,record7),this.#notifyChange(),this.#consume(record7,record7.runtime.fullOutput()),record7.unsubscribeOutput=record7.runtime.onOutput(chunk=>this.#consume(record7,chunk)),record7.unsubscribeExit=record7.runtime.session.onExit(()=>this.#settle(record7)),record7.runtime.exited&&this.#settle(record7),record7.monitorId}pause(ids){let paused=[];for(let id of ids){let record7=this.#records.get(id)??this.#files.get(id);!record7||record7.paused||(record7.paused=!0,"watch"in record7&&record7.watch.pause(),paused.push(record7.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#records.keys(),...this.#files.keys()])}resume(ids){let candidates=ids??[...this.#records.keys(),...this.#files.keys()],resumed=[];for(let id of candidates){let record7=this.#records.get(id)??this.#files.get(id);if(!record7?.paused)continue;record7.paused=!1;let mutedDropped="mutedDropped"in record7?record7.mutedDropped:0;"mutedDropped"in record7&&(record7.mutedDropped=0),"fireWindow"in record7&&record7.fireWindow!==void 0&&(record7.fireWindow.count=0),resumed.push({id:record7.id,mutedDropped}),"watch"in record7&&!this.#parked&&record7.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#records.get(id)?.mutedDropped??0}rearm(id){let record7=this.#records.get(id)??this.#files.get(id);return record7?record7.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){for(let record7 of this.#records.values())if(record7.monitorId===monitorId)return record7.fireWindow={...fireWindow2},!0;return!1}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record7 of[...this.#records.values()])this.#disposeRecord(record7);for(let record7 of this.#files.values())this.#settleFile(record7,"watcher disposed");for(let pending of this.#pending)this.#finishPending(pending);this.#records.clear(),this.#notifyChange()}#finishPending(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async#registrationAwait(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value2=>lateCleanup?.(value2),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value2=>(aborted&&lateCleanup?.(value2),value2),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}#notifyChange(){this.#onChange?.(this.snapshot())}#consume(record7,chunk){if(!(record7.settled||chunk.length===0)){for(let line of record7.lineBuffer.append(chunk))if(!record7.filter||record7.filter.test(line)){if(record7.paused){record7.mutedDropped+=1;continue}if(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),record7.fireWindow!==void 0){let now2=Date.now();now2-record7.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record7.fireWindow={startMs:now2,count:0}),record7.fireWindow.count+=1,record7.fireWindow.count>=DEFAULT_DURABLE_MONITOR_FIRE_BUDGET&&(record7.paused=!0,this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:FIRE_BUDGET_AUTO_MUTE_SUMMARY}),this.#notifyChange())}}}}#settle(record7){if(record7.settled)return;record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#notifyChange();let status=describeExit(record7.runtime)??"exited",code=record7.runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:`watcher ${status}${codeText}`});let exit=record7.runtime.exitResult;this.#emitEnded(record7,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record7){record7.settled||(record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#emitEnded(record7,"disposed",null))}#emitForRecord(record7,event){record7.fireCount+=1,record7.lastFiredAtMs=Date.now(),this.#emit(event),record7.settled||this.#onFire?.(this.snapshot())}#emitEnded(record7,reason,exitCode){this.#onEnded?.({id:record7.id,description:record7.description,startedAtMs:record7.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record7.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}var TERMINAL_SETTINGS_DEFAULTS={defaultCols:DEFAULT_COLS,defaultRows:DEFAULT_ROWS,scrollback:DEFAULT_SCROLLBACK,maxSessions:DEFAULT_MAX_SESSIONS,timeoutAction:"background",notify:"wake",monitor:{coalesceWindowMs:2e3,rateLimitMs:5e3,maxLinesPerInjection:50,maxCharsPerInjection:4096,wakeBudget:5}};function positiveInt(value2,fallback,maximum=Number.MAX_SAFE_INTEGER){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?fallback:Math.min(Math.trunc(value2),maximum)}function nonNegativeInt(value2,fallback){return typeof value2!="number"||!Number.isFinite(value2)||value2<0?fallback:Math.trunc(value2)}function oneOf2(value2,allowed,fallback){return typeof value2=="string"&&allowed.includes(value2)?value2:fallback}function resolveTerminalSettings(raw){return raw?{defaultCols:positiveInt(raw.defaultCols,TERMINAL_SETTINGS_DEFAULTS.defaultCols),defaultRows:positiveInt(raw.defaultRows,TERMINAL_SETTINGS_DEFAULTS.defaultRows),scrollback:nonNegativeInt(raw.scrollback,TERMINAL_SETTINGS_DEFAULTS.scrollback),maxSessions:positiveInt(raw.maxSessions,TERMINAL_SETTINGS_DEFAULTS.maxSessions),timeoutAction:oneOf2(raw.timeoutAction,["background","kill"],TERMINAL_SETTINGS_DEFAULTS.timeoutAction),notify:oneOf2(raw.notify,["wake","next-turn","off"],TERMINAL_SETTINGS_DEFAULTS.notify),monitor:{coalesceWindowMs:positiveInt(raw.monitorCoalesceWindowMs,TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,6e4),rateLimitMs:positiveInt(raw.monitorRateLimitMs,TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs,36e5),maxLinesPerInjection:positiveInt(raw.monitorMaxLinesPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,200),maxCharsPerInjection:positiveInt(raw.monitorMaxCharsPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,16384),wakeBudget:positiveInt(raw.monitorWakeBudget,TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget,100)}}:TERMINAL_SETTINGS_DEFAULTS}function loadTerminalSettings(settingsManager){let global=settingsManager.getGlobalSettings().terminal,project=settingsManager.getProjectSettings().terminal,merged={...global,...project};return resolveTerminalSettings(merged)}function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function noticedResult(text2,notices,extra){return{content:splitModelOnlyNotices(text2,notices),details:extra?.details,isError:extra?.isError}}function createForegroundDetachGate(options){let cancelled=!1,committed=!1,timer,resolveDetached,detached=new Promise(resolve42=>{resolveDetached=resolve42}),clearDeadline=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)},linearize=()=>{if(cancelled||committed||options.runtime.exited||options.signal?.aborted)return;let exitedAtGate=!1,unsubscribeExit=options.runtime.session.onExit(()=>{committed||(exitedAtGate=!0)});if(cancelled||options.runtime.exited||exitedAtGate||options.signal?.aborted){unsubscribeExit();return}committed=!0,options.removeAbortListener(),unsubscribeExit(),resolveDetached()};return timer=setTimeout(()=>queueMicrotask(linearize),options.delayMs),{detached,cancel(){cancelled=!0,clearDeadline()}}}var SHELL_WRAPPER=/^(?:env\s+(?:[\w.]+=[^\s]*\s+)*)?(?:\/(?:usr\/)?bin\/)?(?:ba|z|da|k)?sh\s+-[a-z]*c\s+/i,POWER_MANAGEMENT=/\b(?:pmset|systemsetup|caffeinate|displaysleep|disksleep)\b/,SLEEP_CALL=/(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+(\d+(?:\.\d+)?)/g,PURE=/^sleep\s+\d+(?:\.\d+)?$/,LEADING=/^\(?\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*(?:[;&|]|$)/,LOOP=/\b(?:while|until|for)\b[\s\S]*?(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+\d/,TRAILING=/[;&|]\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*\)?\s*$/;function unwrap(command){let current=command.trim();for(let depth=0;depth<3;depth+=1){let stripped=current.replace(SHELL_WRAPPER,"");if(stripped===current)break;current=stripped.trim();let quote=current[0];(quote==="'"||quote==='"')&&current.endsWith(quote)&&current.length>1&&(current=current.slice(1,-1).trim())}return current}function longestSleepSeconds(command){SLEEP_CALL.lastIndex=0;let longest;for(let match of command.matchAll(SLEEP_CALL)){let seconds=Number.parseFloat(match[1]??"");Number.isFinite(seconds)&&(longest===void 0||seconds>longest)&&(longest=seconds)}return longest}function classifySleepWait(command){if(POWER_MANAGEMENT.test(command))return;let unwrapped=unwrap(command),seconds=longestSleepSeconds(unwrapped);if(seconds!==void 0){if(LOOP.test(unwrapped))return seconds>=2?{kind:"sleep-wait",rule:"R3",seconds}:void 0;if(!(seconds<10)){if(PURE.test(unwrapped))return{kind:"sleep-wait",rule:"R1",seconds};if(LEADING.test(unwrapped))return{kind:"sleep-wait",rule:"R2",seconds};if(TRAILING.test(unwrapped))return{kind:"sleep-wait",rule:"R4",seconds}}}}var ptyBashSchema=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute in a PTY-backed session."}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Process kill deadline in seconds (default 1800). Foreground blocking stops at the ~60s window: a command still running then auto-detaches to a live background session instead of being killed. Ignored for run_in_background sessions (they live until exit or kill_bash)."})),description:typebox_exports.Optional(typebox_exports.String({description:"Short human-readable label for this command."})),run_in_background:typebox_exports.Optional(typebox_exports.Boolean({description:"Run as a persistent background session. Returns a bash_id immediately; query it with bash_output, steer with bash_input, tear down with kill_bash."})),cols:typebox_exports.Optional(typebox_exports.Number({description:"PTY width in columns (default 120)."})),rows:typebox_exports.Optional(typebox_exports.Number({description:"PTY height in rows (default 40)."}))});function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function delay2(ms){return new Promise(resolve42=>setTimeout(resolve42,ms))}var MAX_TIMEOUT_MS=2147483647,BASH_UPDATE_THROTTLE_MS=100;function createThrottledEmitter(emit,throttleMs=BASH_UPDATE_THROTTLE_MS){let timer,dirty=!1,lastEmissionAt,emitIfDirty=()=>{dirty&&(dirty=!1,lastEmissionAt=Date.now(),emit())},clearTimer=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)};return{schedule(){if(dirty=!0,timer!==void 0)return;let elapsed=lastEmissionAt===void 0?throttleMs:Date.now()-lastEmissionAt;if(elapsed>=throttleMs){emitIfDirty();return}timer=setTimeout(()=>{timer=void 0,emitIfDirty()},throttleMs-elapsed)},flush(){clearTimer(),emitIfDirty()},dispose(){clearTimer(),dirty=!1,lastEmissionAt=void 0}}}function sessionSpawnContext(ctx){return{...ctx,getEnv:()=>({...ctx.getEnv(),PI_SESSION_CWD:void 0,PI_GOAL_STORE_FILE:void 0})}}function sessionEnvOverrides(ctx,execCtx){let session=execCtx??ctx.getSessionContext?.();if(!session?.sessionManager)return{};let env={};env.PI_SESSION_ID=session.sessionManager.getSessionId(),session.cwd&&(env.PI_SESSION_CWD=session.cwd),session.goalStoreFile&&(env.PI_GOAL_STORE_FILE=session.goalStoreFile);let sessionFile=session.sessionManager.getSessionFile();return sessionFile&&(env.PI_SESSION_FILE=sessionFile),session.model&&(env.PI_PROVIDER=session.model.provider,env.PI_MODEL=session.model.id),session.thinkingLevel&&(env.PI_REASONING_LEVEL=session.thinkingLevel),env}function raceExitWithKillGrace(runtime,signal,timeoutMs){return new Promise((resolve42,reject)=>{let settled=!1,abortGraceTimer,timeoutGraceTimer,armAbortGrace,settle=finish=>{settled||(settled=!0,abortGraceTimer&&clearTimeout(abortGraceTimer),timeoutGraceTimer&&clearTimeout(timeoutGraceTimer),signal&&armAbortGrace&&signal.removeEventListener("abort",armAbortGrace),finish())};if(runtime.session.waitExit().then(()=>settle(()=>resolve42("exited")),error2=>settle(()=>reject(error2 instanceof Error?error2:new Error(String(error2))))),timeoutMs!==void 0){let timeoutGraceDeadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;timeoutGraceDeadlineMs<=MAX_TIMEOUT_MS&&(timeoutGraceTimer=setTimeout(()=>settle(()=>resolve42("timeout_grace")),timeoutGraceDeadlineMs))}signal&&(armAbortGrace=()=>{abortGraceTimer??=setTimeout(()=>settle(()=>resolve42("abort_grace")),KILLED_SESSION_EXIT_GRACE_MS)},signal.aborted?armAbortGrace():signal.addEventListener("abort",armAbortGrace,{once:!0}))})}function resolveAutoDetachDelayMs(ctx,input,sleepWait){if(ctx.timeoutAction==="kill")return;let windowSeconds=sleepWait?Math.min(5,resolveForegroundWindowSeconds(process.env)):resolveForegroundWindowSeconds(process.env);if(!((input.timeout!==void 0&&Number.isFinite(input.timeout)?input.timeout:1/0)<=windowSeconds))return Math.max(0,Math.trunc(windowSeconds*1e3))}function scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt){if(timeoutMs===void 0)return;let deadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;if(!Number.isFinite(deadlineMs)||deadlineMs>MAX_TIMEOUT_MS||runtime.exited)return;let remainingMs2=Math.max(0,deadlineMs-(Date.now()-startedAt)),timer,unsubscribeExit,clearSweep=()=>{timer!==void 0&&clearTimeout(timer),timer=void 0,unsubscribeExit?.(),unsubscribeExit=void 0};if(unsubscribeExit=runtime.session.onExit(clearSweep),runtime.exited){clearSweep();return}timer=setTimeout(()=>{clearSweep(),runtime.exited||ctx.manager.stop(id).catch(()=>{})},remainingMs2)}async function runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx){if(signal?.aborted)return errorResult("Command aborted");let timeoutMs=input.timeout!==void 0?Math.trunc(input.timeout*1e3):void 0,{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,timeoutMs,cwd,envOverrides:{...sessionEnvOverrides(ctx,execCtx),...FOREGROUND_ENV_OVERRIDES}}),startedAt=Date.now(),activity=`running ${input.command.slice(0,80)}`,updateEmitter=onUpdate?createThrottledEmitter(()=>{let text2=formatTerminalToolOutput(runtime.fullOutput()).body.slice(-2e3);onUpdate?.({content:[{type:"text",text:text2}],details:{progress:{activity,startedAt}}})}):void 0;onUpdate?.({content:[],details:void 0});let unsubscribeOutput=onUpdate?runtime.onOutput(()=>updateEmitter?.schedule()):void 0,sleepWait=classifySleepWait(input.command),detachDelayMs=resolveAutoDetachDelayMs(ctx,input,sleepWait),outcome;if(detachDelayMs===void 0){let onAbort=()=>runtime.session.kill("SIGKILL");signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));try{outcome=await raceExitWithKillGrace(runtime,signal,timeoutMs)}finally{signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}else{let abortGate=new AbortController,onAbort=()=>{runtime.session.kill("SIGKILL"),abortGate.abort()};signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let detachGate=createForegroundDetachGate({runtime,signal,delayMs:detachDelayMs,removeAbortListener:()=>signal?.removeEventListener("abort",onAbort)});try{outcome=await Promise.race([raceExitWithKillGrace(runtime,abortGate.signal,timeoutMs),detachGate.detached.then(()=>"detached")])}finally{detachGate.cancel(),signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}if(outcome==="detached"){scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt),ctx.onBackgroundStart?.(id,input.description??input.command,startedAt),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime));let delta=runtime.readDelta(),partialOutput=formatTerminalToolOutput(delta.text).text||"(no output yet)",timeoutNote=input.timeout!==void 0&&Number.isFinite(input.timeout)?`not killed; the original ${input.timeout}s timeout still applies`:"not killed; it will run until exit or kill_bash",guidance=sleepWait?`This command is a wait (${sleepWait.seconds}s sleep), so it detached immediately; the wait continues in the background. Do nothing and end your turn \u2014 completion will be reported automatically with exit status and output tail. Do NOT poll bash_output({ bash_id: "${id}" }) for it. When you are waiting for a pattern in a command's output, launch it with monitor({ command, filter }) instead so matching lines arrive as events. Use kill_bash({ bash_id: "${id}" }) to stop this session.`:`Continue other work; completion will be reported automatically with exit status and output tail. Use bash_output({ bash_id: "${id}" }) only to peek at new output. monitor cannot attach to this session; use it for future event-driven launches. Use kill_bash({ bash_id: "${id}" }) to stop this session.`;return textResult2(`Command is still running; auto-detached to background with ID: ${id} (${timeoutNote}).
2083
2086
 
2084
2087
  Partial output:
2085
2088
  ${partialOutput}
@@ -2090,18 +2093,19 @@ ${guidance}`,{details:{bash_id:id,background:!0,auto_detached:!0,...sleepWait?{s
2090
2093
 
2091
2094
  `:""}Command timed out after ${input.timeout} seconds`);let status=describeExit(runtime);return exit&&exit.exitCode!==0&&exit.exitCode!==null?errorResult(`${output?`${output}
2092
2095
 
2093
- `:""}Command exited with code ${exit.exitCode}`):textResult2(output||"(no output)",{details:{status,...formatted.truncated?{truncation:formatted.truncation}:{}}})}async function runBackground(ctx,input,cols,rows,cwd,execCtx){let{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,cwd,envOverrides:sessionEnvOverrides(ctx,execCtx)});ctx.onBackgroundStart?.(id,input.description??input.command,Date.now()),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime)),await Promise.race([delay2(BACKGROUND_START_GRACE_MS),runtime.session.waitExit()]);let early=formatTerminalToolOutput(runtime.readDelta().text).text,header2=`Command running in background with ID: ${id}`,backendNote=runtime.backend==="pipe-fallback"?`
2096
+ `:""}Command exited with code ${exit.exitCode}`):noticedResult(output||"(no output)",[formatted.marker],{details:{status,...formatted.truncated?{truncation:formatted.truncation}:{}}})}async function runBackground(ctx,input,cols,rows,cwd,execCtx){let{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,cwd,envOverrides:sessionEnvOverrides(ctx,execCtx)});ctx.onBackgroundStart?.(id,input.description??input.command,Date.now()),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime)),await Promise.race([delay2(BACKGROUND_START_GRACE_MS),runtime.session.waitExit()]);let early=formatTerminalToolOutput(runtime.readDelta().text).text,header2=`Command running in background with ID: ${id}`,backendNote=runtime.backend==="pipe-fallback"?`
2094
2097
  (native PTY unavailable \u2014 running via pipe fallback; bash_input/bash_resize are limited.)`:"",earlyBlock=early?`
2095
2098
 
2096
- ${early}`:"";return textResult2(`${header2}${backendNote}${earlyBlock}`,{details:{bash_id:id,background:!0}})}function createPtyBashTool(ctx){return{name:TERMINAL_BASH_TOOL,exposure:"eval",label:"bash",description:"Execute a shell command in a persistent PTY-backed session. Set run_in_background:true for long-lived or interactive sessions; steer them with bash_input, snapshot with bash_output, tear down with kill_bash. To wait on observable state (a build finishing, a server coming up, a log line), never run sleep or poll loops \u2014 subscribe with the monitor tool instead. Foreground blocking stops at the ~60s window and a still-running command auto-detaches to a live background session; `timeout` is the process kill deadline in seconds.",promptSnippet:"Run shell commands; run_in_background:true for long-lived/interactive PTY sessions",promptGuidelines:["You can inspect PI_* environment variables for current model and session details."],parameters:ptyBashSchema,async execute(_toolCallId,input,signal,onUpdate,execCtx){let cols=resolveDimension(input.cols,ctx.defaultCols||DEFAULT_COLS),rows=resolveDimension(input.rows,ctx.defaultRows||DEFAULT_ROWS),cwd=execCtx?.cwd;return input.run_in_background?runBackground(ctx,input,cols,rows,cwd,execCtx):runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx)}}}var bashInputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),input:typebox_exports.Optional(typebox_exports.String({description:"Literal text to write to the session's stdin."})),keys:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Named keys to send, e.g. ['ctrl+c'], ['enter'], ['up']. Sent after `input` when both are given."})),submit:typebox_exports.Optional(typebox_exports.Boolean({description:"Append Enter (\\r) after `input`. Default true when `input` is a non-empty string."}))});function createBashInputTool(ctx){return{name:TERMINAL_INPUT_TOOL,label:"bash_input",description:"Write stdin or named keys (ctrl+c, enter, up, ...) to a live background bash session \u2014 e.g. drive a REPL or send SIGINT. This executes arbitrary shell input and is permission-gated like bash.",promptSnippet:"Send stdin/keys to a live background bash session (REPL steering, ctrl+c, etc.)",parameters:bashInputSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot send input.`);let notes=[];if(typeof input.input=="string"){let submit=input.submit??input.input.length>0,result3=runtime.session.write(submit?`${input.input}\r`:input.input);if(!result3.ok)return errorResult(`Failed to write input: ${result3.note}`);notes.push(submit?"wrote input + Enter":"wrote input")}if(input.keys&&input.keys.length>0){let{data,unknown}=encodeKeys(input.keys);if(data.length>0){let result3=runtime.session.write(data);if(!result3.ok)return errorResult(`Failed to send keys: ${result3.note}`);notes.push(`sent ${input.keys.length-unknown.length} key(s)`)}unknown.length>0&&notes.push(`ignored unknown keys: ${unknown.join(", ")}`)}return notes.length===0?errorResult("Nothing to send: provide `input` and/or `keys`."):textResult2(`Sent to ${input.bash_id}: ${notes.join("; ")}.`)}}}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){let block=result3.content.find(content=>content.type==="text");this.#text=block?.type==="text"?block.text:"",this.#isPartial=options.isPartial,this.#expanded=options.expanded}render(width){return!this.#isPartial||this.#expanded?this.#text.split(`
2099
+ ${early}`:"";return textResult2(`${header2}${backendNote}${earlyBlock}`,{details:{bash_id:id,background:!0}})}function createPtyBashTool(ctx){return{name:TERMINAL_BASH_TOOL,exposure:"eval",label:"bash",description:"Execute a shell command in a persistent PTY-backed session. Set run_in_background:true for long-lived or interactive sessions; steer them with bash_input, snapshot with bash_output, tear down with kill_bash. To wait on observable state (a build finishing, a server coming up, a log line), never run sleep or poll loops \u2014 subscribe with the monitor tool instead. Foreground blocking stops at the ~60s window and a still-running command auto-detaches to a live background session; `timeout` is the process kill deadline in seconds.",promptSnippet:"Run shell commands; run_in_background:true for long-lived/interactive PTY sessions",promptGuidelines:["You can inspect PI_* environment variables for current model and session details."],parameters:ptyBashSchema,async execute(_toolCallId,input,signal,onUpdate,execCtx){let cols=resolveDimension(input.cols,ctx.defaultCols||DEFAULT_COLS),rows=resolveDimension(input.rows,ctx.defaultRows||DEFAULT_ROWS),cwd=execCtx?.cwd;return input.run_in_background?runBackground(ctx,input,cols,rows,cwd,execCtx):runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx)}}}var bashInputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),input:typebox_exports.Optional(typebox_exports.String({description:"Literal text to write to the session's stdin."})),keys:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Named keys to send, e.g. ['ctrl+c'], ['enter'], ['up']. Sent after `input` when both are given."})),submit:typebox_exports.Optional(typebox_exports.Boolean({description:"Append Enter (\\r) after `input`. Default true when `input` is a non-empty string."}))});function createBashInputTool(ctx){return{name:TERMINAL_INPUT_TOOL,label:"bash_input",description:"Write stdin or named keys (ctrl+c, enter, up, ...) to a live background bash session \u2014 e.g. drive a REPL or send SIGINT. This executes arbitrary shell input and is permission-gated like bash.",promptSnippet:"Send stdin/keys to a live background bash session (REPL steering, ctrl+c, etc.)",parameters:bashInputSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot send input.`);let notes=[];if(typeof input.input=="string"){let submit=input.submit??input.input.length>0,result3=runtime.session.write(submit?`${input.input}\r`:input.input);if(!result3.ok)return errorResult(`Failed to write input: ${result3.note}`);notes.push(submit?"wrote input + Enter":"wrote input")}if(input.keys&&input.keys.length>0){let{data,unknown}=encodeKeys(input.keys);if(data.length>0){let result3=runtime.session.write(data);if(!result3.ok)return errorResult(`Failed to send keys: ${result3.note}`);notes.push(`sent ${input.keys.length-unknown.length} key(s)`)}unknown.length>0&&notes.push(`ignored unknown keys: ${unknown.join(", ")}`)}return notes.length===0?errorResult("Nothing to send: provide `input` and/or `keys`."):textResult2(`Sent to ${input.bash_id}: ${notes.join("; ")}.`)}}}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){this.#text=result3.content.filter(content=>content.type==="text"&&!isModelOnlyText(content)).map(content=>content.type==="text"?content.text:"").join(`
2100
+ `),this.#isPartial=options.isPartial,this.#expanded=options.expanded}render(width){return!this.#isPartial||this.#expanded?this.#text.split(`
2097
2101
  `):truncateToVisualLines(this.#text,OUTPUT_PREVIEW_LINES,Math.max(1,width)).visualLines.map(line=>line.trimEnd())}invalidate(){}};function renderBashOutputCall(args,theme2){return new Text(theme2.fg("toolTitle",theme2.bold(`bash_output ${args.bash_id}`)),0,0)}function renderMonitorCall(args,theme2){let label2=args.action==="rearm"?`monitor rearm ${args.bash_id??""}`.trimEnd():`monitor ${args.description??args.command??""}`.trimEnd();return new Text(theme2.fg("toolTitle",theme2.bold(label2)),0,0)}function renderBashOutputResult(result3,options,_theme,context){let component=context.lastComponent??new BashOutputResultComponent;return component.setResult(result3,options),component}var bashOutputSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),filter:typebox_exports.Optional(typebox_exports.String({description:"Only return output lines matching this regex."})),view:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("log"),typebox_exports.Literal("screen")],{description:"'log' returns new raw output (default); 'screen' returns the rendered xterm grid."}))});function statusLine(runtime){if(!runtime.exited)return"status: running";let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode;return code==null?`status: ${status}`:`status: ${status} exit_code: ${code}`}function applyFilter(text2,filter){if(!filter)return text2;let regex=safeRegExp(filter);return regex===null?text2:text2.split(`
2098
2102
  `).filter(line=>regex.test(line)).join(`
2099
2103
  `)}function screenView(runtime){return runtime.snapshot().visibleGrid.join(`
2100
2104
  `).replace(/\s+$/,"")}function createBashOutputTool(ctx){return{name:TERMINAL_OUTPUT_TOOL,label:"bash_output",description:"Read output from a background bash session without blocking: new output since the last read, the status line, or a rendered full-screen snapshot via view:'screen'. Pattern watches run through monitor; completion arrives as a notification carrying the exit code and output tail.",promptSnippet:"Peek at background bash session output (filter, screen view, status); watch patterns with monitor, completion arrives as a notification",parameters:bashOutputSchema,async execute(_toolCallId,input){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);let monitorEntry=ctx.monitorRegistry?.snapshot().find(entry=>entry.id===sessionId),muted=monitorEntry?.paused===!0,mutedDropped=muted?ctx.monitorRegistry?.mutedDropped(sessionId)??0:0,mutedNote="";muted&&(mutedNote=mutedDropped>0?`monitor muted \u2014 ${mutedDropped} line(s) dropped while muted; run monitor({ action: "rearm", bash_id: "${input.bash_id}" }) to resume.`:`monitor muted; run monitor({ action: "rearm", bash_id: "${input.bash_id}" }) to resume.`);let extra=monitorEntry?{details:{monitorMuted:muted,mutedDropped}}:void 0,prefix=mutedNote.length>0?`${mutedNote}
2101
2105
  `:"";if(input.view==="screen")return textResult2(`${prefix}${statusLine(runtime)}
2102
- ${screenView(runtime)}`,extra);let delta=runtime.readDelta(),formatted=formatTerminalToolOutput(applyFilter(delta.text,input.filter)),dropped=delta.droppedChars>0?`[${delta.droppedChars} earlier chars dropped]
2103
- `:"";return textResult2(`${prefix}${statusLine(runtime)}
2104
- ${dropped}${formatted.text||"(no new output)"}`,extra)},renderCall:renderBashOutputCall,renderResult:renderBashOutputResult}}var bashResizeSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),cols:typebox_exports.Number({description:"New PTY width in columns."}),rows:typebox_exports.Number({description:"New PTY height in rows."})});function valid(value2){return Number.isFinite(value2)&&value2>=1}function createBashResizeTool(ctx){return{name:TERMINAL_RESIZE_TOOL,label:"bash_resize",description:"Resize a live background bash session's PTY (cols x rows) so full-screen TUIs reflow. No-ops with a note under the pipe fallback.",promptSnippet:"Resize a background bash session's PTY so TUIs reflow",parameters:bashResizeSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot resize.`);if(!valid(input.cols)||!valid(input.rows))return errorResult("cols and rows must be finite integers >= 1.");let cols=Math.trunc(input.cols),rows=Math.trunc(input.rows),result3=runtime.session.resize(cols,rows);return runtime.resizeScreen(cols,rows),result3.ok?textResult2(`Resized ${input.bash_id} to ${cols}x${rows}.`):textResult2(`Resize note for ${input.bash_id}: ${result3.note}`)}}}var killBashSchema=typebox_exports.Object({bash_id:typebox_exports.Optional(typebox_exports.String({description:"Session id to tree-kill."})),all:typebox_exports.Optional(typebox_exports.Boolean({description:"Tree-kill every live background session."}))});function createKillBashTool(ctx){return{name:TERMINAL_KILL_TOOL,label:"kill_bash",description:"Terminate a background bash session (or all of them) and its process tree cleanly.",promptSnippet:"Tree-kill a background bash session (or all) with no orphans",parameters:killBashSchema,async execute(_toolCallId,input,_signal){if(input.all){let terminalCount=ctx.manager.size,fileCount=await ctx.monitorRegistry?.stopAllFiles()??0;return await ctx.manager.teardown(),textResult2(`Killed ${terminalCount+fileCount} session(s).`)}if(!input.bash_id)return errorResult("Provide `bash_id` or set `all:true`.");let sessionId=resolveTerminalId(ctx.manager,input.bash_id);return await ctx.monitorRegistry?.stopFile(sessionId)?textResult2(`Killed ${input.bash_id}.`):ctx.manager.get(sessionId)?(await ctx.manager.stop(sessionId),textResult2(`Killed ${input.bash_id}.`)):errorResult(`No terminal session found with id: ${input.bash_id}`)}}}import{resolve as resolve27}from"node:path";var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; max 5 per session; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension2(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}async function createMonitor(ctx,registry,input,execCtx){let filter;try{filter=compileFilter2(input.filter)}catch{return errorResult(`Invalid monitor filter regex: ${input.filter}`)}let cwd=resolve27(execCtx?.cwd??ctx.cwd),timeoutMs=input.persistent?void 0:resolveTimeoutMs(input.timeout_ms),deadlineMs=timeoutMs===void 0?null:Date.now()+timeoutMs,{id,runtime}=await spawnCommandSession(ctx,{command:input.command,cols:resolveDimension2(void 0,ctx.defaultCols||DEFAULT_COLS),rows:resolveDimension2(void 0,ctx.defaultRows||DEFAULT_ROWS),cwd,...timeoutMs===void 0?{}:{timeoutMs}});ctx.onMonitorRearmed?.(id);let monitorId=registry.register({id,description:input.description,runtime,filter,command:input.command,persistent:input.persistent===!0,deadlineMs,durabilityClass:input.persistent===!0?"restartable-command":"ephemeral",...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});return ctx.manager.bindMonitorId(monitorId,id),handMonitorSpec(manifestSessionKey(ctx),{monitorId,spec:{kind:"command",description:input.description,command:input.command,filter:input.filter,cwd,persistent:input.persistent===!0}}),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}var manifestWriters=new Map;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}function handMonitorSpec(sessionKey,registration){(sessionKey===void 0?void 0:manifestWriters.get(sessionKey))?.recordRegister(registration)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let sessionKey=manifestSessionKey(ctx),writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey);if(!(writer===void 0||writer.durableCount()<MAX_DURABLE_MONITORS))return errorResult(`Cannot start another persistent monitor: this session already holds ${MAX_DURABLE_MONITORS} durable monitors (the maximum). Stop one with kill_bash first.`)}function createMonitorTool(ctx){let fallbackRegistry,getRegistry=()=>{let sessionRegistry2=ctx.monitorRegistry;return sessionRegistry2||(fallbackRegistry??=new MonitorRegistry(event=>ctx.onMonitorEvent?.(event)),fallbackRegistry)};return{name:TERMINAL_MONITOR_TOOL,label:"monitor",description:"Subscribe to a change instead of polling. Pass command XOR path, never both: command watches a PTY session, injecting matching newline-terminated output lines (stderr merged) plus an exit summary; path natively watches one file and fires once, where create (the default) fires only when the file appears after registration, so use event modify for an existing file, and filter is rejected. Returns a bash_id immediately; peek with bash_output, stop with kill_bash.",promptSnippet:"Subscribe to a command's output or a file's create/modify event as injected events instead of polling",promptGuidelines:["Waiting on observable state (CI checks, builds, log patterns, deploys, a file landing) means a monitor, never a foreground sleep/poll loop.",'Waiting for one file to appear or change is the path branch: `monitor({ description, path, event? })` beats wrapping `test -f` in a shell poll loop; a file that already exists needs `event: "modify"`, since `create` only fires on appearance, and registration needs the parent directory to exist already \u2014 when the run creates that directory too, use the `command` branch instead.',"Shape the command for the events you need: one-shot gate = `until <cond>; do sleep 1; done; printf 'READY\\n'` with filter ^READY$; stream = `tail -n 0 -F <log> | grep --line-buffered <pat>` with persistent: true, then kill_bash.","Sleep loops belong INSIDE the monitor command, never in your turn: about to sleep, re-poll bash_output, or foreground-block on a long command means register a monitor and keep working."],parameters:monitorSchema,renderCall:renderMonitorCall,async execute(_toolCallId,input,_signal,_onUpdate,execCtx){let registry=getRegistry();if(input.action==="rearm"){if(input.bash_id===void 0||input.bash_id.length===0){let resumed=registry.resume();if(resumed.length===0)return textResult2("No paused monitors to re-arm.");ctx.onMonitorsResumed?.(resumed.map(monitor=>monitor.id));let total=resumed.reduce((sum,monitor)=>sum+monitor.mutedDropped,0);return textResult2(total>0?`Re-armed ${resumed.length} paused monitor(s) (${total} line(s) dropped while muted).`:`Re-armed ${resumed.length} paused monitor(s).`)}let bashId=resolveTerminalId(ctx.manager,input.bash_id),dropped=registry.mutedDropped(bashId),outcome=registry.rearm(bashId);return outcome==="not_found"?errorResult(`No active monitor found with id: ${bashId}`):outcome==="not_paused"?textResult2(`Monitor ${bashId} is not paused; no action taken.`):(ctx.onMonitorRearmed?.(bashId),textResult2(dropped>0?`Monitor ${bashId} re-armed (${dropped} line(s) dropped while muted).`:`Monitor ${bashId} re-armed.`))}let fileInput=isFileCreateInput(input),commandInput=isCreateInput(input);if(fileInput&&commandInput)return errorResult("monitor accepts either command or path, not both.");if(input.persistent===!0&&(fileInput||commandInput)){let refused=durableAdmissionError(ctx);if(refused)return refused}if(fileInput){if(input.filter!==void 0)return errorResult("Native file monitors do not support filter.");if(!ctx.monitorRegistry)return errorResult("Native file monitors require a lifecycle-owned monitor registry.");try{let approvedParent=input[APPROVED_MONITOR_PARENT],{id,monitorId}=await ctx.monitorRegistry.registerFile({description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),persistent:input.persistent===!0,deadlineMs:input.persistent===!0?null:Date.now()+resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,...approvedParent!==void 0?{approvedParent}:{},...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});ctx.manager.bindMonitorId(monitorId,id);let sessionKey=manifestSessionKey(ctx);return handMonitorSpec(sessionKey,{monitorId,spec:{kind:"file",description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,persistent:input.persistent===!0,...approvedParent!==void 0?{approvedParent}:{}}}),input.persistent===!0&&handFileCheckpoint(sessionKey,monitorId,ctx.monitorRegistry,id),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}catch(error2){return errorResult(error2 instanceof Error?error2.message:String(error2))}}return commandInput?createMonitor(ctx,registry,input,execCtx):errorResult("monitor requires description and command or path to start a watcher.")}}}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function terminalStateDir(ctx){let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute16(sessionDir)))return join53(sessionDir,"extensions","terminal")}function createBundle(state){return new TerminalSessionBundle({maxSessions:state.settings.maxSessions,scrollback:state.settings.scrollback})}function bundleSinks(pi,state){return{onMonitorEvent:event=>state.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event)},onMonitorState:(snapshot,transition=!0)=>{state.parked||state.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,paused:entry.paused,startedAtMs:entry.startedAtMs,command:entry.command,filter:entry.filter,persistent:entry.persistent,deadlineMs:entry.deadlineMs,fireCount:entry.fireCount,lastFiredAtMs:entry.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,startedAtMs:entry.startedAtMs}))}),state.manifestWriter&&state.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let writer=state.manifestWriter;if(writer)for(let entry of snapshot)state.recordedBackgroundIds.has(entry.id)||(state.recordedBackgroundIds.add(entry.id),writer.recordBackgroundStart(entry.id,entry.description??entry.id,entry.startedAtMs))},onBackgroundExit:(id,runtime)=>{state.recordedBackgroundIds.delete(id),state.manifestWriter&&state.manifestWriter.recordBackgroundExit(id),state.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state){let requireBundle=()=>(state.bundle||(state.bundle=createBundle(state),state.bundle.monitors.setParked(state.parked),state.bundle.bind(bundleSinks(pi,state))),state.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state.ctx?.cwd??process.cwd()},get shellPath(){return state.shellPath},get defaultCols(){return state.settings.defaultCols},get defaultRows(){return state.settings.defaultRows},get timeoutAction(){return state.settings.timeoutAction},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state.monitorNotifier?.resume(ids)}}function shouldStepAside(ctx){return isAnthropicBashEnabled()&&ctx?.model?.api==="anthropic-messages"}function syncToolset2(pi,state){let stepAside=shouldStepAside(state.ctx),active=new Set(pi.getActiveTools());if(stepAside){for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown||(state.ctx?.ui.notify("native Anthropic bash active \u2014 monitor sessions remain available","info"),state.noticeShown=!0)}else{active.add(TERMINAL_BASH_TOOL);for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown=!1}state.steppedAside=stepAside,pi.setActiveTools([...active])}function sendTerminalReminder(pi,state,sentence){getTerminalNotificationDelivery({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify})?.send(`<system-reminder>${sentence}</system-reminder>`)}function clauseWithDescriptions(label2,count,descriptions){return descriptions.length>0?`${label2} ${count} (${descriptions.join(", ")})`:`${label2} ${count}`}function restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions){let clauses=[];if(digest3.restored>0&&clauses.push(clauseWithDescriptions("restored",digest3.restored,restoredDescriptions)),digest3.lost>0&&clauses.push(clauseWithDescriptions("lost",digest3.lost,lostDescriptions)),digest3.expired>0&&clauses.push(`expired ${digest3.expired}`),digest3.muted>0&&clauses.push(`${digest3.muted} still muted`),clauses.length!==0)return`Terminal state after restart: ${clauses.join("; ")}.`}async function adoptPersistedTerminalState(pi,state,toolCtx,bundle,sessionKey){let ctx=state.ctx,dir=terminalStateDir(ctx);if(dir===void 0||!ctx?.sessionManager)return;let lease=await acquireTerminalLease({dir,encodedSessionId:sessionKey});if(!lease.acquired){sendTerminalReminder(pi,state,`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`);return}state.lease={path:lease.path,pid:lease.pid};let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer);let nowMs=Date.now(),outcomesById=new Map,registry=bundle.monitors,record7=handler=>async monitor=>{let result3=await handler(monitor);return outcomesById.set(monitor.monitorId,result3.outcome),(result3.outcome==="restored"||result3.outcome==="muted")&&(writer.adoptRestored(monitor),registry.adoptFireWindow(monitor.monitorId,monitor.fireWindow)),result3},restartableCommand=createRestartableCommandHandler({ctx:toolCtx,registry}),freshFileRuntimeId,checkpointedFile=createCheckpointedFileRestoreHandler({registry,writer,bindMonitorId:(monitorId,runtimeId)=>{freshFileRuntimeId=runtimeId,bundle.manager.bindMonitorId(monitorId,runtimeId)},now:()=>nowMs}),handlers={"restartable-command":record7(restartableCommand),"checkpointed-file":record7(async monitor=>{freshFileRuntimeId=void 0;let result3=await checkpointedFile(monitor);return result3.outcome!=="restored"||freshFileRuntimeId===void 0?result3:{...result3,outcome:reapplyPersistedMute(registry,monitor,freshFileRuntimeId)}})},digest3=await restoreTerminalState({manifest:writer.store,handlers,now:()=>nowMs}),manifest=null,unreadable=digest3.storeError;if(!unreadable)try{manifest=await writer.store.read()}catch{unreadable=!0}if(unreadable){sendTerminalReminder(pi,state,"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).");return}if(manifest===null)return;let restoredDescriptions=[],lostDescriptions=[];for(let monitor of manifest.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=nowMs)continue;let outcome=outcomesById.get(monitor.monitorId);outcome==="restored"?restoredDescriptions.push(monitor.description):(outcome===void 0||outcome==="lost")&&lostDescriptions.push(monitor.description)}for(let background of manifest.backgroundSessions)lostDescriptions.push(background.command);let sentence=restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions);sentence!==void 0&&sendTerminalReminder(pi,state,sentence)}function detachManifestWriter(state,sessionKey){state.manifestWriter=null,state.recordedBackgroundIds.clear(),sessionKey!==void 0&&unbindTerminalManifestWriter(sessionKey)}async function suspendAndFlushManifest(state,sessionKey){let writer=state.manifestWriter;writer&&state.bundle&&await writer.observeMonitorState(state.bundle.monitors.snapshot()),detachManifestWriter(state,sessionKey),writer&&await writer.recordShutdown()}function registerTerminalExtension(pi){let state={bundle:null,settings:TERMINAL_SETTINGS_DEFAULTS,notifier:null,monitorNotifier:null,statusTicker:new MonitorStatusTicker({render:status=>{let ctx=state.ctx;ctx?.ui.setStatus(MONITOR_STATUS_KEY,status===void 0||ctx.mode!=="tui"?status:ctx.ui.theme.bg("selectedBg",ctx.ui.theme.fg("text",status)))}}),ctx:void 0,shellPath:void 0,steppedAside:!1,noticeShown:!1,lease:null,manifestWriter:null,recordedBackgroundIds:new Set,parked:!1},toolCtx=buildToolContext(pi,state);pi.registerTool(createPtyBashTool(toolCtx)),pi.registerTool(createBashOutputTool(toolCtx)),pi.registerTool(createBashInputTool(toolCtx)),pi.registerTool(createBashResizeTool(toolCtx)),pi.registerTool(createKillBashTool(toolCtx)),pi.registerTool(createMonitorTool(toolCtx)),pi.on("session_start",async(event,ctx)=>{state.ctx=ctx;let settingsManager=SettingsManager.create(ctx.cwd);state.settings=loadTerminalSettings(settingsManager),state.shellPath=settingsManager.getShellPath(),state.notifier=new TerminalNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify}),state.monitorNotifier?.dispose(),state.monitorNotifier=new MonitorNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify,getSettings:()=>state.settings.monitor,pauseMonitors:ids=>state.bundle?.monitors.pause(ids)??[]});let sessionKey=sessionKeyOf(ctx);if(event.reason==="reload"){let claimed=sessionKey===void 0?void 0:claimParkedBundle(sessionKey);claimed&&(await state.bundle?.teardown(),state.bundle=claimed)}else sessionKey!==void 0&&await teardownParkedBundle(sessionKey),await state.bundle?.teardown(),state.bundle=createBundle(state);if(state.bundle??=createBundle(state),state.bundle.bind(bundleSinks(pi,state)),event.reason==="reload"){if(sessionKey!==void 0&&terminalStateDir(ctx)!==void 0){let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer)}}else sessionKey!==void 0&&await adoptPersistedTerminalState(pi,state,toolCtx,state.bundle,sessionKey);syncToolset2(pi,state)}),pi.on("session_parked",()=>{state.parked=!0,state.bundle?.monitors.setParked(!0),state.statusTicker.stop()}),pi.on("session_resumed",()=>{state.parked=!1,state.bundle?.monitors.setParked(!1),state.bundle&&state.statusTicker.sync(state.bundle.monitors.snapshot())}),pi.on("model_select",async(event,ctx)=>{state.ctx={...ctx,model:event.model},syncToolset2(pi,state)}),pi.on("input",event=>{if(event.source==="extension")return;state.monitorNotifier?.noteActivity();let resumed=state.bundle?.monitors.resume()??[];resumed.length>0&&state.monitorNotifier?.resume(resumed.map(monitor=>monitor.id))}),pi.on("tool_call",()=>{state.monitorNotifier?.noteActivity()}),pi.on("before_agent_start",async event=>{if(!state.steppedAside)return{systemPrompt:`${event.systemPrompt}
2106
+ ${screenView(runtime)}`,extra);let delta=runtime.readDelta(),formatted=formatTerminalToolOutput(applyFilter(delta.text,input.filter)),droppedNotice=delta.droppedChars>0?`[${delta.droppedChars} earlier chars dropped]`:void 0,dropped=droppedNotice===void 0?"":`${droppedNotice}
2107
+ `;return noticedResult(`${prefix}${statusLine(runtime)}
2108
+ ${dropped}${formatted.text||"(no new output)"}`,[droppedNotice,formatted.marker],extra)},renderCall:renderBashOutputCall,renderResult:renderBashOutputResult}}var bashResizeSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),cols:typebox_exports.Number({description:"New PTY width in columns."}),rows:typebox_exports.Number({description:"New PTY height in rows."})});function valid(value2){return Number.isFinite(value2)&&value2>=1}function createBashResizeTool(ctx){return{name:TERMINAL_RESIZE_TOOL,label:"bash_resize",description:"Resize a live background bash session's PTY (cols x rows) so full-screen TUIs reflow. No-ops with a note under the pipe fallback.",promptSnippet:"Resize a background bash session's PTY so TUIs reflow",parameters:bashResizeSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot resize.`);if(!valid(input.cols)||!valid(input.rows))return errorResult("cols and rows must be finite integers >= 1.");let cols=Math.trunc(input.cols),rows=Math.trunc(input.rows),result3=runtime.session.resize(cols,rows);return runtime.resizeScreen(cols,rows),result3.ok?textResult2(`Resized ${input.bash_id} to ${cols}x${rows}.`):textResult2(`Resize note for ${input.bash_id}: ${result3.note}`)}}}var killBashSchema=typebox_exports.Object({bash_id:typebox_exports.Optional(typebox_exports.String({description:"Session id to tree-kill."})),all:typebox_exports.Optional(typebox_exports.Boolean({description:"Tree-kill every live background session."}))});function createKillBashTool(ctx){return{name:TERMINAL_KILL_TOOL,label:"kill_bash",description:"Terminate a background bash session (or all of them) and its process tree cleanly.",promptSnippet:"Tree-kill a background bash session (or all) with no orphans",parameters:killBashSchema,async execute(_toolCallId,input,_signal){if(input.all){let terminalCount=ctx.manager.size,fileCount=await ctx.monitorRegistry?.stopAllFiles()??0;return await ctx.manager.teardown(),textResult2(`Killed ${terminalCount+fileCount} session(s).`)}if(!input.bash_id)return errorResult("Provide `bash_id` or set `all:true`.");let sessionId=resolveTerminalId(ctx.manager,input.bash_id);return await ctx.monitorRegistry?.stopFile(sessionId)?textResult2(`Killed ${input.bash_id}.`):ctx.manager.get(sessionId)?(await ctx.manager.stop(sessionId),textResult2(`Killed ${input.bash_id}.`)):errorResult(`No terminal session found with id: ${input.bash_id}`)}}}import{resolve as resolve27}from"node:path";var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; max 5 per session; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension2(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}async function createMonitor(ctx,registry,input,execCtx){let filter;try{filter=compileFilter2(input.filter)}catch{return errorResult(`Invalid monitor filter regex: ${input.filter}`)}let cwd=resolve27(execCtx?.cwd??ctx.cwd),timeoutMs=input.persistent?void 0:resolveTimeoutMs(input.timeout_ms),deadlineMs=timeoutMs===void 0?null:Date.now()+timeoutMs,{id,runtime}=await spawnCommandSession(ctx,{command:input.command,cols:resolveDimension2(void 0,ctx.defaultCols||DEFAULT_COLS),rows:resolveDimension2(void 0,ctx.defaultRows||DEFAULT_ROWS),cwd,...timeoutMs===void 0?{}:{timeoutMs}});ctx.onMonitorRearmed?.(id);let monitorId=registry.register({id,description:input.description,runtime,filter,command:input.command,persistent:input.persistent===!0,deadlineMs,durabilityClass:input.persistent===!0?"restartable-command":"ephemeral",...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});return ctx.manager.bindMonitorId(monitorId,id),handMonitorSpec(manifestSessionKey(ctx),{monitorId,spec:{kind:"command",description:input.description,command:input.command,filter:input.filter,cwd,persistent:input.persistent===!0}}),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}var manifestWriters=new Map;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}function handMonitorSpec(sessionKey,registration){(sessionKey===void 0?void 0:manifestWriters.get(sessionKey))?.recordRegister(registration)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let sessionKey=manifestSessionKey(ctx),writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey);if(!(writer===void 0||writer.durableCount()<MAX_DURABLE_MONITORS))return errorResult(`Cannot start another persistent monitor: this session already holds ${MAX_DURABLE_MONITORS} durable monitors (the maximum). Stop one with kill_bash first.`)}function createMonitorTool(ctx){let fallbackRegistry,getRegistry=()=>{let sessionRegistry2=ctx.monitorRegistry;return sessionRegistry2||(fallbackRegistry??=new MonitorRegistry(event=>ctx.onMonitorEvent?.(event)),fallbackRegistry)};return{name:TERMINAL_MONITOR_TOOL,label:"monitor",description:"Subscribe to a change instead of polling. Pass command XOR path, never both: command watches a PTY session, injecting matching newline-terminated output lines (stderr merged) plus an exit summary; path natively watches one file and fires once, where create (the default) fires only when the file appears after registration, so use event modify for an existing file, and filter is rejected. Returns a bash_id immediately; peek with bash_output, stop with kill_bash.",promptSnippet:"Subscribe to a command's output or a file's create/modify event as injected events instead of polling",promptGuidelines:["Waiting on observable state (CI checks, builds, log patterns, deploys, a file landing) means a monitor, never a foreground sleep/poll loop.",'Waiting for one file to appear or change is the path branch: `monitor({ description, path, event? })` beats wrapping `test -f` in a shell poll loop; a file that already exists needs `event: "modify"`, since `create` only fires on appearance, and registration needs the parent directory to exist already \u2014 when the run creates that directory too, use the `command` branch instead.',"Shape the command for the events you need: one-shot gate = `until <cond>; do sleep 1; done; printf 'READY\\n'` with filter ^READY$; stream = `tail -n 0 -F <log> | grep --line-buffered <pat>` with persistent: true, then kill_bash.","Sleep loops belong INSIDE the monitor command, never in your turn: about to sleep, re-poll bash_output, or foreground-block on a long command means register a monitor and keep working."],parameters:monitorSchema,renderCall:renderMonitorCall,async execute(_toolCallId,input,_signal,_onUpdate,execCtx){let registry=getRegistry();if(input.action==="rearm"){if(input.bash_id===void 0||input.bash_id.length===0){let resumed=registry.resume();if(resumed.length===0)return textResult2("No paused monitors to re-arm.");ctx.onMonitorsResumed?.(resumed.map(monitor=>monitor.id));let total=resumed.reduce((sum,monitor)=>sum+monitor.mutedDropped,0);return textResult2(total>0?`Re-armed ${resumed.length} paused monitor(s) (${total} line(s) dropped while muted).`:`Re-armed ${resumed.length} paused monitor(s).`)}let bashId=resolveTerminalId(ctx.manager,input.bash_id),dropped=registry.mutedDropped(bashId),outcome=registry.rearm(bashId);return outcome==="not_found"?errorResult(`No active monitor found with id: ${bashId}`):outcome==="not_paused"?textResult2(`Monitor ${bashId} is not paused; no action taken.`):(ctx.onMonitorRearmed?.(bashId),textResult2(dropped>0?`Monitor ${bashId} re-armed (${dropped} line(s) dropped while muted).`:`Monitor ${bashId} re-armed.`))}let fileInput=isFileCreateInput(input),commandInput=isCreateInput(input);if(fileInput&&commandInput)return errorResult("monitor accepts either command or path, not both.");if(input.persistent===!0&&(fileInput||commandInput)){let refused=durableAdmissionError(ctx);if(refused)return refused}if(fileInput){if(input.filter!==void 0)return errorResult("Native file monitors do not support filter.");if(!ctx.monitorRegistry)return errorResult("Native file monitors require a lifecycle-owned monitor registry.");try{let approvedParent=input[APPROVED_MONITOR_PARENT],{id,monitorId}=await ctx.monitorRegistry.registerFile({description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),persistent:input.persistent===!0,deadlineMs:input.persistent===!0?null:Date.now()+resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,...approvedParent!==void 0?{approvedParent}:{},...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});ctx.manager.bindMonitorId(monitorId,id);let sessionKey=manifestSessionKey(ctx);return handMonitorSpec(sessionKey,{monitorId,spec:{kind:"file",description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,persistent:input.persistent===!0,...approvedParent!==void 0?{approvedParent}:{}}}),input.persistent===!0&&handFileCheckpoint(sessionKey,monitorId,ctx.monitorRegistry,id),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}catch(error2){return errorResult(error2 instanceof Error?error2.message:String(error2))}}return commandInput?createMonitor(ctx,registry,input,execCtx):errorResult("monitor requires description and command or path to start a watcher.")}}}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function terminalStateDir(ctx){let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute16(sessionDir)))return join53(sessionDir,"extensions","terminal")}function createBundle(state){return new TerminalSessionBundle({maxSessions:state.settings.maxSessions,scrollback:state.settings.scrollback})}function bundleSinks(pi,state){return{onMonitorEvent:event=>state.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event)},onMonitorState:(snapshot,transition=!0)=>{state.parked||state.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,paused:entry.paused,startedAtMs:entry.startedAtMs,command:entry.command,filter:entry.filter,persistent:entry.persistent,deadlineMs:entry.deadlineMs,fireCount:entry.fireCount,lastFiredAtMs:entry.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,startedAtMs:entry.startedAtMs}))}),state.manifestWriter&&state.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let writer=state.manifestWriter;if(writer)for(let entry of snapshot)state.recordedBackgroundIds.has(entry.id)||(state.recordedBackgroundIds.add(entry.id),writer.recordBackgroundStart(entry.id,entry.description??entry.id,entry.startedAtMs))},onBackgroundExit:(id,runtime)=>{state.recordedBackgroundIds.delete(id),state.manifestWriter&&state.manifestWriter.recordBackgroundExit(id),state.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state){let requireBundle=()=>(state.bundle||(state.bundle=createBundle(state),state.bundle.monitors.setParked(state.parked),state.bundle.bind(bundleSinks(pi,state))),state.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state.ctx?.cwd??process.cwd()},get shellPath(){return state.shellPath},get defaultCols(){return state.settings.defaultCols},get defaultRows(){return state.settings.defaultRows},get timeoutAction(){return state.settings.timeoutAction},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state.monitorNotifier?.resume(ids)}}function shouldStepAside(ctx){return isAnthropicBashEnabled()&&ctx?.model?.api==="anthropic-messages"}function syncToolset2(pi,state){let stepAside=shouldStepAside(state.ctx),active=new Set(pi.getActiveTools());if(stepAside){for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown||(state.ctx?.ui.notify("native Anthropic bash active \u2014 monitor sessions remain available","info"),state.noticeShown=!0)}else{active.add(TERMINAL_BASH_TOOL);for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown=!1}state.steppedAside=stepAside,pi.setActiveTools([...active])}function sendTerminalReminder(pi,state,sentence){getTerminalNotificationDelivery({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify})?.send(`<system-reminder>${sentence}</system-reminder>`)}function clauseWithDescriptions(label2,count,descriptions){return descriptions.length>0?`${label2} ${count} (${descriptions.join(", ")})`:`${label2} ${count}`}function restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions){let clauses=[];if(digest3.restored>0&&clauses.push(clauseWithDescriptions("restored",digest3.restored,restoredDescriptions)),digest3.lost>0&&clauses.push(clauseWithDescriptions("lost",digest3.lost,lostDescriptions)),digest3.expired>0&&clauses.push(`expired ${digest3.expired}`),digest3.muted>0&&clauses.push(`${digest3.muted} still muted`),clauses.length!==0)return`Terminal state after restart: ${clauses.join("; ")}.`}async function adoptPersistedTerminalState(pi,state,toolCtx,bundle,sessionKey){let ctx=state.ctx,dir=terminalStateDir(ctx);if(dir===void 0||!ctx?.sessionManager)return;let lease=await acquireTerminalLease({dir,encodedSessionId:sessionKey});if(!lease.acquired){sendTerminalReminder(pi,state,`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`);return}state.lease={path:lease.path,pid:lease.pid};let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer);let nowMs=Date.now(),outcomesById=new Map,registry=bundle.monitors,record7=handler=>async monitor=>{let result3=await handler(monitor);return outcomesById.set(monitor.monitorId,result3.outcome),(result3.outcome==="restored"||result3.outcome==="muted")&&(writer.adoptRestored(monitor),registry.adoptFireWindow(monitor.monitorId,monitor.fireWindow)),result3},restartableCommand=createRestartableCommandHandler({ctx:toolCtx,registry}),freshFileRuntimeId,checkpointedFile=createCheckpointedFileRestoreHandler({registry,writer,bindMonitorId:(monitorId,runtimeId)=>{freshFileRuntimeId=runtimeId,bundle.manager.bindMonitorId(monitorId,runtimeId)},now:()=>nowMs}),handlers={"restartable-command":record7(restartableCommand),"checkpointed-file":record7(async monitor=>{freshFileRuntimeId=void 0;let result3=await checkpointedFile(monitor);return result3.outcome!=="restored"||freshFileRuntimeId===void 0?result3:{...result3,outcome:reapplyPersistedMute(registry,monitor,freshFileRuntimeId)}})},digest3=await restoreTerminalState({manifest:writer.store,handlers,now:()=>nowMs}),manifest=null,unreadable=digest3.storeError;if(!unreadable)try{manifest=await writer.store.read()}catch{unreadable=!0}if(unreadable){sendTerminalReminder(pi,state,"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).");return}if(manifest===null)return;let restoredDescriptions=[],lostDescriptions=[];for(let monitor of manifest.monitors){if(monitor.expiresAt!==null&&monitor.expiresAt<=nowMs)continue;let outcome=outcomesById.get(monitor.monitorId);outcome==="restored"?restoredDescriptions.push(monitor.description):(outcome===void 0||outcome==="lost")&&lostDescriptions.push(monitor.description)}for(let background of manifest.backgroundSessions)lostDescriptions.push(background.command);let sentence=restoreDigestSentence(digest3,restoredDescriptions,lostDescriptions);sentence!==void 0&&sendTerminalReminder(pi,state,sentence)}function detachManifestWriter(state,sessionKey){state.manifestWriter=null,state.recordedBackgroundIds.clear(),sessionKey!==void 0&&unbindTerminalManifestWriter(sessionKey)}async function suspendAndFlushManifest(state,sessionKey){let writer=state.manifestWriter;writer&&state.bundle&&await writer.observeMonitorState(state.bundle.monitors.snapshot()),detachManifestWriter(state,sessionKey),writer&&await writer.recordShutdown()}function registerTerminalExtension(pi){let state={bundle:null,settings:TERMINAL_SETTINGS_DEFAULTS,notifier:null,monitorNotifier:null,statusTicker:new MonitorStatusTicker({render:status=>{let ctx=state.ctx;ctx?.ui.setStatus(MONITOR_STATUS_KEY,status===void 0||ctx.mode!=="tui"?status:ctx.ui.theme.bg("selectedBg",ctx.ui.theme.fg("text",status)))}}),ctx:void 0,shellPath:void 0,steppedAside:!1,noticeShown:!1,lease:null,manifestWriter:null,recordedBackgroundIds:new Set,parked:!1},toolCtx=buildToolContext(pi,state);pi.registerTool(createPtyBashTool(toolCtx)),pi.registerTool(createBashOutputTool(toolCtx)),pi.registerTool(createBashInputTool(toolCtx)),pi.registerTool(createBashResizeTool(toolCtx)),pi.registerTool(createKillBashTool(toolCtx)),pi.registerTool(createMonitorTool(toolCtx)),pi.on("session_start",async(event,ctx)=>{state.ctx=ctx;let settingsManager=SettingsManager.create(ctx.cwd);state.settings=loadTerminalSettings(settingsManager),state.shellPath=settingsManager.getShellPath(),state.notifier=new TerminalNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify}),state.monitorNotifier?.dispose(),state.monitorNotifier=new MonitorNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify,getSettings:()=>state.settings.monitor,pauseMonitors:ids=>state.bundle?.monitors.pause(ids)??[]});let sessionKey=sessionKeyOf(ctx);if(event.reason==="reload"){let claimed=sessionKey===void 0?void 0:claimParkedBundle(sessionKey);claimed&&(await state.bundle?.teardown(),state.bundle=claimed)}else sessionKey!==void 0&&await teardownParkedBundle(sessionKey),await state.bundle?.teardown(),state.bundle=createBundle(state);if(state.bundle??=createBundle(state),state.bundle.bind(bundleSinks(pi,state)),event.reason==="reload"){if(sessionKey!==void 0&&terminalStateDir(ctx)!==void 0){let writer=new TerminalManifestWriter({session:ctx.sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer)}}else sessionKey!==void 0&&await adoptPersistedTerminalState(pi,state,toolCtx,state.bundle,sessionKey);syncToolset2(pi,state)}),pi.on("session_parked",()=>{state.parked=!0,state.bundle?.monitors.setParked(!0),state.statusTicker.stop()}),pi.on("session_resumed",()=>{state.parked=!1,state.bundle?.monitors.setParked(!1),state.bundle&&state.statusTicker.sync(state.bundle.monitors.snapshot())}),pi.on("model_select",async(event,ctx)=>{state.ctx={...ctx,model:event.model},syncToolset2(pi,state)}),pi.on("input",event=>{if(event.source==="extension")return;state.monitorNotifier?.noteActivity();let resumed=state.bundle?.monitors.resume()??[];resumed.length>0&&state.monitorNotifier?.resume(resumed.map(monitor=>monitor.id))}),pi.on("tool_call",()=>{state.monitorNotifier?.noteActivity()}),pi.on("before_agent_start",async event=>{if(!state.steppedAside)return{systemPrompt:`${event.systemPrompt}
2105
2109
  ${buildTerminalPromptSection({evalOnly:isEvalOnlyRouting(pi)})}`}}),pi.on("session_shutdown",async(event,ctx)=>{state.monitorNotifier?.dispose(),state.monitorNotifier=null,state.notifier=null,state.statusTicker.stop();let sessionKey=sessionKeyOf(ctx)??sessionKeyOf(state.ctx);if(event.reason==="reload"&&state.bundle&&sessionKey!==void 0){detachManifestWriter(state,sessionKey),state.bundle.park(),await parkBundle(sessionKey,state.bundle);return}sessionKey!==void 0&&await suspendAndFlushManifest(state,sessionKey);let lease=state.lease;if(state.lease=null,lease!==null)await releaseTerminalLease(lease);else if(sessionKey!==void 0){let dir=terminalStateDir(ctx)??terminalStateDir(state.ctx);dir!==void 0&&await releaseTerminalLease({path:join53(dir,`${encodedSessionId(sessionKey)}.lease`),pid:process.pid})}let bundle=state.bundle;state.bundle=null,await bundle?.teardown(),sessionKey!==void 0&&await teardownParkedBundle(sessionKey)})}var extension_default2=registerTerminalExtension;import{readFile as readFile15,writeFile as writeFile11}from"node:fs/promises";import{platform as platform3}from"node:os";import{spawn as spawn6}from"node:child_process";function runClipboardCommand(command,args,options){return new Promise(resolve42=>{let child=spawn6(command,args,{stdio:["pipe",options?.input===void 0?"pipe":"ignore","ignore"],windowsHide:!0}),chunks=[],length=0,settled=!1,finish=result3=>{settled||(settled=!0,clearTimeout(timer),resolve42(result3))},abort=()=>{child.kill("SIGKILL"),child.stdout?.destroy(),child.stdin?.destroy(),finish(void 0)},timer=setTimeout(abort,options?.timeoutMs??3e3);child.on("error",()=>finish(void 0)),child.on("close",code=>{settled||finish(code===0?Buffer.concat(chunks,length):void 0)}),child.stdout?.on("data",chunk=>{settled||(length+=chunk.length,length>(options?.maxBufferBytes??50*1024*1024)?abort():chunks.push(chunk))}),child.stdin?.on("error",()=>{}),child.stdin?.end(options?.input)})}var MAX_OSC52_ENCODED_LENGTH=1e5;function isRemoteSession(env=process.env){return!!(env.SSH_CONNECTION||env.SSH_CLIENT||env.MOSH_CONNECTION)}function emitOsc52(text2){let encoded=Buffer.from(text2).toString("base64");return encoded.length>MAX_OSC52_ENCODED_LENGTH?!1:(process.stdout.write(`\x1B]52;c;${encoded}\x07`),!0)}async function readClipboardText(){if(platform3()==="linux"){let commands=[];process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-get",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-paste",["--no-newline","--type","text"]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard","-out"]],["xsel",["--clipboard","--output"]]);for(let[command,args]of commands){let bytes=await runClipboardCommand(command,args,{timeoutMs:5e3});if(bytes!==void 0)return bytes.toString("utf8")||null}}try{return await getNativeClipboard()?.getText()||null}catch{return null}}async function copyToClipboard(text2){let p=platform3(),copied=!1;if(p!=="linux")try{let clipboard=getNativeClipboard();clipboard?.setText&&(await clipboard.setText(text2),copied=!0)}catch{}if(!copied){let commands=[];p==="darwin"?commands.push(["pbcopy",[]]):p==="win32"?commands.push(["clip",[]]):(process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-set",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-copy",[]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard"]],["xsel",["--clipboard","--input"]]));for(let[command,args]of commands)if(await runClipboardCommand(command,args,{input:text2,timeoutMs:5e3})!==void 0){copied=!0;break}}if((isRemoteSession()||!copied)&&(copied=emitOsc52(text2)||copied),!copied)throw new Error("Failed to copy to clipboard")}import{isAbsolute as isAbsolute17,resolve as resolve28}from"node:path";var STATUS_TO_MARKER={pending:" ",in_progress:"/",completed:"x",abandoned:"-"},MARKER_TO_STATUS={" ":"pending","":"pending",x:"completed",X:"completed","/":"in_progress",">":"in_progress","-":"abandoned","~":"abandoned"},DEFAULT_TODO_MARKDOWN_FILE="TODO.md";function resolveTodoMarkdownPath(input,cwd){let raw=input.trim().replace(/^["']|["']$/g,"")||DEFAULT_TODO_MARKDOWN_FILE;return isAbsolute17(raw)?raw:resolve28(cwd,raw)}function phasesToMarkdown(phases){if(phases.length===0)return`# ${DEFAULT_INIT_PHASE}
2106
2110
  `;let out=[];for(let index=0;index<phases.length;index+=1){index>0&&out.push(""),out.push(`# ${phases[index].name}`);for(let task of phases[index].tasks)out.push(`- [${STATUS_TO_MARKER[task.status]}] ${task.content}`)}return`${out.join(`
2107
2111
  `)}
@@ -2189,9 +2193,8 @@ ${TASK_MANAGEMENT_SECTION}`})),registerTodoTool(pi,{getCurrentPhases,setCurrentP
2189
2193
  `),0,0)}let lines=[header2,theme2.fg("dim",`URL: ${shorten3(details.finalUrl,URL_BUDGET)}`),theme2.fg("dim",`Content-Type: ${details.contentType||"unknown"}`),"",...collectLines(text2,24).map(line=>theme2.fg("toolOutput",truncateToWidth(line,PREVIEW_WIDTH)))];return new Text(lines.join(`
2190
2194
  `),0,0)}function collectLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
2191
2195
  `,start);if(newlineIndex===-1){lines.push(text2.slice(start));break}lines.push(text2.slice(start,newlineIndex)),start=newlineIndex+1}return lines}function collectNonEmptyTrimmedLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
2192
- `,start),line=(newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex)).trim();if(line.length>0&&lines.push(line),newlineIndex===-1)break;start=newlineIndex+1}return lines}function parseWebfetchArgs(args){if(typeof args!="object"||args===null)return{url:""};let webfetchArgs={url:"url"in args&&typeof args.url=="string"?args.url:""};return"format"in args&&typeof args.format=="string"&&(webfetchArgs.format=args.format),"timeout"in args&&typeof args.timeout=="number"&&(webfetchArgs.timeout=args.timeout),webfetchArgs}function formatProgress2(details){let url=shorten3(details.url,URL_BUDGET);if(details.phase==="downloading"){let downloaded=formatBytes(details.bytesRead??0),total=details.totalBytes===void 0?"":` / ${formatBytes(details.totalBytes)}`;return`Downloading ${url}: ${downloaded}${total}`}return details.phase==="converting"?`Converting ${url} to ${details.format}`:`Fetching ${url} as ${details.format} (${details.timeoutSeconds}s)`}function isWebfetchProgressDetails(details){return typeof details=="object"&&details!==null&&"phase"in details&&(details.phase==="fetching"||details.phase==="downloading"||details.phase==="converting")}function isWebfetchDetails(details){return typeof details=="object"&&details!==null&&"status"in details&&typeof details.status=="number"}function previewText(text2,theme2){let lines=collectNonEmptyTrimmedLines(text2,PREVIEW_LINES);return lines.length===0?[theme2.fg("dim"," empty response")]:lines.map(line=>theme2.fg("toolOutput",` ${truncateToWidth(line,PREVIEW_WIDTH)}`))}function shorten3(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)} KB`:`${(bytes/(1024*1024)).toFixed(1)} MB`}var loadContentModule=()=>import("./content-IWCEHYXU.js");async function htmlToMarkdown(html,url){return(await loadContentModule()).htmlToMarkdown(html,url)}async function htmlToText(html,url){return(await loadContentModule()).htmlToText(html,url)}var import_undici=__toESM(require_undici(),1);var InvalidWebfetchUrlError=class extends Error{constructor(message){super(message),this.name="InvalidWebfetchUrlError"}},WebfetchTimeoutError=class extends Error{constructor(message){super(message),this.name="WebfetchTimeoutError"}},WebfetchResponseTooLargeError=class extends Error{constructor(message){super(message),this.name="WebfetchResponseTooLargeError"}},WebfetchAbortError=class extends Error{constructor(message){super(message),this.name="WebfetchAbortError"}};async function discardBody(body,maxBytes,signal){body.on?.("error",()=>{});try{if(typeof body.dump=="function"){await body.dump(signal?{limit:1024,signal}:{limit:1024});return}await drainBody(body,maxBytes,signal)}catch{}finally{body.destroy()}}async function drainBody(body,maxBytes,signal){let drained=0,iterator=body[Symbol.asyncIterator]();for(;;){let result3=await nextChunk(iterator,signal);if(!result3||result3.done||(drained+=toUint8Array(result3.value).length,drained>maxBytes))return}}async function nextChunk(iterator,signal){if(!signal)return iterator.next();if(signal.aborted)return;let resolveAbort=()=>{},aborted=new Promise(resolve42=>{resolveAbort=()=>resolve42(void 0)}),onAbort=()=>resolveAbort();signal.addEventListener("abort",onAbort,{once:!0});try{return await Promise.race([iterator.next(),aborted])}finally{signal.removeEventListener("abort",onAbort)}}function toUint8Array(chunk){if(chunk instanceof Uint8Array)return chunk;if(typeof chunk=="string")return new TextEncoder().encode(chunk);throw new Error("Unexpected response body chunk")}var MAX_RESPONSE_SIZE_BYTES=5*1024*1024,DEFAULT_TIMEOUT_SECONDS=30,MAX_TIMEOUT_SECONDS2=120,MAX_REDIRECTS=20,BROWSER_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",CHROME_MAJOR_VERSION="143",REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function fetchUrl(options){validateUrl(options.url);let timeoutSeconds=clampTimeout(options.timeoutSeconds),timeoutMs=timeoutSeconds*1e3,controller=new AbortController,timeout=setTimeout(()=>controller.abort(new WebfetchTimeoutError(`Request timed out after ${timeoutSeconds}s`)),timeoutMs),removeAbortForwarder=forwardAbort(options.signal,controller);try{let response=await requestUrl({url:options.url,format:options.format,signal:controller.signal,timeoutMs});return await readHttpResponse(response,controller.signal,options.onProgress)}finally{clearTimeout(timeout),removeAbortForwarder()}}function validateUrl(url){if(!url.startsWith("http://")&&!url.startsWith("https://"))throw new InvalidWebfetchUrlError("URL must start with http:// or https://");try{new URL(url)}catch{throw new InvalidWebfetchUrlError(`Invalid URL: ${url}`)}}function clampTimeout(timeoutSeconds){return timeoutSeconds===void 0||!Number.isFinite(timeoutSeconds)||timeoutSeconds<=0?DEFAULT_TIMEOUT_SECONDS:Math.min(Math.ceil(timeoutSeconds),MAX_TIMEOUT_SECONDS2)}function buildAcceptHeader(format2){switch(format2){case"markdown":return"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";case"text":return"text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";case"html":return"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"}}function buildHeaders2(format2){return{Accept:buildAcceptHeader(format2),"Accept-Language":"en-US,en;q=0.9","Sec-CH-UA":`"Google Chrome";v="${CHROME_MAJOR_VERSION}", "Chromium";v="${CHROME_MAJOR_VERSION}", "Not A(Brand";v="24"`,"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":BROWSER_USER_AGENT}}async function requestUrl(options){let headers=buildHeaders2(options.format),currentUrl=options.url;for(let redirectCount=0;redirectCount<=MAX_REDIRECTS;redirectCount+=1){let response=await(0,import_undici.request)(currentUrl,{method:"GET",headers,signal:options.signal,headersTimeout:options.timeoutMs,bodyTimeout:options.timeoutMs});if(!REDIRECT_STATUSES.has(response.statusCode))return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};let location=getHeader(response.headers,"location");if(!location)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};if(redirectCount===MAX_REDIRECTS)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,options.signal),currentUrl=new URL(location,currentUrl).toString()}throw new WebfetchAbortError("Redirect resolution aborted")}async function readHttpResponse(response,signal,onProgress){await rejectOversizedContentLength(response,signal);let body=await readResponseBody(response,signal,onProgress);return{url:response.url,status:response.status,statusText:response.statusText,contentType:getHeader(response.headers,"content-type"),bytes:body.length,body,truncated:body.length===MAX_RESPONSE_SIZE_BYTES}}async function rejectOversizedContentLength(response,signal){let contentLength=getHeader(response.headers,"content-length");if(contentLength&&Number.parseInt(contentLength,10)>MAX_RESPONSE_SIZE_BYTES)throw await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,signal),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)")}function getHeader(headers,name){let value2=headers[name.toLowerCase()];return Array.isArray(value2)?value2.join(", "):value2??""}async function readResponseBody(response,signal,onProgress){let chunks=[],totalBytes=parseContentLength(response),total=0;try{for await(let chunk of response.body){if(signal.aborted)throw response.body.destroy(),new WebfetchAbortError("Request aborted");let bytes=toUint8Array(chunk);if(chunks.push(bytes),total+=bytes.length,total>MAX_RESPONSE_SIZE_BYTES)throw response.body.destroy(),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)");onProgress?.(total,totalBytes)}}catch(error2){throw signal.aborted?new WebfetchAbortError("Request aborted"):error2}let body=new Uint8Array(total),offset=0;for(let chunk of chunks)body.set(chunk,offset),offset+=chunk.length;return body}function parseContentLength(response){let contentLength=getHeader(response.headers,"content-length");if(contentLength==="")return;let parsed=Number.parseInt(contentLength,10);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0}function forwardAbort(signal,controller){if(!signal)return()=>{};if(signal.aborted)return controller.abort(signal.reason),()=>{};let listener=()=>controller.abort(signal.reason);return signal.addEventListener("abort",listener,{once:!0}),()=>signal.removeEventListener("abort",listener)}var WEBFETCH_FORMATS=["markdown","text","html"],Params2=typebox_exports.Object({url:typebox_exports.String({description:"The URL to fetch content from"}),format:typebox_exports.Optional(StringEnum(["markdown","text","html"],{description:"The format to return the content in. Defaults to markdown."})),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Optional timeout in seconds. Maximum 120."}))}),webfetch={name:"webfetch",label:"Web Fetch",description:"Fetches content from a URL and returns it as markdown, plain text, or HTML. Network use is bounded by timeout and response size limits.",promptSnippet:"webfetch: retrieve URL content as markdown, text, or html",promptGuidelines:["Use webfetch when a specific URL must be retrieved.","Prefer markdown format unless raw HTML or plain text is explicitly needed.","The tool is read-only and does not modify files."],parameters:Params2,async execute(_toolCallId,params,signal,onUpdate,_ctx){let format2=parseWebfetchFormat(params.format),timeoutSeconds=clampTimeout(params.timeout),startedAt=Date.now(),progress={activity:`fetching ${params.url}`,startedAt,maxWaitMs:timeoutSeconds*1e3},downloadedTotalBytes,emitProgress=details2=>{onUpdate?.({content:[{type:"text",text:`Fetching ${params.url} as ${format2} (timeout ${timeoutSeconds}s)`}],details:details2})};emitProgress({phase:"fetching",url:params.url,format:format2,timeoutSeconds,progress});let fetched=await fetchUrl({url:params.url,format:format2,timeoutSeconds,...signal===void 0?{}:{signal},onProgress:(bytesRead,totalBytes)=>{downloadedTotalBytes=totalBytes,emitProgress({phase:"downloading",url:params.url,format:format2,timeoutSeconds,bytesRead,...totalBytes===void 0?{}:{totalBytes},progress})}}),raw=new TextDecoder().decode(fetched.body),contentType=fetched.contentType.toLowerCase();emitProgress({phase:"converting",url:params.url,format:format2,timeoutSeconds,bytesRead:fetched.bytes,...downloadedTotalBytes===void 0?{}:{totalBytes:downloadedTotalBytes},progress});let isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),text2=raw,converted=!1;isHtml&&format2==="markdown"?(text2=await htmlToMarkdown(raw,fetched.url),converted=!0):isHtml&&format2==="text"&&(text2=await htmlToText(raw,fetched.url),converted=!0);let capped=capWebfetchOutput(text2),details={url:params.url,finalUrl:fetched.url,format:format2,status:fetched.status,statusText:fetched.statusText,contentType:fetched.contentType,bytes:fetched.bytes,timeoutSeconds,converted,truncated:fetched.truncated,outputTruncated:capped.truncated,outputBytes:capped.outputBytes,outputTotalBytes:capped.totalBytes};return{content:[{type:"text",text:capped.text}],details}}};function parseWebfetchFormat(value2){if(value2===void 0)return"markdown";for(let format2 of WEBFETCH_FORMATS)if(value2===format2)return format2;return"markdown"}var DEFAULT_OUTPUT_MAX_BYTES=50*1024;function capWebfetchOutput(text2){let totalBytes=Buffer.byteLength(text2,"utf-8");if(totalBytes<=DEFAULT_OUTPUT_MAX_BYTES)return{text:text2,truncated:!1,outputBytes:totalBytes,totalBytes};let head=takeHeadBytes(text2,DEFAULT_OUTPUT_MAX_BYTES),outputBytes=Buffer.byteLength(head,"utf-8"),notice2=`
2193
-
2194
- [Output truncated: ${formatByteSize(outputBytes)} of ${formatByteSize(totalBytes)} shown (${formatByteSize(DEFAULT_OUTPUT_MAX_BYTES)} limit). Re-fetch a more specific URL or use web_search for targeted content.]`;return{text:head+notice2,truncated:!0,outputBytes,totalBytes}}function takeHeadBytes(text2,maxBytes){let lines=[],usedBytes=0,start=0;for(;start<=text2.length;){let newlineIndex=text2.indexOf(`
2196
+ `,start),line=(newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex)).trim();if(line.length>0&&lines.push(line),newlineIndex===-1)break;start=newlineIndex+1}return lines}function parseWebfetchArgs(args){if(typeof args!="object"||args===null)return{url:""};let webfetchArgs={url:"url"in args&&typeof args.url=="string"?args.url:""};return"format"in args&&typeof args.format=="string"&&(webfetchArgs.format=args.format),"timeout"in args&&typeof args.timeout=="number"&&(webfetchArgs.timeout=args.timeout),webfetchArgs}function formatProgress2(details){let url=shorten3(details.url,URL_BUDGET);if(details.phase==="downloading"){let downloaded=formatBytes(details.bytesRead??0),total=details.totalBytes===void 0?"":` / ${formatBytes(details.totalBytes)}`;return`Downloading ${url}: ${downloaded}${total}`}return details.phase==="converting"?`Converting ${url} to ${details.format}`:`Fetching ${url} as ${details.format} (${details.timeoutSeconds}s)`}function isWebfetchProgressDetails(details){return typeof details=="object"&&details!==null&&"phase"in details&&(details.phase==="fetching"||details.phase==="downloading"||details.phase==="converting")}function isWebfetchDetails(details){return typeof details=="object"&&details!==null&&"status"in details&&typeof details.status=="number"}function previewText(text2,theme2){let lines=collectNonEmptyTrimmedLines(text2,PREVIEW_LINES);return lines.length===0?[theme2.fg("dim"," empty response")]:lines.map(line=>theme2.fg("toolOutput",` ${truncateToWidth(line,PREVIEW_WIDTH)}`))}function shorten3(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)} KB`:`${(bytes/(1024*1024)).toFixed(1)} MB`}var loadContentModule=()=>import("./content-IWCEHYXU.js");async function htmlToMarkdown(html,url){return(await loadContentModule()).htmlToMarkdown(html,url)}async function htmlToText(html,url){return(await loadContentModule()).htmlToText(html,url)}var import_undici=__toESM(require_undici(),1);var InvalidWebfetchUrlError=class extends Error{constructor(message){super(message),this.name="InvalidWebfetchUrlError"}},WebfetchTimeoutError=class extends Error{constructor(message){super(message),this.name="WebfetchTimeoutError"}},WebfetchResponseTooLargeError=class extends Error{constructor(message){super(message),this.name="WebfetchResponseTooLargeError"}},WebfetchAbortError=class extends Error{constructor(message){super(message),this.name="WebfetchAbortError"}};async function discardBody(body,maxBytes,signal){body.on?.("error",()=>{});try{if(typeof body.dump=="function"){await body.dump(signal?{limit:1024,signal}:{limit:1024});return}await drainBody(body,maxBytes,signal)}catch{}finally{body.destroy()}}async function drainBody(body,maxBytes,signal){let drained=0,iterator=body[Symbol.asyncIterator]();for(;;){let result3=await nextChunk(iterator,signal);if(!result3||result3.done||(drained+=toUint8Array(result3.value).length,drained>maxBytes))return}}async function nextChunk(iterator,signal){if(!signal)return iterator.next();if(signal.aborted)return;let resolveAbort=()=>{},aborted=new Promise(resolve42=>{resolveAbort=()=>resolve42(void 0)}),onAbort=()=>resolveAbort();signal.addEventListener("abort",onAbort,{once:!0});try{return await Promise.race([iterator.next(),aborted])}finally{signal.removeEventListener("abort",onAbort)}}function toUint8Array(chunk){if(chunk instanceof Uint8Array)return chunk;if(typeof chunk=="string")return new TextEncoder().encode(chunk);throw new Error("Unexpected response body chunk")}var MAX_RESPONSE_SIZE_BYTES=5*1024*1024,DEFAULT_TIMEOUT_SECONDS=30,MAX_TIMEOUT_SECONDS2=120,MAX_REDIRECTS=20,BROWSER_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",CHROME_MAJOR_VERSION="143",REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function fetchUrl(options){validateUrl(options.url);let timeoutSeconds=clampTimeout(options.timeoutSeconds),timeoutMs=timeoutSeconds*1e3,controller=new AbortController,timeout=setTimeout(()=>controller.abort(new WebfetchTimeoutError(`Request timed out after ${timeoutSeconds}s`)),timeoutMs),removeAbortForwarder=forwardAbort(options.signal,controller);try{let response=await requestUrl({url:options.url,format:options.format,signal:controller.signal,timeoutMs});return await readHttpResponse(response,controller.signal,options.onProgress)}finally{clearTimeout(timeout),removeAbortForwarder()}}function validateUrl(url){if(!url.startsWith("http://")&&!url.startsWith("https://"))throw new InvalidWebfetchUrlError("URL must start with http:// or https://");try{new URL(url)}catch{throw new InvalidWebfetchUrlError(`Invalid URL: ${url}`)}}function clampTimeout(timeoutSeconds){return timeoutSeconds===void 0||!Number.isFinite(timeoutSeconds)||timeoutSeconds<=0?DEFAULT_TIMEOUT_SECONDS:Math.min(Math.ceil(timeoutSeconds),MAX_TIMEOUT_SECONDS2)}function buildAcceptHeader(format2){switch(format2){case"markdown":return"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";case"text":return"text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";case"html":return"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"}}function buildHeaders2(format2){return{Accept:buildAcceptHeader(format2),"Accept-Language":"en-US,en;q=0.9","Sec-CH-UA":`"Google Chrome";v="${CHROME_MAJOR_VERSION}", "Chromium";v="${CHROME_MAJOR_VERSION}", "Not A(Brand";v="24"`,"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":BROWSER_USER_AGENT}}async function requestUrl(options){let headers=buildHeaders2(options.format),currentUrl=options.url;for(let redirectCount=0;redirectCount<=MAX_REDIRECTS;redirectCount+=1){let response=await(0,import_undici.request)(currentUrl,{method:"GET",headers,signal:options.signal,headersTimeout:options.timeoutMs,bodyTimeout:options.timeoutMs});if(!REDIRECT_STATUSES.has(response.statusCode))return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};let location=getHeader(response.headers,"location");if(!location)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};if(redirectCount===MAX_REDIRECTS)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,options.signal),currentUrl=new URL(location,currentUrl).toString()}throw new WebfetchAbortError("Redirect resolution aborted")}async function readHttpResponse(response,signal,onProgress){await rejectOversizedContentLength(response,signal);let body=await readResponseBody(response,signal,onProgress);return{url:response.url,status:response.status,statusText:response.statusText,contentType:getHeader(response.headers,"content-type"),bytes:body.length,body,truncated:body.length===MAX_RESPONSE_SIZE_BYTES}}async function rejectOversizedContentLength(response,signal){let contentLength=getHeader(response.headers,"content-length");if(contentLength&&Number.parseInt(contentLength,10)>MAX_RESPONSE_SIZE_BYTES)throw await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,signal),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)")}function getHeader(headers,name){let value2=headers[name.toLowerCase()];return Array.isArray(value2)?value2.join(", "):value2??""}async function readResponseBody(response,signal,onProgress){let chunks=[],totalBytes=parseContentLength(response),total=0;try{for await(let chunk of response.body){if(signal.aborted)throw response.body.destroy(),new WebfetchAbortError("Request aborted");let bytes=toUint8Array(chunk);if(chunks.push(bytes),total+=bytes.length,total>MAX_RESPONSE_SIZE_BYTES)throw response.body.destroy(),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)");onProgress?.(total,totalBytes)}}catch(error2){throw signal.aborted?new WebfetchAbortError("Request aborted"):error2}let body=new Uint8Array(total),offset=0;for(let chunk of chunks)body.set(chunk,offset),offset+=chunk.length;return body}function parseContentLength(response){let contentLength=getHeader(response.headers,"content-length");if(contentLength==="")return;let parsed=Number.parseInt(contentLength,10);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0}function forwardAbort(signal,controller){if(!signal)return()=>{};if(signal.aborted)return controller.abort(signal.reason),()=>{};let listener=()=>controller.abort(signal.reason);return signal.addEventListener("abort",listener,{once:!0}),()=>signal.removeEventListener("abort",listener)}var WEBFETCH_FORMATS=["markdown","text","html"],Params2=typebox_exports.Object({url:typebox_exports.String({description:"The URL to fetch content from"}),format:typebox_exports.Optional(StringEnum(["markdown","text","html"],{description:"The format to return the content in. Defaults to markdown."})),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Optional timeout in seconds. Maximum 120."}))}),webfetch={name:"webfetch",label:"Web Fetch",description:"Fetches content from a URL and returns it as markdown, plain text, or HTML. Network use is bounded by timeout and response size limits.",promptSnippet:"webfetch: retrieve URL content as markdown, text, or html",promptGuidelines:["Use webfetch when a specific URL must be retrieved.","Prefer markdown format unless raw HTML or plain text is explicitly needed.","The tool is read-only and does not modify files."],parameters:Params2,async execute(_toolCallId,params,signal,onUpdate,_ctx){let format2=parseWebfetchFormat(params.format),timeoutSeconds=clampTimeout(params.timeout),startedAt=Date.now(),progress={activity:`fetching ${params.url}`,startedAt,maxWaitMs:timeoutSeconds*1e3},downloadedTotalBytes,emitProgress=details2=>{onUpdate?.({content:[{type:"text",text:`Fetching ${params.url} as ${format2} (timeout ${timeoutSeconds}s)`}],details:details2})};emitProgress({phase:"fetching",url:params.url,format:format2,timeoutSeconds,progress});let fetched=await fetchUrl({url:params.url,format:format2,timeoutSeconds,...signal===void 0?{}:{signal},onProgress:(bytesRead,totalBytes)=>{downloadedTotalBytes=totalBytes,emitProgress({phase:"downloading",url:params.url,format:format2,timeoutSeconds,bytesRead,...totalBytes===void 0?{}:{totalBytes},progress})}}),raw=new TextDecoder().decode(fetched.body),contentType=fetched.contentType.toLowerCase();emitProgress({phase:"converting",url:params.url,format:format2,timeoutSeconds,bytesRead:fetched.bytes,...downloadedTotalBytes===void 0?{}:{totalBytes:downloadedTotalBytes},progress});let isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),text2=raw,converted=!1;isHtml&&format2==="markdown"?(text2=await htmlToMarkdown(raw,fetched.url),converted=!0):isHtml&&format2==="text"&&(text2=await htmlToText(raw,fetched.url),converted=!0);let capped=capWebfetchOutput(text2),details={url:params.url,finalUrl:fetched.url,format:format2,status:fetched.status,statusText:fetched.statusText,contentType:fetched.contentType,bytes:fetched.bytes,timeoutSeconds,converted,truncated:fetched.truncated,outputTruncated:capped.truncated,outputBytes:capped.outputBytes,outputTotalBytes:capped.totalBytes},content=[{type:"text",text:capped.notice===void 0?capped.text:`${capped.text}
2197
+ `}];return capped.notice!==void 0&&content.push(modelOnlyText(capped.notice)),{content,details}}};function parseWebfetchFormat(value2){if(value2===void 0)return"markdown";for(let format2 of WEBFETCH_FORMATS)if(value2===format2)return format2;return"markdown"}var DEFAULT_OUTPUT_MAX_BYTES=50*1024;function capWebfetchOutput(text2){let totalBytes=Buffer.byteLength(text2,"utf-8");if(totalBytes<=DEFAULT_OUTPUT_MAX_BYTES)return{text:text2,truncated:!1,outputBytes:totalBytes,totalBytes};let head=takeHeadBytes(text2,DEFAULT_OUTPUT_MAX_BYTES),outputBytes=Buffer.byteLength(head,"utf-8"),notice2=`[Output truncated: ${formatByteSize(outputBytes)} of ${formatByteSize(totalBytes)} shown (${formatByteSize(DEFAULT_OUTPUT_MAX_BYTES)} limit). Re-fetch a more specific URL or use web_search for targeted content.]`;return{text:head,notice:notice2,truncated:!0,outputBytes,totalBytes}}function takeHeadBytes(text2,maxBytes){let lines=[],usedBytes=0,start=0;for(;start<=text2.length;){let newlineIndex=text2.indexOf(`
2195
2198
  `,start),line=newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex),lineBytes=Buffer.byteLength(line,"utf-8")+(lines.length>0?1:0);if(usedBytes+lineBytes>maxBytes||(lines.push(line),usedBytes+=lineBytes,newlineIndex===-1))break;start=newlineIndex+1}return lines.length===0?sliceUtf8Head(text2,maxBytes):lines.join(`
2196
2199
  `)}function sliceUtf8Head(value2,maxBytes){let buffer=Buffer.from(value2,"utf-8");if(buffer.length<=maxBytes)return value2;let decoded=new TextDecoder("utf-8").decode(buffer.subarray(0,maxBytes));return decoded.endsWith("\uFFFD")?decoded.slice(0,-1):decoded}function formatByteSize(bytes){return bytes<1024?`${bytes}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(1)}MB`}var ENABLE_ENV4="PI_WEBFETCH",STATUS_KEY5="pi-webfetch",WIDGET_KEY5="pi-webfetch";function parseEnableEnv4(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isWebfetchEnabled(){return parseEnableEnv4(ENABLE_ENV4)}function clearUi3(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY5,void 0),ctx.ui.setWidget(WIDGET_KEY5,void 0))}function webfetch_default(pi){isWebfetchEnabled()&&(pi.registerTool({...webfetch,renderCall:renderWebfetchCall,renderResult:renderWebfetchResult}),pi.on("session_start",async(_event,ctx)=>{clearUi3(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi3(ctx)}))}import{access as access2,readFile as readFile16}from"node:fs/promises";import{homedir as homedir8}from"node:os";import{join as join55}from"node:path";var DEFAULT_PROVIDER_URLS={exa:"https://api.exa.ai/search",tavily:"https://api.tavily.com/search",brave:"https://api.search.brave.com/res/v1/web/search","duckduckgo-html":"https://html.duckduckgo.com/html/",deepseek:"https://api.deepseek.com/anthropic/v1/messages",serper:"https://google.serper.dev/search","google-cse":"https://customsearch.googleapis.com/customsearch/v1","z-ai":"https://api.z.ai/api/paas/v4/web_search",openai:"https://api.openai.com/v1/responses",codex:"https://api.openai.com/v1/responses",anthropic:"https://api.anthropic.com/v1/messages",perplexity:"https://api.perplexity.ai/search",xai:"https://api.x.ai/v1/responses",kimi:"https://api.kimi.com/coding/v1/search"};function defaultProviderUrl(provider){return DEFAULT_PROVIDER_URLS[provider]}function isPrivateIpv4(hostname){let parts=hostname.split(".").map(part=>Number.parseInt(part,10));if(parts.length!==4||parts.some(part=>!Number.isInteger(part)||part<0||part>255))return!1;let first=parts[0]??-1,second=parts[1]??-1;return first===10||first===127||first===0||first===169&&second===254||first===172&&second>=16&&second<=31?!0:first===192&&second===168}function isPrivateHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2==="localhost"||normalized2.endsWith(".localhost")||normalized2.includes(":")||normalized2==="::1"||normalized2.startsWith("fc")||normalized2.startsWith("fd")||/^fe[89ab][0-9a-f]:/.test(normalized2)||isPrivateIpv4(normalized2)}function isAllowedProviderBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.protocol==="https:"&&configured.username===""&&configured.password===""&&!configured.hostname.endsWith("..")&&!isPrivateHostname(configured.hostname)}function providerUrl(config){return config.baseUrl??defaultProviderUrl(config.provider)}var PROVIDERS=["exa","tavily","brave","duckduckgo-html","deepseek","serper","google-cse","z-ai","openai","codex","anthropic","perplexity","xai","kimi"],CONTEXT_SIZES=["low","medium","high"],CODEX_MODES=["cached","live"],STRATEGIES=["priority","round-robin","fill-first"],DEFAULT_FREE_CONFIG={strategy:"priority",fallback:!0,auto:!0,providers:[{id:"default",provider:"duckduckgo-html",maxResults:10}]};function isJsonObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneOf3(values,value2){return typeof value2=="string"&&values.includes(value2)}function isStringArray2(value2){return Array.isArray(value2)&&value2.every(item=>typeof item=="string")}function optionalString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function optionalNumber(value2){return typeof value2=="number"&&Number.isFinite(value2)?value2:void 0}function optionalBoolean(value2){return typeof value2=="boolean"?value2:void 0}function optionalProvider(value2){return oneOf3(PROVIDERS,value2)?value2:void 0}function optionalContextSize(value2){return oneOf3(CONTEXT_SIZES,value2)?value2:void 0}function optionalCodexMode(value2){return oneOf3(CODEX_MODES,value2)?value2:void 0}function optionalStrategy(value2){return oneOf3(STRATEGIES,value2)?value2:void 0}function optionalLocation(value2){if(!isJsonObject(value2))return;let location={},country=optionalString(value2.country),region=optionalString(value2.region),city=optionalString(value2.city),timezone=optionalString(value2.timezone);return country&&(location.country=country),region&&(location.region=region),city&&(location.city=city),timezone&&(location.timezone=timezone),Object.keys(location).length>0?location:void 0}function parseJsonObject(content){let parsed;try{parsed=JSON.parse(content)}catch{return null}return isJsonObject(parsed)?parsed:null}function providerEntryFromObject(raw){let provider=optionalProvider(raw.provider)??optionalProvider(raw.backend);if(!provider)return null;let config={provider},id=optionalString(raw.id),apiKey=optionalString(raw.apiKey),baseUrl=optionalString(raw.baseUrl),searchEngineId=optionalString(raw.searchEngineId),maxResults=optionalNumber(raw.maxResults),model=optionalString(raw.model),codexMode=optionalCodexMode(raw.codexMode),searchContextSize=optionalContextSize(raw.searchContextSize),rawAllowedDomains=raw.allowedDomains,rawBlockedDomains=raw.blockedDomains,allowedDomains=isStringArray2(rawAllowedDomains)?rawAllowedDomains:void 0,blockedDomains=isStringArray2(rawBlockedDomains)?rawBlockedDomains:void 0,userLocation=optionalLocation(raw.userLocation),timeoutMs=optionalNumber(raw.timeoutMs),priority=optionalNumber(raw.priority),weight=optionalNumber(raw.weight);return id&&(config.id=id),apiKey&&(config.apiKey=apiKey),baseUrl&&(config.baseUrl=baseUrl),searchEngineId&&(config.searchEngineId=searchEngineId),maxResults&&(config.maxResults=maxResults),model&&(config.model=model),codexMode&&(config.codexMode=codexMode),searchContextSize&&(config.searchContextSize=searchContextSize),allowedDomains&&(config.allowedDomains=allowedDomains),blockedDomains&&(config.blockedDomains=blockedDomains),userLocation&&(config.userLocation=userLocation),timeoutMs!==void 0&&(config.timeoutMs=timeoutMs),priority!==void 0&&(config.priority=priority),weight!==void 0&&(config.weight=weight),config}function configFromObject(raw){let auto=optionalBoolean(raw.auto)??!0,providersValue=raw.providers,rawProviders=Array.isArray(providersValue)?providersValue:void 0;if(rawProviders){if(optionalProvider(raw.provider))return null;let providers=rawProviders.map(value2=>isJsonObject(value2)?providerEntryFromObject(value2):null).filter(entry=>entry!==null),strategy=optionalStrategy(raw.strategy)??"priority",fallback=optionalBoolean(raw.fallback)??!0;return{strategy,fallback,auto,providers}}let provider=providerEntryFromObject(raw);return provider?{strategy:"priority",fallback:!0,auto,providers:[provider]}:null}function hasApiKey(config){return typeof config.apiKey=="string"&&config.apiKey.length>0}function validateProviderConfig(config){return PROVIDERS.includes(config.provider)?config.allowedDomains&&config.blockedDomains?{ok:!1,reason:"invalid_config",message:"Provider config cannot specify both allowedDomains and blockedDomains."}:config.weight!==void 0&&config.weight<=0?{ok:!1,reason:"invalid_config",message:"Provider weight must be greater than 0."}:config.timeoutMs!==void 0&&config.timeoutMs<=0?{ok:!1,reason:"invalid_config",message:"Provider timeoutMs must be greater than 0."}:config.baseUrl&&!isAllowedProviderBaseUrl(config.baseUrl)?{ok:!1,reason:"invalid_config",message:`Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`}:config.provider==="google-cse"&&!config.searchEngineId?{ok:!1,reason:"missing_api_key",message:"Provider google-cse requires searchEngineId."}:(config.provider==="codex"||config.provider==="openai")&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey for hosted Responses API search.`}:config.provider!=="codex"&&config.provider!=="openai"&&config.provider!=="duckduckgo-html"&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey.`}:{ok:!0,config}:{ok:!1,reason:"invalid_config",message:`Unsupported provider: ${config.provider}`}}function validateWebsearchConfig(config){if(!STRATEGIES.includes(config.strategy))return{ok:!1,reason:"invalid_config",message:`Unsupported routing strategy: ${config.strategy}`};if(typeof config.auto!="boolean")return{ok:!1,reason:"invalid_config",message:"Websearch config auto must be a boolean."};if(config.providers.length===0)return{ok:!1,reason:"invalid_config",message:"Websearch config requires at least one provider."};for(let provider of config.providers){let validation=validateProviderConfig(provider);if(!validation.ok)return validation}return{ok:!0,config}}async function fileExists2(path13){try{return await access2(path13),!0}catch{return!1}}async function loadWebsearchConfig(options){let home=options.homeDir??homedir8(),paths=[join55(options.cwd,CONFIG_DIR_NAME,"websearch.json"),join55(options.cwd,".pi","websearch.json"),join55(home,"websearch.json"),join55(home,CONFIG_DIR_NAME,"websearch.json"),join55(home,".pi","websearch.json")].filter((path13,index,all)=>all.indexOf(path13)===index);for(let path13 of paths){if(!await fileExists2(path13))continue;let raw=parseJsonObject(await readFile16(path13,"utf8"));if(!raw)return{ok:!1,reason:"invalid_config",message:`Invalid JSON object in ${path13}`,source:path13};let config=configFromObject(raw);if(!config)return{ok:!1,reason:"invalid_config",message:`Invalid provider config in ${path13}`,source:path13};let validation=validateWebsearchConfig(config);return validation.ok?{ok:!0,config,source:path13}:{...validation,source:path13}}return{ok:!0,config:DEFAULT_FREE_CONFIG,source:"default:duckduckgo-html"}}var EMPTY_DOMAIN_SENTINEL="invalid.invalid";function contentHeaders(extra){return{Accept:"application/json","Content-Type":"application/json",...extra??{}}}function clamp(value2,min,max){return Math.max(min,Math.min(max,Math.trunc(value2)))}function appendDomainFilters(query,allowedDomains,blockedDomains){let parts=[query];for(let domain of allowedDomains??[])parts.push(`site:${domain}`);for(let domain of blockedDomains??[])parts.push(`-site:${domain}`);return parts.join(" ")}function unique(values){return[...new Set(values)]}function nonEmptyDomains(values){return values.length>0?values:[EMPTY_DOMAIN_SENTINEL]}function resolveDomainFilters(config,request2){let configAllowed=config.allowedDomains,configBlocked=config.blockedDomains,requestAllowed=request2.allowedDomains,requestBlocked=request2.blockedDomains;if(configAllowed){let narrowed=requestAllowed?configAllowed.filter(domain=>requestAllowed.includes(domain)):configAllowed,allowed=requestBlocked?narrowed.filter(domain=>!requestBlocked.includes(domain)):narrowed;return{allowedDomains:nonEmptyDomains(unique(allowed))}}if(configBlocked){let blocked=unique([...configBlocked,...requestBlocked??[]]);return requestAllowed?{allowedDomains:nonEmptyDomains(requestAllowed.filter(domain=>!blocked.includes(domain)))}:{blockedDomains:blocked}}return requestAllowed?{allowedDomains:unique(requestAllowed)}:requestBlocked?{blockedDomains:unique(requestBlocked)}:{}}function isJsonObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function getObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function getArray(value2){return Array.isArray(value2)?value2:[]}function getString2(value2){return typeof value2=="string"?value2:void 0}function getNumber(value2){return typeof value2=="number"?value2:void 0}function result2(title,url,snippet,source,score3){if(!title||!url)return null;let item={title,url};return snippet&&(item.snippet=snippet),source&&(item.source=source),score3!==void 0&&(item.score=score3),item}function collect(items,max=50){return items.filter(item=>item!==null).slice(0,max)}function parseObjectPayload(payload){return isJsonObject2(payload)?payload:{}}function buildAnthropicMessagesSearchRequest(ctx,defaultModel){let{config,request:request2,allowedDomains,blockedDomains}=ctx,webSearchTool={type:"web_search_20250305",name:"web_search",max_uses:8};return allowedDomains&&(webSearchTool.allowed_domains=allowedDomains),blockedDomains&&(webSearchTool.blocked_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"x-api-key":config.apiKey??"","anthropic-version":"2023-06-01"})},body:{model:config.model??defaultModel,max_tokens:1024,messages:[{role:"user",content:request2.query}],tools:[webSearchTool]}}}function normalizeAnthropicMessagesSearchPayload(data){let content=getArray(data.content),text2=content.map(getObject).map(item=>getString2(item?.text)).filter(value2=>value2!==void 0).join(`
2197
2200
  `);return collect(content.flatMap(raw=>{let item=getObject(raw);return item?.type!=="web_search_tool_result"?[]:getArray(item.content).map(searchRaw=>{let searchItem=getObject(searchRaw);return result2(getString2(searchItem?.title),getString2(searchItem?.url),getString2(searchItem?.page_age)??text2)})}))}var anthropicProvider={buildRequest(ctx){return buildAnthropicMessagesSearchRequest(ctx,"claude-sonnet-4-5-20250929")},normalizeResponse(data){return normalizeAnthropicMessagesSearchPayload(data)}};var braveProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("count",String(clamp(maxResults,1,20))),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":config.apiKey??""}}}},normalizeResponse(data){let web=getObject(data.web);return collect(getArray(web?.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.description))}))}};var deepseekProvider={buildRequest(ctx){return buildAnthropicMessagesSearchRequest(ctx,"deepseek-v4-flash")},normalizeResponse(data){return normalizeAnthropicMessagesSearchPayload(data)}};function htmlDecode(value2){return value2.replaceAll("&amp;","&").replaceAll("&quot;",'"').replaceAll("&#39;","'").replaceAll("&lt;","<").replaceAll("&gt;",">")}function stripHtml(value2){return htmlDecode(value2.replace(/<[^>]*>/g,"").replace(/\s+/g," ").trim())}function duckDuckGoResultUrl(rawHref){let decodedHref=htmlDecode(rawHref),absoluteHref=decodedHref.startsWith("//")?`https:${decodedHref}`:decodedHref,url;try{url=new URL(absoluteHref)}catch{return}return url.searchParams.get("uddg")??absoluteHref}function normalizeDuckDuckGoHtml(html){let matches=[...html.matchAll(/<a\b[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/g)],snippets=[...html.matchAll(/<a\b[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>/g)].map(match=>stripHtml(match[1]??""));return collect(matches.map((match,index)=>{let title=stripHtml(match[2]??""),url=duckDuckGoResultUrl(match[1]??"");return result2(title,url,snippets[index])}))}var duckDuckGoHtmlProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),{url:url.toString(),init:{method:"GET",headers:{Accept:"text/html"}}}},normalizeResponse(data){return normalizeDuckDuckGoHtml(getString2(data.html)??"")}};var exaProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let headers=contentHeaders({"x-api-key":config.apiKey??""}),body={query:request2.query,numResults:clamp(maxResults,1,20)};return allowedDomains&&(body.includeDomains=allowedDomains),blockedDomains&&(body.excludeDomains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.text)??getString2(item?.snippet),void 0,getNumber(item?.score))}))}};var googleCseProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("key",config.apiKey??""),url.searchParams.set("cx",config.searchEngineId??""),url.searchParams.set("num",String(clamp(maxResults,1,10))),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json"}}}},normalizeResponse(data){return collect(getArray(data.items).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var kimiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{text_query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),limit:clamp(maxResults,1,20),enable_page_crawling:!1,timeout_seconds:30}}},normalizeResponse(data){return collect(getArray(data.search_results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.summary)??getString2(item?.content))}))}};function searchOnlyPrompt(query){return`Find web pages matching any of these search terms or quoted phrases. If the query contains OR, search each alternative independently. Return only relevant source URLs, one per line. Query: ${query}`}function resultsFromTextUrls(text2){if(!text2)return[];let urls=text2.match(/https?:\/\/[^\s)\]}>"]+/g)??[];return collect(unique(urls).map(url=>{let cleaned=url.replace(/[.,;:]+$/,"");return result2(cleaned,cleaned,text2)}))}function buildResponsesRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search",external_web_access:(config.codexMode??"live")==="live"};config.searchContextSize&&(webSearchTool.search_context_size=config.searchContextSize),allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains}),config.userLocation&&(webSearchTool.user_location={type:"approximate",...config.userLocation});let input=searchOnlyPrompt(blockedDomains?appendDomainFilters(request2.query,void 0,blockedDomains):request2.query);return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"gpt-5.5",input,tools:[webSearchTool],include:["web_search_call.action.sources"],tool_choice:"required"}}}function normalizeResponsesPayload(data,options){let output=getArray(data.output),sources=collect(output.flatMap(raw=>{let item=getObject(raw);if(item?.type!=="web_search_call")return[];let action=getObject(item.action);return getArray(action?.sources).map(sourceRaw=>{let source=getObject(sourceRaw),url=getString2(source?.url);return result2(url,url)})})),message=output.map(getObject).find(item=>item?.type==="message"),content=getArray(message?.content).map(getObject).find(item=>item?.type==="output_text"),text2=getString2(content?.text),annotationResults=collect(getArray(content?.annotations).map(raw=>{let item=getObject(raw);return item?.type==="url_citation"?result2(getString2(item.title),getString2(item.url),text2):null}));if(annotationResults.length>0)return annotationResults;if(sources.length>0)return sources.map(source=>source.snippet||text2===void 0?source:{...source,snippet:text2});let textUrls=resultsFromTextUrls(text2);return textUrls.length>0?textUrls:options.citationsFallback?collect(getArray(data.citations).map(raw=>{let url=getString2(raw);return result2(url,url,text2)})):annotationResults}var openAiResponsesProvider={buildRequest(ctx){return buildResponsesRequest(ctx)},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!1})}};function normalizeResultList(items){return collect(items.map(raw=>{let item=getObject(raw),searchResult2=result2(getString2(item?.title),getString2(item?.url),getString2(item?.snippet));if(searchResult2){let publishedAt=getString2(item?.date)??getString2(item?.last_updated);publishedAt&&(searchResult2.publishedAt=publishedAt)}return searchResult2}))}var perplexityProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let body2={model:config.model,messages:[{role:"user",content:request2.query}]};return allowedDomains&&(body2.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body2.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),config.searchContextSize&&(body2.web_search_options={search_context_size:config.searchContextSize}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:body2}}let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=normalizeResultList(getArray(data.search_results));return chatResults.length>0?chatResults:normalizeResultList(getArray(data.results))}};var serperProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={q:appendDomainFilters(request2.query,allowedDomains,blockedDomains),num:clamp(maxResults,1,20)};return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"X-API-KEY":config.apiKey??""})},body}},normalizeResponse(data){return collect(getArray(data.organic).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var tavilyProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.include_domains=allowedDomains),blockedDomains&&(body.exclude_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.content),void 0,getNumber(item?.score))}))}};var xaiProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search"};return allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains.slice(0,5)}),!allowedDomains&&blockedDomains&&(webSearchTool.filters={excluded_domains:blockedDomains.slice(0,5)}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"grok-4.3",input:request2.query,tools:[webSearchTool],tool_choice:"required"}}},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!0})}};var zAiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let webSearch={enable:!0,search_engine:"search-prime",search_result:!0,count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(webSearch.search_domain_filter=allowedDomains[0]),config.searchContextSize&&(webSearch.content_size=config.searchContextSize),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model,messages:[{role:"user",content:request2.query}],tools:[{type:"web_search",web_search:webSearch}]}}}let body={search_engine:"search-prime",search_query:appendDomainFilters(request2.query,void 0,blockedDomains),count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(body.search_domain_filter=allowedDomains[0]),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=collect(getArray(data.web_search).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}));return chatResults.length>0?chatResults:collect(getArray(data.search_result).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}))}};var PROVIDER_MODULES={exa:exaProvider,tavily:tavilyProvider,brave:braveProvider,"duckduckgo-html":duckDuckGoHtmlProvider,deepseek:deepseekProvider,serper:serperProvider,"google-cse":googleCseProvider,"z-ai":zAiProvider,openai:openAiResponsesProvider,codex:openAiResponsesProvider,anthropic:anthropicProvider,perplexity:perplexityProvider,xai:xaiProvider,kimi:kimiProvider};function buildSearchRequest(config,request2){let maxResults=config.maxResults??request2.maxResults,{allowedDomains,blockedDomains}=resolveDomainFilters(config,request2);return PROVIDER_MODULES[config.provider].buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains})}function normalizeSearchResponse(provider,payload){return PROVIDER_MODULES[provider].normalizeResponse(parseObjectPayload(payload))}var MAX_ERROR_DETAIL_LENGTH=500,DEFAULT_PROVIDER_TIMEOUT_MS=6e4;function isJsonObject3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function truncate2(value2,max){return value2.length>max?`${value2.slice(0,max-1)}\u2026`:value2}function extractErrorDetail(payload,bodyText){if(isJsonObject3(payload)){let obj=payload,error2=obj.error;if(typeof error2=="string"&&error2.length>0)return truncate2(error2,MAX_ERROR_DETAIL_LENGTH);if(isJsonObject3(error2)){let message2=error2.message;if(typeof message2=="string"&&message2.length>0)return truncate2(message2,MAX_ERROR_DETAIL_LENGTH)}let message=obj.message;if(typeof message=="string"&&message.length>0)return truncate2(message,MAX_ERROR_DETAIL_LENGTH)}let trimmed=bodyText.trim();return trimmed?truncate2(trimmed,MAX_ERROR_DETAIL_LENGTH):""}function httpErrorMessage(status,payload,bodyText){let detail=extractErrorDetail(payload,bodyText);return detail?`Search failed with HTTP ${status}: ${detail}`:`Search failed with HTTP ${status}`}function abortReason2(signal){return signal.reason??new DOMException("The operation was aborted.","AbortError")}function timeoutMsFor(config){return Math.max(1,Math.trunc(config.timeoutMs??DEFAULT_PROVIDER_TIMEOUT_MS))}function providerTimeoutMessage(timeoutMs){return`Search timed out after ${timeoutMs}ms`}function searchAbortSignal(outerSignal,timeoutMs){if(outerSignal?.aborted)throw abortReason2(outerSignal);let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new DOMException(providerTimeoutMessage(timeoutMs),"TimeoutError"))},timeoutMs),onAbort=()=>controller.abort(outerSignal?abortReason2(outerSignal):void 0);return outerSignal?.addEventListener("abort",onAbort,{once:!0}),{signal:controller.signal,cleanup:()=>{clearTimeout(timeout),outerSignal?.removeEventListener("abort",onAbort)}}}function noResultsMessage(config,request2){return`Search provider ${providerEntryLabel(config)} returned no results for "${request2.query}".`}function createSearchRoutingState(providerCount){return{roundRobinCursor:0,successCounts:Array.from({length:providerCount},()=>0)}}function providerEntryLabel(entry){let id=entry.entryId??entry.id;if(!id||id===entry.provider)return entry.provider;let nativePrefix=`native-${entry.provider}-`;return id.endsWith("/native")?id:`${entry.provider}/${id.startsWith(nativePrefix)?"native":id}`}function sortedPriorityIndices(providers){return providers.map((provider,index)=>({index,priority:provider.priority??index})).sort((left,right)=>left.priority-right.priority||left.index-right.index).map(item=>item.index)}function weightedIndices(providers){let indices=[];for(let[index,provider]of providers.entries()){let weight=Math.max(1,Math.trunc(provider.weight??1));for(let count=0;count<weight;count+=1)indices.push(index)}return indices.length>0?indices:providers.map((_provider,index)=>index)}function rotateUnique(indices,start,providerCount){let order=[];for(let offset=0;offset<indices.length;offset+=1){let index=indices[(start+offset)%indices.length];index!==void 0&&!order.includes(index)&&order.push(index)}for(let index=0;index<providerCount;index+=1)order.includes(index)||order.push(index);return order}function selectOrder(strategy,providers,state){if(strategy==="priority")return sortedPriorityIndices(providers);if(strategy==="round-robin"){let indices=weightedIndices(providers),order=rotateUnique(indices,state.roundRobinCursor%indices.length,providers.length);return state.roundRobinCursor=(state.roundRobinCursor+1)%indices.length,order}let selected=0,selectedCount=state.successCounts[0]??0;for(let index=1;index<providers.length;index+=1){let count=state.successCounts[index]??0;count<selectedCount&&(selected=index,selectedCount=count)}return[selected,...providers.map((_provider,index)=>index).filter(index=>index!==selected)]}async function performProviderSearch(config,request2,signal){let startedAt=Date.now(),built=buildSearchRequest(config,request2),timeoutMs=timeoutMsFor(config),abort=searchAbortSignal(signal,timeoutMs),response;try{let init={...built.init,signal:abort.signal};built.body!==void 0&&(init.body=JSON.stringify(built.body)),response=await fetch(built.url,init)}catch(error2){if(abort.cleanup(),signal?.aborted)throw abortReason2(signal);let details2={provider:config.provider,query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:error2 instanceof Error?error2.message:"Search request failed"};return config.id!==void 0&&(details2.entryId=config.id),details2}let bodyText="";try{bodyText=await response.text()}catch(error2){if(abort.cleanup(),signal?.aborted)throw abortReason2(signal);let details2={provider:config.provider,query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:error2 instanceof Error?error2.message:"Search response read failed"};return config.id!==void 0&&(details2.entryId=config.id),details2}finally{abort.cleanup()}let payload={};if(config.provider==="duckduckgo-html")payload={html:bodyText};else if(bodyText.length>0)try{payload=JSON.parse(bodyText)}catch{payload={}}if(!response.ok){let details2={provider:config.provider,query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:httpErrorMessage(response.status,payload,bodyText)};return config.id!==void 0&&(details2.entryId=config.id),details2}let results=normalizeSearchResponse(config.provider,payload),max=request2.maxResults,limitedResults=results.slice(0,max),details={provider:config.provider,query:request2.query,results:limitedResults,durationMs:Date.now()-startedAt,truncated:results.length>max};return limitedResults.length===0&&(details.error=noResultsMessage(config,request2)),config.id!==void 0&&(details.entryId=config.id),details}function attemptFromDetails(details){let attempt2={provider:details.provider,durationMs:details.durationMs,resultsCount:details.results.length};return details.entryId&&(attempt2.entryId=details.entryId),details.error&&(attempt2.error=details.error),attempt2}async function performSearch(config,request2,signal,routingState,onAttempt){let startedAt=Date.now(),state=routingState??createSearchRoutingState(config.providers.length),order=selectOrder(config.strategy,config.providers,state),attempts=[],routeLabels=order.flatMap(index=>{let provider=config.providers[index];return provider?[providerEntryLabel(provider)]:[]}),collected=new Map,selectedDetails;for(let index of order){let provider=config.providers[index];if(!provider)continue;onAttempt?.(providerEntryLabel(provider),attempts,routeLabels);let details=await performProviderSearch(provider,request2,signal);if(attempts.push(attemptFromDetails(details)),details.error){if(!config.fallback)return{...details,strategy:config.strategy,attempts};selectedDetails=details;continue}if(state.successCounts[index]=(state.successCounts[index]??0)+1,config.strategy!=="fill-first")return{...details,strategy:config.strategy,attempts};selectedDetails=details;for(let item of details.results){if(collected.size>=request2.maxResults)break;collected.set(item.url,item)}if(collected.size>=request2.maxResults)break}if(collected.size>0&&selectedDetails){let results=[...collected.values()],details={provider:selectedDetails.provider,query:request2.query,results,durationMs:Date.now()-startedAt,truncated:results.length>=request2.maxResults,strategy:config.strategy,attempts};return selectedDetails.entryId!==void 0&&(details.entryId=selectedDetails.entryId),details}return{...selectedDetails??{provider:config.providers[0]?.provider??"exa",query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:"All configured search providers failed."},durationMs:Date.now()-startedAt,strategy:config.strategy,attempts,error:`All configured search providers failed: ${attempts.map(attempt2=>`${providerEntryLabel(attempt2)} ${attempt2.error??"failed"}`).join("; ")}`}}function formatSearchText(details){if(details.error)return details.error;if(details.results.length===0)return`No web search results found for "${details.query}".`;let route=` via ${providerEntryLabel(details)}`,lines=[`Web search results for "${details.query}"${route}:`,""];details.attempts&&details.attempts.length>0&&lines.push(`Routing attempts: ${details.attempts.map(attempt2=>`${providerEntryLabel(attempt2)} ${attempt2.error?`failed: ${attempt2.error}`:`${attempt2.resultsCount} result${attempt2.resultsCount===1?"":"s"}`}`).join(" -> ")}`,"");for(let[index,item]of details.results.entries())lines.push(`${index+1}. ${item.title}`),lines.push(` ${item.url}`),item.snippet&&lines.push(` ${item.snippet}`);return lines.push("","REMINDER: Include relevant sources from the URLs above in the final answer."),lines.join(`
@@ -2204,28 +2207,22 @@ ${TASK_MANAGEMENT_SECTION}`})),registerTodoTool(pi,{getCurrentPhases,setCurrentP
2204
2207
  `}function getGlobalDefaultExtensionShimPath(agentDir,extensionId){return join58(agentDir,"extensions",`${extensionId}.js`)}function findGeneratedGlobalDefaultExtensionId(extensionPath,agentDir){if(resolve31(agentDir)!==resolve31(getAgentDir()))return;let resolvedExtensionPath=resolve31(extensionPath);for(let extensionId of globalDefaultExtensionIds)if(resolvedExtensionPath===resolve31(getGlobalDefaultExtensionShimPath(agentDir,extensionId)))return extensionId}function resolveGeneratedGlobalDefaultExtensionFactory(extensionPath,agentDir){let extensionId=findGeneratedGlobalDefaultExtensionId(extensionPath,agentDir);if(extensionId)try{let expectedShim=buildGlobalDefaultExtensionShim(getGlobalDefaultExtensionModulePath(extensionId));return readFileSync34(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=join58(dir,filename);if(existsSync29(filePath))try{if(!statSync17(filePath).isFile())continue;return{path:filePath,content:stripBom(readFileSync34(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=dirname35(commonGitDir);if(!worktreeRoot.startsWith(`${mainRepoRoot}${sep11}`)||canonicalizePath(join58(mainRepoRoot,".git"))!==commonGitDir)return;let worktreeContextFile=loadContextFileFromDir(worktreeRoot);return worktreeContextFile?join58(mainRepoRoot,basename18(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=dirname35(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.sharedHostEnabled=options.sharedHostEnabled??this.settingsManager.getExperimentalSharedHost(),this.extensionSession={sharedHostEnabled:this.sharedHostEnabled,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);existsSync29(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);!existsSync29(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);!existsSync29(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);!existsSync29(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&&existsSync29(this.systemPromptSource)?resolvePath(this.systemPromptSource):void 0,this.appendSystemPromptSourcePaths=(this.appendSystemPromptSource??[]).filter(source=>existsSync29(source)).map(source=>resolvePath(source)),this.loaded=!0}ensureGlobalDefaultExtensions(){if(resolve31(this.agentDir)!==resolve31(getAgentDir()))return;let extensionsDir=join58(this.agentDir,"extensions");mkdirSync15(extensionsDir,{recursive:!0});for(let extensionId of globalDefaultExtensionIds){let modulePath=getGlobalDefaultExtensionModulePath(extensionId);if(!existsSync29(modulePath))continue;let targetPath=getGlobalDefaultExtensionShimPath(this.agentDir,extensionId),shim=buildGlobalDefaultExtensionShim(modulePath);if(existsSync29(targetPath)){let existing=readFileSync34(targetPath,"utf-8");if(existing===shim||!isGeneratedGlobalDefaultExtensionShim(existing))continue;writeFileSync15(targetPath,shim,"utf-8");continue}writeFileSync15(targetPath,shim,"utf-8")}}resolvePackagePaths(options={}){return memoizeResolvedPaths(resolvedPathsMemoKey({agentDir:this.agentDir,cwd:this.cwd,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(!statSync17(resource.path).isDirectory())return resource.path}catch{return resource.path}let skillFile=join58(resource.path,"SKILL.md");return existsSync29(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(join58(this.agentDir,"hooks.json")),preSessionHookSourcePaths:this.preSessionHookSourcePaths.map(path13=>this.resolveResourcePath(path13)),projectHookSourcePaths:this.projectHookSourcePaths.map(path13=>this.resolveResourcePath(path13)),projectHooksPath:this.resolveResourcePath(join58(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=resolve31(resourcePath);if(extraSourceInfos)for(let[sourcePath,sourceInfo]of extraSourceInfos.entries()){let normalizedSourcePath=resolve31(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=resolve31(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=resolve31(filePath),agentRoots=[join58(this.agentDir,"skills"),join58(this.agentDir,"prompts"),join58(this.agentDir,"themes"),join58(this.agentDir,"extensions")],projectRoots=[join58(this.cwd,CONFIG_DIR_NAME,"skills"),join58(this.cwd,CONFIG_DIR_NAME,"prompts"),join58(this.cwd,CONFIG_DIR_NAME,"themes"),join58(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:statSync17(normalizedPath).isDirectory()?normalizedPath:resolve31(normalizedPath,"..")}}mergePaths(primary,additional){let merged=[],seen=new Set;for(let p of[...primary,...additional]){let resolved=this.resolveResourcePath(p),canonicalPath=canonicalizePath(resolved);seen.has(canonicalPath)||(seen.add(canonicalPath),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(resolve31(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=[join58(this.agentDir,"themes"),join58(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(!existsSync29(resolved)){diagnostics.push({type:"warning",message:"theme path does not exist",path:resolved});continue}try{let stats=statSync17(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(existsSync29(dir))try{let entries=readdirSync8(dir,{withFileTypes:!0});for(let entry of entries){let isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync17(join58(dir,entry.name)).isFile()}catch{continue}isFile&&entry.name.endsWith(".json")&&this.loadThemeFromFile(join58(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:join58(this.agentDir,"extensions")}}isGeneratedGlobalDefaultExtensionShimPath(resolvedPath){let shimPath=resolve31(resolvedPath);if(!globalDefaultExtensionIds.some(extensionId=>resolve31(getGlobalDefaultExtensionShimPath(this.agentDir,extensionId))===shimPath))return!1;try{return isGeneratedGlobalDefaultExtensionShim(readFileSync34(shimPath,"utf-8"))}catch{return!1}}getBundledExtensionPackageRoots(){let packageRoots=new Map;for(let bundledExtension of bundledBuiltinExtensions)try{let packageJsonPath=bundledExtension.resolvePackage(),packageRoot=resolve31(packageJsonPath,"..");for(let extensionPath of this.resolvePackageExtensionEntries(packageJsonPath))packageRoots.set(this.resolveExtensionLoadPath(extensionPath),packageRoot)}catch{}return packageRoots}resolvePackageExtensionEntries(packageJsonPath){let extensions=JSON.parse(readFileSync34(packageJsonPath,"utf-8")).pi?.extensions;if(!Array.isArray(extensions))return[];let packageRoot=resolve31(packageJsonPath,"..");return extensions.filter(extensionPath=>typeof extensionPath=="string").map(extensionPath=>resolve31(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=resolve31(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 join62}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 randomBytes5}from"node:crypto";import{createWriteStream}from"node:fs";import{rm as rm8}from"node:fs/promises";import{tmpdir as tmpdir4}from"node:os";import{join as join59}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=randomBytes5(8).toString("hex");return join59(tmpdir4(),`${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=truncateTail(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(resolve42=>{if(stream2.closed){resolve42();return}stream2.once("close",resolve42),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((resolve42,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?resolve42():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(`
2205
2208
  `);i!==-1;i=text2.indexOf(`
2206
2209
  `,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(`
2207
- `);return firstNewline===-1?text2:text2.slice(firstNewline+1)}shouldUseTempFile(){return this.totalRawBytes>this.maxBytes||this.totalDecodedBytes>this.maxBytes||this.totalLines>this.maxLines}ensureTempFile(){if(!this.tempFilePath){this.tempFilePath=defaultTempFilePath(this.tempFilePrefix),this.tempFileStream=createWriteStream(this.tempFilePath),this.tempFileStream.on("error",error2=>{this.tempFileError??=error2});for(let chunk of this.rawChunks)this.tempFileStream.write(chunk);this.rawChunks=[]}}async removeTempFile(){if(!this.tempFilePath)return;let path13=this.tempFilePath;await rm8(path13,{force:!0}),this.tempFilePath=void 0}takeTempFileStream(){let stream2=this.tempFileStream;return this.tempFileStream=void 0,stream2}};import*as os4 from"node:os";import{pathToFileURL as pathToFileURL2}from"node:url";function shortenPath(path13){if(typeof path13!="string")return"";let home=os4.homedir();return path13.startsWith(home)?`~${path13.slice(home.length)}`:path13}function linkPath(styledText,rawPath,cwd){if(!getCapabilities().hyperlinks)return styledText;let absolutePath=resolvePath(rawPath,cwd);return hyperlink(styledText,pathToFileURL2(absolutePath).href)}function str2(value2){return typeof value2=="string"?value2:value2==null?"":null}function replaceTabs2(text2){return text2.replace(/\t/g," ")}function normalizeDisplayText(text2){return text2.replace(/\r/g,"")}function getTextOutput(result3,showImages){if(!result3)return"";let textBlocks=result3.content.filter(c=>c.type==="text"),imageBlocks=result3.content.filter(c=>c.type==="image"),output=textBlocks.map(c=>sanitizeBinaryOutput(stripAnsi(c.text||"")).replace(/\r/g,"")).join(`
2210
+ `);return firstNewline===-1?text2:text2.slice(firstNewline+1)}shouldUseTempFile(){return this.totalRawBytes>this.maxBytes||this.totalDecodedBytes>this.maxBytes||this.totalLines>this.maxLines}ensureTempFile(){if(!this.tempFilePath){this.tempFilePath=defaultTempFilePath(this.tempFilePrefix),this.tempFileStream=createWriteStream(this.tempFilePath),this.tempFileStream.on("error",error2=>{this.tempFileError??=error2});for(let chunk of this.rawChunks)this.tempFileStream.write(chunk);this.rawChunks=[]}}async removeTempFile(){if(!this.tempFilePath)return;let path13=this.tempFilePath;await rm8(path13,{force:!0}),this.tempFilePath=void 0}takeTempFileStream(){let stream2=this.tempFileStream;return this.tempFileStream=void 0,stream2}};import*as os4 from"node:os";import{pathToFileURL as pathToFileURL2}from"node:url";function shortenPath(path13){if(typeof path13!="string")return"";let home=os4.homedir();return path13.startsWith(home)?`~${path13.slice(home.length)}`:path13}function linkPath(styledText,rawPath,cwd){if(!getCapabilities().hyperlinks)return styledText;let absolutePath=resolvePath(rawPath,cwd);return hyperlink(styledText,pathToFileURL2(absolutePath).href)}function str2(value2){return typeof value2=="string"?value2:value2==null?"":null}function replaceTabs2(text2){return text2.replace(/\t/g," ")}function normalizeDisplayText(text2){return text2.replace(/\r/g,"")}function getTextOutput(result3,showImages){if(!result3)return"";let textBlocks=result3.content.filter(c=>c.type==="text"&&!isModelOnlyText(c)),imageBlocks=result3.content.filter(c=>c.type==="image"),output=textBlocks.map(c=>sanitizeBinaryOutput(stripAnsi(c.text||"")).replace(/\r/g,"")).join(`
2208
2211
  `),caps=getCapabilities();if(imageBlocks.length>0&&(!caps.images||!showImages)){let imageIndicators=imageBlocks.map(img=>{let mimeType=img.mimeType??"image/unknown",dims=img.data&&img.mimeType?getImageDimensions(img.data,img.mimeType)??void 0:void 0;return imageFallback(mimeType,dims)}).join(`
2209
2212
  `);output=output?`${output}
2210
2213
  ${imageIndicators}`:imageIndicators}return output}function invalidArgText(theme2){return theme2.fg("error","[invalid arg]")}function renderToolPath(rawPath,theme2,cwd,options){if(rawPath===null)return invalidArgText(theme2);let value2=rawPath||options?.emptyFallback;return value2?linkPath(theme2.fg("accent",shortenPath(value2)),value2,cwd):theme2.fg("toolOutput","...")}var BASH_PREVIEW_LINES=5,BASH_UPDATE_THROTTLE_MS2=100,BashResultRenderComponent=class extends Container{constructor(){super(...arguments),this.state={cachedWidth:void 0,cachedLines:void 0,cachedSkipped:void 0}}};function formatDuration2(ms){let totalSeconds=Math.floor(Math.max(0,ms)/1e3);if(totalSeconds<1)return"<1s";let seconds=totalSeconds%60,totalMinutes=Math.floor(totalSeconds/60);if(totalMinutes<1)return`${seconds}s`;let minutes=totalMinutes%60,hours=Math.floor(totalMinutes/60);return hours<1?seconds===0?`${minutes}m`:`${minutes}m ${seconds}s`:minutes===0?`${hours}h`:`${hours}h ${minutes}m`}function highlightBashCommand(command){return highlightCode(replaceTabs2(normalizeDisplayText(command)),"bash").join(`
2211
- `)}function formatShellCall(args,_prompt){let command=str2(args?.command),timeout=args?.timeout,timeoutSuffix=timeout?theme.fg("muted",` (timeout ${timeout}s)`):"",commandDisplay=command===null?invalidArgText(theme):command?highlightBashCommand(command):theme.fg("toolOutput","...");return theme.fg("toolTitle",theme.bold("$ "))+commandDisplay+timeoutSuffix}function rebuildBashResultRenderComponent(component,result3,options,showImages,startedAt,endedAt){let state=component.state;component.detachAll();let output=getTextOutput(result3,showImages).trim(),truncation=result3.details?.truncation,fullOutputPath=result3.details?.fullOutputPath;if(!options.isPartial&&truncation?.truncated&&fullOutputPath&&output.endsWith("]")){let footerStart=output.lastIndexOf(`
2212
-
2213
- [`);footerStart!==-1&&output.slice(footerStart).includes(fullOutputPath)&&(output=output.slice(0,footerStart).trimEnd())}if(output){let styledOutput=output.split(`
2214
+ `)}function formatShellCall(args,_prompt){let command=str2(args?.command),timeout=args?.timeout,timeoutSuffix=timeout?theme.fg("muted",` (timeout ${timeout}s)`):"",commandDisplay=command===null?invalidArgText(theme):command?highlightBashCommand(command):theme.fg("toolOutput","...");return theme.fg("toolTitle",theme.bold("$ "))+commandDisplay+timeoutSuffix}function rebuildBashResultRenderComponent(component,result3,options,showImages,startedAt,endedAt){let state=component.state;component.detachAll();let output=getTextOutput(result3,showImages).trim();if(output){let styledOutput=output.split(`
2214
2215
  `).map(line=>theme.fg("toolOutput",line)).join(`
2215
2216
  `);options.expanded?component.addChild(new Text(`
2216
- ${styledOutput}`,0,0)):component.addChild({render:width=>{if(state.cachedLines===void 0||state.cachedWidth!==width){let preview=truncateToVisualLines(styledOutput,BASH_PREVIEW_LINES,width);state.cachedLines=preview.visualLines,state.cachedSkipped=preview.skippedCount,state.cachedWidth=width}if(state.cachedSkipped&&state.cachedSkipped>0){let hint=theme.fg("muted",`... (${state.cachedSkipped} earlier lines,`)+` ${keyHint("app.tools.expand","to expand")}${theme.fg("muted",")")}`;return["",truncateToWidth(hint,width,"..."),...state.cachedLines??[]]}return["",...state.cachedLines??[]]},invalidate:()=>{state.cachedWidth=void 0,state.cachedLines=void 0,state.cachedSkipped=void 0}})}if(truncation?.truncated||fullOutputPath){let warnings=[];fullOutputPath&&warnings.push(`Full output: ${fullOutputPath}`),truncation?.truncated&&(truncation.truncatedBy==="lines"?warnings.push(`Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines`):warnings.push(`Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes??51200)} limit)`)),component.addChild(new Text(`
2217
- ${theme.fg("warning",`[${warnings.join(". ")}]`)}`,0,0))}if(startedAt!==void 0){let label2=options.isPartial?"Elapsed":"Took",endTime=endedAt??Date.now();component.addChild(new Text(`
2217
+ ${styledOutput}`,0,0)):component.addChild({render:width=>{if(state.cachedLines===void 0||state.cachedWidth!==width){let preview=truncateToVisualLines(styledOutput,BASH_PREVIEW_LINES,width);state.cachedLines=preview.visualLines,state.cachedSkipped=preview.skippedCount,state.cachedWidth=width}if(state.cachedSkipped&&state.cachedSkipped>0){let hint=theme.fg("muted",`... (${state.cachedSkipped} earlier lines,`)+` ${keyHint("app.tools.expand","to expand")}${theme.fg("muted",")")}`;return["",truncateToWidth(hint,width,"..."),...state.cachedLines??[]]}return["",...state.cachedLines??[]]},invalidate:()=>{state.cachedWidth=void 0,state.cachedLines=void 0,state.cachedSkipped=void 0}})}if(startedAt!==void 0){let label2=options.isPartial?"Elapsed":"Took",endTime=endedAt??Date.now();component.addChild(new Text(`
2218
2218
  ${theme.fg("muted",`${label2} ${formatDuration2(endTime-startedAt)}`)}`,0,0))}}function createShellRenderers(prompt){return{renderCall(args,_theme,context){let state=context.state;context.executionStarted&&state.startedAt===void 0&&(state.startedAt=Date.now(),state.endedAt=void 0);let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatShellCall(args,prompt)),text2},renderResult(result3,options,_theme,context){let state=context.state;state.startedAt!==void 0&&options.isPartial&&!state.interval&&(state.interval=setInterval(()=>context.invalidate(),1e3)),(!options.isPartial||context.isError)&&(state.endedAt??=Date.now(),state.interval&&(clearInterval(state.interval),state.interval=void 0));let component=context.lastComponent??new BashResultRenderComponent;return rebuildBashResultRenderComponent(component,result3,options,context.showImages,state.startedAt,state.endedAt),component.invalidate(),component}}}function wrapToolDefinition(definition,ctxFactory){return{name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,freeform:definition.freeform,constrainedSampling:definition.constrainedSampling,prepareArguments:definition.prepareArguments,executionMode:definition.executionMode,execute:(toolCallId,params,signal,onUpdate,ctx)=>definition.execute(toolCallId,params,signal,onUpdate,ctx??ctxFactory?.())}}function createToolDefinitionFromAgentTool(tool){return{name:tool.name,label:tool.label,description:tool.description,parameters:tool.parameters,freeform:tool.freeform,constrainedSampling:tool.constrainedSampling,prepareArguments:tool.prepareArguments,executionMode:tool.executionMode,execute:async(toolCallId,params,signal,onUpdate)=>tool.execute(toolCallId,params,signal,onUpdate)}}var MAX_TIMEOUT_MS2=2147483647,MAX_TIMEOUT_SECONDS3=MAX_TIMEOUT_MS2/1e3;function resolveTimeoutMs2(timeout){if(timeout===void 0)return;if(!Number.isFinite(timeout)||timeout<=0)throw new Error("Invalid timeout: must be a finite number of seconds");let timeoutMs=timeout*1e3;if(timeoutMs>MAX_TIMEOUT_MS2)throw new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS3} seconds`);return timeoutMs}var bashSchema2=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute"}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Timeout in seconds (optional, no default timeout)"}))}),bashToolSystemPromptContribution={snippet:"Execute bash commands (ls, rg, find, etc.)",guidelines:["You can inspect PI_* environment variables for current model and session details."]};function createLocalShellOperations(shellName,resolveShellConfig){return{exec:async(command,cwd,{onData,signal,timeout,env})=>{let timeoutMs=resolveTimeoutMs2(timeout);if(signal?.aborted)throw new Error("aborted");let shellConfig=resolveShellConfig();try{await fsAccess(cwd,constants4.F_OK)}catch{throw new Error(`Working directory does not exist: ${cwd}
2219
2219
  Cannot execute ${shellName} commands.`)}let commandFromStdin=shellConfig.commandTransport==="stdin",child=spawn7(shellConfig.shell,commandFromStdin?shellConfig.args:[...shellConfig.args,command],{cwd,detached:process.platform!=="win32",env:env??getShellEnv(),stdio:[commandFromStdin?"pipe":"ignore","pipe","pipe"],windowsHide:!0});commandFromStdin&&(child.stdin?.on("error",()=>{}),child.stdin?.end(command)),child.pid&&trackDetachedChildPid(child.pid);let timedOut=!1,timeoutHandle,streamCallbackError,hasStreamCallbackError=!1,killedController=new AbortController,onAbort=()=>{child.pid&&killProcessTree(child.pid),killedController.abort()};try{let handleData=data=>{if(!hasStreamCallbackError)try{let callbackResult=onData(data);callbackResult&&typeof callbackResult.then=="function"&&Promise.resolve(callbackResult).catch(error2=>{hasStreamCallbackError||(streamCallbackError=error2,hasStreamCallbackError=!0),onAbort()})}catch(error2){streamCallbackError=error2,hasStreamCallbackError=!0,onAbort()}};timeoutMs!==void 0&&(timeoutHandle=setTimeout(()=>{timedOut=!0,onAbort()},timeoutMs)),child.stdout?.on("data",handleData),child.stderr?.on("data",handleData),signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let exitCode=await waitForChildProcess(child,{signal:killedController.signal});if(hasStreamCallbackError)throw streamCallbackError;if(signal?.aborted)throw new Error("aborted");if(timedOut)throw new Error(`timeout:${timeout}`);return{exitCode}}finally{let pid=child.pid;pid!==void 0&&(child.exitCode!==null||child.signalCode!==null?noteDetachedChildExited(pid):(child.unref(),child.once("exit",()=>noteDetachedChildExited(pid)))),pruneTrackedDetachedChildren(),timeoutHandle&&clearTimeout(timeoutHandle),signal&&signal.removeEventListener("abort",onAbort)}}}}function createLocalBashOperations(options){return createLocalShellOperations("bash",()=>getShellConfig(options?.shellPath))}function resolveSpawnContext(command,cwd,spawnHook,exposeSessionEnvironment,ctx){let env={...getShellEnv()};if(delete env.PI_SESSION_ID,delete env.PI_SESSION_FILE,delete env.PI_SESSION_CWD,delete env.PI_GOAL_STORE_FILE,delete env.PI_PROVIDER,delete env.PI_MODEL,delete env.PI_REASONING_LEVEL,exposeSessionEnvironment&&ctx){let model=ctx.model;env.PI_SESSION_ID=ctx.sessionManager.getSessionId(),env.PI_SESSION_CWD=ctx.cwd,ctx.goalStoreFile&&(env.PI_GOAL_STORE_FILE=ctx.goalStoreFile);let sessionFile=ctx.sessionManager.getSessionFile();sessionFile&&(env.PI_SESSION_FILE=sessionFile),model&&(env.PI_PROVIDER=model.provider,env.PI_MODEL=model.id),ctx.thinkingLevel&&(env.PI_REASONING_LEVEL=ctx.thinkingLevel)}let baseContext={command,cwd,env};return spawnHook?spawnHook(baseContext):baseContext}function createShellToolDefinition(cwd,config,options){let ops=options?.operations??createLocalBashOperations({shellPath:options?.shellPath}),commandPrefix=options?.commandPrefix,exposeSessionEnvironment=options?.exposeSessionEnvironment??!0,spawnHook=options?.spawnHook;return{name:config.name,label:config.label,description:`Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr. Output is truncated to last ${2e3} lines or ${51200/1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,promptSnippet:config.promptSnippet,promptGuidelines:exposeSessionEnvironment&&config.promptGuidelines?[...config.promptGuidelines]:void 0,parameters:bashSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{command,timeout},signal,onUpdate,ctx){let resolvedCommand=commandPrefix?`${commandPrefix}
2220
- ${command}`:command,spawnContext=resolveSpawnContext(resolvedCommand,ctx?.cwd||cwd,spawnHook,exposeSessionEnvironment,ctx),output=new OutputAccumulator({tempFilePrefix:config.tempFilePrefix}),acceptingOutput=!0,updateTimer,updateDirty=!1,lastUpdateAt=0,outputUpdateError,hasOutputUpdateError=!1,emitOutputUpdate=()=>{if(!onUpdate||!updateDirty||hasOutputUpdateError)return;updateDirty=!1,lastUpdateAt=Date.now();let snapshot=output.snapshot({persistIfTruncated:!0});try{onUpdate({content:[{type:"text",text:snapshot.content||""}],details:{truncation:snapshot.truncation.truncated?snapshot.truncation:void 0,fullOutputPath:snapshot.fullOutputPath}})}catch(error2){outputUpdateError=error2,hasOutputUpdateError=!0}},clearUpdateTimer=()=>{updateTimer&&(clearTimeout(updateTimer),updateTimer=void 0)},scheduleOutputUpdate=()=>{if(!onUpdate)return;updateDirty=!0;let delay3=BASH_UPDATE_THROTTLE_MS2-(Date.now()-lastUpdateAt);if(delay3<=0){clearUpdateTimer(),emitOutputUpdate();return}updateTimer??=setTimeout(()=>{updateTimer=void 0,emitOutputUpdate()},delay3)};onUpdate&&onUpdate({content:[],details:void 0});let handleData=data=>{acceptingOutput&&(output.append(data),scheduleOutputUpdate())},finishOutput=async()=>{acceptingOutput=!1,clearUpdateTimer();let primaryError,hasPrimaryError=!1,snapshot;try{output.finish(),emitOutputUpdate(),snapshot=output.snapshot({persistIfTruncated:!0}),hasOutputUpdateError&&(primaryError=outputUpdateError,hasPrimaryError=!0)}catch(error2){primaryError=error2,hasPrimaryError=!0}try{await output.closeTempFile()}catch(closeError){throw hasPrimaryError?new AggregateError([primaryError,closeError],"Bash output finalization and spill cleanup failed"):closeError}if(hasPrimaryError){try{await output.removeTempFile()}catch(unlinkError){throw unlinkError instanceof Error?new AggregateError([primaryError,unlinkError],"Bash output finalization and spill cleanup failed"):unlinkError}throw primaryError}if(snapshot===void 0)throw new Error("Bash output finalization produced no snapshot");return snapshot},formatOutput=(snapshot,emptyText="(no output)")=>{let truncation=snapshot.truncation,text2=snapshot.content||emptyText,details;if(truncation.truncated){details={truncation,fullOutputPath:snapshot.fullOutputPath};let startLine=truncation.totalLines-truncation.outputLines+1,endLine=truncation.totalLines;if(truncation.lastLinePartial){let lastLineSize=formatSize(output.getLastLineBytes());text2+=`
2221
-
2222
- [Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} (line is ${lastLineSize}). Full output: ${snapshot.fullOutputPath}]`}else truncation.truncatedBy==="lines"?text2+=`
2220
+ ${command}`:command,spawnContext=resolveSpawnContext(resolvedCommand,ctx?.cwd||cwd,spawnHook,exposeSessionEnvironment,ctx),output=new OutputAccumulator({tempFilePrefix:config.tempFilePrefix}),acceptingOutput=!0,updateTimer,updateDirty=!1,lastUpdateAt=0,outputUpdateError,hasOutputUpdateError=!1,emitOutputUpdate=()=>{if(!onUpdate||!updateDirty||hasOutputUpdateError)return;updateDirty=!1,lastUpdateAt=Date.now();let snapshot=output.snapshot({persistIfTruncated:!0});try{onUpdate({content:[{type:"text",text:snapshot.content||""}],details:{truncation:snapshot.truncation.truncated?snapshot.truncation:void 0,fullOutputPath:snapshot.fullOutputPath}})}catch(error2){outputUpdateError=error2,hasOutputUpdateError=!0}},clearUpdateTimer=()=>{updateTimer&&(clearTimeout(updateTimer),updateTimer=void 0)},scheduleOutputUpdate=()=>{if(!onUpdate)return;updateDirty=!0;let delay3=BASH_UPDATE_THROTTLE_MS2-(Date.now()-lastUpdateAt);if(delay3<=0){clearUpdateTimer(),emitOutputUpdate();return}updateTimer??=setTimeout(()=>{updateTimer=void 0,emitOutputUpdate()},delay3)};onUpdate&&onUpdate({content:[],details:void 0});let handleData=data=>{acceptingOutput&&(output.append(data),scheduleOutputUpdate())},finishOutput=async()=>{acceptingOutput=!1,clearUpdateTimer();let primaryError,hasPrimaryError=!1,snapshot;try{output.finish(),emitOutputUpdate(),snapshot=output.snapshot({persistIfTruncated:!0}),hasOutputUpdateError&&(primaryError=outputUpdateError,hasPrimaryError=!0)}catch(error2){primaryError=error2,hasPrimaryError=!0}try{await output.closeTempFile()}catch(closeError){throw hasPrimaryError?new AggregateError([primaryError,closeError],"Bash output finalization and spill cleanup failed"):closeError}if(hasPrimaryError){try{await output.removeTempFile()}catch(unlinkError){throw unlinkError instanceof Error?new AggregateError([primaryError,unlinkError],"Bash output finalization and spill cleanup failed"):unlinkError}throw primaryError}if(snapshot===void 0)throw new Error("Bash output finalization produced no snapshot");return snapshot},formatOutput=(snapshot,emptyText="(no output)")=>{let truncation=snapshot.truncation,text2=snapshot.content||emptyText,notice2,details;if(truncation.truncated){details={truncation,fullOutputPath:snapshot.fullOutputPath};let startLine=truncation.totalLines-truncation.outputLines+1,endLine=truncation.totalLines;if(truncation.lastLinePartial){let lastLineSize=formatSize(output.getLastLineBytes());notice2=`[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} (line is ${lastLineSize}). Full output: ${snapshot.fullOutputPath}]`}else truncation.truncatedBy==="lines"?notice2=`[Showing lines ${startLine}-${endLine} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`:notice2=`[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(51200)} limit). Full output: ${snapshot.fullOutputPath}]`}let content=[{type:"text",text:notice2===void 0?text2:`${text2}
2221
+ `}];return notice2!==void 0&&content.push(modelOnlyText(notice2)),{text:notice2===void 0?text2:`${text2}
2223
2222
 
2224
- [Showing lines ${startLine}-${endLine} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`:text2+=`
2223
+ ${notice2}`,content,details}},appendStatus=(text2,status)=>`${text2?`${text2}
2225
2224
 
2226
- [Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(51200)} limit). Full output: ${snapshot.fullOutputPath}]`}return{text:text2,details}},appendStatus=(text2,status)=>`${text2?`${text2}
2227
-
2228
- `:""}${status}`;try{let exitCode;try{exitCode=(await ops.exec(spawnContext.command,spawnContext.cwd,{onData:handleData,signal,timeout,env:spawnContext.env})).exitCode}catch(err2){let snapshot2;try{snapshot2=await finishOutput()}catch(cleanupError){throw new AggregateError([err2,cleanupError],"Bash command and output cleanup failed")}let{text:text2}=formatOutput(snapshot2,"");if(err2 instanceof Error&&err2.message==="aborted")throw new Error(appendStatus(text2,"Command aborted"));if(err2 instanceof Error&&err2.message.startsWith("timeout:")){let timeoutSecs=err2.message.split(":")[1];throw new Error(appendStatus(text2,`Command timed out after ${timeoutSecs} seconds`))}try{await output.removeTempFile()}catch(unlinkError){throw new AggregateError([err2,unlinkError],"Bash command and output cleanup failed")}throw err2}let snapshot=await finishOutput(),{text:outputText,details}=formatOutput(snapshot);if(exitCode!==0&&exitCode!==null)throw new Error(appendStatus(outputText,`Command exited with code ${exitCode}`));return{content:[{type:"text",text:outputText}],details}}finally{clearUpdateTimer()}},...createShellRenderers(config.prompt)}}var bashToolConfig={name:"bash",label:"bash",shellName:"bash",prompt:"$",promptSnippet:bashToolSystemPromptContribution.snippet,promptGuidelines:bashToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-bash"};function createBashToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,bashToolConfig,options),exposure:"eval"}}function createBashTool2(cwd,options){let definition=createBashToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants7}from"fs";import{access as fsAccess2,readFile as fsReadFile2,writeFile as fsWriteFile}from"fs/promises";import{constants as constants6}from"fs";import{access as access4,readFile as readFile17}from"fs/promises";import{accessSync as accessSync2,constants as constants5}from"node:fs";import{access as access3}from"node:fs/promises";var NARROW_NO_BREAK_SPACE2="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE2}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function fileExists3(filePath){try{return accessSync2(filePath,constants5.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access3(filePath,constants5.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists3(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists3(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists3(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists3(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists3(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}function detectLineEnding2(content){let crlfIdx=content.indexOf(`\r
2225
+ `:""}${status}`;try{let exitCode;try{exitCode=(await ops.exec(spawnContext.command,spawnContext.cwd,{onData:handleData,signal,timeout,env:spawnContext.env})).exitCode}catch(err2){let snapshot2;try{snapshot2=await finishOutput()}catch(cleanupError){throw new AggregateError([err2,cleanupError],"Bash command and output cleanup failed")}let{text:text2}=formatOutput(snapshot2,"");if(err2 instanceof Error&&err2.message==="aborted")throw new Error(appendStatus(text2,"Command aborted"));if(err2 instanceof Error&&err2.message.startsWith("timeout:")){let timeoutSecs=err2.message.split(":")[1];throw new Error(appendStatus(text2,`Command timed out after ${timeoutSecs} seconds`))}try{await output.removeTempFile()}catch(unlinkError){throw new AggregateError([err2,unlinkError],"Bash command and output cleanup failed")}throw err2}let snapshot=await finishOutput(),{text:outputText,content,details}=formatOutput(snapshot);if(exitCode!==0&&exitCode!==null)throw new Error(appendStatus(outputText,`Command exited with code ${exitCode}`));return{content,details}}finally{clearUpdateTimer()}},...createShellRenderers(config.prompt)}}var bashToolConfig={name:"bash",label:"bash",shellName:"bash",prompt:"$",promptSnippet:bashToolSystemPromptContribution.snippet,promptGuidelines:bashToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-bash"};function createBashToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,bashToolConfig,options),exposure:"eval"}}function createBashTool2(cwd,options){let definition=createBashToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants7}from"fs";import{access as fsAccess2,readFile as fsReadFile2,writeFile as fsWriteFile}from"fs/promises";import{constants as constants6}from"fs";import{access as access4,readFile as readFile17}from"fs/promises";import{accessSync as accessSync2,constants as constants5}from"node:fs";import{access as access3}from"node:fs/promises";var NARROW_NO_BREAK_SPACE2="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE2}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function fileExists3(filePath){try{return accessSync2(filePath,constants5.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access3(filePath,constants5.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists3(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists3(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists3(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists3(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists3(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}function detectLineEnding2(content){let crlfIdx=content.indexOf(`\r
2229
2226
  `),lfIdx=content.indexOf(`
2230
2227
  `);return lfIdx===-1||crlfIdx===-1?`
2231
2228
  `:crlfIdx<lfIdx?`\r
@@ -2247,20 +2244,18 @@ ${displayLines.map(line=>theme2.fg("toolOutput",line)).join(`
2247
2244
  `)}`,remaining>0&&(text2+=`${theme2.fg("muted",`
2248
2245
  ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}let resultLimit=result3.details?.resultLimitReached,truncation=result3.details?.truncation;if(resultLimit||truncation?.truncated){let warnings=[];resultLimit&&warnings.push(`${resultLimit} results limit`),truncation?.truncated&&warnings.push(`${formatSize(truncation.maxBytes??51200)} limit`),text2+=`
2249
2246
  ${theme2.fg("warning",`[Truncated: ${warnings.join(", ")}]`)}`}return text2}var findRenderers={renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatFindCall(args,theme2)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatFindResult(result3,options,theme2,context.showImages)),text2}};function relativizeFindResultPath(resultPath,searchPath,pathModule=path8){let hadTrailingSeparator=resultPath.endsWith(pathModule.sep)||pathModule.sep==="\\"&&resultPath.endsWith("/"),posixPath=(pathModule.isAbsolute(resultPath)?pathModule.relative(searchPath,resultPath):resultPath).split(pathModule.sep).join("/");return hadTrailingSeparator&&!posixPath.endsWith("/")?`${posixPath}/`:posixPath}var findSchema=typebox_exports.Object({pattern:typebox_exports.String({description:"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'"}),path:typebox_exports.Optional(typebox_exports.String({description:"Directory to search in (default: current directory)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of results (default: 1000)"}))}),findToolSystemPromptContribution={snippet:"Find files by glob pattern (respects .gitignore)",guidelines:[]},DEFAULT_LIMIT2=1e3,defaultFindOperations={exists:pathExists,glob:()=>[]};function createFindToolDefinition(cwd,options){let customOps=options?.operations,filesystemPolicy=options?.filesystemPolicy;return{name:"find",label:"find",description:`Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT2} results or ${51200/1024}KB (whichever is hit first).`,promptSnippet:findToolSystemPromptContribution.snippet,parameters:findSchema,async execute(_toolCallId,{pattern,path:searchDir,limit},signal,_onUpdate,ctx){return new Promise((resolve42,reject)=>{if(signal?.aborted){reject(new Error("Operation aborted"));return}let settled=!1,stopChild,settle=fn=>{settled||(settled=!0,signal?.removeEventListener("abort",onAbort),stopChild=void 0,fn())},onAbort=()=>{stopChild?.(),settle(()=>reject(new Error("Operation aborted")))};signal?.addEventListener("abort",onAbort,{once:!0}),(async()=>{try{let searchPath=resolveToCwd(searchDir||".",ctx?.cwd||cwd),effectiveLimit=limit??DEFAULT_LIMIT2,ops=customOps??defaultFindOperations;if(filesystemPolicy){let decision=await filesystemPolicy({operation:"enumerate",canonicalPath:await canonicalizeFilesystemPath(searchPath),toolName:"find"});if(!decision.allow)throw new Error(decision.reason);if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}}if(customOps?.glob){if(!await ops.exists(searchPath)){settle(()=>reject(new Error(`Path not found: ${searchPath}`)));return}if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}let results=await ops.glob(pattern,searchPath,{ignore:["**/node_modules/**","**/.git/**"],limit:effectiveLimit});if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}if(results.length===0){settle(()=>resolve42({content:[{type:"text",text:"No files found matching pattern"}],details:void 0}));return}let relativized=results.map(p=>relativizeFindResultPath(p,searchPath)),resultLimitReached=relativized.length>=effectiveLimit,rawOutput=relativized.join(`
2250
- `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),resultOutput=truncation.content,details={},notices=[];resultLimitReached&&(notices.push(`${effectiveLimit} results limit reached`),details.resultLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation),notices.length>0&&(resultOutput+=`
2251
-
2252
- [${notices.join(". ")}]`),settle(()=>resolve42({content:[{type:"text",text:resultOutput}],details:Object.keys(details).length>0?details:void 0}));return}let fdPath=await ensureTool("fd");if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}if(!fdPath){settle(()=>reject(new Error("fd is not available and could not be downloaded")));return}let args=["--glob","--color=never","--hidden"],insideGitRepo=!1;for(let current=searchPath;;){if(await pathExists(path8.join(current,".git"))){insideGitRepo=!0;break}let parent=path8.dirname(current);if(parent===current)break;current=parent}insideGitRepo||args.push("--no-require-git"),args.push("--max-results",String(effectiveLimit));let effectivePattern=pattern;pattern.includes("/")&&(args.push("--full-path"),!pattern.startsWith("/")&&!pattern.startsWith("**/")&&pattern!=="**"&&(effectivePattern=`**/${pattern}`),process.platform==="win32"&&(effectivePattern=effectivePattern.replaceAll("/",String.raw`[/\\]`))),args.push("--",effectivePattern,searchPath);let child=spawn8(fdPath,args,{stdio:["ignore","pipe","pipe"]}),rl=createInterface({input:child.stdout}),stderr="",lines=[];stopChild=()=>{child.killed||child.kill()};let cleanup=()=>{rl.close()};child.stderr?.on("data",chunk=>{stderr+=chunk.toString()}),rl.on("line",line=>{lines.push(line)}),child.on("error",error2=>{cleanup(),settle(()=>reject(new Error(`Failed to run fd: ${error2.message}`)))}),child.on("close",code=>{if(cleanup(),signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}let output=lines.join(`
2247
+ `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),details={},notices=[];resultLimitReached&&(notices.push(`${effectiveLimit} results limit reached`),details.resultLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation);let content=[{type:"text",text:truncation.content}];notices.length>0&&(content[0].text+=`
2248
+ `,content.push(modelOnlyText(`[${notices.join(". ")}]`))),settle(()=>resolve42({content,details:Object.keys(details).length>0?details:void 0}));return}let fdPath=await ensureTool("fd");if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}if(!fdPath){settle(()=>reject(new Error("fd is not available and could not be downloaded")));return}let args=["--glob","--color=never","--hidden"],insideGitRepo=!1;for(let current=searchPath;;){if(await pathExists(path8.join(current,".git"))){insideGitRepo=!0;break}let parent=path8.dirname(current);if(parent===current)break;current=parent}insideGitRepo||args.push("--no-require-git"),args.push("--max-results",String(effectiveLimit));let effectivePattern=pattern;pattern.includes("/")&&(args.push("--full-path"),!pattern.startsWith("/")&&!pattern.startsWith("**/")&&pattern!=="**"&&(effectivePattern=`**/${pattern}`),process.platform==="win32"&&(effectivePattern=effectivePattern.replaceAll("/",String.raw`[/\\]`))),args.push("--",effectivePattern,searchPath);let child=spawn8(fdPath,args,{stdio:["ignore","pipe","pipe"]}),rl=createInterface({input:child.stdout}),stderr="",lines=[];stopChild=()=>{child.killed||child.kill()};let cleanup=()=>{rl.close()};child.stderr?.on("data",chunk=>{stderr+=chunk.toString()}),rl.on("line",line=>{lines.push(line)}),child.on("error",error2=>{cleanup(),settle(()=>reject(new Error(`Failed to run fd: ${error2.message}`)))}),child.on("close",code=>{if(cleanup(),signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}let output=lines.join(`
2253
2249
  `);if(code!==0){let errorMsg=stderr.trim()||`fd exited with code ${code}`;if(!output){settle(()=>reject(new Error(errorMsg)));return}}if(!output){settle(()=>resolve42({content:[{type:"text",text:"No files found matching pattern"}],details:void 0}));return}let relativized=[];for(let rawLine of lines){let line=rawLine.replace(/\r$/,"").trim();line&&relativized.push(relativizeFindResultPath(line,searchPath))}let resultLimitReached=relativized.length>=effectiveLimit,rawOutput=relativized.join(`
2254
- `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),resultOutput=truncation.content,details={},notices=[];resultLimitReached&&(notices.push(`${effectiveLimit} results limit reached. Use limit=${effectiveLimit*2} for more, or refine pattern`),details.resultLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation),notices.length>0&&(resultOutput+=`
2255
-
2256
- [${notices.join(". ")}]`),settle(()=>resolve42({content:[{type:"text",text:resultOutput}],details:Object.keys(details).length>0?details:void 0}))})}catch(e){if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}let error2=e instanceof Error?e:new Error(String(e));settle(()=>reject(error2))}})()})},...findRenderers}}function createFindTool(cwd,options){return wrapToolDefinition(createFindToolDefinition(cwd,options))}import{stat as stat7}from"node:fs/promises";import{resolve as resolve33}from"node:path";function displayPath5(path13){return/[\x00-\x1f\x7f]/.test(path13)?JSON.stringify(path13):path13}function formatGrepText(result3,{now:now2=()=>result3.scan.elapsedMs}={}){let blocks=[];if(result3.matches.length)for(let file of result3.fileMatches){let rows=result3.matches.filter(match=>match.path===file.path);blocks.push([displayPath5(file.path),...rows.map(row=>`${row.line}${row.isContext?"-":":"} ${row.text}`)].join(`
2250
+ `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),details={},notices=[];resultLimitReached&&(notices.push(`${effectiveLimit} results limit reached. Use limit=${effectiveLimit*2} for more, or refine pattern`),details.resultLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation);let content=[{type:"text",text:truncation.content}];notices.length>0&&(content[0].text+=`
2251
+ `,content.push(modelOnlyText(`[${notices.join(". ")}]`))),settle(()=>resolve42({content,details:Object.keys(details).length>0?details:void 0}))})}catch(e){if(signal?.aborted){settle(()=>reject(new Error("Operation aborted")));return}let error2=e instanceof Error?e:new Error(String(e));settle(()=>reject(error2))}})()})},...findRenderers}}function createFindTool(cwd,options){return wrapToolDefinition(createFindToolDefinition(cwd,options))}import{stat as stat7}from"node:fs/promises";import{resolve as resolve33}from"node:path";function displayPath5(path13){return/[\x00-\x1f\x7f]/.test(path13)?JSON.stringify(path13):path13}function formatGrepContent(result3,{now:now2=()=>result3.scan.elapsedMs}={}){let blocks=[];if(result3.matches.length)for(let file of result3.fileMatches){let rows=result3.matches.filter(match=>match.path===file.path);blocks.push([displayPath5(file.path),...rows.map(row=>`${row.line}${row.isContext?"-":":"} ${row.text}`)].join(`
2257
2252
  `))}else result3.fileCount?blocks.push(result3.fileMatches.map(file=>file.count===null?displayPath5(file.path):`${displayPath5(file.path)}: ${file.count}`).join(`
2258
- `)):blocks.push(result3.status==="pageEnd"?`No more results (skip=${result3.skip})`:result3.status==="partial"?"No matches found in searched portion":"No matches found");let notes=[],scan2=result3.scan;return scan2.prefixSearched&&notes.push(`Partial coverage: searched only the first 4 MiB of ${scan2.prefixSearched} large file(s); later matches are omitted.`),scan2.skippedOversized&&notes.push(`Skipped ${scan2.skippedOversized} unreadable/unsearchable large file(s).`),scan2.skippedBinary&&notes.push(`Skipped ${scan2.skippedBinary} binary file(s).`),scan2.missingPaths.length&&notes.push(`Skipped missing path(s): ${scan2.missingPaths.map(displayPath5).join(", ")}`),scan2.timedOut&&notes.push(scan2.warnings.find(w=>w.code==="TIMED_OUT")?.message??"Timed out after 30000 ms; showing the completed ordered prefix."),scan2.regexEngine==="pcre2"&&notes.push("Regex unsupported by the native engine; matched with ripgrep --pcre2."),scan2.patternKind==="literal"&&notes.push(`Pattern searched literally: ${scan2.effectivePattern}`),scan2.patternKind==="sanitized"&&notes.push(`Pattern sanitized: ${scan2.effectivePattern}`),notes.push(`[grep: matches=${result3.matchCount??"n/a"} files=${result3.fileCount} searched=${scan2.filesSearched} elapsedMs=${Math.max(0,Math.round(now2()))} engine=${result3.engine} nextSkip=${result3.nextSkip??"none"}]`),`${blocks.join(`
2253
+ `)):blocks.push(result3.status==="pageEnd"?`No more results (skip=${result3.skip})`:result3.status==="partial"?"No matches found in searched portion":"No matches found");let notes=[],scan2=result3.scan;scan2.prefixSearched&&notes.push(`Partial coverage: searched only the first 4 MiB of ${scan2.prefixSearched} large file(s); later matches are omitted.`),scan2.skippedOversized&&notes.push(`Skipped ${scan2.skippedOversized} unreadable/unsearchable large file(s).`),scan2.skippedBinary&&notes.push(`Skipped ${scan2.skippedBinary} binary file(s).`),scan2.missingPaths.length&&notes.push(`Skipped missing path(s): ${scan2.missingPaths.map(displayPath5).join(", ")}`),scan2.timedOut&&notes.push(scan2.warnings.find(w=>w.code==="TIMED_OUT")?.message??"Timed out after 30000 ms; showing the completed ordered prefix."),scan2.regexEngine==="pcre2"&&notes.push("Regex unsupported by the native engine; matched with ripgrep --pcre2."),scan2.patternKind==="literal"&&notes.push(`Pattern searched literally: ${scan2.effectivePattern}`),scan2.patternKind==="sanitized"&&notes.push(`Pattern sanitized: ${scan2.effectivePattern}`);let footer=`[grep: matches=${result3.matchCount??"n/a"} files=${result3.fileCount} searched=${scan2.filesSearched} elapsedMs=${Math.max(0,Math.round(now2()))} engine=${result3.engine} nextSkip=${result3.nextSkip??"none"}]`;return[{type:"text",text:`${blocks.join(`
2259
2254
 
2260
2255
  `)}
2261
-
2256
+ ${notes.length?`
2262
2257
  ${notes.join(`
2263
- `)}`}var COLLAPSED_LINE_BUDGET=15;function isV1Details(value2){if(!value2||typeof value2!="object")return!1;let details=value2;return details.version===1&&Array.isArray(details.matches)}function formatCallPaths(path13,theme2,cwd){return Array.isArray(path13)?path13.length===0||path13.some(entry=>typeof entry!="string")?invalidArgText(theme2):path13.map(entry=>renderToolPath(entry,theme2,cwd,{emptyFallback:"."})).join(", "):renderToolPath(str2(path13),theme2,cwd,{emptyFallback:"."})}function formatCallGlobs(glob){return glob===void 0?void 0:(Array.isArray(glob)?glob:[glob]).filter(entry=>typeof entry=="string").join(",")||void 0}function formatGrepCall(args,theme2,cwd){let pattern=str2(args?.pattern),invalidArg=invalidArgText(theme2),text2=`${theme2.fg("toolTitle",theme2.bold("grep"))} ${pattern===null?invalidArg:theme2.fg("accent",`/${pattern||""}/`)}${theme2.fg("toolOutput"," in ")}${formatCallPaths(args?.path,theme2,cwd)}`,glob=formatCallGlobs(args?.glob);return glob&&(text2+=theme2.fg("toolOutput",` ${glob}`)),typeof args?.mode=="string"&&args.mode&&(text2+=theme2.fg("toolOutput",` ${args.mode}`)),typeof args?.skip=="number"&&(text2+=theme2.fg("toolOutput",` skip ${args.skip}`)),text2}function formatFileHeader(path13,theme2,cwd){return linkPath(theme2.fg("accent",displayPath5(path13)),path13,cwd)}function formatMatchRow(match,theme2){let row=`${match.line}${match.isContext?"-":":"} ${match.text}`;return match.isContext?theme2.fg("dim",row):theme2.fg("accent",row)}function truncationHeader(details,theme2){let warnings=[];if(details.totalLimitReached&&warnings.push(`${details.matchCount} matches limit`),details.fileLimitReached&&warnings.push("file page limit"),details.perFileLimitReached&&warnings.push("per-file limit"),details.truncation?.truncated&&warnings.push(`${formatSize(details.truncation.maxBytes??51200)} limit`),details.linesTruncated&&warnings.push("some lines truncated"),warnings.length!==0)return theme2.fg("warning",`truncated: ${warnings.join(", ")}`)}function footerLine(details,theme2){return theme2.fg("muted",`[grep: matches=${details.matchCount??"n/a"} files=${details.fileCount} nextSkip=${details.nextSkip??"none"}]`)}function noMatchText(details){return details.status==="pageEnd"?`No more results (skip=${details.skip})`:details.status==="partial"?"No matches found in searched portion":"No matches found"}function groupsFromDetails(details){if(details.fileMatches.length>0)return details.fileMatches.map(file=>({path:file.path,count:file.count,rows:details.matches.filter(match=>match.path===file.path)}));let groups=[];for(let match of details.matches){let last=groups[groups.length-1];!last||last.path!==match.path?groups.push({path:match.path,count:null,rows:[match]}):last.rows.push(match)}return groups}function overflowHint(remaining,unit,theme2){return`${theme2.fg("muted",`... (${remaining} more ${unit},`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`}function formatGroupedResult(details,options,theme2,cwd){let lines=[],truncated=truncationHeader(details,theme2);truncated&&lines.push(truncated);let groups=groupsFromDetails(details);if(groups.length===0)lines.push(theme2.fg("toolOutput",noMatchText(details)));else{let hiddenGroups=0;for(let index=0;index<groups.length;index++){let group=groups[index],rows=options.expanded?group.rows:group.rows.filter(row=>!row.isContext),block=[];if(lines.length>0&&block.push(""),rows.length===0&&group.count!==null)block.push(`${formatFileHeader(group.path,theme2,cwd)}${theme2.fg("toolOutput",`: ${group.count}`)}`);else{block.push(formatFileHeader(group.path,theme2,cwd));for(let row of rows)block.push(formatMatchRow(row,theme2))}if(!options.expanded&&lines.length>0&&lines.length+block.length>COLLAPSED_LINE_BUDGET){hiddenGroups=groups.length-index;break}lines.push(...block)}hiddenGroups>0&&lines.push(overflowHint(hiddenGroups,hiddenGroups===1?"file":"files",theme2))}return lines.push(footerLine(details,theme2)),`
2258
+ `)}`:""}`},modelOnlyText(footer)]}var COLLAPSED_LINE_BUDGET=15;function isV1Details(value2){if(!value2||typeof value2!="object")return!1;let details=value2;return details.version===1&&Array.isArray(details.matches)}function formatCallPaths(path13,theme2,cwd){return Array.isArray(path13)?path13.length===0||path13.some(entry=>typeof entry!="string")?invalidArgText(theme2):path13.map(entry=>renderToolPath(entry,theme2,cwd,{emptyFallback:"."})).join(", "):renderToolPath(str2(path13),theme2,cwd,{emptyFallback:"."})}function formatCallGlobs(glob){return glob===void 0?void 0:(Array.isArray(glob)?glob:[glob]).filter(entry=>typeof entry=="string").join(",")||void 0}function formatGrepCall(args,theme2,cwd){let pattern=str2(args?.pattern),invalidArg=invalidArgText(theme2),text2=`${theme2.fg("toolTitle",theme2.bold("grep"))} ${pattern===null?invalidArg:theme2.fg("accent",`/${pattern||""}/`)}${theme2.fg("toolOutput"," in ")}${formatCallPaths(args?.path,theme2,cwd)}`,glob=formatCallGlobs(args?.glob);return glob&&(text2+=theme2.fg("toolOutput",` ${glob}`)),typeof args?.mode=="string"&&args.mode&&(text2+=theme2.fg("toolOutput",` ${args.mode}`)),typeof args?.skip=="number"&&(text2+=theme2.fg("toolOutput",` skip ${args.skip}`)),text2}function formatFileHeader(path13,theme2,cwd){return linkPath(theme2.fg("accent",displayPath5(path13)),path13,cwd)}function formatMatchRow(match,theme2){let row=`${match.line}${match.isContext?"-":":"} ${match.text}`;return match.isContext?theme2.fg("dim",row):theme2.fg("accent",row)}function noMatchText(details){return details.status==="pageEnd"?`No more results (skip=${details.skip})`:details.status==="partial"?"No matches found in searched portion":"No matches found"}function groupsFromDetails(details){if(details.fileMatches.length>0)return details.fileMatches.map(file=>({path:file.path,count:file.count,rows:details.matches.filter(match=>match.path===file.path)}));let groups=[];for(let match of details.matches){let last=groups[groups.length-1];!last||last.path!==match.path?groups.push({path:match.path,count:null,rows:[match]}):last.rows.push(match)}return groups}function overflowHint(remaining,unit,theme2){return`${theme2.fg("muted",`... (${remaining} more ${unit},`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`}function formatGroupedResult(details,options,theme2,cwd){let lines=[],groups=groupsFromDetails(details);if(groups.length===0)lines.push(theme2.fg("toolOutput",noMatchText(details)));else{let hiddenGroups=0;for(let index=0;index<groups.length;index++){let group=groups[index],rows=options.expanded?group.rows:group.rows.filter(row=>!row.isContext),block=[];if(lines.length>0&&block.push(""),rows.length===0&&group.count!==null)block.push(`${formatFileHeader(group.path,theme2,cwd)}${theme2.fg("toolOutput",`: ${group.count}`)}`);else{block.push(formatFileHeader(group.path,theme2,cwd));for(let row of rows)block.push(formatMatchRow(row,theme2))}if(!options.expanded&&lines.length>0&&lines.length+block.length>COLLAPSED_LINE_BUDGET){hiddenGroups=groups.length-index;break}lines.push(...block)}hiddenGroups>0&&lines.push(overflowHint(hiddenGroups,hiddenGroups===1?"file":"files",theme2))}return`
2264
2259
  ${lines.join(`
2265
2260
  `)}`}function formatTextFallback(result3,options,theme2,showImages){let output=getTextOutput(result3,showImages).trim();if(!output)return"";let lines=output.split(`
2266
2261
  `),maxLines=options.expanded?lines.length:COLLAPSED_LINE_BUDGET,displayLines=lines.slice(0,maxLines),remaining=lines.length-maxLines,text2=`
@@ -2269,23 +2264,19 @@ ${displayLines.map(line=>theme2.fg("toolOutput",line)).join(`
2269
2264
  ${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-KDED6XOI.js")).createRgEngine()}async function loadNativeEngine(options,env){let{loadNativeGrep}=await import("./native-loader-FV5UUHL7.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 stat7(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 canonicalPath=await canonicalizeFilesystemPath(path13);if(options?.filesystemPolicy){let decision=await options.filesystemPolicy({operation:"enumerate",canonicalPath,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(`
2270
2265
  `)||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=>resolve33(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}
2271
2266
  ${row.line}: ${row.text}
2272
- `),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:[{type:"text",text:formatGrepText(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(`
2267
+ `),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(`
2273
2268
  `),maxLines=options.expanded?lines.length:20,displayLines=lines.slice(0,maxLines),remaining=lines.length-maxLines;text2+=`
2274
2269
  ${displayLines.map(line=>theme2.fg("toolOutput",line)).join(`
2275
2270
  `)}`,remaining>0&&(text2+=`${theme2.fg("muted",`
2276
2271
  ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}let entryLimit=result3.details?.entryLimitReached,truncation=result3.details?.truncation;if(entryLimit||truncation?.truncated){let warnings=[];entryLimit&&warnings.push(`${entryLimit} entries limit`),truncation?.truncated&&warnings.push(`${formatSize(truncation.maxBytes??51200)} limit`),text2+=`
2277
2272
  ${theme2.fg("warning",`[Truncated: ${warnings.join(", ")}]`)}`}return text2}var lsRenderers={renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatLsCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatLsResult(result3,options,theme2,context.showImages)),text2}};var lsSchema=typebox_exports.Object({path:typebox_exports.Optional(typebox_exports.String({description:"Directory to list (default: current directory)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of entries to return (default: 500)"}))}),lsToolSystemPromptContribution={snippet:"List directory contents",guidelines:[]},DEFAULT_LIMIT3=500,defaultLsOperations={exists:pathExists,stat:fsStat2,readdir:fsReaddir};function createLsToolDefinition(cwd,options){let ops=options?.operations??defaultLsOperations,filesystemPolicy=options?.filesystemPolicy;return{name:"ls",label:"ls",description:`List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT3} entries or ${51200/1024}KB (whichever is hit first).`,promptSnippet:lsToolSystemPromptContribution.snippet,parameters:lsSchema,async execute(_toolCallId,{path:path13,limit},signal,_onUpdate,ctx){return new Promise((resolve42,reject)=>{if(signal?.aborted){reject(new Error("Operation aborted"));return}let onAbort=()=>reject(new Error("Operation aborted"));signal?.addEventListener("abort",onAbort,{once:!0}),(async()=>{try{let dirPath=resolveToCwd(path13||".",ctx?.cwd||cwd),effectiveLimit=limit??DEFAULT_LIMIT3;if(filesystemPolicy){let decision=await filesystemPolicy({operation:"enumerate",canonicalPath:await canonicalizeFilesystemPath(dirPath),toolName:"ls"});if(!decision.allow)throw new Error(decision.reason)}if(!await ops.exists(dirPath)){reject(new Error(`Path not found: ${dirPath}`));return}if(!(await ops.stat(dirPath)).isDirectory()){reject(new Error(`Not a directory: ${dirPath}`));return}let entries;try{entries=await ops.readdir(dirPath)}catch(e){reject(new Error(`Cannot read directory: ${e.message}`));return}entries.sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase()));let results=[],entryLimitReached=!1;for(let entry of entries){if(results.length>=effectiveLimit){entryLimitReached=!0;break}let fullPath=nodePath.join(dirPath,entry),suffix="";try{(await ops.stat(fullPath)).isDirectory()&&(suffix="/")}catch{continue}results.push(entry+suffix)}if(signal?.removeEventListener("abort",onAbort),results.length===0){resolve42({content:[{type:"text",text:"(empty directory)"}],details:void 0});return}let rawOutput=results.join(`
2278
- `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),output=truncation.content,details={},notices=[];entryLimitReached&&(notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit*2} for more`),details.entryLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation),notices.length>0&&(output+=`
2279
-
2280
- [${notices.join(". ")}]`),resolve42({content:[{type:"text",text:output}],details:Object.keys(details).length>0?details:void 0})}catch(e){signal?.removeEventListener("abort",onAbort),reject(e)}})()})},...lsRenderers}}function createLsTool(cwd,options){return wrapToolDefinition(createLsToolDefinition(cwd,options))}var UTF8_OUTPUT_PREFIX=`try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}
2273
+ `),truncation=truncateHead(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),details={},notices=[];entryLimitReached&&(notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit*2} for more`),details.entryLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize(51200)} limit reached`),details.truncation=truncation);let content=[{type:"text",text:truncation.content}];notices.length>0&&(content[0].text+=`
2274
+ `,content.push(modelOnlyText(`[${notices.join(". ")}]`))),resolve42({content,details:Object.keys(details).length>0?details:void 0})}catch(e){signal?.removeEventListener("abort",onAbort),reject(e)}})()})},...lsRenderers}}function createLsTool(cwd,options){return wrapToolDefinition(createLsToolDefinition(cwd,options))}var UTF8_OUTPUT_PREFIX=`try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}
2281
2275
  `,powershellToolSystemPromptContribution={snippet:"Execute PowerShell commands",guidelines:["You can inspect PI_* environment variables for current model and session details."]};function createLocalPowerShellOperations(){let operations=createLocalShellOperations("PowerShell",getPowerShellConfig);return{exec:(command,cwd,options)=>operations.exec(`${UTF8_OUTPUT_PREFIX}${command}`,cwd,options)}}var powershellToolConfig={name:"powershell",label:"powershell",shellName:"PowerShell",prompt:"PS>",promptSnippet:powershellToolSystemPromptContribution.snippet,promptGuidelines:powershellToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-powershell"};function createPowerShellToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,powershellToolConfig,{...options,operations:options?.operations??createLocalPowerShellOperations()}),exposure:"eval"}}function createPowerShellTool(cwd,options){let definition=createPowerShellToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants8}from"fs";import{access as fsAccess3,readFile as fsReadFile3}from"fs/promises";import{open as open6}from"node:fs/promises";var IMAGE_TYPE_SNIFF_BYTES=4100,PNG_SIGNATURE3=[137,80,78,71,13,10,26,10];function detectSupportedImageMimeType2(buffer){return startsWith3(buffer,[255,216,255])?buffer[3]===247?null:"image/jpeg":startsWith3(buffer,PNG_SIGNATURE3)?isPng2(buffer)&&!isAnimatedPng2(buffer)?"image/png":null:startsWithAscii3(buffer,0,"GIF")?"image/gif":startsWithAscii3(buffer,0,"RIFF")&&startsWithAscii3(buffer,8,"WEBP")?"image/webp":startsWithAscii3(buffer,0,"BM")&&isBmp2(buffer)?"image/bmp":null}async function detectSupportedImageMimeTypeFromFile(filePath){let fileHandle=await open6(filePath,"r");try{let buffer=Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES),{bytesRead}=await fileHandle.read(buffer,0,IMAGE_TYPE_SNIFF_BYTES,0);return detectSupportedImageMimeType2(buffer.subarray(0,bytesRead))}finally{await fileHandle.close()}}function isPng2(buffer){return buffer.length>=16&&readUint32BE2(buffer,PNG_SIGNATURE3.length)===13&&startsWithAscii3(buffer,12,"IHDR")}function isAnimatedPng2(buffer){let offset=PNG_SIGNATURE3.length;for(;offset+8<=buffer.length;){let chunkLength=readUint32BE2(buffer,offset),chunkTypeOffset=offset+4;if(startsWithAscii3(buffer,chunkTypeOffset,"acTL"))return!0;if(startsWithAscii3(buffer,chunkTypeOffset,"IDAT"))return!1;let nextOffset=offset+8+chunkLength+4;if(nextOffset<=offset||nextOffset>buffer.length)return!1;offset=nextOffset}return!1}function isBmp2(buffer){if(buffer.length<26)return!1;let declaredFileSize=readUint32LE2(buffer,2),pixelDataOffset=readUint32LE2(buffer,10),dibHeaderSize=readUint32LE2(buffer,14);if(declaredFileSize!==0&&declaredFileSize<26||pixelDataOffset<14+dibHeaderSize||declaredFileSize!==0&&pixelDataOffset>=declaredFileSize)return!1;let colorPlanes,bitsPerPixel;if(dibHeaderSize===12)colorPlanes=readUint16LE2(buffer,22),bitsPerPixel=readUint16LE2(buffer,24);else if(dibHeaderSize>=40&&dibHeaderSize<=124){if(buffer.length<30)return!1;colorPlanes=readUint16LE2(buffer,26),bitsPerPixel=readUint16LE2(buffer,28)}else return!1;return colorPlanes===1&&[1,4,8,16,24,32].includes(bitsPerPixel)}function readUint16LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)}function readUint32BE2(buffer,offset){return(buffer[offset]??0)*16777216+((buffer[offset+1]??0)<<16)+((buffer[offset+2]??0)<<8)+(buffer[offset+3]??0)}function readUint32LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)+((buffer[offset+2]??0)<<16)+(buffer[offset+3]??0)*16777216}function startsWith3(buffer,bytes){return buffer.length<bytes.length?!1:bytes.every((byte,index)=>buffer[index]===byte)}function startsWithAscii3(buffer,offset,text2){if(buffer.length<offset+text2.length)return!1;for(let index=0;index<text2.length;index++)if(buffer[offset+index]!==text2.charCodeAt(index))return!1;return!0}import{basename as basename20,dirname as dirname37,isAbsolute as isAbsolute19,relative as relative15,resolve as resolvePath3,sep as sep12}from"node:path";var classifiers=[];function registerReadClassifier(classifier){let entry={classifier};return classifiers.push(entry),()=>{let index=classifiers.indexOf(entry);index!==-1&&classifiers.splice(index,1)}}function classifyRead(input){for(let{classifier}of classifiers)try{let classification=classifier(input);if(classification!==void 0)return classification}catch(error2){console.warn("Read classifier failed:",error2)}}var COMPACT_RESOURCE_FILE_NAMES=new Set(["AGENTS.override.md","AGENTS.md","AGENTS.MD","CLAUDE.md","CLAUDE.MD"]);function formatReadLineRange(args,theme2){if(args?.offset===void 0&&args?.limit===void 0)return"";let startLine=args.offset??1,endLine=args.limit!==void 0?startLine+args.limit-1:"";return theme2.fg("warning",`:${startLine}${endLine?`-${endLine}`:""}`)}function formatReadCall(args,theme2,cwd){let pathDisplay=renderToolPath(str2(args?.file_path??args?.path),theme2,cwd);return`${theme2.fg("toolTitle",theme2.bold("read"))} ${pathDisplay}${formatReadLineRange(args,theme2)}`}function trimTrailingEmptyLines(lines){let end=lines.length;for(;end>0&&lines[end-1]==="";)end--;return lines.slice(0,end)}function toPosixPath3(filePath){return filePath.split(sep12).join("/")}function getPiDocsClassification(absolutePath){let packageRoot=dirname37(getReadmePath()),relativePath=relative15(resolvePath3(packageRoot),resolvePath3(absolutePath));if(relativePath===""||relativePath===".."||relativePath.startsWith(`..${sep12}`)||isAbsolute19(relativePath))return;let label2=toPosixPath3(relativePath);if(label2==="README.md"||label2.startsWith("docs/")||label2.startsWith("examples/"))return{kind:"docs",label:label2}}function getCompactReadClassification(args,cwd){let rawPath=str2(args?.file_path??args?.path);if(!rawPath)return;let absolutePath=resolveToCwd(rawPath,cwd),fileName=basename20(absolutePath);if(fileName==="SKILL.md")return{kind:"skill",label:basename20(dirname37(absolutePath))||fileName};let registeredClassification=classifyRead({absolutePath,cwd});if(registeredClassification)return registeredClassification;let docsClassification=getPiDocsClassification(absolutePath);if(docsClassification)return docsClassification;if(COMPACT_RESOURCE_FILE_NAMES.has(fileName))return{kind:"resource",label:formatPathRelativeToCwdOrAbsolute(absolutePath,cwd)}}function formatCompactReadCall(classification,args,theme2){let expandHint=theme2.fg("dim",` (${keyText("app.tools.expand")} to expand)`);return classification.kind==="skill"?theme2.fg("customMessageLabel","\x1B[1m[skill]\x1B[22m ")+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:classification.kind==="memory"?theme2.fg("accent",`\x1B[1m\u2726 ${classification.headline??"Recalled"}\x1B[22m`)+" "+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:theme2.fg("toolTitle",theme2.bold(`read ${classification.kind}`))+" "+theme2.fg("accent",classification.label)+formatReadLineRange(args,theme2)+expandHint}function formatReadResult(args,result3,options,theme2,showImages,_cwd,isError){if(!options.expanded&&!isError)return"";let rawPath=str2(args?.file_path??args?.path),output=getTextOutput(result3,showImages),lang=!isError&&rawPath?getLanguageFromPath(rawPath):void 0,renderedLines=lang?highlightCode(replaceTabs2(output),lang):output.split(`
2282
2276
  `),lines=trimTrailingEmptyLines(renderedLines),maxLines=options.expanded?lines.length:10,displayLines=lines.slice(0,maxLines),remaining=lines.length-maxLines,text2=`
2283
2277
  ${displayLines.map(line=>lang?replaceTabs2(line):theme2.fg("toolOutput",replaceTabs2(line))).join(`
2284
- `)}`;remaining>0&&(text2+=`${theme2.fg("muted",`
2285
- ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`);let truncation=result3.details?.truncation;return truncation?.truncated&&(truncation.firstLineExceedsLimit?text2+=`
2286
- ${theme2.fg("warning",`[First line exceeds ${formatSize(truncation.maxBytes??51200)} limit]`)}`:truncation.truncatedBy==="lines"?text2+=`
2287
- ${theme2.fg("warning",`[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines??2e3} line limit)]`)}`:text2+=`
2288
- ${theme2.fg("warning",`[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes??51200)} limit)]`)}`),text2}var readRenderers={renderCall(rawArgs,theme2,context){let args=rawArgs,text2=context.lastComponent??new Text("",0,0),classification;if(!context.expanded){let rawPath=str2(args?.file_path??args?.path);context.state.classifications??=new Map;let classifications=context.state.classifications;classifications.has(rawPath)||classifications.set(rawPath,getCompactReadClassification(args,context.cwd)),classification=classifications.get(rawPath)}return text2.setText(classification?formatCompactReadCall(classification,args,theme2):formatReadCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatReadResult(context.args,result3,options,theme2,context.showImages,context.cwd,context.isError)),text2}};var readSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to read (relative or absolute)"}),offset:typebox_exports.Optional(typebox_exports.Number({description:"Line number to start reading from (1-indexed)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of lines to read"}))}),readToolSystemPromptContribution={snippet:"Read file contents",guidelines:["Use read to examine files instead of cat or sed."]},LOCAL_URI_SCHEME=/^local:\/\//i,LOCAL_URI_GUIDANCE="local:// URIs resolve only inside eval cells via the kernel read()/write() helpers; the read tool takes filesystem paths. Re-read this with the eval read() helper, or retry with the plain absolute file path.",defaultReadOperations={readFile:path13=>fsReadFile3(path13),access:path13=>fsAccess3(path13,constants8.R_OK),detectImageMimeType:detectSupportedImageMimeTypeFromFile};function getNonVisionImageNote(model){if(!(!model||model.input.includes("image")))return"[Current model does not support images. The image will be omitted from this request.]"}function createReadToolDefinition(cwd,options={folder:selectedReadFolder}){let autoResizeImages=options?.autoResizeImages??!0,ops=options?.operations??defaultReadOperations,filesystemPolicy=options?.filesystemPolicy;return{name:"read",label:"read",description:`Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to ${2e3} lines or ${51200/1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,promptSnippet:readToolSystemPromptContribution.snippet,promptGuidelines:[...readToolSystemPromptContribution.guidelines],parameters:readSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,offset,limit},signal,_onUpdate,ctx){if(LOCAL_URI_SCHEME.test(path13))throw new Error(LOCAL_URI_GUIDANCE);return new Promise((resolve42,reject)=>{if(signal?.aborted){reject(new Error("Operation aborted"));return}let aborted=!1,onAbort=()=>{aborted=!0,reject(new Error("Operation aborted"))};signal?.addEventListener("abort",onAbort,{once:!0}),(async()=>{try{let absolutePath=await resolveReadPathAsync(path13,ctx?.cwd||cwd);if(aborted)return;if(filesystemPolicy){let decision=await filesystemPolicy({operation:"read",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"read"});if(!decision.allow)throw new Error(decision.reason);if(aborted)return}if(await ops.access(absolutePath),aborted)return;let mimeType=ops.detectImageMimeType?await ops.detectImageMimeType(absolutePath):void 0,content,details,nonVisionImageNote=getNonVisionImageNote(ctx?.model);if(mimeType){let buffer=await ops.readFile(absolutePath),processed=await processImage(buffer,mimeType,{autoResizeImages});if(processed.ok){let textNote=`Read image file [${processed.mimeType}]`;processed.hints.length>0&&(textNote+=`
2278
+ `)}`;return remaining>0&&(text2+=`${theme2.fg("muted",`
2279
+ ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`),text2}var readRenderers={renderCall(rawArgs,theme2,context){let args=rawArgs,text2=context.lastComponent??new Text("",0,0),classification;if(!context.expanded){let rawPath=str2(args?.file_path??args?.path);context.state.classifications??=new Map;let classifications=context.state.classifications;classifications.has(rawPath)||classifications.set(rawPath,getCompactReadClassification(args,context.cwd)),classification=classifications.get(rawPath)}return text2.setText(classification?formatCompactReadCall(classification,args,theme2):formatReadCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatReadResult(context.args,result3,options,theme2,context.showImages,context.cwd,context.isError)),text2}};var readSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to read (relative or absolute)"}),offset:typebox_exports.Optional(typebox_exports.Number({description:"Line number to start reading from (1-indexed)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of lines to read"}))}),readToolSystemPromptContribution={snippet:"Read file contents",guidelines:["Use read to examine files instead of cat or sed."]},LOCAL_URI_SCHEME=/^local:\/\//i,LOCAL_URI_GUIDANCE="local:// URIs resolve only inside eval cells via the kernel read()/write() helpers; the read tool takes filesystem paths. Re-read this with the eval read() helper, or retry with the plain absolute file path.",defaultReadOperations={readFile:path13=>fsReadFile3(path13),access:path13=>fsAccess3(path13,constants8.R_OK),detectImageMimeType:detectSupportedImageMimeTypeFromFile};function getNonVisionImageNote(model){if(!(!model||model.input.includes("image")))return"[Current model does not support images. The image will be omitted from this request.]"}function createReadToolDefinition(cwd,options={folder:selectedReadFolder}){let autoResizeImages=options?.autoResizeImages??!0,ops=options?.operations??defaultReadOperations,filesystemPolicy=options?.filesystemPolicy;return{name:"read",label:"read",description:`Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to ${2e3} lines or ${51200/1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,promptSnippet:readToolSystemPromptContribution.snippet,promptGuidelines:[...readToolSystemPromptContribution.guidelines],parameters:readSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,offset,limit},signal,_onUpdate,ctx){if(LOCAL_URI_SCHEME.test(path13))throw new Error(LOCAL_URI_GUIDANCE);return new Promise((resolve42,reject)=>{if(signal?.aborted){reject(new Error("Operation aborted"));return}let aborted=!1,onAbort=()=>{aborted=!0,reject(new Error("Operation aborted"))};signal?.addEventListener("abort",onAbort,{once:!0}),(async()=>{try{let absolutePath=await resolveReadPathAsync(path13,ctx?.cwd||cwd);if(aborted)return;if(filesystemPolicy){let decision=await filesystemPolicy({operation:"read",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"read"});if(!decision.allow)throw new Error(decision.reason);if(aborted)return}if(await ops.access(absolutePath),aborted)return;let mimeType=ops.detectImageMimeType?await ops.detectImageMimeType(absolutePath):void 0,content,details,nonVisionImageNote=getNonVisionImageNote(ctx?.model);if(mimeType){let buffer=await ops.readFile(absolutePath),processed=await processImage(buffer,mimeType,{autoResizeImages});if(processed.ok){let textNote=`Read image file [${processed.mimeType}]`;processed.hints.length>0&&(textNote+=`
2289
2280
  ${processed.hints.join(`
2290
2281
  `)}`),nonVisionImageNote&&(textNote+=`
2291
2282
  ${nonVisionImageNote}`),content=[{type:"text",text:textNote},{type:"image",data:processed.data,mimeType:processed.mimeType}]}else{let textNote=`Read image file [${mimeType}]
@@ -2293,13 +2284,8 @@ ${processed.message}`;nonVisionImageNote&&(textNote+=`
2293
2284
  ${nonVisionImageNote}`),content=[{type:"text",text:textNote}]}}else{let buffer=await ops.readFile(absolutePath);if(aborted)return;let textContent3=buffer.toString("utf-8"),allLines=textContent3.split(`
2294
2285
  `),totalFileLines=allLines.length,startLine=offset?Math.max(0,offset-1):0,startLineDisplay=startLine+1;if(startLine>=allLines.length)throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);let selectedContent,userLimitedLines;if(limit!==void 0){let endLine=Math.min(startLine+limit,allLines.length);selectedContent=allLines.slice(startLine,endLine).join(`
2295
2286
  `),userLimitedLines=endLine-startLine}else selectedContent=allLines.slice(startLine).join(`
2296
- `);let truncation=truncateHead(selectedContent),folder=await prepareReadFolder(absolutePath,options.folder);if(aborted)return;let summary=createDefaultReadSummary({path:absolutePath,text:textContent3,offset,limit,folder,truncated:truncation.truncated}),outputText;if(summary)outputText=summary.text;else if(truncation.firstLineExceedsLimit){let firstLineSize=formatSize(Buffer.byteLength(allLines[startLine],"utf-8"));outputText=`[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(51200)} limit. Use bash: sed -n '${startLineDisplay}p' ${path13} | head -c ${51200}]`,details={truncation}}else if(truncation.truncated){let endLineDisplay=startLineDisplay+truncation.outputLines-1,nextOffset=endLineDisplay+1;outputText=truncation.content,truncation.truncatedBy==="lines"?outputText+=`
2297
-
2298
- [Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`:outputText+=`
2299
-
2300
- [Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(51200)} limit). Use offset=${nextOffset} to continue.]`,details={truncation}}else if(userLimitedLines!==void 0&&startLine+userLimitedLines<allLines.length){let remaining=allLines.length-(startLine+userLimitedLines),nextOffset=startLine+userLimitedLines+1;outputText=`${truncation.content}
2301
-
2302
- [${remaining} more lines in file. Use offset=${nextOffset} to continue.]`}else outputText=truncation.content;content=[{type:"text",text:outputText}]}if(aborted)return;signal?.removeEventListener("abort",onAbort),resolve42({content,details})}catch(error2){signal?.removeEventListener("abort",onAbort),aborted||reject(error2)}})()})},...readRenderers}}function createReadTool2(cwd,options){return wrapToolDefinition(createReadToolDefinition(cwd,options))}import{mkdir as fsMkdir,writeFile as fsWriteFile2}from"fs/promises";import{dirname as dirname38}from"path";import{readFile as readFile18}from"fs/promises";async function readLocalWriteBaseline(absolutePath){try{return{kind:"present",content:await readFile18(absolutePath,"utf-8")}}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return{kind:"missing"};if(error2 instanceof Error)return{kind:"unavailable"};throw error2}}function createWriteDetails(path13,content,baseline){switch(baseline.kind){case"missing":return{operation:"add",patch:createUnifiedPatch("/dev/null",path13,"",content)};case"present":return baseline.content===content?void 0:{operation:"update",patch:createUnifiedPatch(path13,path13,baseline.content,content)};case"unavailable":return;default:return baseline}}function formatWriteResult(result3,theme2){if(!result3.isError)return;let output=result3.content.filter(content=>content.type==="text").map(content=>content.text||"").join(`
2287
+ `);let truncation=truncateHead(selectedContent),folder=await prepareReadFolder(absolutePath,options.folder);if(aborted)return;let summary=createDefaultReadSummary({path:absolutePath,text:textContent3,offset,limit,folder,truncated:truncation.truncated}),outputText,notice2;if(summary)outputText=summary.text;else if(truncation.firstLineExceedsLimit){let firstLineSize=formatSize(Buffer.byteLength(allLines[startLine],"utf-8"));outputText="",notice2=`[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(51200)} limit. Use bash: sed -n '${startLineDisplay}p' ${path13} | head -c ${51200}]`,details={truncation}}else if(truncation.truncated){let endLineDisplay=startLineDisplay+truncation.outputLines-1,nextOffset=endLineDisplay+1;outputText=truncation.content,truncation.truncatedBy==="lines"?notice2=`[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`:notice2=`[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(51200)} limit). Use offset=${nextOffset} to continue.]`,details={truncation}}else if(userLimitedLines!==void 0&&startLine+userLimitedLines<allLines.length){let remaining=allLines.length-(startLine+userLimitedLines),nextOffset=startLine+userLimitedLines+1;outputText=truncation.content,notice2=`[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`}else outputText=truncation.content;content=outputText||notice2===void 0?[{type:"text",text:notice2===void 0?outputText:`${outputText}
2288
+ `}]:[],notice2!==void 0&&content.push(modelOnlyText(notice2))}if(aborted)return;signal?.removeEventListener("abort",onAbort),resolve42({content,details})}catch(error2){signal?.removeEventListener("abort",onAbort),aborted||reject(error2)}})()})},...readRenderers}}function createReadTool2(cwd,options){return wrapToolDefinition(createReadToolDefinition(cwd,options))}import{mkdir as fsMkdir,writeFile as fsWriteFile2}from"fs/promises";import{dirname as dirname38}from"path";import{readFile as readFile18}from"fs/promises";async function readLocalWriteBaseline(absolutePath){try{return{kind:"present",content:await readFile18(absolutePath,"utf-8")}}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return{kind:"missing"};if(error2 instanceof Error)return{kind:"unavailable"};throw error2}}function createWriteDetails(path13,content,baseline){switch(baseline.kind){case"missing":return{operation:"add",patch:createUnifiedPatch("/dev/null",path13,"",content)};case"present":return baseline.content===content?void 0:{operation:"update",patch:createUnifiedPatch(path13,path13,baseline.content,content)};case"unavailable":return;default:return baseline}}function formatWriteResult(result3,theme2){if(!result3.isError)return;let output=result3.content.filter(content=>content.type==="text").map(content=>content.text||"").join(`
2303
2289
  `);return output?`
2304
2290
  ${theme2.fg("error",output)}`:void 0}var WriteCallRenderComponent=class extends Text{constructor(){super("",0,0)}},WRITE_PARTIAL_FULL_HIGHLIGHT_LINES=50;function highlightSingleLine(line,lang){return highlightCode(line,lang)[0]??""}function refreshWriteHighlightPrefix(cache){let prefixCount=Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES,cache.normalizedLines.length);if(prefixCount===0)return;let prefixSource=cache.normalizedLines.slice(0,prefixCount).join(`
2305
2291
  `),prefixHighlighted=highlightCode(prefixSource,cache.lang);for(let i=0;i<prefixCount;i++)cache.highlightedLines[i]=prefixHighlighted[i]??highlightSingleLine(cache.normalizedLines[i]??"",cache.lang)}function rebuildWriteHighlightCacheFull(rawPath,fileContent){let lang=rawPath?getLanguageFromPath(rawPath):void 0;if(!lang)return;let displayContent=normalizeDisplayText(fileContent),normalized2=replaceTabs2(displayContent);return{rawPath,lang,rawContent:fileContent,normalizedLines:normalized2.split(`
@@ -2320,7 +2306,7 @@ ${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",lin
2320
2306
  pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
2321
2307
  pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
2322
2308
 
2323
- Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-23GULCVL.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-23GULCVL.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-U5Y46LHO.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-5PEFD4N6.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat8}from"node:fs/promises";import{resolve as resolve35}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve35(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat8(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2309
+ Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-J7244EJE.js");return await handlePackageCommand(args,runtimeOptions)}async function dispatchConfigCommand(args,runtimeOptions={}){if(args[0]!==CONFIG_COMMAND_ARGV)return!1;let{handleConfigCommand}=await import("./package-manager-cli-J7244EJE.js");return await handleConfigCommand(args,runtimeOptions)}async function dispatchAppServerCommand(args){if(args[0]!==APP_SERVER_COMMAND_ARGV)return!1;let{handleAppServerCommand}=await import("./app-server-command-BGT65PGC.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-3PUZYQOK.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat8}from"node:fs/promises";import{resolve as resolve35}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve35(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat8(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2324
2310
  `;continue}let attachment={type:"image",mimeType:processed.mimeType,data:processed.data};images.push(attachment),processed.hints.length>0?text2+=`<file name="${absolutePath}">${processed.hints.join(`
2325
2311
  `)}</file>
2326
2312
  `:text2+=`<file name="${absolutePath}"></file>
@@ -2368,10 +2354,10 @@ Press any key to continue...`)),await new Promise(resolve42=>{process.stdin.setR
2368
2354
  `)}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}
2369
2355
  `):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
2370
2356
  `),writeRawStdout(`${formatProviderNativeBody(content,!1)}
2371
- `))}}return await session.waitForSettledSessionWork(),exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-BXW5C4JT.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync35,mkdirSync as mkdirSync21,renameSync as renameSync16,rmSync as rmSync11}from"node:fs";import{basename as basename23,dirname as dirname41,join as join70,relative as relative17,resolve as resolve37,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve37(path13))}function getQuarantineRoot(packageDir){let current=resolve37(packageDir);for(;;){if(basename23(current).toLowerCase()==="node_modules")return join70(current,QUARANTINE_DIR_NAME);let parent=dirname41(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync11(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join70(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync35(loadedFile))continue;let quarantinePath=join70(quarantineRunDir,relative17(resolvedPackageDir,loadedFile));mkdirSync21(dirname41(quarantinePath),{recursive:!0}),renameSync16(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve42=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve42(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path13,error:error2})=>({type:"warning",message:`Failed to load extension "${path13}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
2357
+ `))}}return await session.waitForSettledSessionWork(),exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-OHPSU5VU.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync35,mkdirSync as mkdirSync21,renameSync as renameSync16,rmSync as rmSync11}from"node:fs";import{basename as basename23,dirname as dirname41,join as join70,relative as relative17,resolve as resolve37,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve37(path13))}function getQuarantineRoot(packageDir){let current=resolve37(packageDir);for(;;){if(basename23(current).toLowerCase()==="node_modules")return join70(current,QUARANTINE_DIR_NAME);let parent=dirname41(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync11(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join70(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync35(loadedFile))continue;let quarantinePath=join70(quarantineRunDir,relative17(resolvedPackageDir,loadedFile));mkdirSync21(dirname41(quarantinePath),{recursive:!0}),renameSync16(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve42=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve42(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path13,error:error2})=>({type:"warning",message:`Failed to load extension "${path13}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
2372
2358
  `));if(command.kind!=="check"){let signal=AbortSignal.timeout(15e3),modelRuntime=await ModelRuntime.create({allowModelNetwork:!1,signal}),credential2=await resolveCredentialForPrint(parsed,modelRuntime,command.kind,command.minExpiryMs,signal);return process.stdout.write(`${credential2}
2373
2359
  `),!0}let requestedAuth=validateAuthCommandArgs(parsed,command.kind),result3,credential;try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create(),modelRuntime=await createAuthCheckModelRuntime(credentials);result3=await checkProviderAuth(parsed,modelRuntime,{refresh:!command.noRefresh}),command.credentials&&result3.status==="ready"&&(credential=await getProviderCredential(result3.provider,modelRuntime,credentials,{refresh:!command.noRefresh}),credential||(result3={status:"not_ready",provider:result3.provider,reason:"credential_not_available"}))}catch{result3={status:"invalid",provider:requestedAuth.provider??requestedAuth.model,reason:"invalid_state"}}let accounts=[];if(command.json&&result3.status!=="invalid")try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create();accounts=await summarizeCredentialAccounts(result3.provider,await credentials.read(result3.provider))}catch{}let output=command.json?JSON.stringify({...result3,accounts,...credential?{credentials:credential}:{}}):credential??result3.status;process.stdout.write(`${output}
2374
- `),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-CO2ZK3EC.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-Z62FXPOJ.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-QC6BZZNH.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join71(agentDir,"auth.json")),authPath:join71(agentDir,"auth.json"),agentDir,modelsPath:join71(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-DUNYT24Q.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-ZQ4E6FFA.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-SCG5PQZ6.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label2=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2360
+ `),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-ZIBANFBQ.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-Z62FXPOJ.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-GFSDQQUJ.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join71(agentDir,"auth.json")),authPath:join71(agentDir,"auth.json"),agentDir,modelsPath:join71(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-57LEAJPU.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-75CRTY24.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-EDJZ4CSY.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label2=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2375
2361
 
2376
2362
  `),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
2377
2363
 
@@ -2414,7 +2400,7 @@ ${sanitizeFallbackString(output,FALLBACK_JSON_MAX_LENGTH)}`),text2}function isCo
2414
2400
  ${formatToolProgressLine(progress,Date.now(),state.spinnerFrame)}`),this.contentText.setText(text2);return}let container=this.renderShell==="self"?this.selfRenderContainer:this.contentBox;container instanceof Box&&container.setBgFn(background),container.detachAll(),this.renderCall(container),state.result&&this.renderResult(container,state.result),progress&&container.addChild(new Text(formatToolProgressLine(progress,Date.now(),state.spinnerFrame),0,0))}getCallRenderer(){return this.identity.toolDefinition?.renderCall??this.builtInDefinition?.renderCall}getResultRenderer(){return this.identity.toolDefinition?.renderResult??this.builtInDefinition?.renderResult}getRenderContext(lastComponent){return{args:this.state.args,toolCallId:this.identity.toolCallId,invalidate:this.onInvalidate,lastComponent,state:this.rendererState,cwd:this.identity.cwd,executionStarted:this.state.executionStarted,argsComplete:this.state.argsComplete,isPartial:this.state.isPartial,expanded:this.state.expanded,showImages:this.state.showImages,imageProtocol:getCapabilities().images,isError:this.state.result?.isError??!1,hasResult:this.state.result!==void 0,spinnerFrame:this.state.spinnerFrame}}renderCall(container){let fallback=createToolCallFallback(this.identity.toolName),renderer=this.getCallRenderer();if(!renderer){container.addChild(this.clickToExpand(fallback));return}try{let component=renderer(this.state.args,theme,this.getRenderContext(this.callRendererComponent));this.addRendererComponent(container,"call",component,fallback)}catch{this.callRendererComponent=void 0,container.addChild(this.clickToExpand(fallback))}}renderResult(container,result3){let fallback=createToolResultFallback(result3,this.state.showImages),renderer=this.getResultRenderer();if(!renderer){fallback&&container.addChild(this.clickToExpand(fallback));return}try{let agentResult={content:result3.content,details:result3.details},component=renderer(agentResult,{expanded:this.state.expanded,isPartial:this.state.isPartial},theme,this.getRenderContext(this.resultRendererComponent));this.addRendererComponent(container,"result",component,fallback)}catch{this.resultRendererComponent=void 0,fallback&&container.addChild(this.clickToExpand(fallback))}}addRendererComponent(container,slot,value2,fallback){if(!isComponent(value2)){this.setRendererComponent(slot,void 0),fallback&&container.addChild(this.clickToExpand(fallback));return}this.setRendererComponent(slot,value2),container.addChild(this.clickToExpand(new ToolRendererBoundary(value2,fallback,()=>{this.getRendererComponent(slot)===value2&&this.setRendererComponent(slot,void 0)})))}getRendererComponent(slot){return slot==="call"?this.callRendererComponent:this.resultRendererComponent}setRendererComponent(slot,component){slot==="call"?this.callRendererComponent=component:this.resultRendererComponent=component}};var PENDING_RENDER_FRAME_INTERVAL_MS=80,FALLBACK_PREVIEW_LINES=10;function collapseFallbackResult(result3,showImages,expanded){if(!result3||expanded)return result3;let output=getTextOutput(result3,showImages);if(!output)return result3;let lines=output.split(`
2415
2401
  `);if(lines.length<=FALLBACK_PREVIEW_LINES)return result3;let remaining=lines.length-FALLBACK_PREVIEW_LINES,text2=lines.slice(0,FALLBACK_PREVIEW_LINES).join(`
2416
2402
  `)+`${theme.fg("muted",`
2417
- ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme.fg("muted",")")}`;return{...result3,content:[{type:"text",text:text2}]}}var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.invalidate(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.invalidateRenderCache()}stopAnimation(){this.stopSpinnerAnimation(),this.stopTodoStrikeAnimation()}dispose(){this.stopAnimation(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}render(width){if(this.presentation==="grok")return super.render(width);let signature=this.createRenderSignature();if(this.cachedLines&&this.cachedWidth===width&&this.cachedSignature===signature)return[...this.cachedLines];let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.cachedWidth=width,this.cachedSignature=signature,this.cachedLines=[...lines],lines}updateDisplay(){let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state.isPartial,result:state.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state,result:collapseFallbackResult(state.result,state.showImages,state.expanded)}:state;renderer.update(renderState2),this.images.updateOptions({showImages:state.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.spinnerFrame,result:this.result}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){let isStreamingArgs=!this.argsComplete&&["edit","write","apply_patch"].includes(this.identity.toolName),isPartialTask=this.isPartial&&this.identity.toolName==="task"&&this.result!==void 0,isPartialProgress=this.isPartial&&this.result!==void 0&&readToolProgress(this.result.details)!==void 0;isStreamingArgs||isPartialTask||isPartialProgress?this.startSpinnerAnimation():this.stopSpinnerAnimation()}updateTodoStrikeAnimation(){if(!(this.identity.toolName==="todo"&&this.executionStarted&&!this.isPartial&&this.result!==void 0&&!this.result.isError&&hasCompletedTodoTasks(this.result.details))){this.stopTodoStrikeAnimation();return}this.todoStrikeInterval||(this.spinnerFrame=0,this.todoStrikeInterval=setInterval(()=>{let next=(this.spinnerFrame??0)+1;if(next>14){this.stopTodoStrikeAnimation();return}this.spinnerFrame=next,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},65),this.todoStrikeInterval.unref?.())}stopTodoStrikeAnimation(){this.todoStrikeInterval&&(clearInterval(this.todoStrikeInterval),this.todoStrikeInterval=void 0),!this.spinnerInterval&&this.spinnerFrame!==void 0&&(this.spinnerFrame=void 0,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender())}startSpinnerAnimation(){this.spinnerInterval||(this.spinnerInterval=setInterval(()=>{this.spinnerFrame=((this.spinnerFrame??-1)+1)%10,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},PENDING_RENDER_FRAME_INTERVAL_MS),this.spinnerInterval.unref?.())}stopSpinnerAnimation(){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=void 0,this.todoStrikeInterval||(this.spinnerFrame=void 0),this.invalidateRenderCache())}invalidateRenderCache(){this.cachedLines=void 0,this.cachedSignature=void 0,this.cachedWidth=void 0}};var TREE_GUTTER_WIDTH=2,MIN_VISIBLE_ANCHOR_CONTENT_WIDTH=4,MAX_VISIBLE_ANCHOR_CONTENT_WIDTH=20,MIN_ANCHOR_CONTEXT_WIDTH=2,MAX_ANCHOR_CONTEXT_WIDTH=12;function renderHorizontalViewport(rows,width){let viewportWidth=Math.max(0,width-TREE_GUTTER_WIDTH),maxBodyWidth=rows.reduce((max,row)=>Math.max(max,row.bodyWidth),0),maxHorizontalScroll=Math.max(0,maxBodyWidth-viewportWidth),selectedRow=rows.find(row=>row.isSelected),horizontalScroll=0;if(selectedRow&&maxHorizontalScroll>0){let minVisibleAnchorContentWidth=Math.min(MAX_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.max(MIN_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.floor(viewportWidth/3)));if(selectedRow.anchorCol>viewportWidth-minVisibleAnchorContentWidth){let anchorContextWidth=Math.min(MAX_ANCHOR_CONTEXT_WIDTH,Math.max(MIN_ANCHOR_CONTEXT_WIDTH,Math.floor(viewportWidth/4)));horizontalScroll=Math.min(maxHorizontalScroll,selectedRow.anchorCol-anchorContextWidth)}}return rows.map(row=>{let line=horizontalScroll>0?`${row.gutter}${sliceByColumn(row.body,horizontalScroll,viewportWidth,!0)}\x1B[0m`:row.gutter+row.body;return truncateToWidth(line,width,"")})}var TreeList=class{constructor(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode){this.flatNodes=[],this.filteredNodes=[],this.selectedIndex=0,this.filterMode="default",this.searchQuery="",this.toolCallMap=new Map,this.multipleRoots=!1,this.showLabelTimestamps=!1,this.activePathIds=new Set,this.visibleParentMap=new Map,this.visibleChildrenMap=new Map,this.lastSelectedId=null,this.foldedNodes=new Set,this.currentLeafId=currentLeafId,this.maxVisibleLines=maxVisibleLines,this.filterMode=initialFilterMode??"default",this.multipleRoots=tree.length>1,this.flatNodes=this.flattenTree(tree),this.buildActivePath(),this.applyFilter();let targetId=initialSelectedId??currentLeafId;this.selectedIndex=this.findNearestVisibleIndex(targetId),this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??null}findNearestVisibleIndex(entryId){if(this.filteredNodes.length===0)return 0;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let visibleIdToIndex=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=entryId;for(;currentId!==null;){let index=visibleIdToIndex.get(currentId);if(index!==void 0)return index;let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}return this.filteredNodes.length-1}buildActivePath(){if(this.activePathIds.clear(),!this.currentLeafId)return;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let currentId=this.currentLeafId;for(;currentId;){this.activePathIds.add(currentId);let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}}flattenTree(roots){let result3=[];this.toolCallMap.clear();let stack=[],containsActive=new Map,leafId=this.currentLeafId;{let allNodes=[],preOrderStack=[...roots];for(;preOrderStack.length>0;){let node=preOrderStack.pop();allNodes.push(node);for(let i=node.children.length-1;i>=0;i--)preOrderStack.push(node.children[i])}for(let i=allNodes.length-1;i>=0;i--){let node=allNodes[i],has=leafId!==null&&node.entry.id===leafId;for(let child of node.children)containsActive.get(child)&&(has=!0);containsActive.set(node,has)}}let multipleRoots=roots.length>1,orderedRoots=[...roots].sort((a,b)=>Number(containsActive.get(b))-Number(containsActive.get(a)));for(let i=orderedRoots.length-1;i>=0;i--){let isLast=i===orderedRoots.length-1;stack.push([orderedRoots[i],multipleRoots?1:0,multipleRoots,multipleRoots,isLast,[],multipleRoots])}for(;stack.length>0;){let[node,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),entry=node.entry;if(entry.type==="message"&&entry.message.role==="assistant"){let content=entry.message.content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="toolCall"){let tc=block;this.toolCallMap.set(tc.id,{name:tc.name,arguments:tc.arguments})}}}result3.push({node,indent,showConnector,isLast,gutters,isVirtualRootChild});let children=node.children,multipleChildren=children.length>1,orderedChildren=(()=>{let prioritized=[],rest=[];for(let child of children)containsActive.get(child)?prioritized.push(child):rest.push(child);return[...prioritized,...rest]})(),childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=orderedChildren.length-1;i>=0;i--){let childIsLast=i===orderedChildren.length-1;stack.push([orderedChildren[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}return result3}applyFilter(){this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId);let searchTokens=this.searchQuery.toLowerCase().split(/\s+/).filter(Boolean);if(this.filteredNodes=this.flatNodes.filter(flatNode=>{let entry=flatNode.node.entry,isCurrentLeaf=entry.id===this.currentLeafId;if(entry.type==="message"&&entry.message.role==="assistant"&&!isCurrentLeaf){let msg=entry.message,hasText=this.hasTextContent(msg.content),isErrorOrAborted=msg.stopReason&&msg.stopReason!=="stop"&&msg.stopReason!=="toolUse";if(!hasText&&!isErrorOrAborted)return!1}let passesFilter=!0,isSettingsEntry=entry.type==="label"||entry.type==="custom"||entry.type==="model_change"||entry.type==="model_change_rejected"||entry.type==="thinking_level_change"||entry.type==="session_info";switch(this.filterMode){case"user-only":passesFilter=entry.type==="message"&&entry.message.role==="user";break;case"no-tools":passesFilter=!isSettingsEntry&&!(entry.type==="message"&&entry.message.role==="toolResult");break;case"labeled-only":passesFilter=flatNode.node.label!==void 0;break;case"all":passesFilter=!0;break;default:passesFilter=!isSettingsEntry;break}if(!passesFilter)return!1;if(searchTokens.length>0){let nodeText=this.getSearchableText(flatNode.node).toLowerCase();return searchTokens.every(token=>nodeText.includes(token))}return!0}),this.foldedNodes.size>0){let skipSet=new Set;for(let flatNode of this.flatNodes){let{id,parentId}=flatNode.node.entry;parentId!=null&&(this.foldedNodes.has(parentId)||skipSet.has(parentId))&&skipSet.add(id)}this.filteredNodes=this.filteredNodes.filter(flatNode=>!skipSet.has(flatNode.node.entry.id))}this.recalculateVisualStructure(),this.lastSelectedId?this.selectedIndex=this.findNearestVisibleIndex(this.lastSelectedId):this.selectedIndex>=this.filteredNodes.length&&(this.selectedIndex=Math.max(0,this.filteredNodes.length-1)),this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId)}recalculateVisualStructure(){if(this.filteredNodes.length===0)return;let visibleIds=new Set(this.filteredNodes.map(n=>n.node.entry.id)),entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let findVisibleAncestor=nodeId=>{let currentId=entryMap.get(nodeId)?.node.entry.parentId??null;for(;currentId!==null;){if(visibleIds.has(currentId))return currentId;currentId=entryMap.get(currentId)?.node.entry.parentId??null}return null},visibleParent=new Map,visibleChildren=new Map;visibleChildren.set(null,[]);for(let flatNode of this.filteredNodes){let nodeId=flatNode.node.entry.id,ancestorId=findVisibleAncestor(nodeId);visibleParent.set(nodeId,ancestorId),visibleChildren.has(ancestorId)||visibleChildren.set(ancestorId,[]),visibleChildren.get(ancestorId).push(nodeId)}let visibleRootIds=visibleChildren.get(null);this.multipleRoots=visibleRootIds.length>1;let filteredNodeMap=new Map;for(let flatNode of this.filteredNodes)filteredNodeMap.set(flatNode.node.entry.id,flatNode);let stack=[];for(let i=visibleRootIds.length-1;i>=0;i--){let isLast=i===visibleRootIds.length-1;stack.push([visibleRootIds[i],this.multipleRoots?1:0,this.multipleRoots,this.multipleRoots,isLast,[],this.multipleRoots])}for(;stack.length>0;){let[nodeId,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),flatNode=filteredNodeMap.get(nodeId);if(!flatNode)continue;flatNode.indent=indent,flatNode.showConnector=showConnector,flatNode.isLast=isLast,flatNode.gutters=gutters,flatNode.isVirtualRootChild=isVirtualRootChild;let children=visibleChildren.get(nodeId)||[],multipleChildren=children.length>1,childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=children.length-1;i>=0;i--){let childIsLast=i===children.length-1;stack.push([children[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}this.visibleParentMap=visibleParent,this.visibleChildrenMap=visibleChildren}getSearchableText(node){let entry=node.entry,parts=[];switch(node.label&&parts.push(node.label),entry.type){case"message":{let msg=entry.message;if(parts.push(msg.role),"content"in msg&&msg.content&&parts.push(this.extractContent(msg.content)),msg.role==="bashExecution"){let bashMsg=msg;bashMsg.command&&parts.push(bashMsg.command)}break}case"custom_message":{parts.push(entry.customType),typeof entry.content=="string"?parts.push(entry.content):parts.push(this.extractContent(entry.content));break}case"compaction":parts.push("compaction");break;case"branch_summary":parts.push("branch summary",entry.summary);break;case"session_info":parts.push("title"),entry.name&&parts.push(entry.name);break;case"model_change":parts.push("model",entry.modelId);break;case"model_change_rejected":parts.push("model rejected",entry.modelId,entry.reason);break;case"thinking_level_change":parts.push("thinking",entry.thinkingLevel);break;case"custom":parts.push("custom",entry.customType);break;case"label":parts.push("label",entry.label??"");break}return parts.join(" ")}invalidate(){}getSearchQuery(){return this.searchQuery}getSelectedNode(){return this.filteredNodes[this.selectedIndex]?.node}copySelected(){let node=this.getSelectedNode();this.onCopy?.(node?this.getEntryCopyText(node):void 0)}editSelected(){let entry=this.getSelectedNode()?.entry;entry&&(entry.type==="message"&&entry.message.role==="assistant"?this.onEditMessage?.(entry.id):(entry.type==="message"&&entry.message.role==="user"||entry.type==="custom_message")&&this.onSelect?.(entry.id))}updateNodeLabel(entryId,label2,labelTimestamp){for(let flatNode of this.flatNodes)if(flatNode.node.entry.id===entryId){flatNode.node.label=label2,flatNode.node.labelTimestamp=label2?labelTimestamp??new Date().toISOString():void 0;break}}getStatusLabels(){let labels="";switch(this.filterMode){case"no-tools":labels+=" [no-tools]";break;case"user-only":labels+=" [user]";break;case"labeled-only":labels+=" [labeled]";break;case"all":labels+=" [all]";break}return this.showLabelTimestamps&&(labels+=" [+label time]"),labels}render(width){let lines=[];if(this.filteredNodes.length===0)return lines.push(truncateToWidth(theme.fg("muted"," No entries found"),width)),lines.push(truncateToWidth(theme.fg("muted",` (0/0)${this.getStatusLabels()}`),width)),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisibleLines/2),this.filteredNodes.length-this.maxVisibleLines)),endIndex=Math.min(startIndex+this.maxVisibleLines,this.filteredNodes.length),renderedRows=[];for(let i=startIndex;i<endIndex;i++){let flatNode=this.filteredNodes[i],entry=flatNode.node.entry,isSelected=i===this.selectedIndex,cursor=isSelected?theme.fg("accent","\u203A "):" ",displayIndent=this.multipleRoots?Math.max(0,flatNode.indent-1):flatNode.indent,connector=flatNode.showConnector&&!flatNode.isVirtualRootChild?flatNode.isLast?"\u2514\u2500 ":"\u251C\u2500 ":"",connectorPosition=connector?displayIndent-1:-1,totalChars=displayIndent*3,prefixChars=[],isFolded=this.foldedNodes.has(entry.id);for(let i2=0;i2<totalChars;i2++){let level=Math.floor(i2/3),posInLevel=i2%3,gutter2=flatNode.gutters.find(g=>g.position===level);if(gutter2)posInLevel===0?prefixChars.push(gutter2.show?"\u2502":" "):prefixChars.push(" ");else if(connector&&level===connectorPosition)if(posInLevel===0)prefixChars.push(flatNode.isLast?"\u2514":"\u251C");else if(posInLevel===1){let foldable=this.isFoldable(entry.id);prefixChars.push(isFolded?"\u229E":foldable?"\u229F":"\u2500")}else prefixChars.push(" ");else prefixChars.push(" ")}let prefix=prefixChars.join(""),showsFoldInConnector=flatNode.showConnector&&!flatNode.isVirtualRootChild,foldMarker=isFolded&&!showsFoldInConnector?theme.fg("accent","\u229E "):"",pathMarker=this.activePathIds.has(entry.id)?theme.fg("accent","\u2022 "):"",label2=flatNode.node.label?theme.fg("warning",`[${flatNode.node.label}] `):"",labelTimestamp=this.showLabelTimestamps&&flatNode.node.label&&flatNode.node.labelTimestamp?theme.fg("muted",`${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `):"",content=this.getEntryDisplayText(flatNode.node,isSelected),prefixPart=theme.fg("dim",prefix)+foldMarker+pathMarker,anchorCol=visibleWidth(prefixPart),gutter=cursor,body=prefixPart+label2+labelTimestamp+content;isSelected&&(gutter=theme.bg("selectedBg",gutter),body=theme.bg("selectedBg",body)),renderedRows.push({gutter,body,anchorCol,bodyWidth:visibleWidth(body),isSelected})}return lines.push(...renderHorizontalViewport(renderedRows,width)),lines.push(truncateToWidth(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredNodes.length})${this.getStatusLabels()}`),width)),lines}getEntryDisplayText(node,isSelected){let entry=node.entry,result3,normalize3=s=>s.replace(/[\n\t]/g," ").trim();switch(entry.type){case"message":{let msg=entry.message,role=msg.role;if(role==="user"){let msgWithContent=msg,content=normalize3(this.extractContent(msgWithContent.content));result3=theme.fg("accent","user: ")+content}else if(role==="assistant"){let msgWithContent=msg,textContent3=normalize3(this.extractContent(msgWithContent.content));if(textContent3)result3=theme.fg("success","assistant: ")+textContent3;else if(msgWithContent.stopReason==="aborted")result3=theme.fg("success","assistant: ")+theme.fg("muted","(aborted)");else if(msgWithContent.errorMessage){let errMsg=normalize3(msgWithContent.errorMessage).slice(0,80);result3=theme.fg("success","assistant: ")+theme.fg("error",errMsg)}else result3=theme.fg("success","assistant: ")+theme.fg("muted","(no content)")}else if(role==="toolResult"){let toolMsg=msg,toolCall=toolMsg.toolCallId?this.toolCallMap.get(toolMsg.toolCallId):void 0;toolCall?result3=theme.fg("muted",this.formatToolCall(toolCall.name,toolCall.arguments)):result3=theme.fg("muted",`[${toolMsg.toolName??"tool"}]`)}else if(role==="bashExecution"){let bashMsg=msg;result3=theme.fg("dim",`[bash]: ${normalize3(bashMsg.command??"")}`)}else result3=theme.fg("dim",`[${role}]`);break}case"custom_message":{let content=typeof entry.content=="string"?entry.content:entry.content.filter(c=>c.type==="text").map(c=>c.text).join("");result3=theme.fg("customMessageLabel",`[${entry.customType}]: `)+normalize3(content);break}case"compaction":{let tokens=Math.round(entry.tokensBefore/1e3);result3=theme.fg("borderAccent",`[compaction: ${tokens}k tokens]`);break}case"branch_summary":result3=theme.fg("warning","[branch summary]: ")+normalize3(entry.summary);break;case"model_change":result3=theme.fg("dim",`[model: ${entry.modelId}]`);break;case"model_change_rejected":result3=theme.fg("warning",`[model rejected: ${entry.modelId} (${entry.reason})]`);break;case"thinking_level_change":result3=theme.fg("dim",`[thinking: ${entry.thinkingLevel}]`);break;case"custom":result3=theme.fg("dim",`[custom: ${entry.customType}]`);break;case"label":result3=theme.fg("dim",`[label: ${entry.label??"(cleared)"}]`);break;case"session_info":result3=entry.name?[theme.fg("dim","[title: "),theme.fg("dim",entry.name),theme.fg("dim","]")].join(""):[theme.fg("dim","[title: "),theme.italic(theme.fg("dim","empty")),theme.fg("dim","]")].join("");break;default:result3=""}return isSelected?theme.bold(result3):result3}formatLabelTimestamp(timestamp){let date=new Date(timestamp),now2=new Date,hours=date.getHours().toString().padStart(2,"0"),minutes=date.getMinutes().toString().padStart(2,"0"),time2=`${hours}:${minutes}`;if(date.getFullYear()===now2.getFullYear()&&date.getMonth()===now2.getMonth()&&date.getDate()===now2.getDate())return time2;let month=date.getMonth()+1,day=date.getDate();return date.getFullYear()===now2.getFullYear()?`${month}/${day} ${time2}`:`${date.getFullYear().toString().slice(-2)}/${month}/${day} ${time2}`}extractContent(content){return this.extractFullContent(content).slice(0,200)}extractFullContent(content){if(typeof content=="string")return content;if(!Array.isArray(content))return"";let result3="";for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="text"&&(result3+=block.text),typeof block=="object"&&block!==null&&"type"in block&&block.type==="providerNative"){let subtype=block.subtype??"unknown";result3+=`[providerNative:${subtype}]`}return result3}getEntryCopyText(node){let entry=node.entry,text2;switch(entry.type){case"message":entry.message.role==="bashExecution"?text2=entry.message.command:"content"in entry.message&&(text2=this.extractFullContent(entry.message.content),!text2&&entry.message.role==="assistant"&&(text2=entry.message.errorMessage));break;case"custom_message":text2=this.extractFullContent(entry.content);break;case"compaction":text2=entry.summary;break;case"branch_summary":text2=entry.summary;break}return text2?.trim()?text2:void 0}hasTextContent(content){if(typeof content=="string")return content.trim().length>0;if(Array.isArray(content))for(let c of content){if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="text"){let text2=c.text;if(text2&&text2.trim().length>0)return!0}if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="providerNative")return!0}return!1}formatToolCall(name,args){let shortenPath2=p=>{let home=process.env.HOME||process.env.USERPROFILE||"";return home&&p.startsWith(home)?`~${p.slice(home.length)}`:p};switch(name){case"read":{let path13=shortenPath2(String(args.path||args.file_path||"")),offset=args.offset,limit=args.limit,display=path13;if(offset!==void 0||limit!==void 0){let start=offset??1,end=limit!==void 0?start+limit-1:"";display+=`:${start}${end?`-${end}`:""}`}return`[read: ${display}]`}case"write":return`[write: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"edit":return`[edit: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"bash":{let rawCmd=String(args.command||"");return`[bash: ${rawCmd.replace(/[\n\t]/g," ").trim().slice(0,50)}${rawCmd.length>50?"...":""}]`}case"grep":{let pattern=String(args.pattern||""),path13=shortenPath2(String(args.path||"."));return`[grep: /${pattern}/ in ${path13}]`}case"find":{let pattern=String(args.pattern||""),path13=shortenPath2(String(args.path||"."));return`[find: ${pattern} in ${path13}]`}case"ls":return`[ls: ${shortenPath2(String(args.path||"."))}]`;default:{let argsStr=JSON.stringify(args).slice(0,40);return`[${name}: ${argsStr}${JSON.stringify(args).length>40?"...":""}]`}}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.filteredNodes.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.filteredNodes.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"app.tree.foldOrUp")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.isFoldable(currentId)&&!this.foldedNodes.has(currentId)?(this.foldedNodes.add(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("up")}else if(kb.matches(keyData,"app.tree.unfoldOrDown")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.foldedNodes.has(currentId)?(this.foldedNodes.delete(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("down")}else if(kb.matches(keyData,"tui.editor.cursorLeft")||kb.matches(keyData,"tui.select.pageUp"))this.selectedIndex=Math.max(0,this.selectedIndex-this.maxVisibleLines);else if(kb.matches(keyData,"tui.editor.cursorRight")||kb.matches(keyData,"tui.select.pageDown"))this.selectedIndex=Math.min(this.filteredNodes.length-1,this.selectedIndex+this.maxVisibleLines);else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.node.entry.id)}else if(kb.matches(keyData,"app.message.copy"))this.copySelected();else if(kb.matches(keyData,"app.tree.editMessage"))this.editSelected();else if(kb.matches(keyData,"tui.select.cancel"))this.searchQuery?(this.searchQuery="",this.foldedNodes.clear(),this.applyFilter()):this.onCancel?.();else if(kb.matches(keyData,"app.tree.filter.default"))this.filterMode="default",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.noTools"))this.filterMode=this.filterMode==="no-tools"?"default":"no-tools",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.userOnly"))this.filterMode=this.filterMode==="user-only"?"default":"user-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.labeledOnly"))this.filterMode=this.filterMode==="labeled-only"?"default":"labeled-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.all"))this.filterMode=this.filterMode==="all"?"default":"all",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.cycleBackward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex-1+modes.length)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"app.tree.filter.cycleForward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex+1)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"tui.editor.deleteCharBackward"))this.searchQuery.length>0&&(this.searchQuery=this.searchQuery.slice(0,-1),this.foldedNodes.clear(),this.applyFilter());else if(kb.matches(keyData,"app.tree.editLabel")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onLabelEdit&&this.onLabelEdit(selected.node.entry.id,selected.node.label)}else kb.matches(keyData,"app.tree.toggleLabelTimestamp")?this.showLabelTimestamps=!this.showLabelTimestamps:![...keyData].some(ch=>{let code=ch.charCodeAt(0);return code<32||code===127||code>=128&&code<=159})&&keyData.length>0&&(this.searchQuery+=keyData,this.foldedNodes.clear(),this.applyFilter())}isFoldable(entryId){let children=this.visibleChildrenMap.get(entryId);if(!children||children.length===0)return!1;let parentId=this.visibleParentMap.get(entryId);if(parentId==null)return!0;let siblings=this.visibleChildrenMap.get(parentId);return siblings!==void 0&&siblings.length>1}findBranchSegmentStart(direction){let selectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id;if(!selectedId)return this.selectedIndex;let indexByEntryId=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=selectedId;if(direction==="down")for(;;){let children=this.visibleChildrenMap.get(currentId)??[];if(children.length===0)return indexByEntryId.get(currentId);if(children.length>1)return indexByEntryId.get(children[0]);currentId=children[0]}for(;;){let parentId=this.visibleParentMap.get(currentId)??null;if(parentId===null)return indexByEntryId.get(currentId);if((this.visibleChildrenMap.get(parentId)??[]).length>1){let segmentStart=indexByEntryId.get(currentId);if(segmentStart<this.selectedIndex)return segmentStart}currentId=parentId}}},SearchLine=class{constructor(treeList){this.treeList=treeList}invalidate(){}render(width){let query=this.treeList.getSearchQuery();return query?[truncateToWidth(` ${theme.fg("muted","Type to search:")} ${theme.fg("accent",query)}`,width)]:[truncateToWidth(` ${theme.fg("muted","Type to search:")}`,width)]}handleInput(_keyData){}},TreeHelp=class{invalidate(){}render(width){let items=TREE_HELP_ITEMS.map(({keys,label:label2,labelFirst})=>{let text2=formatHelpKeys(keys);return text2?labelFirst?`${label2} ${text2}`:`${text2} ${label2}`:label2}),availableWidth=Math.max(1,width),indent=" ",separator=" \xB7 ",lines=[],currentLine="";for(let item of items){let candidate=currentLine?`${currentLine}${separator}${item}`:visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item;if(!currentLine||visibleWidth(candidate)<=availableWidth){currentLine=candidate;continue}lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),currentLine=visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item}return currentLine&&lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),lines.map(line=>theme.fg("muted",line))}},TREE_HELP_ITEMS=[{keys:["tui.select.up","tui.select.down"],label:"move"},{keys:["tui.editor.cursorLeft","tui.editor.cursorRight"],label:"page"},{keys:["app.tree.foldOrUp","app.tree.unfoldOrDown"],label:"branch"},{keys:["app.message.copy"],label:"copy"},{keys:["app.tree.editMessage"],label:"edit"},{keys:["app.tree.editLabel"],label:"label"},{keys:["app.tree.toggleLabelTimestamp"],label:"label time"},{keys:["app.tree.filter.default","app.tree.filter.noTools","app.tree.filter.userOnly","app.tree.filter.labeledOnly","app.tree.filter.all"],label:"filters",labelFirst:!0},{keys:["app.tree.filter.cycleForward","app.tree.filter.cycleBackward"],label:"cycle",labelFirst:!0}];function formatHelpKeys(keybindings){let keys=[];for(let keybinding of keybindings){let key=getKeybindings().getKeys(keybinding)[0];key!==void 0&&keys.push(key)}return keys.length===0?"":formatKeyText(compactRawKeys(keys)).replace(/\bpageUp\b/g,"pgup").replace(/\bpageDown\b/g,"pgdn").replace(/\bup\b/g,"\u2191").replace(/\bdown\b/g,"\u2193").replace(/\bleft\b/g,"\u2190").replace(/\bright\b/g,"\u2192")}function compactRawKeys(keys){if(keys.length===1)return keys[0];let parts=keys.map(key=>{let separatorIndex=key.lastIndexOf("+");return separatorIndex===-1?{prefix:"",suffix:key}:{prefix:key.slice(0,separatorIndex+1),suffix:key.slice(separatorIndex+1)}}),prefix=parts[0].prefix;return prefix&&parts.every(part=>part.prefix===prefix)?`${prefix}${parts.map(part=>part.suffix).join("/")}`:keys.join("/")}var LabelInput=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(entryId,currentLabel){this._focused=!1,this.entryId=entryId,this.input=new Input,currentLabel&&this.input.setValue(currentLabel)}invalidate(){}render(width){let lines=[],availableWidth=width-2;return lines.push(truncateToWidth(` ${theme.fg("muted","Label (empty to remove):")}`,width)),lines.push(...this.input.render(availableWidth).map(line=>truncateToWidth(` ${line}`,width))),lines.push(truncateToWidth(` ${keyHint("tui.select.confirm","save")} ${keyHint("tui.select.cancel","cancel")}`,width)),lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.confirm")){let value2=this.input.getValue().trim();this.onSubmit?.(this.entryId,value2||void 0)}else kb.matches(keyData,"tui.select.cancel")?this.onCancel?.():this.input.handleInput(keyData)}},TreeSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.labelInput&&(this.labelInput.focused=value2)}constructor(tree,currentLeafId,terminalHeight,onSelect,onCancel,onLabelChange,initialSelectedId,initialFilterMode){super(),this.labelInput=null,this._focused=!1,this.onLabelChangeCallback=onLabelChange;let maxVisibleLines=Math.max(5,Math.floor(terminalHeight/2));this.treeList=new TreeList(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode),this.treeList.onSelect=onSelect,this.treeList.onCancel=onCancel,this.treeList.onCopy=text2=>this.onCopy?.(text2),this.treeList.onEditMessage=entryId=>this.onEditMessage?.(entryId),this.treeList.onLabelEdit=(entryId,currentLabel)=>this.showLabelInput(entryId,currentLabel),this.treeContainer=new Container,this.treeContainer.addChild(this.treeList),this.labelInputContainer=new Container,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Text(theme.bold(" Session Tree"),1,0)),this.addChild(new TreeHelp),this.addChild(new SearchLine(this.treeList)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(this.treeContainer),this.addChild(this.labelInputContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),tree.length===0&&setTimeout(()=>onCancel(),100)}showLabelInput(entryId,currentLabel){this.labelInput=new LabelInput(entryId,currentLabel),this.labelInput.onSubmit=(id,label2)=>{this.treeList.updateNodeLabel(id,label2),this.onLabelChangeCallback?.(id,label2),this.hideLabelInput()},this.labelInput.onCancel=()=>this.hideLabelInput(),this.labelInput.focused=this._focused,this.treeContainer.clear(),this.labelInputContainer.clear(),this.labelInputContainer.addChild(this.labelInput)}hideLabelInput(){this.labelInput=null,this.labelInputContainer.clear(),this.treeContainer.clear(),this.treeContainer.addChild(this.treeList)}handleInput(keyData){this.labelInput?this.labelInput.handleInput(keyData):this.treeList.handleInput(keyData)}getTreeList(){return this.treeList}};function formatDecision(trustPath,decision){if(decision===null)return"none";let label2=decision.decision?"trusted":"untrusted";return trustPath!==void 0&&decision.path!==trustPath?`${label2} (inherited from ${decision.path})`:`${label2} (${decision.path})`}var TrustSelectorComponent=class extends Container{constructor(options){super(),this.savedDecision=options.savedDecision,this.trustOptions=getProjectTrustOptions(options.cwd),this.selectedIndex=Math.max(0,this.trustOptions.findIndex(option=>this.isSavedOption(option))),this.onSelectCallback=options.onSelect,this.onCancelCallback=options.onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Project trust")),1,0)),this.addChild(new Text(theme.fg("muted",options.cwd),1,0)),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",`Saved decision: ${formatDecision(this.trustOptions[0]?.savedPath,options.savedDecision)}`),1,0)),this.addChild(new Text(theme.fg("muted",`Current session: ${options.projectTrusted?"trusted":"untrusted"}`),1,0)),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new Text(rawKeyHint("\u2191\u2193","navigate")+" "+keyHint("tui.select.confirm","save")+" "+keyHint("tui.select.cancel","cancel"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateList()}isSavedOption(option){return option.savedPath!==void 0&&this.savedDecision?.decision===option.trusted&&this.savedDecision.path===option.savedPath}updateList(){this.listContainer.clear();for(let i=0;i<this.trustOptions.length;i++){let option=this.trustOptions[i];if(!option)continue;let isSelected=i===this.selectedIndex,currentMarker=this.isSavedOption(option)?theme.fg("accent","\u2713 "):" ",prefix=isSelected?theme.fg("accent","\u2192 "):" ",label2=isSelected?theme.fg("accent",option.label):theme.fg("text",option.label);this.listContainer.addChild(new Text(`${prefix}${currentMarker}${label2}`,1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")||keyData==="k")this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList();else if(kb.matches(keyData,"tui.select.down")||keyData==="j")this.selectedIndex=Math.min(this.trustOptions.length-1,this.selectedIndex+1),this.updateList();else if(kb.matches(keyData,"tui.select.confirm")||keyData===`
2403
+ ... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme.fg("muted",")")}`;return{...result3,content:[{type:"text",text:text2}]}}var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.invalidate(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.invalidateRenderCache()}stopAnimation(){this.stopSpinnerAnimation(),this.stopTodoStrikeAnimation()}dispose(){this.stopAnimation(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}render(width){if(this.presentation==="grok")return super.render(width);let signature=this.createRenderSignature();if(this.cachedLines&&this.cachedWidth===width&&this.cachedSignature===signature)return[...this.cachedLines];let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.cachedWidth=width,this.cachedSignature=signature,this.cachedLines=[...lines],lines}updateDisplay(){let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state.isPartial,result:state.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state,result:collapseFallbackResult(state.result,state.showImages,state.expanded)}:state;renderer.update(renderState2),this.images.updateOptions({showImages:state.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.spinnerFrame,result:this.result?{...this.result,content:this.result.content.filter(part=>!isModelOnlyText(part))}:void 0}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){let isStreamingArgs=!this.argsComplete&&["edit","write","apply_patch"].includes(this.identity.toolName),isPartialTask=this.isPartial&&this.identity.toolName==="task"&&this.result!==void 0,isPartialProgress=this.isPartial&&this.result!==void 0&&readToolProgress(this.result.details)!==void 0;isStreamingArgs||isPartialTask||isPartialProgress?this.startSpinnerAnimation():this.stopSpinnerAnimation()}updateTodoStrikeAnimation(){if(!(this.identity.toolName==="todo"&&this.executionStarted&&!this.isPartial&&this.result!==void 0&&!this.result.isError&&hasCompletedTodoTasks(this.result.details))){this.stopTodoStrikeAnimation();return}this.todoStrikeInterval||(this.spinnerFrame=0,this.todoStrikeInterval=setInterval(()=>{let next=(this.spinnerFrame??0)+1;if(next>14){this.stopTodoStrikeAnimation();return}this.spinnerFrame=next,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},65),this.todoStrikeInterval.unref?.())}stopTodoStrikeAnimation(){this.todoStrikeInterval&&(clearInterval(this.todoStrikeInterval),this.todoStrikeInterval=void 0),!this.spinnerInterval&&this.spinnerFrame!==void 0&&(this.spinnerFrame=void 0,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender())}startSpinnerAnimation(){this.spinnerInterval||(this.spinnerInterval=setInterval(()=>{this.spinnerFrame=((this.spinnerFrame??-1)+1)%10,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},PENDING_RENDER_FRAME_INTERVAL_MS),this.spinnerInterval.unref?.())}stopSpinnerAnimation(){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=void 0,this.todoStrikeInterval||(this.spinnerFrame=void 0),this.invalidateRenderCache())}invalidateRenderCache(){this.cachedLines=void 0,this.cachedSignature=void 0,this.cachedWidth=void 0}};var TREE_GUTTER_WIDTH=2,MIN_VISIBLE_ANCHOR_CONTENT_WIDTH=4,MAX_VISIBLE_ANCHOR_CONTENT_WIDTH=20,MIN_ANCHOR_CONTEXT_WIDTH=2,MAX_ANCHOR_CONTEXT_WIDTH=12;function renderHorizontalViewport(rows,width){let viewportWidth=Math.max(0,width-TREE_GUTTER_WIDTH),maxBodyWidth=rows.reduce((max,row)=>Math.max(max,row.bodyWidth),0),maxHorizontalScroll=Math.max(0,maxBodyWidth-viewportWidth),selectedRow=rows.find(row=>row.isSelected),horizontalScroll=0;if(selectedRow&&maxHorizontalScroll>0){let minVisibleAnchorContentWidth=Math.min(MAX_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.max(MIN_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.floor(viewportWidth/3)));if(selectedRow.anchorCol>viewportWidth-minVisibleAnchorContentWidth){let anchorContextWidth=Math.min(MAX_ANCHOR_CONTEXT_WIDTH,Math.max(MIN_ANCHOR_CONTEXT_WIDTH,Math.floor(viewportWidth/4)));horizontalScroll=Math.min(maxHorizontalScroll,selectedRow.anchorCol-anchorContextWidth)}}return rows.map(row=>{let line=horizontalScroll>0?`${row.gutter}${sliceByColumn(row.body,horizontalScroll,viewportWidth,!0)}\x1B[0m`:row.gutter+row.body;return truncateToWidth(line,width,"")})}var TreeList=class{constructor(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode){this.flatNodes=[],this.filteredNodes=[],this.selectedIndex=0,this.filterMode="default",this.searchQuery="",this.toolCallMap=new Map,this.multipleRoots=!1,this.showLabelTimestamps=!1,this.activePathIds=new Set,this.visibleParentMap=new Map,this.visibleChildrenMap=new Map,this.lastSelectedId=null,this.foldedNodes=new Set,this.currentLeafId=currentLeafId,this.maxVisibleLines=maxVisibleLines,this.filterMode=initialFilterMode??"default",this.multipleRoots=tree.length>1,this.flatNodes=this.flattenTree(tree),this.buildActivePath(),this.applyFilter();let targetId=initialSelectedId??currentLeafId;this.selectedIndex=this.findNearestVisibleIndex(targetId),this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??null}findNearestVisibleIndex(entryId){if(this.filteredNodes.length===0)return 0;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let visibleIdToIndex=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=entryId;for(;currentId!==null;){let index=visibleIdToIndex.get(currentId);if(index!==void 0)return index;let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}return this.filteredNodes.length-1}buildActivePath(){if(this.activePathIds.clear(),!this.currentLeafId)return;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let currentId=this.currentLeafId;for(;currentId;){this.activePathIds.add(currentId);let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}}flattenTree(roots){let result3=[];this.toolCallMap.clear();let stack=[],containsActive=new Map,leafId=this.currentLeafId;{let allNodes=[],preOrderStack=[...roots];for(;preOrderStack.length>0;){let node=preOrderStack.pop();allNodes.push(node);for(let i=node.children.length-1;i>=0;i--)preOrderStack.push(node.children[i])}for(let i=allNodes.length-1;i>=0;i--){let node=allNodes[i],has=leafId!==null&&node.entry.id===leafId;for(let child of node.children)containsActive.get(child)&&(has=!0);containsActive.set(node,has)}}let multipleRoots=roots.length>1,orderedRoots=[...roots].sort((a,b)=>Number(containsActive.get(b))-Number(containsActive.get(a)));for(let i=orderedRoots.length-1;i>=0;i--){let isLast=i===orderedRoots.length-1;stack.push([orderedRoots[i],multipleRoots?1:0,multipleRoots,multipleRoots,isLast,[],multipleRoots])}for(;stack.length>0;){let[node,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),entry=node.entry;if(entry.type==="message"&&entry.message.role==="assistant"){let content=entry.message.content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="toolCall"){let tc=block;this.toolCallMap.set(tc.id,{name:tc.name,arguments:tc.arguments})}}}result3.push({node,indent,showConnector,isLast,gutters,isVirtualRootChild});let children=node.children,multipleChildren=children.length>1,orderedChildren=(()=>{let prioritized=[],rest=[];for(let child of children)containsActive.get(child)?prioritized.push(child):rest.push(child);return[...prioritized,...rest]})(),childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=orderedChildren.length-1;i>=0;i--){let childIsLast=i===orderedChildren.length-1;stack.push([orderedChildren[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}return result3}applyFilter(){this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId);let searchTokens=this.searchQuery.toLowerCase().split(/\s+/).filter(Boolean);if(this.filteredNodes=this.flatNodes.filter(flatNode=>{let entry=flatNode.node.entry,isCurrentLeaf=entry.id===this.currentLeafId;if(entry.type==="message"&&entry.message.role==="assistant"&&!isCurrentLeaf){let msg=entry.message,hasText=this.hasTextContent(msg.content),isErrorOrAborted=msg.stopReason&&msg.stopReason!=="stop"&&msg.stopReason!=="toolUse";if(!hasText&&!isErrorOrAborted)return!1}let passesFilter=!0,isSettingsEntry=entry.type==="label"||entry.type==="custom"||entry.type==="model_change"||entry.type==="model_change_rejected"||entry.type==="thinking_level_change"||entry.type==="session_info";switch(this.filterMode){case"user-only":passesFilter=entry.type==="message"&&entry.message.role==="user";break;case"no-tools":passesFilter=!isSettingsEntry&&!(entry.type==="message"&&entry.message.role==="toolResult");break;case"labeled-only":passesFilter=flatNode.node.label!==void 0;break;case"all":passesFilter=!0;break;default:passesFilter=!isSettingsEntry;break}if(!passesFilter)return!1;if(searchTokens.length>0){let nodeText=this.getSearchableText(flatNode.node).toLowerCase();return searchTokens.every(token=>nodeText.includes(token))}return!0}),this.foldedNodes.size>0){let skipSet=new Set;for(let flatNode of this.flatNodes){let{id,parentId}=flatNode.node.entry;parentId!=null&&(this.foldedNodes.has(parentId)||skipSet.has(parentId))&&skipSet.add(id)}this.filteredNodes=this.filteredNodes.filter(flatNode=>!skipSet.has(flatNode.node.entry.id))}this.recalculateVisualStructure(),this.lastSelectedId?this.selectedIndex=this.findNearestVisibleIndex(this.lastSelectedId):this.selectedIndex>=this.filteredNodes.length&&(this.selectedIndex=Math.max(0,this.filteredNodes.length-1)),this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId)}recalculateVisualStructure(){if(this.filteredNodes.length===0)return;let visibleIds=new Set(this.filteredNodes.map(n=>n.node.entry.id)),entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let findVisibleAncestor=nodeId=>{let currentId=entryMap.get(nodeId)?.node.entry.parentId??null;for(;currentId!==null;){if(visibleIds.has(currentId))return currentId;currentId=entryMap.get(currentId)?.node.entry.parentId??null}return null},visibleParent=new Map,visibleChildren=new Map;visibleChildren.set(null,[]);for(let flatNode of this.filteredNodes){let nodeId=flatNode.node.entry.id,ancestorId=findVisibleAncestor(nodeId);visibleParent.set(nodeId,ancestorId),visibleChildren.has(ancestorId)||visibleChildren.set(ancestorId,[]),visibleChildren.get(ancestorId).push(nodeId)}let visibleRootIds=visibleChildren.get(null);this.multipleRoots=visibleRootIds.length>1;let filteredNodeMap=new Map;for(let flatNode of this.filteredNodes)filteredNodeMap.set(flatNode.node.entry.id,flatNode);let stack=[];for(let i=visibleRootIds.length-1;i>=0;i--){let isLast=i===visibleRootIds.length-1;stack.push([visibleRootIds[i],this.multipleRoots?1:0,this.multipleRoots,this.multipleRoots,isLast,[],this.multipleRoots])}for(;stack.length>0;){let[nodeId,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),flatNode=filteredNodeMap.get(nodeId);if(!flatNode)continue;flatNode.indent=indent,flatNode.showConnector=showConnector,flatNode.isLast=isLast,flatNode.gutters=gutters,flatNode.isVirtualRootChild=isVirtualRootChild;let children=visibleChildren.get(nodeId)||[],multipleChildren=children.length>1,childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=children.length-1;i>=0;i--){let childIsLast=i===children.length-1;stack.push([children[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}this.visibleParentMap=visibleParent,this.visibleChildrenMap=visibleChildren}getSearchableText(node){let entry=node.entry,parts=[];switch(node.label&&parts.push(node.label),entry.type){case"message":{let msg=entry.message;if(parts.push(msg.role),"content"in msg&&msg.content&&parts.push(this.extractContent(msg.content)),msg.role==="bashExecution"){let bashMsg=msg;bashMsg.command&&parts.push(bashMsg.command)}break}case"custom_message":{parts.push(entry.customType),typeof entry.content=="string"?parts.push(entry.content):parts.push(this.extractContent(entry.content));break}case"compaction":parts.push("compaction");break;case"branch_summary":parts.push("branch summary",entry.summary);break;case"session_info":parts.push("title"),entry.name&&parts.push(entry.name);break;case"model_change":parts.push("model",entry.modelId);break;case"model_change_rejected":parts.push("model rejected",entry.modelId,entry.reason);break;case"thinking_level_change":parts.push("thinking",entry.thinkingLevel);break;case"custom":parts.push("custom",entry.customType);break;case"label":parts.push("label",entry.label??"");break}return parts.join(" ")}invalidate(){}getSearchQuery(){return this.searchQuery}getSelectedNode(){return this.filteredNodes[this.selectedIndex]?.node}copySelected(){let node=this.getSelectedNode();this.onCopy?.(node?this.getEntryCopyText(node):void 0)}editSelected(){let entry=this.getSelectedNode()?.entry;entry&&(entry.type==="message"&&entry.message.role==="assistant"?this.onEditMessage?.(entry.id):(entry.type==="message"&&entry.message.role==="user"||entry.type==="custom_message")&&this.onSelect?.(entry.id))}updateNodeLabel(entryId,label2,labelTimestamp){for(let flatNode of this.flatNodes)if(flatNode.node.entry.id===entryId){flatNode.node.label=label2,flatNode.node.labelTimestamp=label2?labelTimestamp??new Date().toISOString():void 0;break}}getStatusLabels(){let labels="";switch(this.filterMode){case"no-tools":labels+=" [no-tools]";break;case"user-only":labels+=" [user]";break;case"labeled-only":labels+=" [labeled]";break;case"all":labels+=" [all]";break}return this.showLabelTimestamps&&(labels+=" [+label time]"),labels}render(width){let lines=[];if(this.filteredNodes.length===0)return lines.push(truncateToWidth(theme.fg("muted"," No entries found"),width)),lines.push(truncateToWidth(theme.fg("muted",` (0/0)${this.getStatusLabels()}`),width)),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisibleLines/2),this.filteredNodes.length-this.maxVisibleLines)),endIndex=Math.min(startIndex+this.maxVisibleLines,this.filteredNodes.length),renderedRows=[];for(let i=startIndex;i<endIndex;i++){let flatNode=this.filteredNodes[i],entry=flatNode.node.entry,isSelected=i===this.selectedIndex,cursor=isSelected?theme.fg("accent","\u203A "):" ",displayIndent=this.multipleRoots?Math.max(0,flatNode.indent-1):flatNode.indent,connector=flatNode.showConnector&&!flatNode.isVirtualRootChild?flatNode.isLast?"\u2514\u2500 ":"\u251C\u2500 ":"",connectorPosition=connector?displayIndent-1:-1,totalChars=displayIndent*3,prefixChars=[],isFolded=this.foldedNodes.has(entry.id);for(let i2=0;i2<totalChars;i2++){let level=Math.floor(i2/3),posInLevel=i2%3,gutter2=flatNode.gutters.find(g=>g.position===level);if(gutter2)posInLevel===0?prefixChars.push(gutter2.show?"\u2502":" "):prefixChars.push(" ");else if(connector&&level===connectorPosition)if(posInLevel===0)prefixChars.push(flatNode.isLast?"\u2514":"\u251C");else if(posInLevel===1){let foldable=this.isFoldable(entry.id);prefixChars.push(isFolded?"\u229E":foldable?"\u229F":"\u2500")}else prefixChars.push(" ");else prefixChars.push(" ")}let prefix=prefixChars.join(""),showsFoldInConnector=flatNode.showConnector&&!flatNode.isVirtualRootChild,foldMarker=isFolded&&!showsFoldInConnector?theme.fg("accent","\u229E "):"",pathMarker=this.activePathIds.has(entry.id)?theme.fg("accent","\u2022 "):"",label2=flatNode.node.label?theme.fg("warning",`[${flatNode.node.label}] `):"",labelTimestamp=this.showLabelTimestamps&&flatNode.node.label&&flatNode.node.labelTimestamp?theme.fg("muted",`${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `):"",content=this.getEntryDisplayText(flatNode.node,isSelected),prefixPart=theme.fg("dim",prefix)+foldMarker+pathMarker,anchorCol=visibleWidth(prefixPart),gutter=cursor,body=prefixPart+label2+labelTimestamp+content;isSelected&&(gutter=theme.bg("selectedBg",gutter),body=theme.bg("selectedBg",body)),renderedRows.push({gutter,body,anchorCol,bodyWidth:visibleWidth(body),isSelected})}return lines.push(...renderHorizontalViewport(renderedRows,width)),lines.push(truncateToWidth(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredNodes.length})${this.getStatusLabels()}`),width)),lines}getEntryDisplayText(node,isSelected){let entry=node.entry,result3,normalize3=s=>s.replace(/[\n\t]/g," ").trim();switch(entry.type){case"message":{let msg=entry.message,role=msg.role;if(role==="user"){let msgWithContent=msg,content=normalize3(this.extractContent(msgWithContent.content));result3=theme.fg("accent","user: ")+content}else if(role==="assistant"){let msgWithContent=msg,textContent3=normalize3(this.extractContent(msgWithContent.content));if(textContent3)result3=theme.fg("success","assistant: ")+textContent3;else if(msgWithContent.stopReason==="aborted")result3=theme.fg("success","assistant: ")+theme.fg("muted","(aborted)");else if(msgWithContent.errorMessage){let errMsg=normalize3(msgWithContent.errorMessage).slice(0,80);result3=theme.fg("success","assistant: ")+theme.fg("error",errMsg)}else result3=theme.fg("success","assistant: ")+theme.fg("muted","(no content)")}else if(role==="toolResult"){let toolMsg=msg,toolCall=toolMsg.toolCallId?this.toolCallMap.get(toolMsg.toolCallId):void 0;toolCall?result3=theme.fg("muted",this.formatToolCall(toolCall.name,toolCall.arguments)):result3=theme.fg("muted",`[${toolMsg.toolName??"tool"}]`)}else if(role==="bashExecution"){let bashMsg=msg;result3=theme.fg("dim",`[bash]: ${normalize3(bashMsg.command??"")}`)}else result3=theme.fg("dim",`[${role}]`);break}case"custom_message":{let content=typeof entry.content=="string"?entry.content:entry.content.filter(c=>c.type==="text").map(c=>c.text).join("");result3=theme.fg("customMessageLabel",`[${entry.customType}]: `)+normalize3(content);break}case"compaction":{let tokens=Math.round(entry.tokensBefore/1e3);result3=theme.fg("borderAccent",`[compaction: ${tokens}k tokens]`);break}case"branch_summary":result3=theme.fg("warning","[branch summary]: ")+normalize3(entry.summary);break;case"model_change":result3=theme.fg("dim",`[model: ${entry.modelId}]`);break;case"model_change_rejected":result3=theme.fg("warning",`[model rejected: ${entry.modelId} (${entry.reason})]`);break;case"thinking_level_change":result3=theme.fg("dim",`[thinking: ${entry.thinkingLevel}]`);break;case"custom":result3=theme.fg("dim",`[custom: ${entry.customType}]`);break;case"label":result3=theme.fg("dim",`[label: ${entry.label??"(cleared)"}]`);break;case"session_info":result3=entry.name?[theme.fg("dim","[title: "),theme.fg("dim",entry.name),theme.fg("dim","]")].join(""):[theme.fg("dim","[title: "),theme.italic(theme.fg("dim","empty")),theme.fg("dim","]")].join("");break;default:result3=""}return isSelected?theme.bold(result3):result3}formatLabelTimestamp(timestamp){let date=new Date(timestamp),now2=new Date,hours=date.getHours().toString().padStart(2,"0"),minutes=date.getMinutes().toString().padStart(2,"0"),time2=`${hours}:${minutes}`;if(date.getFullYear()===now2.getFullYear()&&date.getMonth()===now2.getMonth()&&date.getDate()===now2.getDate())return time2;let month=date.getMonth()+1,day=date.getDate();return date.getFullYear()===now2.getFullYear()?`${month}/${day} ${time2}`:`${date.getFullYear().toString().slice(-2)}/${month}/${day} ${time2}`}extractContent(content){return this.extractFullContent(content).slice(0,200)}extractFullContent(content){if(typeof content=="string")return content;if(!Array.isArray(content))return"";let result3="";for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="text"&&(result3+=block.text),typeof block=="object"&&block!==null&&"type"in block&&block.type==="providerNative"){let subtype=block.subtype??"unknown";result3+=`[providerNative:${subtype}]`}return result3}getEntryCopyText(node){let entry=node.entry,text2;switch(entry.type){case"message":entry.message.role==="bashExecution"?text2=entry.message.command:"content"in entry.message&&(text2=this.extractFullContent(entry.message.content),!text2&&entry.message.role==="assistant"&&(text2=entry.message.errorMessage));break;case"custom_message":text2=this.extractFullContent(entry.content);break;case"compaction":text2=entry.summary;break;case"branch_summary":text2=entry.summary;break}return text2?.trim()?text2:void 0}hasTextContent(content){if(typeof content=="string")return content.trim().length>0;if(Array.isArray(content))for(let c of content){if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="text"){let text2=c.text;if(text2&&text2.trim().length>0)return!0}if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="providerNative")return!0}return!1}formatToolCall(name,args){let shortenPath2=p=>{let home=process.env.HOME||process.env.USERPROFILE||"";return home&&p.startsWith(home)?`~${p.slice(home.length)}`:p};switch(name){case"read":{let path13=shortenPath2(String(args.path||args.file_path||"")),offset=args.offset,limit=args.limit,display=path13;if(offset!==void 0||limit!==void 0){let start=offset??1,end=limit!==void 0?start+limit-1:"";display+=`:${start}${end?`-${end}`:""}`}return`[read: ${display}]`}case"write":return`[write: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"edit":return`[edit: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"bash":{let rawCmd=String(args.command||"");return`[bash: ${rawCmd.replace(/[\n\t]/g," ").trim().slice(0,50)}${rawCmd.length>50?"...":""}]`}case"grep":{let pattern=String(args.pattern||""),path13=shortenPath2(String(args.path||"."));return`[grep: /${pattern}/ in ${path13}]`}case"find":{let pattern=String(args.pattern||""),path13=shortenPath2(String(args.path||"."));return`[find: ${pattern} in ${path13}]`}case"ls":return`[ls: ${shortenPath2(String(args.path||"."))}]`;default:{let argsStr=JSON.stringify(args).slice(0,40);return`[${name}: ${argsStr}${JSON.stringify(args).length>40?"...":""}]`}}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.filteredNodes.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.filteredNodes.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"app.tree.foldOrUp")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.isFoldable(currentId)&&!this.foldedNodes.has(currentId)?(this.foldedNodes.add(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("up")}else if(kb.matches(keyData,"app.tree.unfoldOrDown")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.foldedNodes.has(currentId)?(this.foldedNodes.delete(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("down")}else if(kb.matches(keyData,"tui.editor.cursorLeft")||kb.matches(keyData,"tui.select.pageUp"))this.selectedIndex=Math.max(0,this.selectedIndex-this.maxVisibleLines);else if(kb.matches(keyData,"tui.editor.cursorRight")||kb.matches(keyData,"tui.select.pageDown"))this.selectedIndex=Math.min(this.filteredNodes.length-1,this.selectedIndex+this.maxVisibleLines);else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.node.entry.id)}else if(kb.matches(keyData,"app.message.copy"))this.copySelected();else if(kb.matches(keyData,"app.tree.editMessage"))this.editSelected();else if(kb.matches(keyData,"tui.select.cancel"))this.searchQuery?(this.searchQuery="",this.foldedNodes.clear(),this.applyFilter()):this.onCancel?.();else if(kb.matches(keyData,"app.tree.filter.default"))this.filterMode="default",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.noTools"))this.filterMode=this.filterMode==="no-tools"?"default":"no-tools",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.userOnly"))this.filterMode=this.filterMode==="user-only"?"default":"user-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.labeledOnly"))this.filterMode=this.filterMode==="labeled-only"?"default":"labeled-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.all"))this.filterMode=this.filterMode==="all"?"default":"all",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.cycleBackward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex-1+modes.length)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"app.tree.filter.cycleForward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex+1)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"tui.editor.deleteCharBackward"))this.searchQuery.length>0&&(this.searchQuery=this.searchQuery.slice(0,-1),this.foldedNodes.clear(),this.applyFilter());else if(kb.matches(keyData,"app.tree.editLabel")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onLabelEdit&&this.onLabelEdit(selected.node.entry.id,selected.node.label)}else kb.matches(keyData,"app.tree.toggleLabelTimestamp")?this.showLabelTimestamps=!this.showLabelTimestamps:![...keyData].some(ch=>{let code=ch.charCodeAt(0);return code<32||code===127||code>=128&&code<=159})&&keyData.length>0&&(this.searchQuery+=keyData,this.foldedNodes.clear(),this.applyFilter())}isFoldable(entryId){let children=this.visibleChildrenMap.get(entryId);if(!children||children.length===0)return!1;let parentId=this.visibleParentMap.get(entryId);if(parentId==null)return!0;let siblings=this.visibleChildrenMap.get(parentId);return siblings!==void 0&&siblings.length>1}findBranchSegmentStart(direction){let selectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id;if(!selectedId)return this.selectedIndex;let indexByEntryId=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=selectedId;if(direction==="down")for(;;){let children=this.visibleChildrenMap.get(currentId)??[];if(children.length===0)return indexByEntryId.get(currentId);if(children.length>1)return indexByEntryId.get(children[0]);currentId=children[0]}for(;;){let parentId=this.visibleParentMap.get(currentId)??null;if(parentId===null)return indexByEntryId.get(currentId);if((this.visibleChildrenMap.get(parentId)??[]).length>1){let segmentStart=indexByEntryId.get(currentId);if(segmentStart<this.selectedIndex)return segmentStart}currentId=parentId}}},SearchLine=class{constructor(treeList){this.treeList=treeList}invalidate(){}render(width){let query=this.treeList.getSearchQuery();return query?[truncateToWidth(` ${theme.fg("muted","Type to search:")} ${theme.fg("accent",query)}`,width)]:[truncateToWidth(` ${theme.fg("muted","Type to search:")}`,width)]}handleInput(_keyData){}},TreeHelp=class{invalidate(){}render(width){let items=TREE_HELP_ITEMS.map(({keys,label:label2,labelFirst})=>{let text2=formatHelpKeys(keys);return text2?labelFirst?`${label2} ${text2}`:`${text2} ${label2}`:label2}),availableWidth=Math.max(1,width),indent=" ",separator=" \xB7 ",lines=[],currentLine="";for(let item of items){let candidate=currentLine?`${currentLine}${separator}${item}`:visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item;if(!currentLine||visibleWidth(candidate)<=availableWidth){currentLine=candidate;continue}lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),currentLine=visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item}return currentLine&&lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),lines.map(line=>theme.fg("muted",line))}},TREE_HELP_ITEMS=[{keys:["tui.select.up","tui.select.down"],label:"move"},{keys:["tui.editor.cursorLeft","tui.editor.cursorRight"],label:"page"},{keys:["app.tree.foldOrUp","app.tree.unfoldOrDown"],label:"branch"},{keys:["app.message.copy"],label:"copy"},{keys:["app.tree.editMessage"],label:"edit"},{keys:["app.tree.editLabel"],label:"label"},{keys:["app.tree.toggleLabelTimestamp"],label:"label time"},{keys:["app.tree.filter.default","app.tree.filter.noTools","app.tree.filter.userOnly","app.tree.filter.labeledOnly","app.tree.filter.all"],label:"filters",labelFirst:!0},{keys:["app.tree.filter.cycleForward","app.tree.filter.cycleBackward"],label:"cycle",labelFirst:!0}];function formatHelpKeys(keybindings){let keys=[];for(let keybinding of keybindings){let key=getKeybindings().getKeys(keybinding)[0];key!==void 0&&keys.push(key)}return keys.length===0?"":formatKeyText(compactRawKeys(keys)).replace(/\bpageUp\b/g,"pgup").replace(/\bpageDown\b/g,"pgdn").replace(/\bup\b/g,"\u2191").replace(/\bdown\b/g,"\u2193").replace(/\bleft\b/g,"\u2190").replace(/\bright\b/g,"\u2192")}function compactRawKeys(keys){if(keys.length===1)return keys[0];let parts=keys.map(key=>{let separatorIndex=key.lastIndexOf("+");return separatorIndex===-1?{prefix:"",suffix:key}:{prefix:key.slice(0,separatorIndex+1),suffix:key.slice(separatorIndex+1)}}),prefix=parts[0].prefix;return prefix&&parts.every(part=>part.prefix===prefix)?`${prefix}${parts.map(part=>part.suffix).join("/")}`:keys.join("/")}var LabelInput=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(entryId,currentLabel){this._focused=!1,this.entryId=entryId,this.input=new Input,currentLabel&&this.input.setValue(currentLabel)}invalidate(){}render(width){let lines=[],availableWidth=width-2;return lines.push(truncateToWidth(` ${theme.fg("muted","Label (empty to remove):")}`,width)),lines.push(...this.input.render(availableWidth).map(line=>truncateToWidth(` ${line}`,width))),lines.push(truncateToWidth(` ${keyHint("tui.select.confirm","save")} ${keyHint("tui.select.cancel","cancel")}`,width)),lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.confirm")){let value2=this.input.getValue().trim();this.onSubmit?.(this.entryId,value2||void 0)}else kb.matches(keyData,"tui.select.cancel")?this.onCancel?.():this.input.handleInput(keyData)}},TreeSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.labelInput&&(this.labelInput.focused=value2)}constructor(tree,currentLeafId,terminalHeight,onSelect,onCancel,onLabelChange,initialSelectedId,initialFilterMode){super(),this.labelInput=null,this._focused=!1,this.onLabelChangeCallback=onLabelChange;let maxVisibleLines=Math.max(5,Math.floor(terminalHeight/2));this.treeList=new TreeList(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode),this.treeList.onSelect=onSelect,this.treeList.onCancel=onCancel,this.treeList.onCopy=text2=>this.onCopy?.(text2),this.treeList.onEditMessage=entryId=>this.onEditMessage?.(entryId),this.treeList.onLabelEdit=(entryId,currentLabel)=>this.showLabelInput(entryId,currentLabel),this.treeContainer=new Container,this.treeContainer.addChild(this.treeList),this.labelInputContainer=new Container,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Text(theme.bold(" Session Tree"),1,0)),this.addChild(new TreeHelp),this.addChild(new SearchLine(this.treeList)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(this.treeContainer),this.addChild(this.labelInputContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),tree.length===0&&setTimeout(()=>onCancel(),100)}showLabelInput(entryId,currentLabel){this.labelInput=new LabelInput(entryId,currentLabel),this.labelInput.onSubmit=(id,label2)=>{this.treeList.updateNodeLabel(id,label2),this.onLabelChangeCallback?.(id,label2),this.hideLabelInput()},this.labelInput.onCancel=()=>this.hideLabelInput(),this.labelInput.focused=this._focused,this.treeContainer.clear(),this.labelInputContainer.clear(),this.labelInputContainer.addChild(this.labelInput)}hideLabelInput(){this.labelInput=null,this.labelInputContainer.clear(),this.treeContainer.clear(),this.treeContainer.addChild(this.treeList)}handleInput(keyData){this.labelInput?this.labelInput.handleInput(keyData):this.treeList.handleInput(keyData)}getTreeList(){return this.treeList}};function formatDecision(trustPath,decision){if(decision===null)return"none";let label2=decision.decision?"trusted":"untrusted";return trustPath!==void 0&&decision.path!==trustPath?`${label2} (inherited from ${decision.path})`:`${label2} (${decision.path})`}var TrustSelectorComponent=class extends Container{constructor(options){super(),this.savedDecision=options.savedDecision,this.trustOptions=getProjectTrustOptions(options.cwd),this.selectedIndex=Math.max(0,this.trustOptions.findIndex(option=>this.isSavedOption(option))),this.onSelectCallback=options.onSelect,this.onCancelCallback=options.onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Project trust")),1,0)),this.addChild(new Text(theme.fg("muted",options.cwd),1,0)),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",`Saved decision: ${formatDecision(this.trustOptions[0]?.savedPath,options.savedDecision)}`),1,0)),this.addChild(new Text(theme.fg("muted",`Current session: ${options.projectTrusted?"trusted":"untrusted"}`),1,0)),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new Text(rawKeyHint("\u2191\u2193","navigate")+" "+keyHint("tui.select.confirm","save")+" "+keyHint("tui.select.cancel","cancel"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateList()}isSavedOption(option){return option.savedPath!==void 0&&this.savedDecision?.decision===option.trusted&&this.savedDecision.path===option.savedPath}updateList(){this.listContainer.clear();for(let i=0;i<this.trustOptions.length;i++){let option=this.trustOptions[i];if(!option)continue;let isSelected=i===this.selectedIndex,currentMarker=this.isSavedOption(option)?theme.fg("accent","\u2713 "):" ",prefix=isSelected?theme.fg("accent","\u2192 "):" ",label2=isSelected?theme.fg("accent",option.label):theme.fg("text",option.label);this.listContainer.addChild(new Text(`${prefix}${currentMarker}${label2}`,1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")||keyData==="k")this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList();else if(kb.matches(keyData,"tui.select.down")||keyData==="j")this.selectedIndex=Math.min(this.trustOptions.length-1,this.selectedIndex+1),this.updateList();else if(kb.matches(keyData,"tui.select.confirm")||keyData===`
2418
2404
  `){let selected=this.trustOptions[this.selectedIndex];selected&&this.onSelectCallback({trusted:selected.trusted,updates:selected.updates})}else kb.matches(keyData,"tui.select.cancel")&&this.onCancelCallback()}};function getAskUserAnswerHeaders(entries,requestId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==ASK_USER_QUESTION_ENTRY)continue;let data=entry.data;if(typeof data!="object"||data===null||!("requestId"in data)||data.requestId!==requestId||!("headers"in data)||!Array.isArray(data.headers))continue;return data.headers.filter(header2=>typeof header2=="string")}return[]}function summaryRows(frame2,headers){let fallbackHeaders=headers.length>0?headers:[frame2.requestId];if(/^(?:The user did not answer|The user dismissed|The pending question|This session has no user)/.test(frame2.body))return fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`);let answers=[],comment,unanswered=[];for(let line of frame2.body.split(`
2419
2405
  `)){let separator=line.indexOf(": ");if(separator<1)continue;let header2=line.slice(0,separator),value2=line.slice(separator+2);header2==="The user responded"?comment=value2:header2==="Unanswered"?unanswered=value2.split(", "):answers.push(`\u21B3 ${header2}: ${value2}`)}return comment!==void 0?answers.push(`\u21B3 ${headers[0]??unanswered[0]??frame2.requestId}: ${JSON.stringify(comment)}`):answers.push(...unanswered.map(header2=>`\u21B3 ${header2}: (no answer)`)),answers.length>0?answers:fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`)}var AskUserAnswerChip=class extends MouseRegion{constructor(frame2,headers,fullBody){let rows=summaryRows(frame2,headers).map(row=>stripAnsi(row).replace(/\s+/g," ")),summary={render:width=>rows.map(row=>theme.fg("muted",truncateToWidth(row,width,"\u2026"))),invalidate(){}},content=new Container;content.addChild(summary);let expanded=!1;super(content,event=>{if(event.button==="left"){if(event.type==="press")return{handled:!0,render:!1};if(!(event.type!=="click"||(event.clickCount??1)!==1))return expanded=!expanded,content.detachAll(),content.addChild(expanded?fullBody:summary),{handled:!0}}}),this.fullBody=fullBody}invalidate(){super.invalidate(),this.fullBody.invalidate()}dispose(){this.fullBody.dispose?.()}};var OSC133_ZONE_START2="\x1B]133;A\x07",OSC133_ZONE_END2="\x1B]133;B\x07",OSC133_ZONE_FINAL2="\x1B]133;C\x07",UserMessageComponent=class extends Container{constructor(text2,markdownTheme=getMarkdownTheme(),outputPad=1,markdownTransformers=[],answerHeaders=[]){super(),this.text=text2,this.markdownTheme=markdownTheme,this.outputPad=outputPad,this.markdownTransformers=markdownTransformers,this.answerHeaders=answerHeaders,this.rebuild()}setOutputPad(padding){this.outputPad=padding,this.rebuild()}rebuild(){this.clear();let contentBox=new Box(this.outputPad,1,content=>theme.bg("userMessageBg",content));contentBox.addChild(new Markdown(this.text,0,0,this.markdownTheme,{color:content=>theme.fg("userMessageText",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}));let answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}render(width){let lines=super.render(width);return lines.length===0?lines:lines.length===1?(lines[0]=OSC133_ZONE_START2+lines[0]+OSC133_ZONE_END2+OSC133_ZONE_FINAL2,lines):(lines[0]=OSC133_ZONE_START2+lines[0],lines[lines.length-1]=OSC133_ZONE_END2+OSC133_ZONE_FINAL2+lines[lines.length-1],lines)}};var UserMessageList=class{constructor(messages,initialSelectedId){this.messages=[],this.selectedIndex=0,this.maxVisible=10,this.messages=messages;let initialIndex=initialSelectedId?messages.findIndex(message=>message.id===initialSelectedId):-1;this.selectedIndex=initialIndex>=0?initialIndex:Math.max(0,messages.length-1)}invalidate(){}render(width){let lines=[];if(this.messages.length===0)return lines.push(theme.fg("muted"," No user messages found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.messages.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.messages.length);for(let i=startIndex;i<endIndex;i++){let message=this.messages[i],isSelected=i===this.selectedIndex,normalizedMessage=message.text.replace(/\n/g," ").trim(),cursor=isSelected?theme.fg("accent","\u203A "):" ",maxMsgWidth=width-2,truncatedMsg=truncateToWidth(normalizedMessage,maxMsgWidth),messageLine=cursor+(isSelected?theme.bold(truncatedMsg):truncatedMsg);lines.push(messageLine);let metadata=` Message ${i+1} of ${this.messages.length}`,metadataLine=theme.fg("muted",metadata);lines.push(metadataLine),lines.push("")}if(startIndex>0||endIndex<this.messages.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.messages.length})`);lines.push(scrollInfo)}return lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.messages.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.messages.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.messages[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.id)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}},UserMessageSelectorComponent=class extends Container{constructor(messages,onSelect,onCancel,initialSelectedId){super(),this.addChild(new Spacer(1)),this.addChild(new Text(theme.bold("Fork from Message"),1,0)),this.addChild(new Text(theme.fg("muted","Select a user message to copy the active path up to that point into a new session"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.messageList=new UserMessageList(messages,initialSelectedId),this.messageList.onSelect=onSelect,this.messageList.onCancel=onCancel,this.addChild(this.messageList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),messages.length===0&&setTimeout(()=>onCancel(),100)}getMessageList(){return this.messageList}};import{spawn as spawn10}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve42=>{let proc=spawn10(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{killed||(killed=!0,proc.kill("SIGTERM"),setTimeout(()=>{proc.killed||proc.kill("SIGKILL")},5e3))};options?.signal&&(options.signal.aborted?killProcess():options.signal.addEventListener("abort",killProcess,{once:!0})),options?.timeout&&options.timeout>0&&(timeoutId=setTimeout(()=>{killProcess()},options.timeout)),proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),waitForChildProcess(proc).then(code=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve42({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve42({stdout,stderr,code:1,killed})})})}import{statSync as statSync18}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync18(file,{bigint:!0});return`${stats.mtimeNs}:${stats.size}`}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.fingerprints)if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function absorbNewlyCompiled(live){for(let file of live.importer.compiledFiles?.()??[]){if(live.fingerprints.has(file))continue;let fingerprint=fingerprintOf(file);fingerprint!==void 0&&live.fingerprints.set(file,fingerprint)}}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return absorbNewlyCompiled(generation),generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create){return generation?generation.importer:(pendingImporter??=create().then(importer=>(generation={importer,factories:new Map,fingerprints:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledFiles!==void 0&&(generation.factories.set(resolvedPath,factory),absorbNewlyCompiled(generation))}function clearExtensionCache(){dropGeneration()}var __rewriteRelativeImportExtension=function(path13,preserveJsx){return typeof path13=="string"&&/^\.\.?\//.test(path13)?path13.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path13};function sessionProfile(options){return{sharedHostEnabled:options?.sharedHostEnabled??!1,sessionKind:options?.sessionKind??"interactive",sessionContext:options?.sessionContext??EMPTY_SESSION_CONTEXT}}var VIRTUAL_MODULES={typebox:build_exports,"typebox/compile":compile_exports,"typebox/value":value_exports,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports,"@earendil-works/pi-agent-core":dist_exports2,"@earendil-works/pi-tui":dist_exports,"@earendil-works/pi-ai":compat_exports,"@earendil-works/pi-ai/compat":compat_exports,"@earendil-works/pi-ai/oauth":oauth_exports,"@earendil-works/pi-ai/providers/all":all_exports,"@earendil-works/pi-coding-agent":dist_exports3,"@mariozechner/pi-agent-core":dist_exports2,"@mariozechner/pi-tui":dist_exports,"@mariozechner/pi-ai":compat_exports,"@mariozechner/pi-ai/compat":compat_exports,"@mariozechner/pi-ai/oauth":oauth_exports,"@mariozechner/pi-ai/providers/all":all_exports,"@mariozechner/pi-coding-agent":dist_exports3,"@code-yeongyu/senpi":dist_exports3},require3=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path9.extname(fileURLToPath5(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path9.dirname(fileURLToPath5(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path9.resolve(__dirname,"../../.."),packagesRoot=path9.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path9.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path9.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path9.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath5(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path9.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path9.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs3.existsSync(piCodingAgentDistEntry)?piCodingAgentDistEntry:piCodingAgentSourceEntry,piAgentCoreEntry=resolveWorkspaceOrBundled("@earendil-works/pi-agent-core","dist/index.js","agent/dist/index.js","agent/src/index.ts","@earendil-works/pi-agent-core"),piTuiEntry=resolveWorkspaceOrBundled("@earendil-works/pi-tui","dist/index.js","tui/dist/index.js","tui/src/index.ts","@earendil-works/pi-tui"),piAiCompatEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/compat.js","ai/dist/compat.js","ai/src/compat.ts","@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/oauth.js","ai/dist/oauth.js","ai/src/oauth.ts","@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/providers/all.js","ai/dist/providers/all.js","ai/src/providers/all.ts","@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@code-yeongyu/senpi":piCodingAgentEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var runtimeFactories=new WeakMap;function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,executeTool:()=>Promise.reject(new Error("Extension runtime not initialized")),getActiveTools:notInitialized,getAllTools:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},registerRemovedToolHint:()=>{},registerLazyToolActivator:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,setSessionModel:()=>Promise.reject(new Error("Extension runtime not initialized")),setSessionThinkingLevel:notInitialized,setSessionFastMode:notInitialized,flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],assertActive:()=>{if(state.staleMessage)throw new Error(state.staleMessage)},invalidate:message=>{if(!state.staleMessage){state.staleMessage=message??"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().";for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear(),runtimeFactories.delete(runtime)}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath,order:nextProviderRegistrationOrder++})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath,order:nextProviderRegistrationOrder++})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)}};return runtime}function drainPendingProviderRegistrations(runtime){let drained=[...runtime.pendingProviderRegistrations.map(entry=>({kind:"config",...entry})),...runtime.pendingNativeProviderRegistrations.map(entry=>({kind:"native",...entry}))];return drained.sort((a,b)=>a.order-b.order),runtime.pendingProviderRegistrations=[],runtime.pendingNativeProviderRegistrations=[],drained}function createExtensionAPI(extension,runtime,cwd,eventBus,session){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state="loading",assertActive=()=>{if(state==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0};return{api:{cwd,sharedHostEnabled:session.sharedHostEnabled,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler){assertActive();let list3=extension.handlers.get(event)??[];list3.push(handler),extension.handlers.set(event,list3)},registerTool(tool){if(runtime.assertActive(),tool.name==="tool_search"&&extension.sourceInfo.source!=="builtin")throw new Error('Tool name "tool_search" is reserved for the builtin tool-search extension.');if(typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:tool,sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerLazyToolActivator(activator){runtime.assertActive();let activators=extension.lazyToolActivators??[];activators.push(activator),extension.lazyToolActivators=activators,runtime.registerLazyToolActivator(activator)},registerRemovedToolHint(name,hint){runtime.assertActive();let hints=extension.removedToolHints;hints||(hints=new Map,extension.removedToolHints=hints),hints.set(name,hint),runtime.registerRemovedToolHint(name,hint)},registerFilesystemPolicy(policy){runtime.assertActive();let policies=extension.filesystemPolicies??[];policies.push(policy),extension.filesystemPolicies=policies},registerCommand(name,options){assertActive(),extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer,options){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer),extension.entryRendererOptions??=new Map,options===void 0?extension.entryRendererOptions.delete(customType):extension.entryRendererOptions.set(customType,options)},registerReadClassifier(classifier){assertActive();let unregister=runtime.trackEventBusSubscription(registerReadClassifier(classifier));return state==="loading"&&loadingUnsubscribers.push(unregister),unregister},registerMcpServer(name,config){runtime.assertActive();let error2=validateMcpServerDeclaration(name,config);if(error2)throw new Error(error2);extension.mcpServers.set(name,{name,config,extensionPath:extension.path,registrationCwd:extension.registrationCwd})},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label2){assertActive(),runtime.setLabel(entryId,label2)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model)},setSessionThinkingLevel(level){runtime.assertActive(),runtime.setSessionThinkingLevel(level)},setSessionFastMode(enabled){runtime.assertActive(),runtime.setSessionFastMode(enabled)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},rpc:{emit(name,data){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension event name must not be empty");eventBus.emit(EXTENSION_RPC_EVENT_CHANNEL,{name:normalizedName,data})},handle(name,handler){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension request name must not be empty");let handlers=extension.rpcHandlers??new Map;if(handlers.has(normalizedName))throw new Error(`RPC extension request handler already registered: ${normalizedName}`);handlers.set(normalizedName,handler),extension.rpcHandlers=handlers}},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}},commit:()=>{if(state==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state="active",clearPending()}},discard:()=>{if(state==="loading"){state="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-H4IJCWWQ.js");return createBunExtensionImporter(VIRTUAL_MODULES)}let{createJiti}=await importNodeOnlyApi("jiti/static");return createJiti(import.meta.url,{moduleCache:!1,...isNodeSeaBinary||isBundledNode?{virtualModules:VIRTUAL_MODULES,tryNative:!1}:isTypeScriptSourceRuntime?{alias:getAliases(),virtualModules:VIRTUAL_MODULES,tsconfigPaths:!0}:{alias:getAliases()}})}async function loadExtensionModule(extensionPath,getImporter){let cachedFactory=cachedExtensionFactory(extensionPath);if(cachedFactory)return cachedFactory;let importer=await getImporter(),factory=await importer.import(extensionPath,{default:!0});if(typeof factory=="function")return rememberExtensionFactory(extensionPath,factory,importer),factory}function createExtension(extensionPath,resolvedPath,registrationCwd){let source=extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1).split(":")[0]||"temporary":"local",baseDir=extensionPath.startsWith("<")?void 0:path9.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source,baseDir,scope:source==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers:new Map,entryRenderers:void 0,commands:new Map,rpcHandlers:new Map,flags:new Map,shortcuts:new Map,mcpServers:new Map,registrationCwd}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session){let extension=createExtension(extensionPath,resolvedPath,cwd),load=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await factory(load.api),load.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load.discard(),error2}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,getImporter,factoryResolver,session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=factoryResolver?.(extensionPath,resolvedPath)??await loadExtensionModule(resolvedPath,getImporter);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>",session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime,session)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,options){let session=sessionProfile(options),extensions=[],errors=[],resolvedCwd=resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime(),getImporter=()=>extensionModuleImporter(createExtensionModuleImporter);for(let extPath of paths){let{extension,error:error2}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,getImporter,options?.factoryResolver,session);if(error2){errors.push({path:extPath,error:error2});continue}extension&&extensions.push(extension)}return{extensions,errors,runtime:resolvedRuntime,eventBus:resolvedEventBus}}async function loadExtensions(paths,cwd,eventBus,runtime,options){return loadExtensionsInternal(paths,cwd,eventBus,runtime,options)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries(dir){let packageJsonPath=path9.join(dir,"package.json");if(fs3.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path9.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path9.join(dir,"index.ts"),indexJs=path9.join(dir,"index.js");return fs3.existsSync(indexTs)?[indexTs]:fs3.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs3.existsSync(dir))return[];let discovered=[];try{let entries=fs3.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path9.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.isSymbolicLink()){let entries2=resolveExtensionEntries(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path9.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path9.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path9.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs3.existsSync(resolved)&&fs3.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function wrapRegisteredTool(registeredTool,runner,createToolContext){return{...wrapToolDefinition(registeredTool.definition),execute:async(toolCallId,params,signal,onUpdate)=>{let activeBefore=runner.getActiveTools(),invocation=createToolContext?.(signal),result3;try{result3=await registeredTool.definition.execute(toolCallId,params,signal,onUpdate,invocation?.context??runner.createContext())}finally{invocation?.dispose()}let activeAfter=runner.getActiveTools();if(!activeBefore.every(name=>activeAfter.includes(name)))return result3;let beforeNames=new Set(activeBefore),addedToolNames=activeAfter.filter(name=>!beforeNames.has(name));return addedToolNames.length===0?result3:{...result3,addedToolNames:[...new Set([...result3.addedToolNames??[],...addedToolNames])]}}}}function wrapRegisteredTools(registeredTools,runner,createToolContext){return registeredTools.map(tool=>wrapRegisteredTool(tool,runner,createToolContext))}var SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6-sol|gpt-6-astra)(?![a-z])/i,ASTRA_MODEL_ID_PATTERN=/gpt-6-astra(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(ASTRA_MODEL_ID_PATTERN.test(model.id)?thinkingLevel==="max":thinkingLevel==="xhigh"||thinkingLevel==="max")&&isSensitiveHighReasoningModel(model)}function buildHighReasoningWarning(model,thinkingLevel){let modelId=model.id,title=`\u26A0 HIGH-REASONING MODEL WARNING \u2014 ${model.provider}/${modelId} @ ${thinkingLevel}`,body=[`${modelId} is a frontier reasoning model. Running it at "${thinkingLevel}" effort makes it acutely sensitive to prompt quality.`,"Driving this model directly from a human prompt is NOT recommended. Risks include:"," \u2022 The model may refuse to stop, looping or working far past the stated goal.",' \u2022 It may perform unrequested actions in order to "complete" the task.'," \u2022 It may take risky, irreversible, or dangerous actions to force completion.","Strongly recommended: use this model ONLY through the ultrabrain subagent.","Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's \u2014 exactly what these high-effort models need to stay bounded.",'From the main agent, delegate instead: "query ultrabrain with <task>".',`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`];return{title,body}}var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv2(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}function resolveBufferSeconds(configured){return configured===void 0||!Number.isFinite(configured)||configured<0?DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS:Math.trunc(configured)}function resolvePromptCacheSafeWaitSeconds(model,settings,env){if(settings?.cacheAwareTimeouts===!1||!model)return;let ttlSeconds=resolvePromptCacheTtlSeconds(model,toProviderEnv2(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs}){let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0){await continuation;return}let timer=setTimeout(()=>{getActiveSignal()===ownedSignal&&abortActive()},timeoutMs);try{await continuation}finally{clearTimeout(timer)}}var BILLING_ERROR_PATTERN=new RegExp(["credit[- ]balance","insufficient[_ -]quota","\\bbilling\\b","purchase credits","credits[-_ ]required","credits are required","usage_limit_reached","usage_not_included","usage limit has been reached"].join("|"),"i");function isBillingErrorMessage(errorMessage8){return errorMessage8!==void 0&&BILLING_ERROR_PATTERN.test(errorMessage8)}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps}get activeState(){return this.state}get exhaustedChainKey(){return this.lastExhaustedChainKey}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy){let state=this.state;if(!state||state.pinned||revertPolicy!=="cooldown-expiry"||this.deps.cooldowns.isSuppressed(state.originalSelector))return!1;let selector=parseFallbackSelector(state.originalSelector,this.deps.registry);if(!selector||!this.deps.isAuthAvailable(selector.provider))return!1;let model=this.deps.registry.find(selector.provider,selector.id),current=this.deps.getCurrentSelector();if(!model||!current)return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.deps.switchModel(model,thinking,"fallback-revert");let from=formatSelector(current.model);return this.state=void 0,this.deps.logger.info("fallback_reverted",{from,to:state.originalSelector}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector}),!0}noteManualThinkingLevel(){this.state&&(this.state.lastAppliedThinkingLevel=void 0)}notifyCompactionApplied(){let state=this.state;if(!state)return!1;state.pinnedByRefusal=!1;let wasPinned=state.pinned;return state.pinned=state.pinnedByBilling,!wasPinned||state.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state.chainKey,originalSelector:state.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.deps.cooldowns.clear(formatSelector(model))}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector(),candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage}));let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);await this.deps.switchModel(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state,pinnedByRefusal=prior?.pinnedByRefusal===!0||reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||reason==="billing";return this.state={chainKey:candidate.chainKey,originalSelector:prior?.originalSelector??from,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling},this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason}),!0}nextCandidate(reserve=!0,logDecision=reserve){let settings=this.deps.getSettings(),current=this.deps.getCurrentSelector();if(!settings.modelFallback||!current)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey,entries=chainKey?chains[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,this.deps.registry);if(!selector){this.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){this.skip(raw,"self");continue}let base=baseSelector(selector);if(this.triedSelectors.has(base)){this.skip(raw,"tried");continue}if(this.deps.cooldowns.isSuppressed(base)){this.skip(raw,"suppressed");continue}if(!this.deps.isAuthAvailable(selector.provider)){this.skip(raw,"unauthenticated");continue}let model=this.deps.registry.find(selector.provider,selector.id);if(!model){this.skip(raw,"unknown");continue}return reserve&&this.triedSelectors.add(base),{chainKey,selector,model}}this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}selectThinking(selector,model,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random){this.expiresAtBySelector=new Map,this.now=now2,this.random=random}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs3,errorMessage:errorMessage8}){if(retryAfterMs3!==void 0&&Number.isFinite(retryAfterMs3)&&retryAfterMs3>0)return retryAfterMs3;let message=errorMessage8?.toLowerCase()??"";return/usage[- ]limit|quota|insufficient_quota|billing|credits[-_ ]required|credits are required/.test(message)?30*6e4:/rate[ -]?limit|429|too many requests/.test(message)?3e4:/overloaded|capacity/.test(message)?45e3+this.capacityJitterMs():/5xx|\b5\d\d\b|server|internal error/.test(message)?2e4:/timed? out|timeout|econnreset|econnrefused|etimedout|socket hang up|socket connection was closed|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|getaddrinfo|enotfound|eai_again|upstream.?connect|reset before headers|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|stream ended before a terminal response event|http2 request did not get a response/.test(message)?6e4:5*6e4}capacityJitterMs(){return Math.round(Math.min(1,Math.max(0,this.random()))*3e4)}};function classifyRateLimitedWait(hintMs,settings){return hintMs===void 0?"no-hint-fast-fallback":hintMs<=settings.hintedWaitCapMs?"tier1-in-turn":hintMs<settings.probeBackMaxMs?"tier2-fallback-probe-back":"tier3-fallback-only"}function probeBackSchedule(hintMs,nowMs){return{firstAtMs:nowMs+Math.ceil(hintMs/2),deadlineMs:nowMs+hintMs}}function nextInTurnDelayMs(state,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state.attempt-1);if(state.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state.hintDeadlineMs,cumulativeHintedWaitMs:state.cumulativeHintedWaitMs,demoteToProbeBack:!1}}function degradeWithoutFallback(tier,hintMs,attempt2,baseDelayMs,hintedWaitCapMs){return tier==="tier3-fallback-only"?{kind:"fail",hintMs:hintMs??0}:tier==="tier2-fallback-probe-back"?{kind:"in-turn",delayMs:Math.max(Math.min(hintMs??hintedWaitCapMs,hintedWaitCapMs),baseDelayMs*2**(attempt2-1))}:{kind:"in-turn",delayMs:baseDelayMs*2**(attempt2-1)}}import{chmodSync as chmodSync11,closeSync as closeSync6,mkdirSync as mkdirSync22,openSync as openSync6,renameSync as renameSync17,rmSync as rmSync13,statSync as statSync20,writeSync as writeSync5}from"node:fs";import{dirname as dirname43,join as join74}from"node:path";var DEFAULT_MAX_BYTES8=5*1024*1024,MAX_STRING_LENGTH2=200,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT3=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join74(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(filePath,line,maxBytes)}catch(error2){reportedWriteFailure||(reportedWriteFailure=!0,console.error("Unable to write retry fallback debug log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data),warn:(event,data)=>log("warn",event,data)}}function validMaxBytes4(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES8}function formatLine3(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText3(event)};if(data!==void 0){for(let[key,value2]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine4(filePath,line,maxBytes){mkdirSync22(dirname43(filePath),{recursive:!0,mode:448});let text2=`${line}
2420
2406
  `;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync13(`${filePath}.1`,{force:!0}),renameSync17(filePath,`${filePath}.1`),chmodSync11(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync5(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync11(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync20(filePath).size+incomingBytes>maxBytes}catch(error2){if(isMissingFileError3(error2))return!1;throw error2}}function isMissingFileError3(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}function serializeValue2(value2,seen){if(typeof value2=="string")return safeText3(value2);if(typeof value2=="bigint")return value2.toString();if(typeof value2=="number"||typeof value2=="boolean"||value2===null)return value2;if(typeof value2>"u")return;if(typeof value2=="function"||typeof value2=="symbol")return String(value2);if(seen.has(value2))return"[Circular]";if(seen.add(value2),Array.isArray(value2))return value2.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value2))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value2){try{let entries=[];for(let key of Object.keys(value2))try{let item=Reflect.get(value2,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText3(value2){let redacted=value2.replace(SENSITIVE_TEXT3,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH2?redacted:`${redacted.slice(0,MAX_STRING_LENGTH2-3)}...`}var ProbeBackScheduler=class{constructor(opts){this._armed=!1,this._generation=0,this._secondProbeAnnounced=!1,this._now=opts.now,this._setTimeout=opts.setTimeout??((cb,d)=>setTimeout(cb,d)),this._clearTimeout=opts.clearTimeout??(h=>clearTimeout(h))}get active(){return this._armed}arm(input){let gen=++this._generation;if(this._armed&&(this._clearTimers(),this._abortInFlight("superseded"),this._disarm()),this._armed=!0,this._firstTimer={handle:void 0},this._deadlineTimer={handle:void 0},this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1,gen!==this._generation||(input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.firstAtMs,probeIndex:1}),gen!==this._generation))return;let firstDelay=Math.max(0,input.firstAtMs-this._now());this._firstTimer&&(this._firstTimer.handle=this._setTimeout(()=>{this._runProbe(input,1,gen)},firstDelay));let deadlineDelay=Math.max(0,input.deadlineMs-this._now());gen===this._generation&&this._deadlineTimer&&(this._deadlineTimer.handle=this._setTimeout(()=>{this._runDeadlineProbe(input,gen)},deadlineDelay))}cancel(reason){this._generation++,this._clearTimers(),this._abortInFlight(reason),this._disarm()}_clearTimers(){this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._deadlineTimer?.handle!==void 0&&(this._clearTimeout(this._deadlineTimer.handle),this._deadlineTimer.handle=void 0)}_abortInFlight(_reason){this._abortController&&(this._abortController.abort(),this._abortController=void 0),this._activeProbeIndex=void 0}_disarm(){this._armed=!1,this._firstTimer=void 0,this._deadlineTimer=void 0,this._abortController=void 0,this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1}_finish(){this._clearTimers(),this._disarm()}_announceSecondProbe(input,generation2){generation2!==this._generation||this._secondProbeAnnounced||(this._secondProbeAnnounced=!0,input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.deadlineMs,probeIndex:2}))}_runDeadlineProbe(input,generation2){generation2!==this._generation||!this._armed||(this._deadlineTimer&&(this._deadlineTimer.handle=void 0),this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._activeProbeIndex===1&&this._abortInFlight("superseded"),this._announceSecondProbe(input,generation2),generation2===this._generation&&this._runProbe(input,2,generation2))}async _runProbe(input,probeIndex,generation2){let gen=generation2;if(gen!==this._generation||!this._armed)return;if(probeIndex===1&&this._firstTimer?this._firstTimer.handle=void 0:this._deadlineTimer&&(this._deadlineTimer.handle=void 0),!input.authAvailable()){if(gen!==this._generation||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1,errorMessage:"auth-unavailable"}),gen!==this._generation))return;this._finish();return}if(gen!==this._generation||this._activeProbeIndex!==void 0)return;let abortController=new AbortController;this._abortController=abortController,this._activeProbeIndex=probeIndex;let success;try{success=await input.runProbe(abortController.signal)}catch{success=!1}if(!(gen!==this._generation||this._activeProbeIndex!==probeIndex||this._abortController!==abortController)){if(this._abortController=void 0,this._activeProbeIndex=void 0,success){if(gen!==this._generation||(input.onCleared(input.selector),gen!==this._generation)||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!0}),gen!==this._generation))return;this._finish();return}if(probeIndex===1){this._announceSecondProbe(input,gen);return}gen===this._generation&&(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1}),gen===this._generation&&this._finish())}}};var WakeSourceTracker=class{constructor(){this.counts=new Map}observe(data){if(typeof data!="object"||data===null)return;let{source,activeCount}=data;typeof source!="string"||source.length===0||typeof activeCount!="number"||!Number.isFinite(activeCount)||(activeCount>0?this.counts.set(source,activeCount):this.counts.delete(source))}get hasActive(){return this.counts.size>0}get activeSources(){return[...this.counts.keys()]}};function isSessionBusySnapshot(snapshot){return snapshot.isStreaming||snapshot.isBashRunning||snapshot.isCompacting||snapshot.hasSessionWork||snapshot.hasActiveWakeSource}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
@@ -2442,7 +2428,7 @@ The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder
2442
2428
  `||text2[cursor]==="\r"&&text2[cursor+1]===`
2443
2429
  `;){cursor+=text2[cursor]==="\r"?2:1;let lineStart=cursor;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;if(text2[cursor]!==`
2444
2430
  `&&!(text2[cursor]==="\r"&&text2[cursor+1]===`
2445
- `))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&(key="Tools/summaries",usage3=entry.usage),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._baseToolDefinitions=new Map,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._extensionMode="print",this._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),this._retryRandom=config.retryRandom??Math.random,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env}:{model}}catch{return{model}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),messages=compactedBeforeCallback?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of this._eventListeners)l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID11(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source){try{let messages=source==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||((this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),this._emitQueueUpdate()}return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&!this._overflowRecoveryAttempted}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),event.message.role==="assistant")){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1;let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),this._turnIndex++,this._flushPendingCustomMessages()}else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._sessionFastMode||this._currentServiceTier==="priority"}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID11()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name);this.agent.state.tools=tools,this._baseSystemPrompt=this._rebuildSystemPrompt(validToolNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt,activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name)),withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2431
+ `))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve42){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve42(requested)}}function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&(key="Tools/summaries",usage3=entry.usage),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._baseToolDefinitions=new Map,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._extensionMode="print",this._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),this._retryRandom=config.retryRandom??Math.random,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env}:{model}}catch{return{model}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),messages=compactedBeforeCallback?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of this._eventListeners)l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID11(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source){try{let messages=source==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||((this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),this._emitQueueUpdate()}return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&!this._overflowRecoveryAttempted}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),event.message.role==="assistant")){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1;let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),this._turnIndex++,this._flushPendingCustomMessages()}else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._sessionFastMode||this._currentServiceTier==="priority"}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID11()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name);this.agent.state.tools=tools,this._baseSystemPrompt=this._rebuildSystemPrompt(validToolNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt,activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name)),withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2446
2432
 
2447
2433
  `):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
2448
2434
 
@@ -2462,7 +2448,7 @@ ${command}`:command;try{let result3=await executeBashWithOperations(resolvedComm
2462
2448
  `).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 randomUUID12}from"crypto";import{readFileSync as readFileSync40,unlinkSync as unlinkSync3}from"fs";import{tmpdir as tmpdir6}from"os";import{join as join75}from"path";var SUPPORTED_IMAGE_MIME_TYPES=["image/png","image/jpeg","image/webp","image/gif"],DEFAULT_LIST_TIMEOUT_MS=1e3,DEFAULT_POWERSHELL_TIMEOUT_MS=5e3;function isWaylandSession(env=process.env){return!!env.WAYLAND_DISPLAY||env.XDG_SESSION_TYPE==="wayland"}function baseMimeType2(mimeType){return mimeType.split(";")[0]?.trim().toLowerCase()??mimeType.toLowerCase()}function selectPreferredImageMimeType(mimeTypes){let normalized2=mimeTypes.map(t=>t.trim()).filter(Boolean).map(t=>({raw:t,base:baseMimeType2(t)}));for(let preferred of SUPPORTED_IMAGE_MIME_TYPES){let match=normalized2.find(t=>t.base===preferred);if(match)return match.raw}return normalized2.find(t=>t.base.startsWith("image/"))?.raw??null}function isSupportedImageMimeType(mimeType){let base=baseMimeType2(mimeType);return SUPPORTED_IMAGE_MIME_TYPES.some(t=>t===base)}async function convertToPng2(bytes){let photon=await loadPhoton();if(!photon)return null;try{let image=photon.PhotonImage.new_from_byteslice(bytes);try{return image.get_bytes()}finally{image.free()}}catch{return null}}async function readClipboardImageViaWlPaste(){let list3=await runClipboardCommand("wl-paste",["--list-types"],{timeoutMs:DEFAULT_LIST_TIMEOUT_MS});if(list3===void 0)return;let types=list3.toString("utf-8").split(/\r?\n/).map(t=>t.trim()).filter(Boolean),selectedType=selectPreferredImageMimeType(types);if(!selectedType)return null;let data=await runClipboardCommand("wl-paste",["--type",selectedType,"--no-newline"]);if(data!==void 0)return data.length===0?null:{bytes:data,mimeType:baseMimeType2(selectedType)}}function isWSL(env=process.env){if(env.WSL_DISTRO_NAME||env.WSLENV)return!0;try{let release3=readFileSync40("/proc/version","utf-8");return/microsoft|wsl/i.test(release3)}catch{return!1}}async function readClipboardImageViaPowerShell(){let tmpFile=join75(tmpdir6(),`pi-wsl-clip-${randomUUID12()}.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=readFileSync40(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((resolve42,reject)=>{let accepted=!1,rejectedAtPreflight=!1,disposition,resolveAcceptedDisposition=()=>{accepted&&disposition&&resolve42(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,label2){return this.selectedFor(questionId).includes(label2)}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,label2){let question=this.request.questions.find(entry=>entry.id===questionId);if(question?.options.some(option=>option.label===label2)){if(question.multiSelect){let next=[...this.selectedFor(questionId)],index=next.indexOf(label2);index>=0?next.splice(index,1):next.push(label2),this.selected.set(questionId,next)}else this.selected.set(questionId,[label2]);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(label2=>question.options.some(option=>option.label===label2));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,label2]of labels.entries()){let button=`[ ${truncateToWidth(label2,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===`
2463
2449
  `){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===`
2464
2450
  `){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===`
2465
- `){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 label2=truncateToWidth(tab,width-2);visibleWidth(line)>1&&visibleWidth(line)+2+visibleWidth(label2)>width-1&&(lines.push(line),line=" "),visibleWidth(line)>1&&(line+=" ");let start=visibleWidth(line);line+=label2,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"):"",label2=`${question.header}${answered}`;return index===state.activeTabIndex?theme.fg("accent",theme.bold(`\u2192 ${label2}`)):theme.fg("muted",` ${label2}`)}),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 label2=KIND_LABELS[details.kind]??"Session continuity degraded",base=details.reason?`${label2} (${details.reason})`:label2;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 basename24}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 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{action:"Read",label:path13?basename24(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&&basename24(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=[]}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)),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){this.children=members,this.calls=calls}};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=[];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=[]),members.push(child),calls.push({component:child,call}),group.setMembers(members,calls)):group&&child instanceof AssistantMessageComponent&&child.isExplorationDetail?members.push(child):(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,run=WIDTHS[mid];if(cp<run[0])hi=mid-1;else if(cp>run[1])lo=mid+1;else return run[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(`
2451
+ `){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 label2=truncateToWidth(tab,width-2);visibleWidth(line)>1&&visibleWidth(line)+2+visibleWidth(label2)>width-1&&(lines.push(line),line=" "),visibleWidth(line)>1&&(line+=" ");let start=visibleWidth(line);line+=label2,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"):"",label2=`${question.header}${answered}`;return index===state.activeTabIndex?theme.fg("accent",theme.bold(`\u2192 ${label2}`)):theme.fg("muted",` ${label2}`)}),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 label2=KIND_LABELS[details.kind]??"Session continuity degraded",base=details.reason?`${label2} (${details.reason})`:label2;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 basename24}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?basename24(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&&basename24(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,run=WIDTHS[mid];if(cp<run[0])hi=mid-1;else if(cp>run[1])lo=mid+1;else return run[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(`
2466
2452
  `).map(l=>l.endsWith("\r")?l.slice(0,-1):l);return out.length>0&&out[out.length-1]===""&&out.pop(),out}var ALNUM=/[\p{Alphabetic}\p{N}]/u,isAlphanumeric2=c=>ALNUM.test(c),isIdChar=c=>isAlphanumeric2(c)||c==="_",ENTITY_LOOKAHEAD=10,NAMED_ENTITIES={lt:"<",gt:">",amp:"&",quot:'"',apos:"'"};function decodeEntityBody(body){let named=NAMED_ENTITIES[body];if(named!==void 0)return named;if(!body.startsWith("#"))return null;let num2=body.slice(1),hex=/^[xX]/.test(num2),digits=hex?num2.slice(1):num2;if(!(hex?/^[0-9a-fA-F]+$/:/^[0-9]+$/).test(digits))return null;let code=Number.parseInt(digits,hex?16:10);return code>1114111||code>=55296&&code<=57343||code<32||code>=127&&code<=159?null:String.fromCodePoint(code)}function decodeHtmlEntities(s){if(!s.includes("&"))return s;let chars=[...s],out="",i=0;for(;i<chars.length;){if(chars[i]!=="&"){out+=chars[i],i++;continue}let hi=Math.min(i+1+ENTITY_LOOKAHEAD,chars.length),semi=-1;for(let j=i+1;j<hi;j++)if(chars[j]===";"){semi=j;break}let decoded=semi===-1?null:decodeEntityBody(chars.slice(i+1,semi).join(""));decoded===null?(out+="&",i++):(out+=decoded,i=semi+1)}return out}function stripMarkdown(s){let chars=[...[...s].filter(c=>c!=="`").join("").replaceAll("**","").replaceAll("__","")],out="";for(let i=0;i<chars.length;i++){let c=chars[i],inWord=i>0&&isAlphanumeric2(chars[i-1])&&chars[i+1]!==void 0&&isAlphanumeric2(chars[i+1]);(c==="*"||c==="_")&&!inWord||(out+=c)}return out.trim()}var HTML_FORMAT_TAGS=new Set(["b","strong","i","em","u","s","strike","del","ins","mark","small","big","sub","sup","code","kbd","samp","var","tt","span","font","q","abbr","cite","pre"]);function htmlTagAt(chars,start){let i=start+1;chars[i]==="/"&&i++;let nameStart=i;for(;i<chars.length&&/^[0-9A-Za-z]$/.test(chars[i]);)i++;if(i===nameStart)return null;let name=chars.slice(nameStart,i).join("");for(;i<chars.length&&chars[i]!==">";){if(chars[i]==="<")return null;i++}return chars[i]===">"?{name,end:i+1}:null}function stripHtmlTags(s){let chars=[...s],out="",i=0;for(;i<chars.length;){if(chars[i]==="<"){let tag=htmlTagAt(chars,i);if(tag){let lower=tag.name.toLowerCase();if(lower==="br"){out+=" ",i=tag.end;continue}if(HTML_FORMAT_TAGS.has(lower)){i=tag.end;continue}}}out+=chars[i],i++}return out}function unwrap2(s,open7,close){return s.length>=open7.length+close.length&&s.startsWith(open7)&&s.endsWith(close)?s.slice(open7.length,s.length-close.length):null}function cleanLabel(raw){let trimmed=stripHtmlTags(raw.trim()).trim(),unquoted=(unwrap2(trimmed,'"','"')??unwrap2(trimmed,"'","'")??trimmed).trim(),md=unwrap2(unquoted,"`","`");return decodeHtmlEntities(md===null?unquoted:stripMarkdown(md.trim()))}function lastBreak(s){let best=-1;for(let c of LABEL_BREAK_CHARS)best=Math.max(best,s.lastIndexOf(c));return best}function wrapLabel(label2,width,maxLines){width=Math.max(1,width);let lines=[],cur="",curW=0;for(let word of label2.split(/\s+/).filter(w=>w!=="")){let ww=stringWidth(word);if(ww>width){cur!==""&&(lines.push(cur),cur="");let chunk="",chunkW=0;for(let[ch,cw]of measured(word)){if(chunkW+cw>width&&chunk!==""){let p=lastBreak(chunk),carry=p===-1?"":chunk.slice(p+1);lines.push(p===-1?chunk:chunk.slice(0,p+1)),chunk=carry,chunkW=stringWidth(carry)}chunk+=ch,chunkW+=cw}cur=chunk,curW=chunkW}else cur===""?(cur=word,curW=ww):curW+1+ww<=width?(cur+=` ${word}`,curW+=1+ww):(lines.push(cur),cur=word,curW=ww)}if(cur!==""&&lines.push(cur),lines.length===0&&lines.push(""),lines.length>maxLines){lines.length=maxLines;let target=Math.max(1,width-1),s="",sw=0;for(let[ch,cw]of measured(lines[lines.length-1])){if(sw+cw>target)break;s+=ch,sw+=cw}lines[lines.length-1]=`${s}\u2026`}return lines}function fitLabel(label2,inner){if(stringWidth(label2)<=inner)return label2;let out="",used=0;for(let[c,cw]of measured(label2)){if(used+cw+1>inner)break;out+=c,used+=cw}return`${out}\u2026`}var CONT="\0",U=1,D=2,L=4,R=8,STY_DOT=1,STY_THICK=2,STY_SOLID=4,Canvas=class{w;h;ch;cls;mask;style;occupied;curStyle=STY_SOLID;constructor(w,h){let n=w*h;this.w=w,this.h=h,this.ch=new Array(n).fill(" "),this.cls=new Array(n).fill("none"),this.mask=new Uint8Array(n),this.style=new Uint8Array(n),this.occupied=new Uint8Array(n)}idx(x,y){return y*this.w+x}set(x,y,c,cls){if(x>=this.w||y>=this.h)return;let i=this.idx(x,y);this.ch[i]=c,this.cls[i]=cls}addBits(x,y,bits,cls="edge"){if(x>=this.w||y>=this.h)return;let i=this.idx(x,y);this.occupied[i]||(this.mask[i]|=bits,this.style[i]|=this.curStyle,this.cls[i]!=="border"&&(this.cls[i]=cls))}blit(sub,ox,oy){for(let sy=0;sy<sub.h;sy++)for(let sx=0;sx<sub.w;sx++){let x=ox+sx,y=oy+sy;if(x>=this.w||y>=this.h)continue;let si=sub.idx(sx,sy),di=this.idx(x,y);this.ch[di]=sub.ch[si],this.cls[di]=sub.cls[si],this.style[di]=sub.style[si],this.occupied[di]=1}}junction(x,y,bits){if(x>=this.w||y>=this.h)return;let i=this.idx(x,y);this.mask[i]|=bits,this.cls[i]!=="border"&&(this.cls[i]="edge")}segV(x,y0,y1){let a=Math.min(y0,y1),b=Math.max(y0,y1);for(let y=a;y<=b;y++){let bits=0;y>a&&(bits|=U),y<b&&(bits|=D),this.addBits(x,y,bits)}}segH(y,x0,x1){let a=Math.min(x0,x1),b=Math.max(x0,x1);for(let x=a;x<=b;x++){let bits=0;x>a&&(bits|=L),x<b&&(bits|=R),this.addBits(x,y,bits)}}finalizeMask(){for(let i=0;i<this.ch.length;i++)if(this.mask[i]!==0&&this.ch[i]===" "){let c=maskChar(this.mask[i]);this.ch[i]=this.style[i]===STY_DOT?dottedChar(c):this.style[i]===STY_THICK?thickChar(c):c}}flipVertical(){for(let y=0;y<Math.floor(this.h/2);y++){let y2=this.h-1-y;for(let x=0;x<this.w;x++){let i=this.idx(x,y),j=this.idx(x,y2);[this.ch[i],this.ch[j]]=[this.ch[j],this.ch[i]],[this.cls[i],this.cls[j]]=[this.cls[j],this.cls[i]]}}for(let i=0;i<this.ch.length;i++)this.ch[i]=flipGlyphV(this.ch[i])}flipHorizontal(){for(let y=0;y<this.h;y++)for(let x=0;x<Math.floor(this.w/2);x++){let x2=this.w-1-x,i=this.idx(x,y),j=this.idx(x2,y);[this.ch[i],this.ch[j]]=[this.ch[j],this.ch[i]],[this.cls[i],this.cls[j]]=[this.cls[j],this.cls[i]]}for(let i=0;i<this.ch.length;i++)this.ch[i]=flipGlyphH(this.ch[i]);for(let y=0;y<this.h;y++){let x=0;for(;x<this.w;){let cls=this.cls[this.idx(x,y)];if(cls==="text"||cls==="edgeLabel"){let start=this.idx(x,y);for(;x<this.w&&this.cls[this.idx(x,y)]===cls;)x++;let end=this.idx(x,y);reverseSlice(this.ch,start,end)}else x++}}}toLines(){let plain=[],styled=[],width=0;for(let y=0;y<this.h;y++){let last=0;for(let x=this.w-1;x>=0;x--)if(this.ch[this.idx(x,y)]!==" "){last=x+1;break}width=Math.max(width,last);let spans=[],plainRow="",run="",runCls="none";for(let x=0;x<last;x++){let i=this.idx(x,y),c=this.ch[i];if(c===CONT)continue;let cls=this.cls[i];plainRow+=c,cls!==runCls&&run!==""&&(spans.push({text:run,cls:runCls}),run=""),runCls=cls,run+=c}run!==""&&spans.push({text:run,cls:runCls}),styled.push(spans),plain.push(plainRow.replace(/ +$/,""))}let first=0;for(;first<plain.length&&plain[first]==="";)first++;let end=plain.length;for(;end>first&&plain[end-1]==="";)end--;return{plain:plain.slice(first,end),styled:styled.slice(first,end),width}}};function reverseSlice(arr,start,end){for(let i=start,j=end-1;i<j;i++,j--)[arr[i],arr[j]]=[arr[j],arr[i]]}function drawText(canvas,text2,x,y,cls){let cur=x;for(let[cluster,cw]of measured(text2))if(cw!==0){canvas.set(cur,y,cluster,cls);for(let k=1;k<cw;k++)canvas.set(cur+k,y,CONT,cls);cur+=cw}}function drawTextOverEdges(canvas,text2,x,y,cls){let cur=x;for(let[cluster,cw]of measured(text2))if(cw!==0){for(let k=0;k<cw;k++)cur+k<canvas.w&&y<canvas.h&&(canvas.mask[canvas.idx(cur+k,y)]=0),canvas.set(cur+k,y,k===0?cluster:CONT,cls);cur+=cw}}function maskChar(mask){switch(mask){case 0:return" ";case U:case D:case U|D:return"\u2502";case L:case R:case L|R:return"\u2500";case D|R:return"\u250C";case D|L:return"\u2510";case U|R:return"\u2514";case U|L:return"\u2518";case U|D|R:return"\u251C";case U|D|L:return"\u2524";case D|L|R:return"\u252C";case U|L|R:return"\u2534";default:return"\u253C"}}var DOTTED={"\u2500":"\u254C","\u2502":"\u254E"},THICK={"\u2500":"\u2501","\u2502":"\u2503","\u250C":"\u250F","\u2510":"\u2513","\u2514":"\u2517","\u2518":"\u251B","\u251C":"\u2523","\u2524":"\u252B","\u252C":"\u2533","\u2534":"\u253B","\u253C":"\u254B"},FLIP_V={"\u250C":"\u2514","\u2514":"\u250C","\u2510":"\u2518","\u2518":"\u2510","\u250F":"\u2517","\u2517":"\u250F","\u2513":"\u251B","\u251B":"\u2513","\u256D":"\u2570","\u2570":"\u256D","\u256E":"\u256F","\u256F":"\u256E","\u252C":"\u2534","\u2534":"\u252C","\u2533":"\u253B","\u253B":"\u2533","\u25BC":"\u25B2","\u25B2":"\u25BC","\u25BD":"\u25B3","\u25B3":"\u25BD"},FLIP_H={"\u250C":"\u2510","\u2510":"\u250C","\u2514":"\u2518","\u2518":"\u2514","\u250F":"\u2513","\u2513":"\u250F","\u2517":"\u251B","\u251B":"\u2517","\u256D":"\u256E","\u256E":"\u256D","\u2570":"\u256F","\u256F":"\u2570","\u251C":"\u2524","\u2524":"\u251C","\u2523":"\u252B","\u252B":"\u2523","\u25B6":"\u25C4","\u25C4":"\u25B6","\u25B7":"\u25C1","\u25C1":"\u25B7"},dottedChar=c=>DOTTED[c]??c,thickChar=c=>THICK[c]??c,flipGlyphV=c=>FLIP_V[c]??c,flipGlyphH=c=>FLIP_H[c]??c;var MAX_NODES=128,MAX_EDGES=512,MAX_GROUPS=24,MAX_GROUP_DEPTH=6,MAX_MEMBERS=8,emptyClassInfo=()=>({annotation:null,attrs:[],methods:[]});function parseDir(token){switch(asciiUpper(token)){case"LR":return"right";case"RL":return"left";case"BT":return"up";default:return"down"}}var Graph=class{nodes=[];edges=[];index=new Map;groups=[];nodeGroup=[];curGroup=null;overCap=!1;warnings=[];dir="down";constructor(dir="down"){this.dir=dir}nodeIndex(id,label2,shape){let existing=this.index.get(id);return existing!==void 0?(label2!==null&&(this.nodes[existing].label=label2,this.nodes[existing].shape=shape),existing):this.nodes.length>=MAX_NODES?(this.overCap=!0,null):(this.index.set(id,this.nodes.length),this.nodes.push({label:label2??id,shape}),this.nodeGroup.push(this.curGroup),this.nodes.length-1)}nodeLabel(id,label2){let existing=this.index.get(id);return existing!==void 0?(this.nodes[existing].label=label2,existing):this.nodeIndex(id,label2,"round")}pushEdge(edge){return this.edges.length>=MAX_EDGES?(this.overCap=!0,!1):(this.edges.push(edge),!0)}};var PAD=1,GAP_X=3,GAP_Y=2,MAX_CANVAS_CELLS=1<<21,sat=(a,b)=>Math.max(0,a-b),half=n=>Math.floor(n/2);function computeRanks(graph){let n=graph.nodes.length,children=Array.from({length:n},()=>[]),indeg=new Array(n).fill(0);for(let e of graph.edges)e.from!==e.to&&(children[e.from].push(e.to),indeg[e.to]++);let color=new Uint8Array(n),dag=Array.from({length:n},()=>[]),order=[],roots=[...Array(n).keys()].filter(i=>indeg[i]===0);for(let start of[...roots,...Array(n).keys()])color[start]===0&&dfsDag(start,children,color,dag,order);let rank=new Array(n).fill(0);for(let i=order.length-1;i>=0;i--){let u=order[i];for(let v of dag[u])rank[v]=Math.max(rank[v],rank[u]+1)}return rank}function dfsDag(start,children,color,dag,order){let stack=[{u:start,i:0}];for(color[start]=1;stack.length>0;){let frame2=stack[stack.length-1],u=frame2.u;if(frame2.i<children[u].length){let v=children[u][frame2.i];if(frame2.i++,color[v]===1)continue;dag[u].push(v),color[v]===0&&(color[v]=1,stack.push({u:v,i:0}))}else color[u]=2,order.push(u),stack.pop()}}function orderRanks(byRank,edges,ranks){let n=ranks.length;if(byRank.length<2||n<3)return;let parents=Array.from({length:n},()=>[]),children=Array.from({length:n},()=>[]);for(let e of edges)e.from!==e.to&&ranks[e.to]>ranks[e.from]&&(parents[e.to].push(e.from),children[e.from].push(e.to));let pos=new Array(n).fill(0),reindex=row=>{for(let i=0;i<row.length;i++)pos[row[i]]=i};for(let row of byRank)reindex(row);let best=byRank.map(row=>[...row]),bestCrossings=countCrossings(edges,ranks,pos);if(bestCrossings!==0){for(let it=0;it<8;it++){let rows=it%2===0?byRank.slice(1):byRank.slice(0,-1).reverse(),neigh=it%2===0?parents:children;for(let row of rows)sortByBarycenter(row,neigh,pos),reindex(row);let crossings=countCrossings(edges,ranks,pos);if(crossings<bestCrossings&&(bestCrossings=crossings,best=byRank.map(row=>[...row])),bestCrossings===0)break}for(let i=0;i<byRank.length;i++)byRank[i].splice(0,byRank[i].length,...best[i])}}function sortByBarycenter(row,neigh,pos){let keyed=row.map(v=>({key:neigh[v].length===0?pos[v]:neigh[v].reduce((s,u)=>s+pos[u],0)/neigh[v].length,v}));keyed.sort((a,b)=>a.key-b.key);for(let i=0;i<keyed.length;i++)row[i]=keyed[i].v}function countCrossings(edges,ranks,pos){let adjacent=edges.filter(e=>e.from!==e.to&&ranks[e.to]===ranks[e.from]+1).map(e=>[ranks[e.from],pos[e.from],pos[e.to]]),crossings=0;for(let i=0;i<adjacent.length;i++){let a=adjacent[i];for(let j=i+1;j<adjacent.length;j++){let b=adjacent[j];a[0]===b[0]&&(a[1]<b[1]&&a[2]>b[2]||a[1]>b[1]&&a[2]<b[2])&&crossings++}}return crossings}function assignPositions(byRank,size,sep15,edges,ranks){let n=size.length,parents=Array.from({length:n},()=>[]),children=Array.from({length:n},()=>[]);for(let e of edges)e.from!==e.to&&ranks[e.to]>ranks[e.from]&&(parents[e.to].push(e.from),children[e.from].push(e.to));let pos=new Array(n).fill(0);for(let row of byRank){let x=0;for(let v of row){let h=size[v]/2;x+=h,pos[v]=x,x+=h+sep15}}for(let it=0;it<10;it++){let rows=it%2===0?byRank:[...byRank].reverse(),neigh=it%2===0?parents:children;for(let row of rows)relaxRank(row,neigh,pos,size,sep15)}let minLeft=Number.POSITIVE_INFINITY;for(let v=0;v<n;v++)minLeft=Math.min(minLeft,pos[v]-size[v]/2);return Number.isFinite(minLeft)||(minLeft=0),Array.from({length:n},(_,v)=>Math.max(0,Math.round(pos[v]-minLeft)))}function relaxRank(nodes,neigh,pos,size,sep15){let n=nodes.length;if(n===0)return;let desired=nodes.map(v=>neigh[v].length===0?pos[v]:neigh[v].reduce((s,u)=>s+pos[u],0)/neigh[v].length),halfOf=i=>size[nodes[i]]/2,left=new Array(n);for(let i=0;i<n;i++)left[i]=i===0?desired[i]:Math.max(desired[i],left[i-1]+halfOf(i-1)+sep15+halfOf(i));let right=new Array(n);for(let i=n-1;i>=0;i--)right[i]=i===n-1?desired[i]:Math.min(desired[i],right[i+1]-halfOf(i+1)-sep15-halfOf(i));for(let i=0;i<n;i++)pos[nodes[i]]=(left[i]+right[i])/2;for(let i=1;i<n;i++){let minP=pos[nodes[i-1]]+halfOf(i-1)+sep15+halfOf(i);pos[nodes[i]]<minP&&(pos[nodes[i]]=minP)}}function assignTracks(spans){let sorted=[...spans].sort((a,b)=>{for(let i=0;i<5;i++)if(a[i]!==b[i])return a[i]-b[i];return 0}),tracks=[],assigned=[];for(let[s,e,f,t,idx]of sorted){let slot=tracks.findIndex(members=>members.every(([s2,e2,f2,t2])=>e2+2<=s||e+2<=s2||f2===f||t2===t));slot===-1&&(tracks.push([]),slot=tracks.length-1),tracks[slot].push([s,e,f,t]),assigned.push([idx,slot])}return{assigned,count:tracks.length}}function busSpans(graph,ranks,centers,r,exact){let out=[];return graph.edges.forEach((e,i)=>{let jogs=exact?centers[e.from]!==centers[e.to]:Math.abs(centers[e.from]-centers[e.to])>1;e.from!==e.to&&ranks[e.from]===r&&ranks[e.to]===r+1&&jogs&&out.push([Math.min(centers[e.from],centers[e.to]),Math.max(centers[e.from],centers[e.to]),e.from,e.to,i])}),out}function laneSpans(graph,ranks,placed,vertical){let out=[];return graph.edges.forEach((e,i)=>{if(e.from===e.to||ranks[e.to]===ranks[e.from]+1)return;let pf=placed[e.from],pt=placed[e.to],a=vertical?Math.min(pf.cy,pt.cy):Math.min(pf.cx,pt.cx),b=vertical?Math.max(pf.cy,pt.cy):Math.max(pf.cx,pt.cx);out.push([a,b,e.from,e.to,i])}),out}function placeTd(ranks,maxRank,byRank,sizes,graph,placed){let centers=assignPositions(byRank,sizes.layW,GAP_X,graph.edges,ranks),edgeBus=new Array(graph.edges.length).fill(0),busTracks=new Array(maxRank+1).fill(0);for(let r=0;r<maxRank;r++){let spans=busSpans(graph,ranks,centers,r,!1);if(spans.length===0)continue;let{assigned,count}=assignTracks(spans);for(let[idx,slot]of assigned)edgeBus[idx]=slot;busTracks[r]=count}let rankH=byRank.map(row=>row.length===0?3:Math.max(...row.map(i=>sizes.boxH[i]+sizes.extraH[i]))),rankY=new Array(maxRank+1).fill(0);for(let r=1;r<=maxRank;r++)rankY[r]=rankY[r-1]+rankH[r-1]+Math.max(GAP_Y,busTracks[r-1]+1);let canvasH=rankY[maxRank]+rankH[maxRank],bandEnd=Array.from({length:maxRank+1},(_,r)=>rankY[r]+rankH[r]),diagramW=1;byRank.forEach((row,r)=>{for(let idx of row){let w=sizes.boxW[idx],h=sizes.boxH[idx],cx=centers[idx],x=sat(cx,half(w)),y=rankY[r]+half(rankH[r]-h-sizes.extraH[idx]);placed[idx]={x,y,w,h,cx,cy:y+half(h),rank:r},diagramW=Math.max(diagramW,x+w),sizes.extraH[idx]>0&&sizes.selfLabelW[idx]>0&&(diagramW=Math.max(diagramW,x+w+2+sizes.selfLabelW[idx]))}});let contentW=diagramW;for(let e of graph.edges){if(e.from===e.to||e.label===null)continue;let lw=Math.min(stringWidth(e.label),MAX_LABEL);contentW=ranks[e.to]===ranks[e.from]+1?Math.max(contentW,placed[e.to].cx+2+lw):Math.max(contentW,diagramW+lw+1)}let edgeLane=new Array(graph.edges.length).fill(0),lanes=laneSpans(graph,ranks,placed,!0),canvasW=contentW,laneBase=0;if(lanes.length>0){let{assigned,count}=assignTracks(lanes);for(let[idx,slot]of assigned)edgeLane[idx]=slot;canvasW=contentW+1+count,laneBase=contentW+1}return{canvasW,canvasH,bandEnd,edgeBus,laneBase,edgeLane}}function placeLr(ranks,maxRank,byRank,sizes,graph,placed){let colW=byRank.map(row=>row.length===0?0:Math.max(...row.map(i=>sizes.boxW[i]))),labelWidths=graph.edges.filter(e=>e.from===e.to||ranks[e.to]===ranks[e.from]+1).filter(e=>e.label!==null).map(e=>Math.min(stringWidth(e.label),MAX_LABEL)),maxLabel=labelWidths.length===0?0:Math.max(...labelWidths),baseGap=Math.max(GAP_X+1,maxLabel+3),centers=assignPositions(byRank,sizes.layH,1,graph.edges,ranks),edgeBus=new Array(graph.edges.length).fill(0),busTracks=new Array(maxRank+1).fill(0);for(let r=0;r<maxRank;r++){let spans=busSpans(graph,ranks,centers,r,!0);if(spans.length===0)continue;let{assigned,count}=assignTracks(spans);for(let[idx,slot]of assigned)edgeBus[idx]=slot;busTracks[r]=count}let rankX=new Array(maxRank+1).fill(0);for(let r=1;r<=maxRank;r++)rankX[r]=rankX[r-1]+colW[r-1]+Math.max(baseGap,busTracks[r-1]+1);let selfTails=byRank[maxRank].filter(i=>sizes.extraH[i]>0&&sizes.selfLabelW[i]>0).map(i=>2+sizes.selfLabelW[i]),canvasW=rankX[maxRank]+colW[maxRank]+(selfTails.length===0?0:Math.max(...selfTails)),bandEnd=Array.from({length:maxRank+1},(_,r)=>rankX[r]+colW[r]),diagramH=1;byRank.forEach((row,r)=>{let x=rankX[r];for(let idx of row){let w=sizes.boxW[idx],h=sizes.boxH[idx],cy=centers[idx],y=sat(cy,half(h+sizes.extraH[idx]));placed[idx]={x,y,w,h,cx:x+half(w),cy:y+half(h),rank:r},diagramH=Math.max(diagramH,y+h+sizes.extraH[idx])}});let edgeLane=new Array(graph.edges.length).fill(0),lanes=laneSpans(graph,ranks,placed,!1),canvasH=diagramH,laneBase=0;if(lanes.length>0){let{assigned,count}=assignTracks(lanes);for(let[idx,slot]of assigned)edgeLane[idx]=slot;canvasH=diagramH+1+count,laneBase=diagramH+1}return{canvasW,canvasH,bandEnd,edgeBus,laneBase,edgeLane}}function layoutCanvas(graph,extras){let n=graph.nodes.length;if(n===0)return null;let ranks=computeRanks(graph),maxRank=Math.max(...ranks,0),byRank=Array.from({length:maxRank+1},()=>[]);for(let idx=0;idx<ranks.length;idx++)byRank[ranks[idx]].push(idx);orderRanks(byRank,graph.edges,ranks);let wrapped=graph.nodes.map(node=>wrapLabel(node.label,WRAP_WIDTH,MAX_LINES)),widest=lines=>Math.max(1,lines.length===0?1:Math.max(...lines.map(stringWidth))),boxW=extras.map((extra,i)=>extra.kind==="frame"?Math.max(extra.sub.w+2,stringWidth(fitLabel(graph.nodes[i].label,WRAP_WIDTH))+4):extra.kind==="compartments"?widest(extra.sections.flat())+2*PAD+2:widest(wrapped[i])+2*PAD+2),boxH=extras.map((extra,i)=>{if(extra.kind==="frame")return extra.sub.h+2;if(extra.kind==="compartments"){let filled=extra.sections.filter(s=>s.length>0).length;return extra.sections.reduce((s,sec)=>s+sec.length,0)+sat(filled,1)+2}return wrapped[i].length+2}),extraH=new Array(n).fill(0),selfLabelW=new Array(n).fill(0);for(let e of graph.edges)e.from===e.to&&(extraH[e.from]=2,e.label!==null&&(selfLabelW[e.from]=Math.max(selfLabelW[e.from],Math.min(stringWidth(e.label),MAX_LABEL))));for(let i=0;i<n;i++)extraH[i]>0&&(boxW[i]=Math.max(boxW[i],7));let sizes={boxW,boxH,layW:boxW.map((w,i)=>w+(selfLabelW[i]>0?2*(selfLabelW[i]+3):0)),layH:boxH.map((h,i)=>h+extraH[i]),extraH,selfLabelW},placed=Array.from({length:n},()=>({x:0,y:0,w:0,h:0,cx:0,cy:0,rank:0})),vertical=graph.dir==="down"||graph.dir==="up",plan=vertical?placeTd(ranks,maxRank,byRank,sizes,graph,placed):placeLr(ranks,maxRank,byRank,sizes,graph,placed);if(plan.canvasW*plan.canvasH>MAX_CANVAS_CELLS)return null;let canvas=new Canvas(plan.canvasW,plan.canvasH);for(let idx=0;idx<n;idx++){let extra=extras[idx];extra.kind==="frame"?drawFrame(canvas,placed[idx],graph.nodes[idx].label,extra.sub):extra.kind==="compartments"?drawClassBox(canvas,placed[idx],extra.sections):drawBox(canvas,placed[idx],wrapped[idx],graph.nodes[idx].shape)}return graph.edges.forEach((edge,i)=>{if(canvas.curStyle=edge.line==="dotted"?STY_DOT:edge.line==="thick"?STY_THICK:STY_SOLID,edge.from===edge.to){routeSelf(canvas,placed[edge.from],edge);return}let from=placed[edge.from],to=placed[edge.to],adjacent=to.rank===from.rank+1,bus=plan.bandEnd[from.rank]+plan.edgeBus[i],lane=plan.laneBase+plan.edgeLane[i];vertical?adjacent?routeForward(canvas,from,to,edge,bus):routeBack(canvas,from,to,edge,lane):adjacent?routeForwardLr(canvas,from,to,edge,bus):routeBackLr(canvas,from,to,edge,lane)}),canvas.finalizeMask(),canvas}function orient(canvas,graph){return graph.dir==="up"?canvas.flipVertical():graph.dir==="left"&&canvas.flipHorizontal(),canvas}function layoutFlowchart(graph){let extras=graph.nodes.map(()=>({kind:"plain"})),canvas=layoutCanvas(graph,extras);return canvas&&orient(canvas,graph)}function layoutClass(graph,infos){let extras=graph.nodes.map((node,i)=>{let title=[];return infos[i].annotation!==null&&title.push(`\xAB${infos[i].annotation}\xBB`),title.push(displayGenerics(node.label)),{kind:"compartments",sections:[title,infos[i].attrs,infos[i].methods]}}),canvas=layoutCanvas(graph,extras);return canvas&&orient(canvas,graph)}function displayGenerics(s){let out="",open7=!1;for(let c of s)c==="~"?(out+=open7?">":"<",open7=!open7):out+=c;return out}var nodeKey=i=>`n${i}`,groupKey=i=>`g${i}`;function layoutGrouped(graph){let proxy=new Map;graph.groups.forEach((g,gi)=>{let ni=graph.index.get(g.id);ni!==void 0&&proxy.set(ni,gi)});let groupChain=g=>{let chain=[],cur=g;for(;cur!==null;)chain.push(cur),cur=graph.groups[cur].parent;return chain.reverse()},endpoint=n=>{let gi=proxy.get(n);return gi===void 0?{key:nodeKey(n),chain:groupChain(graph.nodeGroup[n])}:{key:groupKey(gi),chain:groupChain(graph.groups[gi].parent)}},scopeEdges=new Map,referenced=new Array(graph.groups.length).fill(!1);graph.edges.forEach((e,ei)=>{let f=endpoint(e.from),t=endpoint(e.to),k=0;for(;k<f.chain.length&&k<t.chain.length&&f.chain[k]===t.chain[k];)k++;let scope=k===0?null:f.chain[k-1],fKey=f.chain.length>k?groupKey(f.chain[k]):f.key,tKey=t.chain.length>k?groupKey(t.chain[k]):t.key;for(let key of[fKey,tKey])key.startsWith("g")&&(referenced[Number(key.slice(1))]=!0);let list3=scopeEdges.get(scope);list3?list3.push([fKey,tKey,ei]):scopeEdges.set(scope,[[fKey,tKey,ei]])});let directNodes=new Map;graph.nodeGroup.forEach((g,ni)=>{if(proxy.has(ni))return;let list3=directNodes.get(g);list3?list3.push(ni):directNodes.set(g,[ni])});let keep=new Array(graph.groups.length).fill(!1);for(let gi=graph.groups.length-1;gi>=0;gi--){let hasNodes=(directNodes.get(gi)??[]).length>0,hasChildren=graph.groups.some((g,c)=>g.parent===gi&&keep[c]);keep[gi]=hasNodes||hasChildren||referenced[gi]}let canvas=buildScope(graph,null,scopeEdges,directNodes,keep);return canvas&&orient(canvas,graph)}function buildScope(graph,scope,scopeEdges,directNodes,keep){let items=(directNodes.get(scope)??[]).map(nodeKey),childGroups=graph.groups.map((_,gi)=>gi).filter(gi=>graph.groups[gi].parent===scope&&keep[gi]);if(items.push(...childGroups.map(groupKey)),items.length===0)return new Canvas(1,1);let indexOf=new Map,nodes=[],extras=[];for(let item of items){indexOf.set(item,nodes.length);let i=Number(item.slice(1));if(item.startsWith("n"))nodes.push({label:graph.nodes[i].label,shape:graph.nodes[i].shape}),extras.push({kind:"plain"});else{let sub=buildScope(graph,i,scopeEdges,directNodes,keep);if(sub===null)return null;nodes.push({label:graph.groups[i].label,shape:"rect"}),extras.push({kind:"frame",sub})}}let edges=[];for(let[f,t,ei]of scopeEdges.get(scope)??[]){let fi=indexOf.get(f),ti=indexOf.get(t);if(fi===void 0||ti===void 0)continue;let e=graph.edges[ei];edges.push({from:fi,to:ti,label:e.label,headTo:e.headTo,headFrom:e.headFrom,line:e.line})}let synth=new Graph(graph.dir);return synth.nodes=nodes,synth.edges=edges,layoutCanvas(synth,extras)}function drawBox(canvas,p,lines,shape){let{x,y,w,h}=p,right=x+w-1,bottom=y+h-1,rounded=shape==="round"||shape==="diamond";canvas.set(x,y,rounded?"\u256D":"\u250C","border"),canvas.set(right,y,rounded?"\u256E":"\u2510","border"),canvas.set(x,bottom,rounded?"\u2570":"\u2514","border"),canvas.set(right,bottom,rounded?"\u256F":"\u2518","border");for(let cx=x+1;cx<right;cx++)canvas.addBits(cx,y,L|R,"border"),canvas.addBits(cx,bottom,L|R,"border");for(let cy=y+1;cy<bottom;cy++)canvas.addBits(x,cy,U|D,"border"),canvas.addBits(right,cy,U|D,"border");for(let cy=y;cy<=bottom;cy++)for(let cx=x;cx<=right;cx++)canvas.occupied[canvas.idx(cx,cy)]=1;let inner=Math.max(1,sat(w,2*PAD+2));lines.forEach((line,li)=>{let text2=fitLabel(line,inner),textX=x+1+PAD+half(sat(inner,stringWidth(text2)));drawText(canvas,text2,textX,y+1+li,"text")})}function drawClassBox(canvas,p,sections){drawBox(canvas,p,[],"rect");let inner=Math.max(1,sat(p.w,2*PAD+2)),row=p.y+1,first=!0;sections.forEach((section,si)=>{if(section.length!==0){if(!first){canvas.set(p.x,row,"\u251C","border");for(let x=p.x+1;x<p.x+p.w-1;x++)canvas.set(x,row,"\u2500","border");canvas.set(p.x+p.w-1,row,"\u2524","border"),row++}first=!1;for(let line of section){let text2=fitLabel(line,inner),tx=si===0?p.x+1+PAD+half(sat(inner,stringWidth(text2))):p.x+1+PAD;drawTextOverEdges(canvas,text2,tx,row,"text"),row++}}})}function drawFrame(canvas,p,title,sub){drawBox(canvas,p,[],"rect");let t=fitLabel(title,sat(p.w,4));drawTextOverEdges(canvas,` ${t} `,p.x+1,p.y,"text"),canvas.blit(sub,p.x+1+half(p.w-2-sub.w),p.y+1+half(p.h-2-sub.h))}function headGlyph(head,arrow){switch(head){case"circle":return"o";case"cross":return"\xD7";case"diamondFill":return"\u25C6";case"diamondOpen":return"\u25C7";case"triangle":return{"\u25BC":"\u25BD","\u25B2":"\u25B3","\u25C4":"\u25C1","\u25B6":"\u25B7"}[arrow]??arrow;default:return arrow}}function routeForward(canvas,from,to,edge,bus){let tx=to.cx,bx=Math.abs(from.cx-tx)<=1?tx:from.cx,by=from.y+from.h-1,headRow=to.y-1;canvas.junction(bx,by,D),canvas.segV(bx,by,bus),bx===tx?canvas.segV(bx,bus,headRow):(canvas.segH(bus,bx,tx),canvas.segV(tx,bus,headRow)),edge.headTo==="none"?canvas.addBits(tx,headRow,U):canvas.set(tx,headRow,headGlyph(edge.headTo,"\u25BC"),"edge"),edge.headFrom!=="none"&&canvas.set(bx,by,headGlyph(edge.headFrom,"\u25B2"),"edge"),edge.label!==null&&placeLabel(canvas,edge.label,headRow,tx+1)}function routeSelf(canvas,p,edge){let bottom=p.y+p.h-1,exitX=p.cx+1,retX=p.x+p.w-2;if(retX<=exitX||bottom+2>=canvas.h)return;let[v,h,bl,br]=edge.line==="dotted"?["\u254E","\u254C","\u2570","\u256F"]:edge.line==="thick"?["\u2503","\u2501","\u2517","\u251B"]:["\u2502","\u2500","\u2570","\u256F"];canvas.junction(exitX,bottom,D),canvas.set(exitX,bottom+1,v,"edge"),canvas.set(exitX,bottom+2,bl,"edge");for(let x=exitX+1;x<retX;x++)canvas.set(x,bottom+2,h,"edge");canvas.set(retX,bottom+2,br,"edge"),canvas.set(retX,bottom+1,headGlyph(edge.headTo,"\u25B2"),"edge"),edge.label!==null&&placeLabel(canvas,edge.label,bottom+1,p.x+p.w+1)}function routeBack(canvas,from,to,edge,laneX){let sx=from.x+from.w-1,sy=from.cy,tx=to.x+to.w-1,tyc=to.cy;canvas.junction(sx,sy,R),canvas.segH(sy,sx,laneX),canvas.segV(laneX,sy,tyc),canvas.segH(tyc,tx+1,laneX),edge.headTo==="none"?canvas.addBits(tx+1,tyc,R):canvas.set(tx+1,tyc,headGlyph(edge.headTo,"\u25C4"),"edge"),edge.headFrom!=="none"&&canvas.set(sx,sy,headGlyph(edge.headFrom,"\u25C4"),"edge"),edge.label!==null&&placeLabel(canvas,edge.label,sat(tyc,1),sat(laneX,stringWidth(edge.label)+1))}function routeForwardLr(canvas,from,to,edge,bus){let rx=from.x+from.w-1,ry=from.cy,ly=to.cy,headCol=to.x-1;canvas.junction(rx,ry,R),canvas.segH(ry,rx,bus),ry===ly?canvas.segH(ry,bus,headCol):(canvas.segV(bus,ry,ly),canvas.segH(ly,bus,headCol)),edge.headTo==="none"?canvas.addBits(headCol,ly,R):canvas.set(headCol,ly,headGlyph(edge.headTo,"\u25B6"),"edge"),edge.headFrom!=="none"&&canvas.set(rx,ry,headGlyph(edge.headFrom,"\u25C4"),"edge"),edge.label!==null&&placeLabel(canvas,edge.label,sat(ly,1),bus+1)}function routeBackLr(canvas,from,to,edge,laneY){let sx=from.cx,sy=from.y+from.h-1,tx=to.cx,ty=to.y+to.h-1;canvas.junction(sx,sy,D),canvas.segV(sx,sy,laneY),canvas.segH(laneY,sx,tx),canvas.segV(tx,laneY,ty+1),edge.headTo==="none"?canvas.addBits(tx,ty+1,D):canvas.set(tx,ty+1,headGlyph(edge.headTo,"\u25B2"),"edge"),edge.headFrom!=="none"&&canvas.set(sx,sy,headGlyph(edge.headFrom,"\u25B2"),"edge"),edge.label!==null&&placeLabel(canvas,edge.label,sat(laneY,1),half(sx+tx))}function placeLabel(canvas,label2,row,startX){if(row>=canvas.h)return;let text2=fitLabel(label2,MAX_LABEL),x=startX;for(let[c,cw]of measured(text2)){if(cw===0)continue;if(x+cw>canvas.w)break;let blocked=!1;for(let k=0;k<cw;k++){let i=canvas.idx(x+k,row);(canvas.ch[i]!==" "||canvas.mask[i]!==0||canvas.occupied[i])&&(blocked=!0)}if(blocked)break;canvas.set(x,row,c,"edgeLabel");for(let k=1;k<cw;k++)canvas.set(x+k,row,CONT,"edgeLabel");x+=cw}}var PAD2=1,SEQ_GAP=5,MAX_CANVAS_CELLS2=1<<21,sat2=(a,b)=>Math.max(0,a-b),half2=n=>Math.floor(n/2);function noteGeometry(xs,anchor,textW){if(anchor.kind==="over"){let center=half2(xs[anchor.from]+xs[anchor.to]),w2=Math.max(xs[anchor.to]-xs[anchor.from]+5,textW+2*PAD2+2);return{x:sat2(center,half2(w2)),w:w2}}let w=textW+2*PAD2+2;return anchor.kind==="left"?{x:sat2(xs[anchor.at],2+w-1),w}:{x:xs[anchor.at]+2,w}}var itemTextW=text2=>text2===null?0:stringWidth(text2);function layoutSequence(seq){let n=seq.labels.length,labels=seq.labels.map(l=>fitLabel(l,WRAP_WIDTH)),boxW=labels.map(l=>Math.max(1,stringWidth(l))+2*PAD2+2),boxH=3,gaps=Array.from({length:sat2(n,1)},(_,i)=>Math.max(SEQ_GAP,Math.ceil(boxW[i]/2)+Math.ceil(boxW[i+1]/2)+1)),reqs=[];for(let item of seq.items)if(item.kind==="message"){let tw=itemTextW(item.text);item.from!==item.to?reqs.push([Math.min(item.from,item.to),Math.max(item.from,item.to),Math.max(tw+2,4)]):item.from+1<n&&reqs.push([item.from,item.from+1,5+tw+2])}else if(item.kind==="note"){let tw=stringWidth(item.text),a=item.anchor;if(a.kind==="over"&&a.from<a.to)reqs.push([a.from,a.to,sat2(tw,1)]);else if(a.kind==="over"){let need=Math.ceil((tw+4)/2)+2;a.from>0&&reqs.push([a.from-1,a.from,need]),a.from+1<n&&reqs.push([a.from,a.from+1,need])}else a.kind==="left"&&a.at>0?reqs.push([a.at-1,a.at,tw+7]):a.kind==="right"&&a.at+1<n&&reqs.push([a.at,a.at+1,tw+7])}reqs.sort((a,b)=>a[1]-a[0]-(b[1]-b[0]));for(let[l,r,need]of reqs){let cur=0;for(let i=l;i<r;i++)cur+=gaps[i];cur<need&&(gaps[r-1]+=need-cur)}let xs=new Array(n);xs[0]=half2(boxW[0]);for(let i=1;i<n;i++)xs[i]=xs[i-1]+gaps[i-1];let canvasW=xs[n-1]+Math.ceil(boxW[n-1]/2)+1;for(let item of seq.items)if(item.kind==="message"&&item.from===item.to)canvasW=Math.max(canvasW,xs[item.from]+5+itemTextW(item.text)+1);else if(item.kind==="note"){let g=noteGeometry(xs,item.anchor,stringWidth(item.text));canvasW=Math.max(canvasW,g.x+g.w+1)}else item.kind==="divider"&&(canvasW=Math.max(canvasW,stringWidth(item.text)+4));let rows=[],y=boxH+1;for(let item of seq.items)rows.push(y),y+=rowHeight(item);let bottomTop=y,canvasH=bottomTop+boxH;if(canvasW*canvasH>MAX_CANVAS_CELLS2)return null;let canvas=new Canvas(canvasW,canvasH);for(let i=0;i<n;i++)for(let by of[0,bottomTop])drawBox(canvas,box(sat2(xs[i],half2(boxW[i])),by,boxW[i],boxH),[labels[i]],"rect");seq.items.forEach((item,k)=>{if(item.kind!=="note")return;let g=noteGeometry(xs,item.anchor,stringWidth(item.text));drawBox(canvas,box(g.x,rows[k],g.w,3),[item.text],"rect")});for(let x of xs)canvas.junction(x,boxH-1,D),canvas.segV(x,boxH,bottomTop-1),canvas.junction(x,bottomTop,U);return seq.items.forEach((item,k)=>{let r=rows[k];item.kind==="message"?drawMessage(canvas,item,xs,r):item.kind==="divider"&&drawDivider(canvas,item.text,r,canvasW)}),canvas.finalizeMask(),canvas}function rowHeight(item){return item.kind==="note"?4:item.kind==="divider"?2:item.from===item.to?4:item.text!==null?3:2}var box=(x,y,w,h)=>({x,y,w,h,cx:x+half2(w),cy:y+1,rank:0});function drawMessage(canvas,item,xs,r){let lineCh=item.dashed?"\u254C":"\u2500";if(item.from===item.to){let x=xs[item.from];canvas.junction(x,r,R),canvas.set(x+1,r,lineCh,"edge"),canvas.set(x+2,r,lineCh,"edge"),canvas.set(x+3,r,"\u256E","edge"),canvas.set(x+3,r+1,"\u2502","edge"),canvas.set(x+1,r+2,item.head==="cross"?"\xD7":"\u25C4","edge"),canvas.set(x+2,r+2,lineCh,"edge"),canvas.set(x+3,r+2,"\u256F","edge"),item.text!==null&&drawTextOverEdges(canvas,item.text,x+5,r+1,"text");return}let x0=xs[item.from],x1=xs[item.to],rightward=x1>x0,arrowRow=item.text!==null?r+1:r,lo=Math.min(x0,x1),hi=Math.max(x0,x1);canvas.junction(x0,arrowRow,rightward?R:L);for(let x=lo+1;x<hi;x++)canvas.set(x,arrowRow,lineCh,"edge");let headCh=item.head==="cross"?"\xD7":rightward?"\u25B6":"\u25C4";if(canvas.set(rightward?x1-1:x1+1,arrowRow,headCh,"edge"),item.text!==null){let span=hi-lo-1,t=fitLabel(item.text,Math.max(1,span));drawTextOverEdges(canvas,t,lo+1+half2(sat2(span,stringWidth(t))),r,"text")}}function drawDivider(canvas,text2,r,canvasW){for(let x=0;x<canvasW;x++)canvas.set(x,r,"\u2500","edge");drawTextOverEdges(canvas,` ${fitLabel(text2,sat2(canvasW,4))} `,2,r,"edgeLabel")}function flushStatement(cur,out){let trimmed=cur.trim();return trimmed!==""&&out.push(trimmed),""}function splitStatements(line,out){let chars=[...line],cur="",inQuotes=!1;for(let i=0;i<chars.length;i++){let c=chars[i];if(inQuotes)c==='"'&&(inQuotes=!1),cur+=c;else if(c==='"')inQuotes=!0,cur+=c;else{if(c==="%"&&chars[i+1]==="%")break;c===";"?cur=flushStatement(cur,out):cur+=c}}flushStatement(cur,out)}function statementsOf(src){let out=[];for(let line of srcLines(src))splitStatements(line,out);return out}var firstWord=s=>s.split(/\s+/).filter(w=>w!=="")[0]??"",words=s=>s.split(/\s+/).filter(w=>w!=="");function splitOnce(s,sep15){let i=s.indexOf(sep15);return i===-1?null:[s.slice(0,i),s.slice(i+sep15.length)]}var nonEmpty2=s=>s===""?null:s;function headerKind(statements){let header2=statements[0];if(header2===void 0)return null;let kind=firstWord(header2);return kind===""?null:asciiLower(kind)}function diagramKind(src){let kind=headerKind(statementsOf(src));return kind===null?null:kind==="graph"||kind==="flowchart"?"flowchart":kind.startsWith("statediagram")?"state":kind.startsWith("classdiagram")?"class":kind==="erdiagram"?"er":kind==="sequencediagram"?"sequence":null}function parseGraph(src){let statements=statementsOf(src),kind=headerKind(statements);if(kind!=="graph"&&kind!=="flowchart")return null;let graph=new Graph(parseDir(words(statements[0])[1]??"TB")),stack=[];for(let st of statements.slice(1)){switch(asciiLower(firstWord(st))){case"subgraph":{if(graph.groups.length>=MAX_GROUPS||stack.length>=MAX_GROUP_DEPTH)return null;let[id,label2]=parseSubgraphDecl(st.slice(8).trim());graph.groups.push({id,label:label2,parent:stack.at(-1)??null}),stack.push(graph.groups.length-1),graph.curGroup=stack.at(-1)??null;continue}case"end":stack.pop(),graph.curGroup=stack.at(-1)??null;continue;case"classdef":case"class":case"style":case"linkstyle":case"click":case"direction":continue;default:break}if(parseStatement(st,graph),graph.overCap)return null}return graph.nodes.length===0?null:graph}function parseSubgraphDecl(rest){if(rest.startsWith('"')){let close=rest.indexOf('"',1);if(close!==-1){let label2=rest.slice(1,close);return[label2,decodeHtmlEntities(label2)]}}let open7=rest.indexOf("[");if(open7!==-1){let id=rest.slice(0,open7).trim(),label2=cleanLabel(rest.slice(open7+1).replace(/\]+$/,"").trim());if(id!==""&&label2!=="")return[id,label2]}return[rest,rest]}function parseStatement(st,graph){let chars=[...st],i=0,head=parseNodeGroup(chars,i,graph);if(!head){graph.warnings.push(`dropped, does not start with a node: "${st}"`);return}let prev=head.group;for(i=head.next;i=skipSpaces(chars,i),!(i>=chars.length);){let link=parseLink(chars,i);if(!link){graph.warnings.push(`dropped, expected a link: "${chars.slice(i).join("")}"`);break}i=skipSpaces(chars,link.next);let target=parseNodeGroup(chars,i,graph);if(!target){graph.warnings.push(`dropped, link has no target: "${st}"`);break}i=target.next;for(let f of prev)for(let t of target.group){let reversed=link.left==="arrow"&&link.right!=="arrow";if(!graph.pushEdge({from:reversed?t:f,to:reversed?f:t,label:link.label,headTo:reversed?"arrow":link.right,headFrom:reversed?link.right:link.left,line:link.line}))return}prev=target.group}}function parseNodeGroup(chars,start,graph){let first=parseNode(chars,start,graph);if(!first)return null;let group=[first.index],i=first.next;for(;;){let j=skipSpaces(chars,i);if(chars[j]!=="&")break;let next=parseNode(chars,j+1,graph);if(!next)return null;group.push(next.index),i=next.next}return{group,next:i}}function skipSpaces(chars,i){for(;i<chars.length&&(chars[i]===" "||chars[i]===" ");)i++;return i}function parseNode(chars,start,graph){let i=skipSpaces(chars,start),idStart=i;for(;i<chars.length&&isIdChar(chars[i]);)i++;if(i===idStart)return null;let id=chars.slice(idStart,i).join(""),shaped=readShapeAt(chars,i);shaped.unclosed!==void 0&&graph.warnings.push(`node "${id}": label is missing its closing \`${shaped.unclosed}\``);let index=graph.nodeIndex(id,shaped.label,shaped.shape);if(index===null)return null;let next=shaped.after;if(chars[next]===":"&&chars[next+1]===":"&&chars[next+2]===":"){let k=next+3;for(;k<chars.length&&(isIdChar(chars[k])||chars[k]==="-");)k++;for(;k>next+3&&chars[k-1]==="-";)k--;k>next+3&&(next=k)}return{index,next}}function readShapeAt(chars,i){let c=chars[i],n=chars[i+1];return c==="["?n==="["?readShape(chars,i+2,"]]","rect"):n==="("?readShape(chars,i+2,")]","round"):readShape(chars,i+1,"]","rect"):c==="("?n==="("?readShape(chars,i+2,"))","round"):n==="["?readShape(chars,i+2,"])","round"):readShape(chars,i+1,")","round"):c==="{"?n==="{"?readShape(chars,i+2,"}}","diamond"):readShape(chars,i+1,"}","diamond"):c===">"?readShape(chars,i+1,"]","rect"):{shape:"rect",label:null,after:i}}function readShape(chars,start,closer,shape){let j=start;for(;chars[j]===" "||chars[j]===" ";)j++;let quoted2=chars[j]==='"',i=start,text2="",inQuotes=!1;for(;i<chars.length;){let c=chars[i];if(quoted2&&c==='"'){inQuotes=!inQuotes,text2+=c,i++;continue}if(!inQuotes&&chars.slice(i,i+closer.length).join("")===closer)return{shape,label:cleanLabel(text2),after:i+closer.length};text2+=c,i++}return{shape,label:cleanLabel(text2),after:chars.length,unclosed:closer}}var isLinkChar=c=>c==="-"||c==="."||c==="="||c==="<"||c===">";function parseLink(chars,start){let i=skipSpaces(chars,start),left="none";(chars[i]==="o"||chars[i]==="x")&&(chars[i+1]==="-"||chars[i+1]==="."||chars[i+1]==="=")&&(left=chars[i]==="o"?"circle":"cross",i++);let opStart=i;for(;i<chars.length&&isLinkChar(chars[i]);)i++;if(i===opStart)return null;let op1=chars.slice(opStart,i).join("");left==="none"&&op1.startsWith("<")&&(left="arrow");let line=lineKind(op1),right=op1.includes(">")?"arrow":"none";if(right==="none"){let trailing=trailingHead(chars,i);trailing&&(right=trailing.head,i=trailing.next)}if(chars[i]==="|"){i++;let lStart=i;for(;i<chars.length&&chars[i]!=="|";)i++;let label2=cleanLabel(chars.slice(lStart,i).join(""));return chars[i]==="|"&&i++,{left,right,line,label:nonEmpty2(label2),next:i}}if(right==="none"){let textStart=skipSpaces(chars,i),j=textStart;for(;j<chars.length&&!isLinkChar(chars[j]);)j++;if(j<chars.length&&j>textStart&&chars[j]!=="<"){let text2=chars.slice(textStart,j).join(""),op2Start=j;for(;j<chars.length&&isLinkChar(chars[j]);)j++;let op2=chars.slice(op2Start,j).join("");if(op2.includes(">"))right="arrow";else{let trailing=trailingHead(chars,j);trailing&&(right=trailing.head,j=trailing.next)}return line==="solid"&&(line=lineKind(op2)),{left,right,line,label:nonEmpty2(cleanLabel(text2)),next:j}}}return{left,right,line,label:null,next:i}}function lineKind(op){return op.includes("=")?"thick":op.includes(".")?"dotted":"solid"}function trailingHead(chars,i){let head=chars[i]==="o"?"circle":chars[i]==="x"?"cross":null;if(head===null)return null;let after=chars[i+1];return after===void 0||after===" "||after===" "||after==="|"||after==="&"||after===";"?{head,next:i+1}:null}function parseState(src){let statements=statementsOf(src),kind=headerKind(statements);if(kind===null||!kind.startsWith("statediagram"))return null;let graph=new Graph,inNote=!1;for(let st of statements.slice(1)){if(inNote){asciiLower(st)==="end note"&&(inNote=!1);continue}st=dropStyleTags(st);let first=asciiLower(firstWord(st));if(first==="direction")graph.dir=parseDir(words(st)[1]??"");else if(first==="note")st.includes(":")||(inNote=!0);else if(first==="state"){if(parseStateDecl(st,graph)===null)return null}else if(!["classdef","class","hide","scale","}","--"].includes(first)){if(st.includes("-->")){if(parseTransition(st,graph)===null)return null}else if(parseStateDesc(st,graph)===null)return null}if(graph.overCap)return null}return graph.nodes.length===0?null:graph}function parseStateDecl(st,graph){let rest=st.slice(5).trim().replace(/\{$/,"").trim();if(rest==="")return!0;if(rest.startsWith('"')){let close=rest.indexOf('"',1);if(close===-1)return null;let label2=rest.slice(1,close),after=rest.slice(close+1).trim(),id2=after.startsWith("as")?after.slice(2).trim():label2;return graph.nodeLabel(id2,decodeHtmlEntities(label2))===null?null:!0}let shape="round",id=rest,stereotyped=!1,pos=rest.indexOf("<<");return pos!==-1&&(rest.slice(pos+2).replace(/>>$/,"").trim()==="choice"&&(shape="diamond"),id=rest.slice(0,pos).trim(),stereotyped=!0),id===""||/\s/.test(id)||graph.nodeIndex(id,stereotyped?id:null,shape)===null?null:!0}function parseTransition(st,graph){let rest=st,prev=null;for(;;){let split=splitOnce(rest,"-->");if(!split)break;let[lhs,rhs]=split,fromId=lhs.trimEnd().replace(/-+$/,"").trim(),from;if(prev!==null){if(fromId!=="")return null;from=prev}else{if(fromId==="")return null;let f=stateEndpoint(graph,fromId,!0);if(f===null)return null;from=f}let nextArrow=rhs.indexOf("-->"),toPartRaw=nextArrow===-1?rhs:rhs.slice(0,nextArrow),tail=nextArrow===-1?"":rhs.slice(nextArrow),colon=splitOnce(toPartRaw,":"),toPart=colon?colon[0]:toPartRaw,label2=colon?nonEmpty2(decodeHtmlEntities(colon[1].trim())):null,toId=toPart.trimStart().replace(/^>+/,"").trimEnd().replace(/-+$/,"").trim();if(toId==="")return null;let to=stateEndpoint(graph,toId,!1);if(to===null)return null;if(!graph.pushEdge({from,to,label:label2,headTo:"arrow",headFrom:"none",line:"solid"}))return!0;prev=to,rest=tail}return!0}function dropStyleTags(st){let chars=[...st],out=[];for(let i=0;i<chars.length;){if(chars[i]===":"&&chars[i+1]===":"&&chars[i+2]===":"){let k=i+3;for(;k<chars.length&&(isIdChar(chars[k])||chars[k]==="-");)k++;for(;k>i+3&&chars[k-1]==="-";)k--;if(k>i+3){i=k;continue}}out.push(chars[i]),i++}return out.join("")}function stateEndpoint(graph,id,isSource){return id==="[*]"?graph.nodeIndex(isSource?"[*]start":"[*]end","\u25CF","round"):graph.nodeIndex(id,null,"round")}function parseStateDesc(st,graph){let split=splitOnce(st,":");if(split){let id=split[0].trim(),desc=split[1].trim();return id===""||/\s/.test(id)||desc===""||graph.nodeLabel(id,decodeHtmlEntities(desc))===null?null:!0}return/\s/.test(st)||graph.nodeIndex(st,null,"round")===null?null:!0}var CLASS_OPS=[["<|--","triangle","none","solid"],["--|>","none","triangle","solid"],["<|..","triangle","none","dotted"],["..|>","none","triangle","dotted"],["*--","diamondFill","none","solid"],["--*","none","diamondFill","solid"],["o--","diamondOpen","none","solid"],["--o","none","diamondOpen","solid"],["<--","arrow","none","solid"],["-->","none","arrow","solid"],["<..","arrow","none","dotted"],["..>","none","arrow","dotted"],["--","none","none","solid"],["..","none","none","dotted"]],MAX_CLASS_OP=4;function parseClass(src){let statements=statementsOf(src),kind=headerKind(statements);if(kind===null||!kind.startsWith("classdiagram"))return null;let graph=new Graph,infos=[],sync=()=>{for(;infos.length<graph.nodes.length;)infos.push(emptyClassInfo())},declare=name=>{let idx=graph.nodeIndex(name,null,"rect");return sync(),idx},curClass=null;for(let st of statements.slice(1)){if(curClass!==null){st==="}"?curClass=null:pushMember(infos[curClass],st);continue}st=dropStyleTags(st);let first=asciiLower(firstWord(st));if(first==="direction"){graph.dir=parseDir(words(st)[1]??"");continue}if(["note","callback","click","link","style","cssclass","classdef","namespace","}"].includes(first))continue;if(first==="class"){let rest=st.slice(5).trim(),open7=rest.endsWith("{"),name=open7?rest.slice(0,-1).trim():rest;if(name===""||/\s/.test(name))return null;let idx=declare(name);if(idx===null)return null;open7&&(curClass=idx);continue}if(st.startsWith("<<")){let split=splitOnce(st.slice(2),">>");if(!split)return null;let name=split[1].trim();if(name===""||/\s/.test(name))return null;let idx=declare(name);if(idx===null)return null;infos[idx].annotation=split[0].trim();continue}let rel=parseClassRelation(st);if(rel){let f=declare(rel.from);if(f===null)return null;let t=declare(rel.to);if(t===null||graph.edges.length>=MAX_EDGES)return null;graph.edges.push({from:f,to:t,label:rel.label,headTo:rel.headTo,headFrom:rel.headFrom,line:rel.line});continue}let member=splitOnce(st,":");if(member){let id=member[0].trim(),text2=member[1].trim();if(id===""||/\s/.test(id)||text2==="")return null;let idx=declare(id);if(idx===null)return null;pushMember(infos[idx],text2);continue}return null}return graph.nodes.length===0?null:(sync(),{graph,infos})}function pushMember(info,raw){if(raw.startsWith("<<")){let split=splitOnce(raw.slice(2),">>");split&&(info.annotation=split[0].trim());return}let member=decodeHtmlEntities(displayGenerics2(raw.trim())),list3=member.includes("(")?info.methods:info.attrs;list3.length<MAX_MEMBERS?list3.push(member):list3.length===MAX_MEMBERS&&list3.push("\u2026")}function parseClassRelation(st){let chars=[...st],found=null;outer:for(let pos=0;pos<chars.length;pos++){let tail=chars.slice(pos,pos+MAX_CLASS_OP).join("");for(let[op,headFrom,headTo,line]of CLASS_OPS){if(!tail.startsWith(op)||op.startsWith("o")&&pos>0&&isIdChar(chars[pos-1]))continue;let after=chars[pos+[...op].length];if(!(op.endsWith("o")&&after!==void 0&&isIdChar(after))){found={pos,op,headFrom,headTo,line};break outer}}}if(!found)return null;let lhsRaw=chars.slice(0,found.pos).join("").trim(),rhsRaw=chars.slice(found.pos+[...found.op].length).join("").trim(),[lhs,cardFrom]=stripCardinalitySuffix(lhsRaw),[rhs,cardTo]=stripCardinalityPrefix(rhsRaw),split=splitOnce(rhs,":"),toId=(split?split[0]:rhs).trim(),relLabel=split?nonEmpty2(decodeHtmlEntities(split[1].trim())):null;if(lhs===""||toId===""||/\s/.test(lhs)||/\s/.test(toId))return null;let label2=nonEmpty2([cardFrom,relLabel??"",cardTo].filter(s=>s!=="").join(" "));return{from:lhs,to:toId,headFrom:found.headFrom,headTo:found.headTo,line:found.line,label:label2}}function stripCardinalitySuffix(s){let t=s.trimEnd();if(t.endsWith('"')){let rest=t.slice(0,-1),q=rest.lastIndexOf('"');if(q!==-1)return[rest.slice(0,q).trimEnd(),rest.slice(q+1)]}return[t,""]}function stripCardinalityPrefix(s){let t=s.trimStart();if(t.startsWith('"')){let rest=t.slice(1),q=rest.indexOf('"');if(q!==-1)return[rest.slice(q+1).trimStart(),rest.slice(0,q)]}return[t,""]}function displayGenerics2(s){let out="",open7=!1;for(let c of s)c==="~"?(out+=open7?">":"<",open7=!open7):out+=c;return out}function parseEr(src){let statements=statementsOf(src);if(headerKind(statements)!=="erdiagram")return null;let graph=new Graph,infos=[],curEntity=null;for(let st of statements.slice(1)){if(curEntity!==null){st==="}"?curEntity=null:pushErAttribute(infos[curEntity],st);continue}let rel=splitErRelationship(st);if(rel){let tokens=words(rel.rel);if(tokens.length!==3)return null;let op=parseErOp(tokens[1]);if(!op)return null;let f=erEntity(graph,infos,tokens[0]);if(f===null)return null;let t=erEntity(graph,infos,tokens[2]);if(t===null||graph.edges.length>=MAX_EDGES)return null;let relLabel=rel.label===null?"":cleanLabel(rel.label);graph.edges.push({from:f,to:t,label:nonEmpty2([op.cardL,relLabel,op.cardR].filter(s=>s!=="").join(" ")),headTo:"none",headFrom:"none",line:op.line});continue}let open7=st.endsWith("{"),decl=open7?st.slice(0,-1).trim():st;if(decl===""||words(decl).length!==1)return null;let idx=erEntity(graph,infos,decl);if(idx===null)return null;open7&&(curEntity=idx)}if(graph.nodes.length===0)return null;for(;infos.length<graph.nodes.length;)infos.push(emptyClassInfo());return{graph,infos}}function erEntity(graph,infos,token){let open7=token.indexOf("["),idx;if(open7!==-1){let id=token.slice(0,open7),label2=cleanLabel(token.slice(open7+1).replace(/\]+$/,""));if(id===""||label2==="")return null;idx=graph.nodeLabel(id,label2)}else idx=graph.nodeIndex(token,null,"rect");if(idx===null)return null;for(;infos.length<graph.nodes.length;)infos.push(emptyClassInfo());return idx}function splitErRelationship(st){let split=splitOnce(st,":"),rel=split?split[0]:st,label2=split?split[1].trim():null;return words(rel).some(t=>parseErOp(t)!==null)?{rel,label:label2}:null}var isAscii=s=>{for(let i=0;i<s.length;i++)if(s.charCodeAt(i)>127)return!1;return!0};function parseErOp(tok){if(tok.length!==6||!isAscii(tok))return null;let mid=tok.slice(2,4),line=mid==="--"?"solid":mid===".."?"dotted":null;if(line===null)return null;let cardL=erCard(tok.slice(0,2)),cardR=erCard(tok.slice(4,6));return cardL===null||cardR===null?null:{cardL,cardR,line}}function erCard(tok){switch(tok){case"|o":case"o|":return"0..1";case"||":return"1";case"}o":case"o{":return"0..*";case"}|":case"|{":return"1..*";default:return null}}function pushErAttribute(info,raw){let parts=[];for(let tok of words(raw)){if(tok.startsWith('"'))break;parts.push(tok)}if(parts.length===0)return;let line=decodeHtmlEntities(parts.join(" "));info.attrs.length<MAX_MEMBERS?info.attrs.push(line):info.attrs.length===MAX_MEMBERS&&info.attrs.push("\u2026")}var SEQ_OPS=[["-->>",!0,"arrow"],["->>",!1,"arrow"],["--x",!0,"cross"],["-x",!1,"cross"],["--)",!0,"arrow"],["-)",!1,"arrow"],["-->",!0,"arrow"],["->",!1,"arrow"]],MAX_SEQ_OP=4,Sequence=class{labels=[];index=new Map;items=[];participant(id,label2){let existing=this.index.get(id);return existing!==void 0?(label2!==null&&(this.labels[existing]=label2),existing):this.labels.length>=MAX_NODES?null:(this.index.set(id,this.labels.length),this.labels.push(label2??id),this.labels.length-1)}};function parseSequence(src){let statements=statementsOf(src);if(headerKind(statements)!=="sequencediagram")return null;let seq=new Sequence,autonumber=!1,msgCount=0,blocks=[];for(let st of statements.slice(1)){let first=firstWord(st),lower=asciiLower(first);if(lower==="participant"||lower==="actor"){let rest=st.slice(first.length).trim();if(rest==="")return null;let as=splitOnce(rest," as ");if(seq.participant(as?as[0].trim():rest,as?cleanLabel(as[1]):null)===null)return null;continue}if(lower==="autonumber"){autonumber=!0;continue}if(["activate","deactivate","create","destroy","title","acctitle","accdescr","links","link","properties"].includes(lower))continue;if(lower==="note"){let note=parseNoteAnchor(st.slice(first.length).trim(),seq);if(!note||seq.items.length>=MAX_EDGES)return null;seq.items.push({kind:"note",anchor:note.anchor,text:note.text});continue}if(["loop","alt","opt","par","critical","break","else","and","option"].includes(lower)){if(["else","and","option"].includes(lower)){if(blocks.at(-1)!==!0)continue}else blocks.push(!0);if(seq.items.length>=MAX_EDGES)return null;seq.items.push({kind:"divider",text:decodeHtmlEntities(st)});continue}if(lower==="rect"||lower==="box"){blocks.push(!1);continue}if(lower==="end"){if(blocks.pop()===!0){if(seq.items.length>=MAX_EDGES)return null;seq.items.push({kind:"divider",text:"end"})}continue}let msg=parseSeqMessage(st,seq);if(!msg)return null;let text2=msg.text;if(autonumber&&(msgCount++,text2=text2===null?`${msgCount}.`:`${msgCount}. ${text2}`),seq.items.length>=MAX_EDGES)return null;seq.items.push({kind:"message",from:msg.from,to:msg.to,text:text2,dashed:msg.dashed,head:msg.head})}return seq.labels.length===0?null:seq}function parseNoteAnchor(rest,seq){let lower=asciiLower(rest),kind,idsAndText;if(lower.startsWith("over "))kind="over",idsAndText=rest.slice(5);else if(lower.startsWith("left of "))kind="left",idsAndText=rest.slice(8);else if(lower.startsWith("right of "))kind="right",idsAndText=rest.slice(9);else return null;let split=splitOnce(idsAndText,":");if(!split)return null;let text2=decodeHtmlEntities(split[1].trim()),parts=split[0].split(",").map(s=>s.trim()).filter(s=>s!=="");if(parts.length===0)return null;let a=seq.participant(parts[0],null);if(a===null)return null;if(kind!=="over")return{text:text2,anchor:{kind,at:a}};let b=a;if(parts[1]!==void 0){let second=seq.participant(parts[1],null);if(second===null)return null;b=second}return{text:text2,anchor:{kind:"over",from:Math.min(a,b),to:Math.max(a,b)}}}function parseSeqMessage(st,seq){let chars=[...st],found=null;outer:for(let pos=0;pos<chars.length;pos++){let tail=chars.slice(pos,pos+MAX_SEQ_OP).join("");for(let[op,dashed,head]of SEQ_OPS)if(tail.startsWith(op)){found={pos,op,dashed,head};break outer}}if(!found)return null;let fromId=chars.slice(0,found.pos).join("").trim();if(fromId==="")return null;let rest=chars.slice(found.pos+[...found.op].length).join("").trimStart().replace(/^[+-]+/,""),split=splitOnce(rest,":"),toId=(split?split[0]:rest).trim(),text2=split?nonEmpty2(decodeHtmlEntities(split[1].trim())):null;if(toId==="")return null;let from=seq.participant(fromId,null);if(from===null)return null;let to=seq.participant(toId,null);return to===null?null:{from,to,text:text2,dashed:found.dashed,head:found.head}}function render(src){if(src=stripControls(src),src.trim()==="")return null;let drawn=attempt(src);return drawn===null?null:{...drawn.canvas.toLines(),warnings:drawn.warnings}}function attempt(src){let drawn=draw(src);if(drawn!==null)return drawn;let body=src.replace(/\s+$/,""),cut=body.lastIndexOf(`
2467
2453
  `);if(cut===-1)return null;let salvaged=draw(body.slice(0,cut));if(salvaged===null)return null;let dropped=body.slice(cut+1).trim();return{canvas:salvaged.canvas,warnings:[...salvaged.warnings,`dropped, unreadable final line: "${dropped}"`]}}function draw(src){let plain=canvas=>canvas===null?null:{canvas,warnings:[]};switch(diagramKind(src)){case"flowchart":{let graph=parseGraph(src);if(graph===null)return null;let canvas=graph.groups.length===0?layoutFlowchart(graph):layoutGrouped(graph);return canvas===null?null:{canvas,warnings:graph.warnings}}case"state":{let state=parseState(src);return state===null?null:plain(layoutFlowchart(state))}case"class":{let cls=parseClass(src);return cls===null?null:plain(layoutClass(cls.graph,cls.infos))}case"er":{let er=parseEr(src);return er===null?null:plain(layoutClass(er.graph,er.infos))}case"sequence":{let seq=parseSequence(src);return seq===null?null:plain(layoutSequence(seq))}default:return null}}var markdownParser=new Q;function isMermaid(token){return token.type==="code"&&token.lang?.trim().split(/\s+/,1)[0]?.toLowerCase()==="mermaid"}function codeSpan(line){let content=line||"\xA0",longestBacktickRun=Math.max(0,...Array.from(content.matchAll(/`+/g),match=>match[0].length)),fence="`".repeat(longestBacktickRun+1),padding=content.startsWith("`")||content.endsWith("`")?" ":"";return`${fence}${padding}${content}${padding}${fence}`}function styleSpan(span,theme2){switch(span.cls){case"border":return theme2.fg("borderMuted",span.text);case"text":return theme2.fg("text",span.text);case"edge":return theme2.fg("accent",span.text);case"edgeLabel":return theme2.fg("muted",span.text);case"title":return theme2.fg("accent",theme2.bold(span.text));case"none":return span.text}}function themedLines(art,theme2){return art.styled.map(row=>row.map(span=>styleSpan(span,theme2)).join(""))}function createMermaidMarkdownTransformer(options){return(markdown,context)=>{let mode=options.getMode();return mode==="off"||context.messageType==="assistant-thinking"||context.isStreaming&&mode!=="streaming"?markdown:markdownParser.lexer(markdown).map(token=>{if(!isMermaid(token))return token.raw;let art=render(token.text);if(!art||art.width>context.availableWidth)return token.raw;if(!context.isStreaming&&art.warnings.length>0){let suffix=art.warnings.length>1?` (+${art.warnings.length-1} more)`:"",warning=`Mermaid diagram not rendered: ${art.warnings[0]}${suffix}`,styledWarning=options.theme?options.theme.fg("warning",warning):warning;return`${token.raw}
2468
2454
  ${codeSpan(styledWarning)}
@@ -2499,7 +2485,7 @@ ${expandedBody}`,this.getStartupExpansionState());this.loadedResourcesContainer.
2499
2485
  `),contextCompactList=formatCompactList(contextFiles.map(contextFile=>this.formatContextPath(contextFile.path)),{sort:!1});addLoadedSection("Context",contextCompactList,contextList)}let skills=skillsResult.skills;if(skills.length>0){let groups=this.buildScopeGroups(skills.map(skill=>({path:skill.filePath,sourceInfo:skill.sourceInfo}))),skillList=this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}),skillCompactList=formatCompactList(skills.filter(skill=>!isSystemResource(skill.sourceInfo)).map(skill=>skill.name));addLoadedSection("Skills",skillCompactList,skillList)}let templates=this.session.promptTemplates;if(templates.length>0){let groups=this.buildScopeGroups(templates.map(template=>({path:template.filePath,sourceInfo:template.sourceInfo}))),templateByPath=new Map(templates.map(t=>[t.filePath,t])),templateList=this.formatScopeGroups(groups,{formatPath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)},formatPackagePath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)}}),promptCompactList=formatCompactList(templates.filter(template=>!isSystemResource(template.sourceInfo)).map(template=>`/${template.name}`));addLoadedSection("Prompts",promptCompactList,templateList)}if(extensions.length>0){let groups=this.buildScopeGroups(extensions),extList=this.formatScopeGroups(groups,{formatPath:item=>this.formatExtensionDisplayPath(item.path),formatPackagePath:item=>this.formatExtensionDisplayPath(this.getShortPath(item.path,item.sourceInfo))}),extensionCompactList=formatCompactList(this.getCompactExtensionLabels(extensions.filter(extension=>!isSystemResource(extension.sourceInfo))));addLoadedSection("Extensions",extensionCompactList,extList,"mdHeading")}let customThemes=themesResult.themes.filter(t=>t.sourcePath);if(customThemes.length>0){let groups=this.buildScopeGroups(customThemes.map(loadedTheme=>({path:loadedTheme.sourcePath,sourceInfo:loadedTheme.sourceInfo}))),themeList=this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}),themeCompactList=formatCompactList(customThemes.filter(loadedTheme=>!isSystemResource(loadedTheme.sourceInfo)).map(loadedTheme=>loadedTheme.name??this.getCompactPathLabel(loadedTheme.sourcePath,loadedTheme.sourceInfo)));addLoadedSection("Themes",themeCompactList,themeList)}}if(showDiagnostics){let addDiagnosticNotice=(title,diagnostics)=>{this.loadedResourcesContainer.addChild(buildNoticeBox({title,tone:"warning",why:"Conflicting or invalid loaded resources were found.",extra:this.formatDiagnostics(diagnostics,sourceInfos)},{expanded:this.toolOutputExpanded},theme)),this.loadedResourcesContainer.addChild(new Spacer(1))},skillDiagnostics=skillsResult.diagnostics;skillDiagnostics.length>0&&addDiagnosticNotice("Skill conflicts",skillDiagnostics);let promptDiagnostics=promptsResult.diagnostics;promptDiagnostics.length>0&&addDiagnosticNotice("Prompt conflicts",promptDiagnostics);let extensionDiagnostics=[],extensionErrors=this.session.resourceLoader.getExtensions().errors;if(extensionErrors.length>0)for(let error2 of extensionErrors)extensionDiagnostics.push({type:"error",message:error2.error,path:error2.path});let commandDiagnostics=this.session.extensionRunner.getCommandDiagnostics();extensionDiagnostics.push(...commandDiagnostics),extensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));let shortcutDiagnostics=this.session.extensionRunner.getShortcutDiagnostics();extensionDiagnostics.push(...shortcutDiagnostics),extensionDiagnostics.length>0&&addDiagnosticNotice("Extension issues",extensionDiagnostics);let themeDiagnostics=themesResult.diagnostics;themeDiagnostics.length>0&&addDiagnosticNotice("Theme conflicts",themeDiagnostics)}}async bindCurrentSessionExtensions(){let uiContext=this.createExtensionUIContext();await this.session.bindExtensions({uiContext,mode:"tui",abortHandler:()=>{this.restoreQueuedMessagesToEditor({abort:!0})},commandContextActions:{waitForIdle:()=>this.session.waitForIdle(),newSession:async options=>{this.clearStatusIndicator();try{return await this.runtimeHost.newSession(options)}catch(error2){return this.handleFatalRuntimeError("Failed to create session",error2)}},fork:async(entryId,options)=>{try{let result3=await this.runtimeHost.fork(entryId,options);return result3.cancelled||(this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")),{cancelled:result3.cancelled}}catch(error2){return this.handleFatalRuntimeError("Failed to fork session",error2)}},navigateTree:async(targetId,options)=>{let result3=await this.session.navigateTree(targetId,{summarize:options?.summarize,customInstructions:options?.customInstructions,replaceInstructions:options?.replaceInstructions,label:options?.label,expectedLeafId:options?.expectedLeafId});return result3.cancelled?{cancelled:!0}:(this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus("Navigated to selected point"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1})},editAssistantMessage:async(entryId,text2,options)=>{let result3=await this.session.editAssistantMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced assistant response"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},editUserMessage:async(entryId,text2,options)=>{let result3=await this.session.editUserMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced user prompt"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},switchSession:async(sessionPath,options)=>this.handleResumeSession(sessionPath,options),reload:async()=>{await this.handleReloadCommand()}},shutdownHandler:()=>{this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()},onError:error2=>{this.showExtensionError(error2)}}),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.setupAutocompleteProvider();let extensionRunner=this.session.extensionRunner;this.setupExtensionShortcuts(extensionRunner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0}),this.showStartupNoticesIfNeeded()}applyFullscreenScrollbarSetting(){this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar())}applyRuntimeSettings(){setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides()),configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs()),this.applyFullscreenScrollbarSetting(),this.renderer instanceof TuiAltScreen&&this.renderer.setCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect?.()??!0),this.footer.setSession(this.session),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerDataProvider.setCwd(this.sessionManager.getCwd()),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.applySmoothStreamingRenderFps(),this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());let clearOnShrink=this.settingsManager.getClearOnShrink();this.ui.setClearOnShrink(clearOnShrink),!clearOnShrink&&!this.activeStatusIndicator&&this.statusContainer.clear();let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.defaultEditor.setPaddingX(editorPaddingX),this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible),this.editor!==this.defaultEditor&&(this.editor.setPaddingX?.(editorPaddingX),this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible))}async rebindCurrentSession(options={}){_InteractiveMode.restoreCompactionEscapeOverride(this),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let session=this.session;this.unsubscribe?.(),this.unsubscribe=void 0,this.applyRuntimeSettings(),options.renderBeforeBind&&(this.renderCurrentSessionState(),this.subscribeToAgent()),await this.bindCurrentSessionExtensions(),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err2=>{this.showError(`Shortcut handler error: ${err2 instanceof Error?err2.message:String(err2)}`)}),!0;return!1}}async withBlockedHostDialog(id,label2,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label2,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}async handleHostUiRequest(request2){switch(request2.method){case"select":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionSelector(request2.title??"",request2.options??[]));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"confirm":return{type:"extension_ui_response",id:request2.id,confirmed:await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionConfirm(request2.title??"",request2.message??""))};case"input":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionInput(request2.title??"",request2.placeholder));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"editor":{let value2=await this.withBlockedHostDialog(request2.id,request2.title??"",()=>this.showExtensionEditor(request2.title??"",request2.prefill));return value2===void 0?{type:"extension_ui_response",id:request2.id,cancelled:!0}:{type:"extension_ui_response",id:request2.id,value:value2}}case"question":{let questions=request2.questions??[];if(questions.length===0)return{type:"extension_ui_response",id:request2.id,cancelled:!0};let remainingMs2=request2.remainingMs!==void 0&&request2.remainingMs>0?request2.remainingMs:request2.timeout,hostRuntime=this.runtimeHost,progressTimer,lastDraft,waitForAnswer=request2.waitForAnswer??!0,response=await(waitForAnswer?this.showQuestionOverlay:this.showAsyncQuestion).call(this,{requestId:request2.requestId??"",questions,waitForAnswer,timeoutMs:request2.timeout??0},{timeout:remainingMs2,notifyArrival:request2.askedAtMs===void 0||request2.askedAtMs>=this.questionArrivalEpochMs,onProgress:draft=>{lastDraft=draft,progressTimer===void 0&&(progressTimer=setTimeout(()=>{progressTimer=void 0,hostRuntime.sendHostUiProgress?.({type:"extension_ui_progress",id:request2.id,...lastDraft?.answers!==void 0?{answers:lastDraft.answers}:{},...lastDraft?.comment!==void 0?{comment:lastDraft.comment}:{}})},1e3))}});return progressTimer!==void 0&&clearTimeout(progressTimer),response.status==="cancelled"?{type:"extension_ui_response",id:request2.id,cancelled:!0}:response.status==="timed_out"?void 0:{type:"extension_ui_response",id:request2.id,answers:response.answers,...response.comment!==void 0?{comment:response.comment}:{}}}case"notify":this.showExtensionNotify(request2.message??"");return;case"setStatus":this.setExtensionStatus(request2.statusKey??"",request2.statusText);return;case"setTitle":this.extensionTerminalTitle=request2.title??"",this.applyTerminalTitle();return;case"set_editor_text":this.editor.setText(request2.text??"");return;case"setWidget":this.setExtensionWidget(request2.widgetKey??"",request2.widgetLines,{placement:request2.widgetPlacement});return;case"setHeader":this.setExtensionHeader(linesFactory(request2.widgetLines));return;case"setFooter":this.setExtensionFooter(linesFactory(request2.widgetLines));return;case"custom_unsupported":this.showExtensionNotify(`${request2.extensionName??"This extension"} requires the classic TUI; its component widget cannot be rendered in the shared host.`,"warning");return;default:return}}setExtensionStatus(key,text2){this.footerDataProvider.setExtensionStatus(key,text2),this.ui.requestRender()}startToolHookStatusTimer(){if(this.hookStatusIntervalId)return;let intervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS);this.hookStatusIntervalId=setInterval(()=>{this.refreshToolHookStatuses()},intervalMs),this.hookStatusIntervalId.unref()}stopToolHookStatusTimer(){this.hookStatusIntervalId&&(clearInterval(this.hookStatusIntervalId),this.hookStatusIntervalId=void 0)}refreshToolHookStatuses(){if(this.hookStatusContainer.clear(),this.activeToolHooks.size===0){this.stopToolHookStatusTimer(),this.ui.requestRender();return}let now2=Date.now();for(let hook of this.activeToolHooks.values()){let elapsedMs=Math.max(0,now2-hook.startedAt),elapsedSeconds=Math.floor(elapsedMs/1e3);this.hookStatusContainer.addChild(new Text(formatToolHookStatusMessageFrame(hook.hookName,hook.statusMessage,elapsedSeconds,elapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),1,0))}this.ui.requestRender()}handleToolHookStatusEvent(event){if(event.phase==="start"){this.activeToolHooks.set(event.hookRunId,event),this.activeToolTerminalTitle=formatToolHookTerminalTitle(event),this.ui.terminal&&this.applyTerminalTitle(),this.startToolHookStatusTimer(),this.refreshToolHookStatuses();return}if(event.phase==="update"){let existing=this.activeToolHooks.get(event.hookRunId);if(!existing)return;let updated={...existing,statusMessage:event.statusMessage};this.activeToolHooks.set(event.hookRunId,updated),this.activeToolTerminalTitle=formatToolHookTerminalTitle(updated),this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses();return}this.activeToolHooks.delete(event.hookRunId);let nextHook=this.activeToolHooks.values().next().value;this.activeToolTerminalTitle=nextHook?formatToolHookTerminalTitle(nextHook):void 0,this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses()}handleToolExecutionStart(event){let label2=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame2,elapsedMs)=>formatWorkingStatusShimmerText(frame2,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text2=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text2):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label2){this.hiddenThinkingLabel=label2??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing2=map.get(key);existing2?.dispose&&existing2.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container;for(let line of content.slice(0,_InteractiveMode.MAX_WIDGET_LINES))container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new Text(theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing=targetMap.get(key);existing?.dispose&&existing.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state of this.pendingQuestions.values())state.finish({status:"cancelled",answers:{},unanswered:state.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text2)=>this.setExtensionStatus(key,text2),setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label2=>this.setHiddenThinkingLabel(label2),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text2=>this.editor.handleInput(`\x1B[200~${text2}\x1B[201~`),setEditorText:text2=>this.editor.setText(text2),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(resolve42=>{if(opts?.signal?.aborted){resolve42(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve42(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve42(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve42(void 0)},{tui:this.ui,timeout:opts?.timeout,onToggleToolsExpanded:()=>this.toggleToolOutputExpansion()}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionSelector),this.ui.setFocus(this.extensionSelector),this.ui.requestRender()})}hideExtensionSelector(){this.extensionSelector?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionSelector=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}async showExtensionConfirm(title,message,opts){return await this.showExtensionSelector(`${title}
2500
2486
  ${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){return await this.showExtensionConfirm("Session cwd not found",formatMissingSessionCwdPrompt(error2.issue))?error2.issue.fallbackCwd:void 0}showExtensionInput(title,placeholder,opts){return new Promise(resolve42=>{if(opts?.signal?.aborted){resolve42(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve42(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve42(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve42(void 0)},{tui:this.ui,timeout:opts?.timeout}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()})}hideExtensionInput(){this.extensionInput?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionInput=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showExtensionEditor(title,prefill){return new Promise(resolve42=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve42(value2)},()=>{this.hideExtensionEditor(),resolve42(void 0)},void 0,this.settingsManager.getExternalEditorCommand()),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionEditor),this.ui.setFocus(this.extensionEditor),this.ui.requestRender()})}hideExtensionEditor(){this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionEditor=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showQuestionOverlay(request2,opts){return new Promise(resolve42=>{let settled=!1,previousWorkingMessage=this.workingMessage,finish=response=>{settled||(settled=!0,opts?.signal?.removeEventListener("abort",onAbort),this.workingMessage=previousWorkingMessage,this.updateWorkingIndicatorMessage(),this.blockingQuestionHeader=void 0,this.applyTerminalTitle(),this.hideQuestionOverlay(),resolve42(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve42({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),opts?.notifyArrival!==!1&&this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled()),state={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,opts?.notifyArrival!==!1&&this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}refreshAsyncWidget(){this.syncQuestionMouseCapture(),this.applyTerminalTitle();let state=this.shownQuestion;if(!state||this.questionSurface==="expanded"){this.setExtensionWidget(ASK_USER_WIDGET_KEY,void 0);return}this.setExtensionWidget(ASK_USER_WIDGET_KEY,tui=>new AskUserAsyncWidget({request:state.request,draft:state.draft,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,pendingCount:this.pendingOrder.length,tui,mouseCaptureActive:this.terminalMouseMode!=="off",onExpandClick:()=>this.expandPendingQuestion(state.request.requestId),onNextQuestion:()=>this.cyclePendingQuestion(),onOptionClick:index=>this.clickPendingQuestion(state,index),onOwnAnswerClick:()=>this.clickPendingQuestion(state,"own-answer"),onExpire:()=>state.finish(buildTimedOutResponse(state.request,state.draft,Date.now()-state.askedAtMs))}))}cyclePendingQuestion(){if(this.pendingOrder.length<2)return;let index=this.pendingOrder.indexOf(this.shownQuestionId);this.shownQuestionId=this.pendingOrder[(index+1)%this.pendingOrder.length],this.refreshAsyncWidget()}clickPendingQuestion(state,option){let unanswered=unansweredIds2(state.request,state.draft),index=state.request.questions.findIndex(question=>question.id===unanswered[0]);this.expandPendingQuestion(state.request.requestId,index)&&(option==="own-answer"?this.askUserQuestion.openOwnAnswer():this.askUserQuestion.clickOption(option,!0))}handleAskUserShortcut(data){let state=this.shownQuestion;if(!state||this.askUserQuestion||this.ui.hasOverlay()||this.extensionSelector||this.extensionInput||this.extensionEditor)return!1;if(matchesAskUserAnswerKey(data))return this.expandPendingQuestion();if(this.editor.getText()!==""||this.ui.getFocusedComponent()!==this.editor||this.defaultEditor.isShowingAutocomplete())return!1;if(this.keybindings.matches(data,"app.question.next"))return this.pendingOrder.length<2?!1:(this.cyclePendingQuestion(),!0);let unanswered=unansweredIds2(state.request,state.draft),questionIndex=state.request.questions.findIndex(question2=>question2.id===unanswered[0]),question=state.request.questions[questionIndex];if(/^[1-9]$/.test(data)&&question?.options[Number(data)-1])return this.expandPendingQuestion(state.request.requestId,questionIndex,data),!0;let printable=decodeKittyPrintable(data)??data;return(data.startsWith("\x1B[200~")||printable!==""&&!/[\x00-\x1f\x7f]/.test(printable)&&!/^[/!]/.test(printable))&&this.setComposerReply(state.request.requestId),!1}setComposerReply(requestId){this.composerDestination=requestId===void 0?{kind:"chat"}:{kind:"answer",requestId};let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);this.defaultEditor.setReplyLabel(state?theme.fg("muted",`\u21B3 reply to ${state.request.questions[0].header} \xB7 ${keyText("app.message.followUp")} sends as message`):void 0),this.ui.requestRender()}async handleAnswerCommand(argument){let state=this.shownQuestion;if(!state){this.showStatus("No question is pending.");return}if(argument==="skip"){let response={status:"cancelled",answers:state.draft.answers??{},unanswered:unansweredIds2(state.request,state.draft)};state.finish(response),await state.completion,this.showStatus("The user dismissed the question."),await this.session.sendUserMessage(formatUserMessage(response,state.request.requestId,state.request.questions),{deliverAs:this.session.isStreaming?"steer":"followUp"});return}if(argument!==""){let id=/^[1-9]\d*$/.test(argument)?this.pendingOrder[Number(argument)-1]:void 0;if(id===void 0){this.showStatus("Choose a pending question number or /answer skip.");return}this.expandPendingQuestion(id);return}if(this.pendingOrder.length===1){this.expandPendingQuestion();return}let list3=new SelectList(this.pendingOrder.map(id=>{let pending=this.pendingQuestions.get(id),remaining=(pending.getDeadlineAtMs?.()??pending.askedAtMs+pending.timeoutMs)-Date.now();return{value:id,label:`${pending.request.questions[0].header} \xB7 ${formatCountdownLabel(Date.now()-pending.askedAtMs)} ago \xB7 ${formatCountdownLabel(remaining)} remaining`}}),10,getSelectListTheme()),close=()=>{this.ui.hideOverlay(),this.questionSurface="collapsed"};list3.onCancel=close,list3.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list3,{width:"80%",anchor:"bottom-center"})}expandPendingQuestion(requestId=this.shownQuestionId,initialQuestionIndex,initialInput){let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);if(!state||this.askUserQuestion)return!1;this.shownQuestionId=state.request.requestId;let component=new AskUserQuestionComponent(state.request,response=>{if(this.pendingQuestions.get(state.request.requestId)===state){if(response.status!=="cancelled"){state.finish(response);return}this.hideQuestionOverlay(),this.refreshAsyncWidget()}},{tui:this.ui,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,initialDraft:state.draft,initialQuestionIndex,onProgress:draft=>{state.draft=draft,state.onProgress?.(draft)}});return this.askUserQuestion=component,this.questionSurface="expanded",this.refreshAsyncWidget(),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender(),initialInput!==void 0&&component.handleInput(initialInput),!0}submitAsyncQuestionComment(text2){let destination=this.composerDestination,state=destination.kind==="answer"?this.pendingQuestions.get(destination.requestId):void 0;return state?(this.setComposerReply(),this.editor.addToHistory?.(text2),this.editor.setText(""),state.finish(buildCommentResponse(state.request,state.draft,text2)),!0):!1}getExpandedEditorText(){return expandEditorSubmission(this.editor,this.editor.getText())}setCustomEditorComponent(factory){if(this.editorComponentFactory=factory,!(!factory&&this.editor===this.defaultEditor)){if(this.disposeActiveSelector(),this.editorContainer.clear(),factory){let newEditor=factory(this.ui,this.chrome?this.chrome.getEditorTheme():getEditorTheme(),this.keybindings);newEditor.onSubmit=text2=>{this.defaultEditor.onSubmit?.(expandSubmittedText(newEditor,text2))},newEditor.onChange=this.defaultEditor.onChange,transferEditorContent(this.editor,newEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(newEditor),newEditor.borderColor!==void 0&&(newEditor.borderColor=this.defaultEditor.borderColor),newEditor.setPaddingX!==void 0&&newEditor.setPaddingX(this.defaultEditor.getPaddingX()),newEditor.setAutocompleteMaxVisible!==void 0&&newEditor.setAutocompleteMaxVisible(this.defaultEditor.getAutocompleteMaxVisible()),newEditor.setAutocompleteProvider&&this.autocompleteProvider&&newEditor.setAutocompleteProvider(this.autocompleteProvider);let customEditor=newEditor;if("actionHandlers"in customEditor&&customEditor.actionHandlers instanceof Map){customEditor.onEscape||(customEditor.onEscape=()=>this.defaultEditor.onEscape?.()),customEditor.onCtrlD||(customEditor.onCtrlD=()=>this.defaultEditor.onCtrlD?.()),customEditor.onPasteImage||(customEditor.onPasteImage=()=>this.defaultEditor.onPasteImage?.()),customEditor.onExtensionShortcut||(customEditor.onExtensionShortcut=data=>this.defaultEditor.onExtensionShortcut?.(data));for(let[action,handler]of this.defaultEditor.actionHandlers)customEditor.actionHandlers.set(action,handler)}this.editor=newEditor}else this.editor!==this.defaultEditor&&(transferEditorContent(this.editor,this.defaultEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(this.defaultEditor)),this.editor=this.defaultEditor;this.editorContainer.addChild(this.editor),this.activeStatusIndicator&&(this.statusContainer.clear(),this.activeWorkingIndicatorEmbedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,this.activeStatusIndicator),this.activeWorkingIndicatorEmbedded||this.statusContainer.addChild(this.activeStatusIndicator)),this.ui.setFocus(this.editor),this.ui.requestRender()}}showExtensionNotify(message,type2){type2==="error"?this.showError(message):type2==="warning"?this.showWarning(message):this.showStatus(message)}async showExtensionCustom(factory,options){let savedText=this.editor.getText(),isOverlay=options?.overlay??!1,restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.editor.setText(savedText),this.ui.setFocus(this.editor),this.ui.requestRender()};return new Promise((resolve42,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve42(result3);try{component?.dispose?.()}catch{}}};Promise.resolve(factory(this.ui,theme,this.keybindings,close)).then(c=>{if(!closed)if(component=c,isOverlay){let overlayOptions=(()=>{if(options?.overlayOptions)return typeof options.overlayOptions=="function"?options.overlayOptions():options.overlayOptions;let w=component.width;return w?{width:w}:void 0})(),handle=this.ui.showOverlay(component,overlayOptions);options?.onHandle?.(handle)}else this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}).catch(err2=>{closed||(isOverlay||restoreEditor(),reject(err2))})})}showExtensionError(error2){let errorMsg=formatExtensionErrorHeadline(error2),errorText5=new Text(theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText5),error2.stack){let stackLines=error2.stack.split(`
2501
2487
  `).slice(1).map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
2502
- `);stackLines&&this.chatContainer.addChild(new Text(stackLines,1,0))}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=text2=>{let wasBashMode=this.isBashMode;this.isBashMode=text2.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text2)},this.subscribeImageMarkers(this.defaultEditor),this.defaultEditor.onPasteImage=()=>{this.lastInputWasPaste=!0,this.handleClipboardPaste()};let previousEscapeHandler=this.defaultEditor.onEscape;this.defaultEditor.onEscape=()=>{this.hideShortcutOverlay(),previousEscapeHandler?.()}}async handleRightClickPaste(){let target=this.renderer.getFocusedComponent(),handleInput=target?.handleInput;if(!(!target||!handleInput))try{let text2=await readClipboardText();if(!text2||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text2}\x1B[201~`),this.ui.requestRender()}catch{}}async handleClipboardPaste(){try{let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async text2=>{try{let preResolvedImages=this.preResolvedSubmissionImages;if(this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim(),!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText(""),await this.handleAnswerCommand(text2.slice(7).trim());return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer");return}if(this.session.isStreaming){let images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId2)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId2),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),submission=images.length>0?{text:text2,images,pendingEchoId}:{text:text2,pendingEchoId};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":event.entry.type==="custom"&&(this.addCustomEntryToChat(event.entry),this.ui.requestRender());break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label2=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isNetworkProviderError(errorMessage8)?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`Retry switched models (${event.reason}); the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isNetworkProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isNetworkProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isNetworkProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isNetworkProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isNetworkProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new Text(theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusText.setText(theme.fg("dim",message)),this.ui.requestRender();return}let spacer=new Spacer(1),text2=new Text(theme.fg("dim",message),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(toolName,toolCallId,args){return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message);let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label2=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label2}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label2="Cache miss";miss.modelChanged?label2="Cache miss after model switch":miss.idleMs>=3e5&&(label2=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label2}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve42=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve42(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
2488
+ `);stackLines&&this.chatContainer.addChild(new Text(stackLines,1,0))}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=text2=>{let wasBashMode=this.isBashMode;this.isBashMode=text2.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text2)},this.subscribeImageMarkers(this.defaultEditor),this.defaultEditor.onPasteImage=()=>{this.lastInputWasPaste=!0,this.handleClipboardPaste()};let previousEscapeHandler=this.defaultEditor.onEscape;this.defaultEditor.onEscape=()=>{this.hideShortcutOverlay(),previousEscapeHandler?.()}}async handleRightClickPaste(){let target=this.renderer.getFocusedComponent(),handleInput=target?.handleInput;if(!(!target||!handleInput))try{let text2=await readClipboardText();if(!text2||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text2}\x1B[201~`),this.ui.requestRender()}catch{}}async handleClipboardPaste(){try{let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async text2=>{try{let preResolvedImages=this.preResolvedSubmissionImages;if(this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim(),!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText(""),await this.handleAnswerCommand(text2.slice(7).trim());return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer");return}if(this.session.isStreaming){let images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId2)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId2),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),submission=images.length>0?{text:text2,images,pendingEchoId}:{text:text2,pendingEchoId};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":event.entry.type==="custom"&&(this.addCustomEntryToChat(event.entry),this.ui.requestRender());break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label2=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label2),this.workingMessage=label2,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label2}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isNetworkProviderError(errorMessage8)?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`Retry switched models (${event.reason}); the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isNetworkProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isNetworkProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isNetworkProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isNetworkProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isNetworkProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new Text(theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusText.setText(theme.fg("dim",message)),this.ui.requestRender();return}let spacer=new Spacer(1),text2=new Text(theme.fg("dim",message),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(requestedName,toolCallId,args){let toolName=this.session.resolveToolCallName(requestedName);return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message);let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label2=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label2}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label2="Cache miss";miss.modelChanged?label2="Cache miss after model switch":miss.idleMs>=3e5&&(label2=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label2}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve42=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve42(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
2503
2489
  `),process.exit(0)}emergencyTerminalExit(crash){this.isShuttingDown=!0;try{appendUncaughtCrashLog(crash.origin,crash.error)}catch{}this.unregisterSignalHandlers(),killTrackedDetachedChildren(),process.exit(129)}uncaughtCrash(error2,origin){if(this.isShuttingDown&&process.exit(1),isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:`dead-terminal ${origin}`,error:error2}),isRecoverableInspectorVmImportError(error2,origin)){this.showWarning(INSPECTOR_VM_IMPORT_WARNING);return}this.isShuttingDown=!0;try{this.unregisterSignalHandlers()}catch{}try{killTrackedDetachedChildren()}catch{}try{this.pauseQuestionMouseCapture(),this.ui.stop()}catch{}try{appendUncaughtCrashLog(origin,error2)}catch{}restoreInteractiveStderr();let storageMessage=storageWriteCrashMessage(error2);storageMessage!==void 0&&console.error(storageMessage),console.error(`${APP_NAME} exiting due to uncaughtException:`),console.error(error2),process.exit(1)}requestExtensionShutdown(){this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()}async checkShutdownRequested(){this.shutdownRequested&&await this.shutdown()}registerSignalHandlers(){this.unregisterSignalHandlers();let signals=["SIGTERM"];if(process.platform!=="win32"&&signals.push("SIGHUP"),process.platform!=="win32"){let resizeHandler=()=>{this.runtimeHost?.setClientInfo?.(this.ui.terminal.columns)};process.on("SIGWINCH",resizeHandler),this.signalCleanupHandlers.push(()=>process.off("SIGWINCH",resizeHandler))}for(let signal of signals){let handler=()=>{killTrackedDetachedChildren(),this.shutdown({fromSignal:!0})};process.prependListener(signal,handler),this.signalCleanupHandlers.push(()=>process.off(signal,handler))}let terminalErrorHandler=error2=>{throw isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:"dead-terminal stdio error",error:error2}),error2};process.stdout.on("error",terminalErrorHandler),process.stderr.on("error",terminalErrorHandler),this.signalCleanupHandlers.push(()=>process.stdout.off("error",terminalErrorHandler)),this.signalCleanupHandlers.push(()=>process.stderr.off("error",terminalErrorHandler));let uncaughtExceptionHandler=(error2,origin)=>this.uncaughtCrash(error2,origin);process.prependListener("uncaughtException",uncaughtExceptionHandler),this.signalCleanupHandlers.push(()=>process.off("uncaughtException",uncaughtExceptionHandler)),consumeEarlyInspectorVmImportRecoveries()>0&&this.showWarning(INSPECTOR_VM_IMPORT_WARNING)}unregisterSignalHandlers(){for(let cleanup of this.signalCleanupHandlers)cleanup();this.signalCleanupHandlers=[]}handleCtrlZ(){if(process.platform==="win32"){this.showStatus("Suspend to background is not supported on Windows");return}let suspendKeepAlive=setInterval(()=>{},2**30),ignoreSigint=()=>{};process.on("SIGINT",ignoreSigint),process.once("SIGCONT",()=>{clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)});try{restoreInteractiveStderr(),this.pauseQuestionMouseCapture(),this.ui.stop(),process.kill(0,"SIGTSTP")}catch(error2){throw clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),error2}}async handleFollowUp(){this.setComposerReply();let text2=this.getExpandedEditorText().trim();if(!text2)return;if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"followUp");return}let images=this.takeSubmissionImages(text2);if(this.session.isStreaming){if(this.editor.addToHistory?.(text2),this.editor.setText(""),this.isExtensionCommand(text2)){await this.session.prompt(text2);return}let pendingEchoId=this.beginUserEcho(text2,images);try{await this.session.prompt(text2,{streamingBehavior:"followUp",...images.length>0?{images}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId)})}catch(error2){throw this.optimisticUserEchoes.reject(pendingEchoId),error2}this.updatePendingMessagesDisplay(),this.ui.requestRender()}else this.editor.onSubmit&&(this.preResolvedSubmissionImages=images.length>0?images:void 0,this.editor.setText(""),this.editor.onSubmit(text2))}handleDequeue(){let restored=this.restoreQueuedMessagesToEditor();restored===0?this.showStatus("No queued messages to restore"):this.showStatus(`Restored ${restored} queued message${restored>1?"s":""} to editor`)}updateEditorBorderColor(){if(this.chrome)this.editor.borderColor=this.chrome.getEditorBorderColor({isBashMode:this.isBashMode,thinkingLevel:this.session.thinkingLevel||"off"});else if(this.isBashMode)this.editor.borderColor=theme.getBashModeBorderColor();else{let level=this.session.thinkingLevel||"off";this.editor.borderColor=theme.getThinkingBorderColor(level)}this.activeStatusIndicator?.invalidate(),this.ui.requestRender()}async cycleThinkingLevel(){await this.session.cycleThinkingLevel()===void 0&&this.showStatus("Current model does not support thinking")}async cycleModel(direction){try{let result3=await this.session.cycleModel(direction);if(result3===void 0){let msg=this.session.favoriteModels.length>0?buildFavoriteCycleStatusMessage("single"):buildFavoriteCycleStatusMessage("empty");this.showStatus(msg)}else{if((result3.skippedModels?.length??0)>0&&modelsAreEqual(result3.model,this.session.model)){this.showStatus("No favorite model can fit the current context. Compact the session or start a new one.");return}this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.updateEditorBorderColor();let thinkingStr=result3.model.reasoning&&result3.thinkingLevel!=="off"?` (thinking: ${result3.thinkingLevel})`:"",systemPromptStr=result3.systemPromptChange?.systemPromptName?`, optimized system prompt applied: ${result3.systemPromptChange.systemPromptName}`:"";this.showStatus(`Switched to ${result3.model.name||result3.model.id}${thinkingStr}${systemPromptStr}`),this.showRiskyMainModelWarning(result3.model),this.maybeWarnAboutAnthropicSubscriptionAuth(result3.model)}}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}toggleToolOutputExpansion(){this.setToolsExpanded(!this.toolOutputExpanded)}setToolsExpanded(expanded){if(expanded===this.toolOutputExpanded)return;this.toolOutputExpanded=expanded;let activeHeader=this.customHeader??this.builtInHeader;isExpandable(activeHeader)&&activeHeader.setExpanded(expanded);for(let container of[this.loadedResourcesContainer,this.chatContainer])for(let child of container.children)isExpandable(child)&&child.setExpanded(expanded);this.showStatus(`Tool output: ${expanded?"expanded":"collapsed"}`)}toggleThinkingBlockVisibility(){this.hideThinkingBlock=!this.hideThinkingBlock,this.settingsManager.setHideThinkingBlock(this.hideThinkingBlock),this.rebuildChatFromMessages&&(this.chatContainer.clear(),this.rebuildChatFromMessages()),this.streamingComponent&&this.streamingMessage&&(this.streamingComponent.setHideThinkingBlock(this.hideThinkingBlock),this.streamingReveal.resyncVisibility(),this.chatContainer.addChild(this.streamingComponent)),this.showStatus(`Thinking blocks: ${this.hideThinkingBlock?"hidden":"visible"}`)}async handleOpenExternalEditor(){let editorCmd=this.settingsManager.getExternalEditorCommand(),content=this.getExpandedEditorText();this.pauseQuestionMouseCapture(),this.ui.stop(),restoreInteractiveStderr();try{let result3=await editInExternalEditor({command:editorCmd,content});result3.status==="complete"&&this.editor.setText(result3.content)}finally{takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)}}clearEditor(){this.editor.setText(""),this.ui.requestRender()}showError(errorMessage8){if(isNetworkProviderError(errorMessage8,!0)){this.getProviderErrors().record(errorMessage8,this.toolOutputExpanded),this.ui.requestRender();return}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",`Error: ${sanitizeTuiErrorMessage(errorMessage8)}`),1,0)),this.ui.requestRender()}getProviderErrors(){return this.providerErrors??=new ProviderErrorPresentation(this.chatContainer),this.providerErrors}showNoticeBox(spec){let sanitized={...spec,title:sanitizeTuiErrorMessage(spec.title),why:sanitizeTuiErrorMessage(spec.why),...spec.extra===void 0?{}:{extra:spec.extra.map(line=>({...line,text:sanitizeTuiErrorMessage(line.text)}))},...spec.expandedLine===void 0?{}:{expandedLine:sanitizeTuiErrorMessage(spec.expandedLine)}};this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(buildNoticeBox(sanitized,{expanded:this.toolOutputExpanded},theme)),this.ui.requestRender()}showWarning(warningMessage){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Warning: ${warningMessage}`),1,0)),this.ui.requestRender()}showNewVersionNotification(newVersion){let action=BRAND?.update?.command??`${APP_NAME} update`,changelogUrl=getReleaseChangelogUrl(newVersion),changelogLink=getCapabilities().hyperlinks?hyperlink(changelogUrl,changelogUrl):changelogUrl;this.showNoticeBox({title:"Update Available",tone:"warning",why:`New version ${newVersion} is available.`,extra:[{text:action},{text:`Changelog: ${changelogLink}`,tone:"accent"}]})}showRiskyMainModelWarning(model){!model||!isRiskyMainModel(model)||this.showNoticeBox({title:"Risky model warning",tone:"error",why:RISKY_MAIN_MODEL_WARNING})}showSettingsSourceSelected(event){this.showStatus(`Settings: ${path12.basename(event.path)} (${event.format.toUpperCase()})`)}showHighReasoningWarning(event){let{title,body}=buildHighReasoningWarning({id:event.modelId,provider:event.provider},event.thinkingLevel);this.showNoticeBox({title,tone:"error",why:body[0]??"High reasoning may affect reliability or cost.",extra:body.slice(1).map(text2=>({text:text2,tone:"error"}))})}showPackageUpdateNotification(packages){this.showNoticeBox({title:"Package Updates Available",tone:"warning",why:`Package updates are available. Run ${APP_NAME} update --extensions`,extra:[{text:"Packages:",tone:"dim"},...packages.map(pkg=>({text:`- ${pkg}`,tone:"dim"}))]})}getAllQueuedMessages(){return{steering:[...this.session.getSteeringMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text)],followUp:[...this.session.getFollowUpMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text)]}}clearAllQueues(options={abortWillFollow:!1}){let clearedNative=this.session.clearQueue(options),{steering,followUp}=clearedNative,nativeMessages=clearedNative.ordered??[...steering.map((text2,enqueueOrder)=>({text:text2,mode:"steer",enqueueOrder})),...followUp.map((text2,index)=>({text:text2,mode:"followUp",enqueueOrder:steering.length+index}))],compactionMessages=[...this.compactionInFlightMessages,...this.compactionQueuedMessages],compactionSteering=compactionMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),compactionFollowUp=compactionMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text);for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.compactionQueuedMessages=[];for(let message of compactionMessages)message.pendingEchoId&&this.optimisticUserEchoes?.remove(message.pendingEchoId);let fallbackOrder=nativeMessages.reduce((maximum,message)=>Math.max(maximum,message.enqueueOrder),0),ordered=[...nativeMessages,...compactionMessages.map((message,index)=>({...message,enqueueOrder:message.enqueueOrder??fallbackOrder+index+1}))].sort((a,b)=>a.enqueueOrder-b.enqueueOrder),cleared={steering:[...steering,...compactionSteering],followUp:[...followUp,...compactionFollowUp]};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}updatePendingMessagesDisplay(){this.pendingMessagesContainer.clear();let{steering:steeringMessages,followUp:followUpMessages}=this.getAllQueuedMessages();if(steeringMessages.length>0||followUpMessages.length>0){this.pendingMessagesContainer.addChild(new Spacer(1));for(let message of steeringMessages){let text2=theme.fg("dim",`Steering: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}for(let message of followUpMessages){let text2=theme.fg("dim",`Follow-up: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}let dequeueHint=this.getAppKeyDisplay("app.message.dequeue"),hintText=theme.fg("dim",`\u21B3 ${dequeueHint} to edit all queued messages`);this.pendingMessagesContainer.addChild(new TruncatedText(hintText,1,0))}}restoreQueuedMessagesToEditor(options){let{steering,followUp,ordered}=this.clearAllQueues({abortWillFollow:options?.abort===!0}),allQueued=ordered?.map(message=>message.text)??[...steering,...followUp];if(allQueued.length===0)return this.updatePendingMessagesDisplay(),options?.abort&&this.session.abort(),0;let queuedText=allQueued.join(`
2504
2490
 
2505
2491
  `),currentText=options?.currentText??this.editor.getText(),combinedText=[queuedText,currentText].filter(t=>t.trim()).join(`