@code-yeongyu/senpi 2026.9.27-4 → 2026.9.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/dist/bundle/chunks/{app-server-command-3GVJZFFH.js → app-server-command-TOPTGVQB.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-4SUOOZZ4.js → azure-openai-responses-FCZNBRWE.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
- package/dist/bundle/chunks/{chunk-PSCNHY7D.js → chunk-3GMFUEU7.js} +1 -1
- package/dist/bundle/chunks/{chunk-HBG6SQU5.js → chunk-62XHQXCZ.js} +1 -1
- package/dist/bundle/chunks/{chunk-SLL375O7.js → chunk-7DY2JPUX.js} +1 -1
- package/dist/bundle/chunks/chunk-7YUGCTEV.js +15 -0
- package/dist/bundle/chunks/{chunk-FWBSGMAE.js → chunk-A4UMPXQF.js} +1 -1
- package/dist/bundle/chunks/chunk-BBK6SSYT.js +2 -0
- package/dist/bundle/chunks/{chunk-C2425O2Q.js → chunk-CNQ4JB45.js} +1 -1
- package/dist/bundle/chunks/{chunk-27IFXX3B.js → chunk-DRN4FQCE.js} +1 -1
- package/dist/bundle/chunks/{chunk-22MGY5JQ.js → chunk-EHSZ7UCW.js} +1 -1
- package/dist/bundle/chunks/chunk-FHJYIU3U.js +5 -0
- package/dist/bundle/chunks/chunk-GJUCSTAG.js +19 -0
- package/dist/bundle/chunks/{chunk-VMKAYXHL.js → chunk-KIOTFUG6.js} +25 -20
- package/dist/bundle/chunks/{chunk-2BMD37YV.js → chunk-LUPPSEQW.js} +1 -1
- package/dist/bundle/chunks/chunk-OAIVTS5X.js +8 -0
- package/dist/bundle/chunks/{chunk-NRGMT74E.js → chunk-QOVUQZO4.js} +1 -1
- package/dist/bundle/chunks/chunk-SN4ZHPMN.js +135 -0
- package/dist/bundle/chunks/{chunk-IKXPBYSO.js → chunk-UJFLZ2M2.js} +1 -1
- package/dist/bundle/chunks/{chunk-4T4GFAGK.js → chunk-VFSXUT7K.js} +1 -1
- package/dist/bundle/chunks/{cli-main-66NFBKVH.js → cli-main-ARR54ET6.js} +1 -1
- package/dist/bundle/chunks/{google-generative-ai-ZTGKZTGU.js → google-generative-ai-LFCBHG3Y.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-CCZ376YK.js → google-vertex-C474FXU7.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-NZ3I2UEN.js → help-fast-path-3U3YDEZ6.js} +1 -1
- package/dist/bundle/chunks/{host-command-RORPAC5X.js → host-command-6CJ7YM6W.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-UDMJGLOR.js → host-lifecycle-RZIMOFDM.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +6 -6
- package/dist/bundle/chunks/interactive-host-runtime-A3GEIFTU.js +4 -0
- package/dist/bundle/chunks/{interactive-mode-LOAADKLH.js → interactive-mode-ITSFLGF6.js} +1 -1
- package/dist/bundle/chunks/{list-tips-S5CANO5W.js → list-tips-FPXDXN7R.js} +1 -1
- package/dist/bundle/chunks/multi-session-host-B4WMZE2G.js +21 -0
- package/dist/bundle/chunks/{openai-codex-responses-YSGZZDD5.js → openai-codex-responses-2LDIFL6Z.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-KWHRWCBN.js → openai-completions-7KZLPKYP.js} +1 -1
- package/dist/bundle/chunks/{openai-images-6U5FCN5S.js → openai-images-I7DR7ERP.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-7PWMBGYX.js → openai-responses-LCHS3AF3.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-QIKWQZUD.js → openrouter-images-IPNDRK6C.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-5EEDA35I.js → package-manager-cli-DXHQ6RKA.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-KZG4OVR7.js → rotation-stream-ZVJEGA2G.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-HOEA5NGQ.js → rpc-mode-PFPNP65F.js} +1 -1
- package/dist/bundle/chunks/session-picker-KOPOV6Q4.js +2 -0
- package/dist/bundle/chunks/session-worker.js +311 -302
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/host-command.d.ts +8 -1
- package/dist/cli/host-command.d.ts.map +1 -1
- package/dist/cli/host-command.js +66 -14
- package/dist/cli/host-command.js.map +1 -1
- package/dist/core/agent-session.d.ts +18 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +119 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/retry-fallback/candidates.d.ts +26 -0
- package/dist/core/retry-fallback/candidates.d.ts.map +1 -0
- package/dist/core/retry-fallback/candidates.js +41 -0
- package/dist/core/retry-fallback/candidates.js.map +1 -0
- package/dist/core/retry-fallback/circuit-probes.d.ts +30 -0
- package/dist/core/retry-fallback/circuit-probes.d.ts.map +1 -0
- package/dist/core/retry-fallback/circuit-probes.js +60 -0
- package/dist/core/retry-fallback/circuit-probes.js.map +1 -0
- package/dist/core/retry-fallback/circuit.d.ts +101 -0
- package/dist/core/retry-fallback/circuit.d.ts.map +1 -0
- package/dist/core/retry-fallback/circuit.js +175 -0
- package/dist/core/retry-fallback/circuit.js.map +1 -0
- package/dist/core/retry-fallback/controller-types.d.ts +58 -0
- package/dist/core/retry-fallback/controller-types.d.ts.map +1 -0
- package/dist/core/retry-fallback/controller-types.js +2 -0
- package/dist/core/retry-fallback/controller-types.js.map +1 -0
- package/dist/core/retry-fallback/controller.d.ts +21 -49
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +88 -42
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +25 -17
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-failure-report.d.ts +33 -0
- package/dist/core/session-failure-report.d.ts.map +1 -0
- package/dist/core/session-failure-report.js +62 -0
- package/dist/core/session-failure-report.js.map +1 -0
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +4 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +2 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/help-content.d.ts.map +1 -1
- package/dist/modes/interactive/help-content.js +3 -0
- package/dist/modes/interactive/help-content.js.map +1 -1
- package/dist/modes/interactive/interactive-host-attach.d.ts +10 -0
- package/dist/modes/interactive/interactive-host-attach.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-host-attach.js +14 -0
- package/dist/modes/interactive/interactive-host-attach.js.map +1 -0
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +3 -6
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +7 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +66 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-failure-info.d.ts +3 -0
- package/dist/modes/interactive/session-failure-info.d.ts.map +1 -0
- package/dist/modes/interactive/session-failure-info.js +21 -0
- package/dist/modes/interactive/session-failure-info.js.map +1 -0
- package/dist/modes/interactive/tips/catalog/model-tips.d.ts +7 -7
- package/dist/modes/interactive/tips/catalog/model-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/model-tips.js +7 -1
- package/dist/modes/interactive/tips/catalog/model-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
- package/dist/modes/rpc/host-attach-hold.d.ts +16 -0
- package/dist/modes/rpc/host-attach-hold.d.ts.map +1 -0
- package/dist/modes/rpc/host-attach-hold.js +9 -0
- package/dist/modes/rpc/host-attach-hold.js.map +1 -0
- package/dist/modes/rpc/host-cleanup-paths.d.ts +20 -0
- package/dist/modes/rpc/host-cleanup-paths.d.ts.map +1 -0
- package/dist/modes/rpc/host-cleanup-paths.js +13 -0
- package/dist/modes/rpc/host-cleanup-paths.js.map +1 -0
- package/dist/modes/rpc/host-client-occupancy.d.ts +24 -0
- package/dist/modes/rpc/host-client-occupancy.d.ts.map +1 -0
- package/dist/modes/rpc/host-client-occupancy.js +53 -0
- package/dist/modes/rpc/host-client-occupancy.js.map +1 -0
- package/dist/modes/rpc/host-daemon-paths.d.ts +61 -8
- package/dist/modes/rpc/host-daemon-paths.d.ts.map +1 -1
- package/dist/modes/rpc/host-daemon-paths.js +128 -11
- package/dist/modes/rpc/host-daemon-paths.js.map +1 -1
- package/dist/modes/rpc/host-daemon-registration.d.ts +11 -1
- package/dist/modes/rpc/host-daemon-registration.d.ts.map +1 -1
- package/dist/modes/rpc/host-daemon-registration.js +28 -15
- package/dist/modes/rpc/host-daemon-registration.js.map +1 -1
- package/dist/modes/rpc/host-endpoints.d.ts +12 -0
- package/dist/modes/rpc/host-endpoints.d.ts.map +1 -0
- package/dist/modes/rpc/host-endpoints.js +59 -0
- package/dist/modes/rpc/host-endpoints.js.map +1 -0
- package/dist/modes/rpc/host-ensure-lock.d.ts +11 -0
- package/dist/modes/rpc/host-ensure-lock.d.ts.map +1 -0
- package/dist/modes/rpc/host-ensure-lock.js +49 -0
- package/dist/modes/rpc/host-ensure-lock.js.map +1 -0
- package/dist/modes/rpc/host-ensure.d.ts +7 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +42 -65
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-gc-evidence.d.ts +18 -0
- package/dist/modes/rpc/host-gc-evidence.d.ts.map +1 -0
- package/dist/modes/rpc/host-gc-evidence.js +128 -0
- package/dist/modes/rpc/host-gc-evidence.js.map +1 -0
- package/dist/modes/rpc/host-gc.d.ts +28 -0
- package/dist/modes/rpc/host-gc.d.ts.map +1 -0
- package/dist/modes/rpc/host-gc.js +110 -0
- package/dist/modes/rpc/host-gc.js.map +1 -0
- package/dist/modes/rpc/host-generations.d.ts +10 -2
- package/dist/modes/rpc/host-generations.d.ts.map +1 -1
- package/dist/modes/rpc/host-generations.js +12 -7
- package/dist/modes/rpc/host-generations.js.map +1 -1
- package/dist/modes/rpc/host-handoff.d.ts +6 -0
- package/dist/modes/rpc/host-handoff.d.ts.map +1 -1
- package/dist/modes/rpc/host-handoff.js +31 -4
- package/dist/modes/rpc/host-handoff.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle-policy.d.ts +53 -0
- package/dist/modes/rpc/host-lifecycle-policy.d.ts.map +1 -0
- package/dist/modes/rpc/host-lifecycle-policy.js +64 -0
- package/dist/modes/rpc/host-lifecycle-policy.js.map +1 -0
- package/dist/modes/rpc/host-lifecycle.d.ts +1 -44
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +23 -85
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-observe-request.d.ts +17 -0
- package/dist/modes/rpc/host-observe-request.d.ts.map +1 -0
- package/dist/modes/rpc/host-observe-request.js +30 -0
- package/dist/modes/rpc/host-observe-request.js.map +1 -0
- package/dist/modes/rpc/host-probe.d.ts +12 -0
- package/dist/modes/rpc/host-probe.d.ts.map +1 -1
- package/dist/modes/rpc/host-probe.js +28 -1
- package/dist/modes/rpc/host-probe.js.map +1 -1
- package/dist/modes/rpc/host-protocol-info.d.ts +2 -0
- package/dist/modes/rpc/host-protocol-info.d.ts.map +1 -1
- package/dist/modes/rpc/host-protocol-info.js +1 -0
- package/dist/modes/rpc/host-protocol-info.js.map +1 -1
- package/dist/modes/rpc/host-readiness.d.ts +22 -0
- package/dist/modes/rpc/host-readiness.d.ts.map +1 -0
- package/dist/modes/rpc/host-readiness.js +44 -0
- package/dist/modes/rpc/host-readiness.js.map +1 -0
- package/dist/modes/rpc/host-runner.d.ts +13 -0
- package/dist/modes/rpc/host-runner.d.ts.map +1 -1
- package/dist/modes/rpc/host-runner.js +23 -4
- package/dist/modes/rpc/host-runner.js.map +1 -1
- package/dist/modes/rpc/host-status-all.d.ts +31 -0
- package/dist/modes/rpc/host-status-all.d.ts.map +1 -0
- package/dist/modes/rpc/host-status-all.js +78 -0
- package/dist/modes/rpc/host-status-all.js.map +1 -0
- package/dist/modes/rpc/host-status-rows.d.ts +35 -0
- package/dist/modes/rpc/host-status-rows.d.ts.map +1 -0
- package/dist/modes/rpc/host-status-rows.js +42 -0
- package/dist/modes/rpc/host-status-rows.js.map +1 -0
- package/dist/modes/rpc/host-status.d.ts +32 -1
- package/dist/modes/rpc/host-status.d.ts.map +1 -1
- package/dist/modes/rpc/host-status.js +33 -27
- package/dist/modes/rpc/host-status.js.map +1 -1
- package/dist/modes/rpc/host-successor.d.ts +3 -1
- package/dist/modes/rpc/host-successor.d.ts.map +1 -1
- package/dist/modes/rpc/host-successor.js +105 -42
- package/dist/modes/rpc/host-successor.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts +6 -0
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +12 -13
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/loop-lag-watchdog.d.ts +16 -0
- package/dist/modes/rpc/loop-lag-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/loop-lag-watchdog.js +34 -2
- package/dist/modes/rpc/loop-lag-watchdog.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts +2 -1
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +33 -6
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.js +2 -2
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +16 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +9 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +4 -1
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-path-key.d.ts +3 -1
- package/dist/modes/rpc/session-path-key.d.ts.map +1 -1
- package/dist/modes/rpc/session-path-key.js +3 -1
- package/dist/modes/rpc/session-path-key.js.map +1 -1
- package/docs/rpc.md +186 -19
- package/docs/settings.md +25 -1
- package/docs/usage.md +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +14 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-3DEXCYNN.js +0 -135
- package/dist/bundle/chunks/chunk-5X4KSPK5.js +0 -12
- package/dist/bundle/chunks/chunk-KMD5ZONU.js +0 -5
- package/dist/bundle/chunks/chunk-PEHZYGYA.js +0 -8
- package/dist/bundle/chunks/chunk-PRC5XIIH.js +0 -2
- package/dist/bundle/chunks/chunk-QKY33652.js +0 -18
- package/dist/bundle/chunks/interactive-host-runtime-TIFT2SKR.js +0 -4
- package/dist/bundle/chunks/multi-session-host-GRHKB7Q2.js +0 -21
- package/dist/bundle/chunks/session-picker-FTFCQYHH.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{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-IKXPBYSO.js";import{TIP_DEFINITIONS}from"./chunk-FWBSGMAE.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-MUTD2NOH.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,REPOSITORY_IDENTITY_ENTRY_TYPE,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,environmentContextMessageIfChanged,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-27IFXX3B.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,PROCESS_START_TOLERANCE_MS,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,ownProcessStartedAtMs,processBootAtMs,safeRegExp,sameBoot,sameProcessStart}from"./chunk-YS5YEX4S.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 as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-PEHZYGYA.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-SLL375O7.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-EJKCBRYK.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-C2425O2Q.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-3DEXCYNN.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-5X4KSPK5.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-KMD5ZONU.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths,recordProcessLifetime}from"./chunk-QKY33652.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-NRGMT74E.js";import{createRgEngine,ensureTool}from"./chunk-DA4W77J7.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-4T4GFAGK.js";import{discoverEnvSlots}from"./chunk-HBG6SQU5.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-TRSQVD6V.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-22MGY5JQ.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-Y5A6TKBN.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-2BMD37YV.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,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-PSCNHY7D.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-ELFCNCBY.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-4LVZQRDG.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-PBWQK23Z.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{resolveToolNameMatch}from"./chunk-WASCMT6Y.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,readProviderDiagnostic,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds,sanitizeProviderDiagnostic}from"./chunk-L6QV7NZI.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,getSupportedThinkingLevels,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,supportsConfigurationUpdate,upsertSlot}from"./chunk-WL5EQYNL.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=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 open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,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(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,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=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID14}from"node:crypto";import{existsSync as existsSync45,mkdirSync as mkdirSync26,readFileSync as readFileSync42,writeFileSync as writeFileSync23}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname48}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_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),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(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,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((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-UJFLZ2M2.js";import{TIP_DEFINITIONS}from"./chunk-A4UMPXQF.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-MUTD2NOH.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,REPOSITORY_IDENTITY_ENTRY_TYPE,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,environmentContextMessageIfChanged,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-DRN4FQCE.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,PROCESS_START_TOLERANCE_MS,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,ownProcessStartedAtMs,processBootAtMs,safeRegExp,sameBoot,sameProcessStart}from"./chunk-YS5YEX4S.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 as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-OAIVTS5X.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-7DY2JPUX.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-EJKCBRYK.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-CNQ4JB45.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,monotonicNow,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-SN4ZHPMN.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-7YUGCTEV.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-FHJYIU3U.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths,daemonDirectoryName,recordProcessLifetime,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-GJUCSTAG.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-QOVUQZO4.js";import{createRgEngine,ensureTool}from"./chunk-DA4W77J7.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-VFSXUT7K.js";import{discoverEnvSlots}from"./chunk-62XHQXCZ.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-TRSQVD6V.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-EHSZ7UCW.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-Y5A6TKBN.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-LUPPSEQW.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,isQuotaExhaustionMessage,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-3GMFUEU7.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-ELFCNCBY.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-4LVZQRDG.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-PBWQK23Z.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{resolveToolNameMatch}from"./chunk-WASCMT6Y.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,readProviderDiagnostic,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds,sanitizeProviderDiagnostic}from"./chunk-L6QV7NZI.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,getSupportedThinkingLevels,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,supportsConfigurationUpdate,upsertSlot}from"./chunk-WL5EQYNL.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=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 open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,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(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,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=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID14}from"node:crypto";import{existsSync as existsSync45,mkdirSync as mkdirSync26,readFileSync as readFileSync42,writeFileSync as writeFileSync23}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname48}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_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),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(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,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((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=`
|
|
@@ -690,7 +690,7 @@ ${bounded}`}function measureSlicedContext(entries,firstKeptEntryId,summary,token
|
|
|
690
690
|
`)return;if(character==="\\"){let escaped=blob[index+1];if(escaped===void 0)return;encoded+=character+escaped,index++;continue}encoded+=character}}function extractJsonArrayPrefix(text2){if(!text2.startsWith("["))return;let depth=0,inString=!1,escaped=!1;for(let index=0;index<text2.length;index++){let character=text2[index];if(inString){escaped?escaped=!1:character==="\\"?escaped=!0:character==='"'&&(inString=!1);continue}if(character==='"')inString=!0;else if(character==="[")depth++;else if(character==="]"){if(depth--,depth===0)return text2.slice(0,index+1);if(depth<0)return}}}function parseV2Payload(payload){try{let parsed=JSON.parse(payload);return Array.isArray(parsed)?parsed.filter(isToolActivationIdentity):[]}catch{return[]}}function isToolActivationIdentity(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2;return typeof candidate.name=="string"&&candidate.name.length>0&&typeof candidate.registrationId=="string"&&candidate.registrationId.length>0}function extractLegacyActivationSegments(blob){let segments=[],cursor=blob.indexOf(LEGACY_TOOL_SEARCH_ACTIVATION_MARKER);for(;cursor>=0;){let rest=blob.slice(cursor+LEGACY_TOOL_SEARCH_ACTIVATION_MARKER.length),end=rest.search(/["\\\n]/);segments.push(end<0?rest:rest.slice(0,end)),cursor=blob.indexOf(LEGACY_TOOL_SEARCH_ACTIVATION_MARKER,cursor+LEGACY_TOOL_SEARCH_ACTIVATION_MARKER.length)}return segments}import{AsyncLocalStorage}from"node:async_hooks";import{basename as basename4,extname}from"node:path";var DEFAULT_BM25_PRECISION={minCoverage:.5,minScoreRatio:.35},DEFAULT_LIMIT=25;function buildBm25Index(docs){let indexed=docs.map(indexDoc),docFreq=new Map;for(let entry of indexed)for(let term of entry.termFreq.keys())docFreq.set(term,(docFreq.get(term)??0)+1);let totalLength=indexed.reduce((sum,entry)=>sum+entry.length,0),avgLength=indexed.length===0?0:totalLength/indexed.length,docCount=indexed.length;return{search(query,limit=DEFAULT_LIMIT,options={}){let pool=indexed.filter(entry=>(options.source===void 0||entry.doc.source===options.source)&&(options.group===void 0||entry.doc.group===options.group)),queryTerms=tokenizeToolText(query).map(stemToken);if(queryTerms.length===0)return[];let contentTerms=contentTermsOf(queryTerms),useExact=options.exactMatch!==!1,normQuery=normalizeToolName(query),results=[];for(let entry of pool){let exact=useExact&&normQuery.length>0&&entry.exactNames.has(normQuery),score3=bm25Score(entry,queryTerms,docFreq,avgLength,docCount);!exact&&score3<=0||results.push({coverage:coverageOf(entry,contentTerms),doc:entry.doc,exact,name:entry.doc.name,score:score3})}return results.sort(compareResults),(options.precision===void 0?results:applyPrecision(results,options.precision)).slice(0,Math.max(0,limit))}}}function applyPrecision(results,precision){let floor=(results.find(result3=>!result3.exact)?.score??0)*precision.minScoreRatio;return results.filter(result3=>result3.exact||result3.coverage>=precision.minCoverage&&result3.score>=floor)}var STOPWORDS=new Set(["a","an","and","are","be","by","can","do","for","from","how","i","in","is","it","me","my","need","of","on","or","please","that","the","this","to","tool","use","using","via","want","we","with","you","your"]);function contentTermsOf(queryTerms){let content=new Set(queryTerms.filter(term=>!STOPWORDS.has(term)));return content.size>0?content:new Set(queryTerms)}function coverageOf(entry,contentTerms){if(contentTerms.size===0)return 0;let matched=0;for(let term of contentTerms)entry.termFreq.has(term)&&matched++;return matched/contentTerms.size}function indexDoc(doc){let termFreq=new Map;addField(termFreq,indexTokens(doc.name),3),addField(termFreq,indexTokens(doc.label),3);for(let alias of doc.aliases)addField(termFreq,indexTokens(alias),3);for(let keyword of doc.keywords)addField(termFreq,indexTokens(keyword),3);addField(termFreq,indexTokens(doc.group),2),addField(termFreq,indexTokens(doc.ownerLabel),2),addField(termFreq,indexTokens(doc.description??""),1),addField(termFreq,indexTokens(doc.searchText??""),1);let length=0;for(let count of termFreq.values())length+=count;return{doc,exactNames:new Set([doc.name,doc.label,...doc.aliases,...doc.keywords].map(normalizeToolName)),length,termFreq}}function addField(termFreq,tokens,weight){for(let token of tokens)termFreq.set(token,(termFreq.get(token)??0)+weight)}function bm25Score(entry,queryTerms,docFreq,avgLength,docCount){let score3=0,seen=new Set;for(let term of queryTerms){if(seen.has(term))continue;seen.add(term);let tf=entry.termFreq.get(term);if(tf===void 0)continue;let idf=inverseDocFreq(docFreq.get(term)??0,docCount),denom=tf+.9*(1-.4+.4*entry.length/(avgLength||1));score3+=idf*(tf*(.9+1)/(denom||1))}return score3}function inverseDocFreq(termDocFreq,docCount){let value2=Math.log(1+(docCount-termDocFreq+.5)/(termDocFreq+.5));return value2<0?0:value2}function compareResults(left,right){return left.exact!==right.exact?left.exact?-1:1:right.score!==left.score?right.score-left.score:left.name.localeCompare(right.name)}function indexTokens(text2){return tokenizeToolText(text2).map(stemToken)}function stemToken(token){return token.length<4||!token.endsWith("s")||token.endsWith("ss")||token.endsWith("us")?token:token.endsWith("ies")?`${token.slice(0,-3)}y`:token.slice(0,-1)}function tokenizeToolText(text2){if(text2.length===0)return[];let withBoundaries=text2.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2"),tokens=[];for(let raw of withBoundaries.split(/[^a-zA-Z0-9]+/))raw.length!==0&&tokens.push(raw.toLowerCase());return tokens}function normalizeToolName(name){return name.toLowerCase().replace(/[-_\s]+/g,"")}var TOOL_SEARCH_TOOL_NAME="tool_search",MAX_RESULTS=5,ParamsSchema=typebox_exports.Object({query:typebox_exports.String({description:"Natural-language description of the capability you need."}),source:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("mcp"),typebox_exports.Literal("extension")],{description:"Optional: restrict the search to MCP or extension tools."})),group:typebox_exports.Optional(typebox_exports.String({description:"Optional: restrict the search to one catalog group."}))});function createToolSearchTool(service3){return{name:TOOL_SEARCH_TOOL_NAME,label:"Tool search",description:"Search the catalog of deferred tools by capability. Returns matching tool names with their parameter schemas and never changes your active tool set; call a returned tool by name and it activates on that first call.",promptSnippet:"Search deferred tool catalogs by capability; call a returned tool by name to use it.",parameters:ParamsSchema,prepareArguments:prepareToolSearchArguments,executionMode:"parallel",async execute(_toolCallId,params){let options={...params.source===void 0?{}:{source:params.source},...params.group===void 0?{}:{group:params.group}},matches=service3.search(params.query,MAX_RESULTS,options);return{content:[{type:"text",text:buildToolSearchResultText({group:params.group,hiddenHints:service3.hiddenToolHints(params.query),matches,parametersOf:name=>service3.getToolParameters(name),query:params.query,source:params.source})}],details:{matched:matches.map(match=>match.name),query:params.query}}},renderCall(args,theme2){let source=args.source===void 0?"":` source:${args.source}`,group=args.group===void 0?"":` @${args.group}`;return new Text(theme2.fg("toolTitle",theme2.bold(`${TOOL_SEARCH_TOOL_NAME} "${args.query}"${source}${group}`)),0,0)},renderResult(result3,options,theme2){let count=result3.details?.matched.length??0,title=options.isPartial?`${TOOL_SEARCH_TOOL_NAME}: searching`:`${TOOL_SEARCH_TOOL_NAME}: ${count} tool(s) found`;return new Text(theme2.fg("toolOutput",title),0,0)}}}function prepareToolSearchArguments(args){if(!isRecord4(args))return args;let{server,...rest}=args;return{...rest,...rest.source===void 0&&server===void 0?{}:{source:rest.source??"mcp"},...rest.group===void 0&&server===void 0?{}:{group:rest.group??server}}}function buildToolSearchResultText(input){let{query,matches,hiddenHints,source,group}=input,scope=[source===void 0?void 0:`source "${source}"`,group===void 0?void 0:`group "${group}"`].filter(part=>part!==void 0).join(" in "),scopeText=scope.length===0?"":` in ${scope}`,hintLines=hiddenHints.map(entry=>`- ${entry.name}: ${entry.hint}`);if(matches.length===0){let head=`No catalog tools matched "${query}"${scopeText}. Your active tool set is unchanged.`;return hintLines.length===0?`${head} Try different keywords or a broader query.`:[head,"","The query names a tool that is hidden in this session:",...hintLines].join(`
|
|
691
691
|
`)}let bullets=matches.map(match=>{let description=oneLine(match.doc.description)??"(no description)",parameters=compactParameters(input.parametersOf(match.name));return parameters===void 0?`- ${match.name} \u2014 ${description}`:`- ${match.name} \u2014 ${description}
|
|
692
692
|
parameters: ${parameters}`}),lines=[`Found ${matches.length} tool(s) matching "${query}"${scopeText}. Nothing was activated; call one by name and it activates on that first call:`,"",...bullets];return hintLines.length>0&&lines.push("","The query also names a tool that is hidden in this session:",...hintLines),lines.join(`
|
|
693
|
-
`)}function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneLine(text2){if(text2===void 0)return;let collapsed=text2.replace(/\s+/g," ").trim();if(collapsed.length!==0)return collapsed.length<=160?collapsed:`${collapsed.slice(0,157)}...`}function compactParameters(parameters){if(isRecord4(parameters))try{return JSON.stringify(parameters)}catch(error2){if(error2 instanceof TypeError)return;throw error2}}var ToolSearchService=class{#runtime;#feeds=new Map;#extensionDocs=[];#extensionFingerprint="";#registryGeneration=0;#historyScannedGeneration=-1;#registerToolSearch;#removedToolHints=()=>({});constructor(runtime){this.#runtime=runtime,this.#feeds.set("extension",{docs:[],hooks:{activate:names=>this.#promoteExtensionTools(names)}})}#nativeInjectionFailure=null;noteNativeInjectionFailure(reason){this.#nativeInjectionFailure=reason}takeNativeInjectionFailure(){let reason=this.#nativeInjectionFailure;return this.#nativeInjectionFailure=null,reason}bindRuntime(runtime){this.#runtime=runtime}bindActivationRuntime(runtime){this.#runtime={...this.#runtime,...runtime}}bindToolRegistrar(register){this.#registerToolSearch=register}bindRemovedToolHints(provider){this.#removedToolHints=provider}hiddenToolHints(query){let hints=this.#removedToolHints(),byNormalizedName=new Map(Object.entries(hints).map(([name,hint])=>[normalizeToolName(name),{hint,name}]));if(byNormalizedName.size===0)return[];let seen=new Set,matched=[];for(let candidate of[normalizeToolName(query),...tokenizeToolText(query)]){let entry=byNormalizedName.get(candidate);entry===void 0||seen.has(entry.name)||(seen.add(entry.name),matched.push(entry))}return matched}getToolParameters(name){return this.#runtime.getAllTools().find(tool=>tool.name===name)?.parameters}beginSession(){this.#feeds.delete("mcp"),this.#registryGeneration+=1,this.#historyScannedGeneration=-1,this.#refreshExtensionDocs(),this.#syncToolSearchLifecycle()}feed(source,docs,hooks){let validDocs=docs.filter(doc=>isValidDocument(doc,source));this.#feeds.set(source,{docs:validDocs,hooks}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle()}getCatalog(){return this.#refreshExtensionDocs(),[...this.#feeds.get("mcp")?.docs??[],...this.#extensionDocs]}search(query,limit=10,options={}){return buildBm25Index(this.getCatalog()).search(query,limit,{precision:DEFAULT_BM25_PRECISION,...options})}activate(matches){let namesBySource=new Map;for(let match of matches){let names=namesBySource.get(match.doc.source)??[];names.push(match.name),namesBySource.set(match.doc.source,names)}for(let[source,names]of namesBySource)this.#feeds.get(source)?.hooks.activate(names);let active=new Set(this.#runtime.getActiveTools());return matches.map(({name})=>name).filter(name=>active.has(name))}activateTool(name){let doc=this.getCatalog().find(candidate=>candidate.name===name);return doc===void 0?!1:(this.#feeds.get(doc.source)?.hooks.activate([name]),this.#runtime.getActiveTools().includes(name))}maybeRehydrateFromHistory(messages){let catalog=this.getCatalog();if(this.#historyScannedGeneration===this.#registryGeneration)return[];this.#historyScannedGeneration=this.#registryGeneration;let docsByName=new Map(catalog.map(doc=>[doc.name,{name:doc.name,registrationId:doc.registrationId,source:doc.source,allowLazyActivation:!0}])),restored=rehydrate(messages,docsByName);return restored.length>0&&this.#activateNames(restored,catalog),restored}#refreshExtensionDocs(){let docs=this.#runtime.getAllTools().filter(tool=>tool.exposure==="search"&&tool.allowLazyActivation).map(extensionDocument).filter(doc=>doc!==void 0).sort((left,right)=>left.name.localeCompare(right.name)),fingerprint=JSON.stringify(docs);fingerprint!==this.#extensionFingerprint&&(this.#extensionDocs=docs,this.#extensionFingerprint=fingerprint,this.#feeds.set("extension",{docs,hooks:{activate:names=>this.#promoteExtensionTools(names)}}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle())}#activateNames(names,catalog=this.getCatalog()){let sourceByName=new Map(catalog.map(doc=>[doc.name,doc.source])),namesBySource=new Map;for(let name of names){let source=sourceByName.get(name);if(source===void 0)continue;let sourceNames=namesBySource.get(source)??[];sourceNames.push(name),namesBySource.set(source,sourceNames)}for(let[source,sourceNames]of namesBySource)this.#feeds.get(source)?.hooks.activate(sourceNames)}#syncToolSearchLifecycle(){let hasDocuments=this.#extensionDocs.length>0||(this.#feeds.get("mcp")?.docs.length??0)>0;hasDocuments&&this.#registerToolSearch?.();let current=this.#runtime.getActiveTools(),isActive2=current.includes(TOOL_SEARCH_TOOL_NAME);hasDocuments!==isActive2&&this.#runtime.setActiveTools(hasDocuments?[...current,TOOL_SEARCH_TOOL_NAME]:current.filter(name=>name!==TOOL_SEARCH_TOOL_NAME))}#promoteExtensionTools(names){if(names.length===0)return;let current=this.#runtime.getActiveTools(),active=new Set(current),added=[...new Set(names.filter(name=>!active.has(name)))].sort();this.#runtime.setActiveTools([...current,...added])}};function extensionDocument(tool){if(tool.name.length===0)return;let ownerLabel=extensionOwnerLabel(tool),registrationId=deriveExtensionRegistrationId(tool.sourceInfo,tool.name);if(registrationId.length!==0)return{name:tool.name,label:tool.label,aliases:[],description:tool.description,searchText:tool.searchText,keywords:tool.searchKeywords,source:"extension",group:tool.searchGroup??ownerLabel,ownerLabel,registrationId}}function extensionOwnerLabel(tool){let fileName=basename4(tool.sourceInfo.path),extension=extname(fileName);return extension.length===0?fileName:fileName.slice(0,-extension.length)}function isValidDocument(doc,source){return doc.source===source&&doc.name.length>0&&doc.registrationId.length>0}var scopedService=new AsyncLocalStorage,service=null;function installScopedToolSearchService(value2){scopedService.enterWith(value2)}function getToolSearchService(runtime){let scoped=scopedService.getStore();if(scoped!==void 0)return runtime!==void 0&&scoped.bindRuntime(runtime),scoped;if(service===null){if(runtime===void 0)throw new Error("ToolSearchService runtime is not bound");service=new ToolSearchService(runtime)}else runtime!==void 0&&service.bindRuntime(runtime);return service}import*as fs3 from"node:fs";import{createRequire as createRequire4}from"node:module";import*as path9 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";var oauth_exports={};__export(oauth_exports,{loadAnthropicOAuth:()=>loadAnthropicOAuth,registerBundledOAuthFlowLoaders:()=>registerBundledOAuthFlowLoaders});var dist_exports3={};__export(dist_exports3,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS2,DEFAULT_HOST_LAUNCH_SPEC:()=>DEFAULT_HOST_LAUNCH_SPEC,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,GENERATION_HANDOFF_CAPABILITY:()=>GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR:()=>HOST_EXIT_ERROR,HOST_EXIT_FALLBACK:()=>HOST_EXIT_FALLBACK,HOST_EXIT_OK:()=>HOST_EXIT_OK,HOST_EXIT_REFUSED:()=>HOST_EXIT_REFUSED,HOST_EXIT_USAGE:()=>HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION:()=>HOST_PROTOCOL_VERSION,HostEnsureRefusedError:()=>HostEnsureRefusedError,HostLaunchSpecError:()=>HostLaunchSpecError,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,PINNED_HOST_CLIENT_CAPABILITIES:()=>PINNED_HOST_CLIENT_CAPABILITIES,ProjectTrustStore:()=>ProjectTrustStore,REQUIRED_HOST_CAPABILITIES:()=>REQUIRED_HOST_CAPABILITIES,RpcClient:()=>RpcClient,RpcClientOpenInFlightError:()=>RpcClientOpenInFlightError,RpcTransportGoneError:()=>RpcTransportGoneError,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,buildContextEntries:()=>buildContextEntries,buildNoticeBox:()=>buildNoticeBox,buildSessionContext:()=>buildSessionContext,calculateContextTokens:()=>calculateContextTokens2,classifyRead:()=>classifyRead,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary2,compact:()=>compact2,compareEngineOrdinal:()=>compareEngineOrdinal,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool2,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool2,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createHostDaemonPaths:()=>createHostDaemonPaths,createLocalBashOperations:()=>createLocalBashOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool2,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool2,createWriteToolDefinition:()=>createWriteToolDefinition,decideHostAction:()=>decideHostAction,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,engineBuildIdentity:()=>engineBuildIdentity,engineBuildIdentityFrom:()=>engineBuildIdentityFrom,ensureHost:()=>ensureHost,estimateTokens:()=>estimateTokens2,findCutPoint:()=>findCutPoint2,findTurnStartIndex:()=>findTurnStartIndex2,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize,formatSkillsForPrompt:()=>formatSkillsForPrompt,generateBranchSummary:()=>generateBranchSummary2,generateDiffString:()=>generateDiffString2,generateSummary:()=>generateSummary2,generateSummaryWithUsage:()=>generateSummaryWithUsage2,generateUnifiedPatch:()=>generateUnifiedPatch2,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage2,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,handoffHost:()=>handoffHost,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isToolCallEventType:()=>isToolCallEventType,isTransportGoneError:()=>isTransportGoneError,isWriteToolResult:()=>isWriteToolResult,kernelToolsStorage:()=>kernelToolsStorage,keyHint:()=>keyHint,keyText:()=>keyText,loadHostLaunchSpec:()=>loadHostLaunchSpec,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills2,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,noticeEntryRenderer:()=>noticeEntryRenderer,noticeMessageRenderer:()=>noticeMessageRenderer,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter3,parseHostLaunchSpec:()=>parseHostLaunchSpec,parseHostProtocolInfo:()=>parseHostProtocolInfo,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries2,probeHost:()=>probeHost,rawKeyHint:()=>rawKeyHint,readHostStatus:()=>readHostStatus,readStoredCredential:()=>readStoredCredential,registerReadClassifier:()=>registerReadClassifier,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runHostCommand:()=>runHostCommand,runHostRequest:()=>runHostRequest,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,sanitizeTerminalLabel:()=>sanitizeTerminalLabel,serializeConversation:()=>serializeConversation2,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shouldCompact:()=>shouldCompact2,stopHost:()=>stopHost,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,truncateToVisualLines:()=>truncateToVisualLines,withFileMutationQueue:()=>withFileMutationQueue2,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync3,mkdirSync as mkdirSync2,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync2,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname5,join as join5}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve42,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value2=>{settled||(settled=!0,cleanup(),resolve42(value2))},error2=>{settled||(settled=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join5(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname5(this.authPath);existsSync3(dir)||mkdirSync2(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync3(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync3(this.authPath)&&chmodSync(temporary,statSync2(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path13){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path13,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path13,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release3;try{release3=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release3&&release3()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let release3=await import_proper_lockfile.default.lock(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onCompromised});return signal?.aborted&&(await release3(),signal.throwIfAborted()),release3}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve42=>setTimeout(resolve42,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release3,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release3=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release3)try{await release3()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join5(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);let value2=credential;if(value2.type==="api_key"){let validKey=value2.key===void 0||typeof value2.key=="string",validEnv=value2.env===void 0||typeof value2.env=="object"&&value2.env!==null&&!Array.isArray(value2.env)&&Object.values(value2.env).every(entry=>typeof entry=="string");if(validKey&&validEnv)continue}else if(value2.type==="oauth"&&typeof value2.access=="string"&&typeof value2.refresh=="string"&&typeof value2.expires=="number"&&Number.isFinite(value2.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}return this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);if(options?.signal?.throwIfAborted(),!!credential)return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath){let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join5(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data);return{data:migrated.data,repaired:repaired.repaired,migrated:migrated.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync3(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS)}updateReadState(data,revision){this.data=data,this.readState.data=data,this.readState.revision=revision}reload(){let data={},revision;try{this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision)}catch(error2){this.recordError(error2 instanceof Error?error2:new Error(String(error2)))}}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch{return options?.signal?.throwIfAborted(),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),credential?.type!=="api_key"||credential.key===void 0?credential:{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value2=>{if(value2===void 0)throw new Error("Login cancelled");return value2});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join5(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{EventEmitter}from"node:events";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var providerScopeStorage=new AsyncLocalStorage2,ProviderScope=class{constructor(){this.overlay=new Map,this.imagesOverlay=new Map,this.state="active"}close(){this.state="closed",this.overlay.clear(),this.imagesOverlay.clear()}};installProviderScopeAccessor(()=>providerScopeStorage.getStore());installImagesProviderScopeAccessor(()=>providerScopeStorage.getStore());function activeProviderScope(){return providerScopeStorage.getStore()}function runWithProviderScope(scope,fn){if(scope.state==="closed")throw new Error("Provider scope is closed");return providerScopeStorage.run(scope,fn)}function bindToProviderScope(fn){let scope=providerScopeStorage.getStore();if(!scope)throw new Error("No active provider scope to bind");return(...args)=>runWithProviderScope(scope,()=>fn(...args))}var EXTENSION_RPC_EVENT_CHANNEL="senpi:extension-rpc-event";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let scopedHandler=bindHandler(handler),safeHandler=async data=>{try{await scopedHandler(data)}catch(err2){console.error(`Event handler error (${channel}):`,err2)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}function bindHandler(handler){try{return bindToProviderScope(handler)}catch{return handler}}import{AsyncLocalStorage as AsyncLocalStorage3}from"node:async_hooks";var kernelToolsStorage=new AsyncLocalStorage3;var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text2){return{render(width){return wrapTextWithAnsi(text2,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec,options,theme2){let box2=new Box(1,1,text2=>theme2.bg("customMessageBg",text2));box2.addChild(noticeText(theme2.fg(spec.tone??"accent",`${BOLD}${spec.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec.why)));for(let line of spec.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec=map(message);return spec===void 0?void 0:buildNoticeBox(spec,options,theme2)}}function noticeEntryRenderer(map){return(entry,options,theme2)=>{let spec=map(entry);return spec===void 0?void 0:buildNoticeBox(spec,options,theme2)}}import{join as join8}from"node:path";import{dirname as dirname6,join as join7}from"node:path";import{readFileSync as readFileSync7}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(typebox_exports.String({minLength:1}))},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1}),PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean())}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),cost:typebox_exports.Optional(ModelCostSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(typebox_exports.String({minLength:1})),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);import{chmodSync as chmodSync2,existsSync as existsSync4,readFileSync as readFileSync6,renameSync as renameSync3,rmSync as rmSync2,statSync as statSync3,writeFileSync as writeFileSync4}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord5=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2),JsoncSpanScanner=class{constructor(text2){this.text=text2}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
693
|
+
`)}function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneLine(text2){if(text2===void 0)return;let collapsed=text2.replace(/\s+/g," ").trim();if(collapsed.length!==0)return collapsed.length<=160?collapsed:`${collapsed.slice(0,157)}...`}function compactParameters(parameters){if(isRecord4(parameters))try{return JSON.stringify(parameters)}catch(error2){if(error2 instanceof TypeError)return;throw error2}}var ToolSearchService=class{#runtime;#feeds=new Map;#extensionDocs=[];#extensionFingerprint="";#registryGeneration=0;#historyScannedGeneration=-1;#registerToolSearch;#removedToolHints=()=>({});constructor(runtime){this.#runtime=runtime,this.#feeds.set("extension",{docs:[],hooks:{activate:names=>this.#promoteExtensionTools(names)}})}#nativeInjectionFailure=null;noteNativeInjectionFailure(reason){this.#nativeInjectionFailure=reason}takeNativeInjectionFailure(){let reason=this.#nativeInjectionFailure;return this.#nativeInjectionFailure=null,reason}bindRuntime(runtime){this.#runtime=runtime}bindActivationRuntime(runtime){this.#runtime={...this.#runtime,...runtime}}bindToolRegistrar(register){this.#registerToolSearch=register}bindRemovedToolHints(provider){this.#removedToolHints=provider}hiddenToolHints(query){let hints=this.#removedToolHints(),byNormalizedName=new Map(Object.entries(hints).map(([name,hint])=>[normalizeToolName(name),{hint,name}]));if(byNormalizedName.size===0)return[];let seen=new Set,matched=[];for(let candidate of[normalizeToolName(query),...tokenizeToolText(query)]){let entry=byNormalizedName.get(candidate);entry===void 0||seen.has(entry.name)||(seen.add(entry.name),matched.push(entry))}return matched}getToolParameters(name){return this.#runtime.getAllTools().find(tool=>tool.name===name)?.parameters}beginSession(){this.#feeds.delete("mcp"),this.#registryGeneration+=1,this.#historyScannedGeneration=-1,this.#refreshExtensionDocs(),this.#syncToolSearchLifecycle()}feed(source,docs,hooks){let validDocs=docs.filter(doc=>isValidDocument(doc,source));this.#feeds.set(source,{docs:validDocs,hooks}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle()}getCatalog(){return this.#refreshExtensionDocs(),[...this.#feeds.get("mcp")?.docs??[],...this.#extensionDocs]}search(query,limit=10,options={}){return buildBm25Index(this.getCatalog()).search(query,limit,{precision:DEFAULT_BM25_PRECISION,...options})}activate(matches){let namesBySource=new Map;for(let match of matches){let names=namesBySource.get(match.doc.source)??[];names.push(match.name),namesBySource.set(match.doc.source,names)}for(let[source,names]of namesBySource)this.#feeds.get(source)?.hooks.activate(names);let active=new Set(this.#runtime.getActiveTools());return matches.map(({name})=>name).filter(name=>active.has(name))}activateTool(name){let doc=this.getCatalog().find(candidate=>candidate.name===name);return doc===void 0?!1:(this.#feeds.get(doc.source)?.hooks.activate([name]),this.#runtime.getActiveTools().includes(name))}maybeRehydrateFromHistory(messages){let catalog=this.getCatalog();if(this.#historyScannedGeneration===this.#registryGeneration)return[];this.#historyScannedGeneration=this.#registryGeneration;let docsByName=new Map(catalog.map(doc=>[doc.name,{name:doc.name,registrationId:doc.registrationId,source:doc.source,allowLazyActivation:!0}])),restored=rehydrate(messages,docsByName);return restored.length>0&&this.#activateNames(restored,catalog),restored}#refreshExtensionDocs(){let docs=this.#runtime.getAllTools().filter(tool=>tool.exposure==="search"&&tool.allowLazyActivation).map(extensionDocument).filter(doc=>doc!==void 0).sort((left,right)=>left.name.localeCompare(right.name)),fingerprint=JSON.stringify(docs);fingerprint!==this.#extensionFingerprint&&(this.#extensionDocs=docs,this.#extensionFingerprint=fingerprint,this.#feeds.set("extension",{docs,hooks:{activate:names=>this.#promoteExtensionTools(names)}}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle())}#activateNames(names,catalog=this.getCatalog()){let sourceByName=new Map(catalog.map(doc=>[doc.name,doc.source])),namesBySource=new Map;for(let name of names){let source=sourceByName.get(name);if(source===void 0)continue;let sourceNames=namesBySource.get(source)??[];sourceNames.push(name),namesBySource.set(source,sourceNames)}for(let[source,sourceNames]of namesBySource)this.#feeds.get(source)?.hooks.activate(sourceNames)}#syncToolSearchLifecycle(){let hasDocuments=this.#extensionDocs.length>0||(this.#feeds.get("mcp")?.docs.length??0)>0;hasDocuments&&this.#registerToolSearch?.();let current=this.#runtime.getActiveTools(),isActive2=current.includes(TOOL_SEARCH_TOOL_NAME);hasDocuments!==isActive2&&this.#runtime.setActiveTools(hasDocuments?[...current,TOOL_SEARCH_TOOL_NAME]:current.filter(name=>name!==TOOL_SEARCH_TOOL_NAME))}#promoteExtensionTools(names){if(names.length===0)return;let current=this.#runtime.getActiveTools(),active=new Set(current),added=[...new Set(names.filter(name=>!active.has(name)))].sort();this.#runtime.setActiveTools([...current,...added])}};function extensionDocument(tool){if(tool.name.length===0)return;let ownerLabel=extensionOwnerLabel(tool),registrationId=deriveExtensionRegistrationId(tool.sourceInfo,tool.name);if(registrationId.length!==0)return{name:tool.name,label:tool.label,aliases:[],description:tool.description,searchText:tool.searchText,keywords:tool.searchKeywords,source:"extension",group:tool.searchGroup??ownerLabel,ownerLabel,registrationId}}function extensionOwnerLabel(tool){let fileName=basename4(tool.sourceInfo.path),extension=extname(fileName);return extension.length===0?fileName:fileName.slice(0,-extension.length)}function isValidDocument(doc,source){return doc.source===source&&doc.name.length>0&&doc.registrationId.length>0}var scopedService=new AsyncLocalStorage,service=null;function installScopedToolSearchService(value2){scopedService.enterWith(value2)}function getToolSearchService(runtime){let scoped=scopedService.getStore();if(scoped!==void 0)return runtime!==void 0&&scoped.bindRuntime(runtime),scoped;if(service===null){if(runtime===void 0)throw new Error("ToolSearchService runtime is not bound");service=new ToolSearchService(runtime)}else runtime!==void 0&&service.bindRuntime(runtime);return service}import*as fs3 from"node:fs";import{createRequire as createRequire4}from"node:module";import*as path9 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";var oauth_exports={};__export(oauth_exports,{loadAnthropicOAuth:()=>loadAnthropicOAuth,registerBundledOAuthFlowLoaders:()=>registerBundledOAuthFlowLoaders});var dist_exports3={};__export(dist_exports3,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS2,DEFAULT_HOST_LAUNCH_SPEC:()=>DEFAULT_HOST_LAUNCH_SPEC,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,GENERATION_HANDOFF_CAPABILITY:()=>GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR:()=>HOST_EXIT_ERROR,HOST_EXIT_FALLBACK:()=>HOST_EXIT_FALLBACK,HOST_EXIT_OK:()=>HOST_EXIT_OK,HOST_EXIT_REFUSED:()=>HOST_EXIT_REFUSED,HOST_EXIT_USAGE:()=>HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION:()=>HOST_PROTOCOL_VERSION,HostEnsureRefusedError:()=>HostEnsureRefusedError,HostLaunchSpecError:()=>HostLaunchSpecError,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,PINNED_HOST_CLIENT_CAPABILITIES:()=>PINNED_HOST_CLIENT_CAPABILITIES,ProjectTrustStore:()=>ProjectTrustStore,REQUIRED_HOST_CAPABILITIES:()=>REQUIRED_HOST_CAPABILITIES,RpcClient:()=>RpcClient,RpcClientOpenInFlightError:()=>RpcClientOpenInFlightError,RpcTransportGoneError:()=>RpcTransportGoneError,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,buildContextEntries:()=>buildContextEntries,buildNoticeBox:()=>buildNoticeBox,buildSessionContext:()=>buildSessionContext,calculateContextTokens:()=>calculateContextTokens2,classifyRead:()=>classifyRead,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary2,compact:()=>compact2,compareEngineOrdinal:()=>compareEngineOrdinal,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool2,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool2,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createHostDaemonPaths:()=>createHostDaemonPaths,createLocalBashOperations:()=>createLocalBashOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool2,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool2,createWriteToolDefinition:()=>createWriteToolDefinition,daemonDirectoryName:()=>daemonDirectoryName,decideHostAction:()=>decideHostAction,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,engineBuildIdentity:()=>engineBuildIdentity,engineBuildIdentityFrom:()=>engineBuildIdentityFrom,ensureHost:()=>ensureHost,estimateTokens:()=>estimateTokens2,findCutPoint:()=>findCutPoint2,findTurnStartIndex:()=>findTurnStartIndex2,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize,formatSkillsForPrompt:()=>formatSkillsForPrompt,generateBranchSummary:()=>generateBranchSummary2,generateDiffString:()=>generateDiffString2,generateSummary:()=>generateSummary2,generateSummaryWithUsage:()=>generateSummaryWithUsage2,generateUnifiedPatch:()=>generateUnifiedPatch2,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage2,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,handoffHost:()=>handoffHost,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isToolCallEventType:()=>isToolCallEventType,isTransportGoneError:()=>isTransportGoneError,isWriteToolResult:()=>isWriteToolResult,kernelToolsStorage:()=>kernelToolsStorage,keyHint:()=>keyHint,keyText:()=>keyText,loadHostLaunchSpec:()=>loadHostLaunchSpec,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills2,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,noticeEntryRenderer:()=>noticeEntryRenderer,noticeMessageRenderer:()=>noticeMessageRenderer,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter3,parseHostLaunchSpec:()=>parseHostLaunchSpec,parseHostProtocolInfo:()=>parseHostProtocolInfo,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries2,probeHost:()=>probeHost,rawKeyHint:()=>rawKeyHint,readHostStatus:()=>readHostStatus,readStoredCredential:()=>readStoredCredential,registerReadClassifier:()=>registerReadClassifier,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runHostCommand:()=>runHostCommand,runHostRequest:()=>runHostRequest,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,sanitizeTerminalLabel:()=>sanitizeTerminalLabel,serializeConversation:()=>serializeConversation2,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shardKey:()=>shardKey,shardSocketPath:()=>shardSocketPath,shardSocketPathForKey:()=>shardSocketPathForKey,shouldCompact:()=>shouldCompact2,stopHost:()=>stopHost,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,truncateToVisualLines:()=>truncateToVisualLines,withFileMutationQueue:()=>withFileMutationQueue2,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync3,mkdirSync as mkdirSync2,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync2,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname5,join as join5}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve42,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value2=>{settled||(settled=!0,cleanup(),resolve42(value2))},error2=>{settled||(settled=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join5(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname5(this.authPath);existsSync3(dir)||mkdirSync2(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync3(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync3(this.authPath)&&chmodSync(temporary,statSync2(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path13){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path13,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path13,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release3;try{release3=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release3&&release3()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let release3=await import_proper_lockfile.default.lock(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onCompromised});return signal?.aborted&&(await release3(),signal.throwIfAborted()),release3}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve42=>setTimeout(resolve42,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release3,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release3=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release3)try{await release3()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join5(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);let value2=credential;if(value2.type==="api_key"){let validKey=value2.key===void 0||typeof value2.key=="string",validEnv=value2.env===void 0||typeof value2.env=="object"&&value2.env!==null&&!Array.isArray(value2.env)&&Object.values(value2.env).every(entry=>typeof entry=="string");if(validKey&&validEnv)continue}else if(value2.type==="oauth"&&typeof value2.access=="string"&&typeof value2.refresh=="string"&&typeof value2.expires=="number"&&Number.isFinite(value2.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}return this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);if(options?.signal?.throwIfAborted(),!!credential)return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath){let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join5(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data);return{data:migrated.data,repaired:repaired.repaired,migrated:migrated.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync3(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS)}updateReadState(data,revision){this.data=data,this.readState.data=data,this.readState.revision=revision}reload(){let data={},revision;try{this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision)}catch(error2){this.recordError(error2 instanceof Error?error2:new Error(String(error2)))}}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch{return options?.signal?.throwIfAborted(),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),credential?.type!=="api_key"||credential.key===void 0?credential:{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value2=>{if(value2===void 0)throw new Error("Login cancelled");return value2});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join5(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{EventEmitter}from"node:events";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var providerScopeStorage=new AsyncLocalStorage2,ProviderScope=class{constructor(){this.overlay=new Map,this.imagesOverlay=new Map,this.state="active"}close(){this.state="closed",this.overlay.clear(),this.imagesOverlay.clear()}};installProviderScopeAccessor(()=>providerScopeStorage.getStore());installImagesProviderScopeAccessor(()=>providerScopeStorage.getStore());function activeProviderScope(){return providerScopeStorage.getStore()}function runWithProviderScope(scope,fn){if(scope.state==="closed")throw new Error("Provider scope is closed");return providerScopeStorage.run(scope,fn)}function bindToProviderScope(fn){let scope=providerScopeStorage.getStore();if(!scope)throw new Error("No active provider scope to bind");return(...args)=>runWithProviderScope(scope,()=>fn(...args))}var EXTENSION_RPC_EVENT_CHANNEL="senpi:extension-rpc-event";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let scopedHandler=bindHandler(handler),safeHandler=async data=>{try{await scopedHandler(data)}catch(err2){console.error(`Event handler error (${channel}):`,err2)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}function bindHandler(handler){try{return bindToProviderScope(handler)}catch{return handler}}import{AsyncLocalStorage as AsyncLocalStorage3}from"node:async_hooks";var kernelToolsStorage=new AsyncLocalStorage3;var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text2){return{render(width){return wrapTextWithAnsi(text2,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec,options,theme2){let box2=new Box(1,1,text2=>theme2.bg("customMessageBg",text2));box2.addChild(noticeText(theme2.fg(spec.tone??"accent",`${BOLD}${spec.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec.why)));for(let line of spec.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec=map(message);return spec===void 0?void 0:buildNoticeBox(spec,options,theme2)}}function noticeEntryRenderer(map){return(entry,options,theme2)=>{let spec=map(entry);return spec===void 0?void 0:buildNoticeBox(spec,options,theme2)}}import{join as join8}from"node:path";import{dirname as dirname6,join as join7}from"node:path";import{readFileSync as readFileSync7}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(typebox_exports.String({minLength:1}))},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1}),PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean())}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),cost:typebox_exports.Optional(ModelCostSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(typebox_exports.String({minLength:1})),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);import{chmodSync as chmodSync2,existsSync as existsSync4,readFileSync as readFileSync6,renameSync as renameSync3,rmSync as rmSync2,statSync as statSync3,writeFileSync as writeFileSync4}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord5=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2),JsoncSpanScanner=class{constructor(text2){this.text=text2}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
694
694
|
`||c==="\r"||c==="\uFEFF")i++;else if(this.text.startsWith("//",i))i=this.lineEnd(i);else if(this.text.startsWith("/*",i))i=this.blockCommentEnd(i);else break}return i}value(from){let start=this.skipTrivia(from),c=this.text[start];if(c==="{")return this.object(start);if(c==="[")return this.array(start);if(c==='"')return{start,end:this.stringEnd(start)};let end=start;for(;end<this.text.length&&!/[\s,\]}/]/.test(this.text[end]??"");)end++;if(end===start)throw new Error(`unexpected character at offset ${start}`);return{start,end}}object(start){let members=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="}")return{start,end:i+1,members};if(c===","){i++;continue}if(c!=='"')throw new Error(`expected a key at offset ${i}`);let keySpan={start:i,end:this.stringEnd(i)},colon=this.skipTrivia(keySpan.end);if(this.text[colon]!==":")throw new Error(`expected ':' at offset ${colon}`);let value2=this.value(colon+1);members.push({key:JSON.parse(this.text.slice(keySpan.start,keySpan.end)),keySpan,value:value2}),i=value2.end}}array(start){let elements=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="]")return{start,end:i+1,elements};if(c===","){i++;continue}let element=this.value(i);elements.push(element),i=element.end}}stringEnd(start){for(let i=start+1;i<this.text.length;i++)if(this.text[i]==="\\")i++;else if(this.text[i]==='"')return i+1;throw new Error("unterminated string")}blockCommentEnd(from){let close=this.text.indexOf("*/",from+2);if(close<0)throw new Error("unterminated comment");return close+2}lineEnd(from){let newline=this.text.indexOf(`
|
|
695
695
|
`,from);return newline<0?this.text.length:newline}},parseJsonc=content=>JSON.parse(stripJsonComments(stripBom(content)));function migratedDocument(document){let renamed=[],next={...document};if(isRecord5(document.providers)){let providers={};for(let[id,provider]of Object.entries(document.providers)){let canonical=normalizeProviderId(id);canonical!==id&&renamed.push(`${id} -> ${canonical}`),!(canonical!==id&&canonical in document.providers)&&(providers[canonical]=provider)}next.providers=providers}return Array.isArray(document.disabledProviders)&&(next.disabledProviders=document.disabledProviders.map(id=>typeof id!="string"||normalizeProviderId(id)===id?id:(renamed.push(`${id} -> ${normalizeProviderId(id)}`),normalizeProviderId(id)))),{next,renamed:[...new Set(renamed)]}}function memberRemovalSpan(text2,scanner,member){let after=scanner.skipTrivia(member.value.end);if(text2[after]===","){let start=member.keySpan.start;for(;start>0&&(text2[start-1]===" "||text2[start-1]===" ");)start--;let ownsLine=start===0||text2[start-1]===`
|
|
696
696
|
`,end=after+1;for(;end<text2.length&&(text2[end]===" "||text2[end]===" ");)end++;return ownsLine&&text2[end]==="\r"&&end++,ownsLine&&text2[end]===`
|
|
@@ -707,7 +707,7 @@ File: ${path13}`)}return _ModelConfig.parseAndMigrate(content,path13)}static loa
|
|
|
707
707
|
|
|
708
708
|
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,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){return models.find(model=>model.id===modelId)??(api?models.find(model=>model.api===api):void 0)??models.find(model=>model.api==="openai-completions")??models[0]}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>({...model,baseUrl:config.baseUrl??model.baseUrl,compat:mergeCompat(model.compat,config.compat)}));for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id)))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>{let defaults=findModelDefaults(models,definition.id,definition.api??config.api),api=definition.api??config.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return{...definition,api,provider:providerId,baseUrl,headers:void 0}}),...models.filter(model=>customModelIds.has(model.id)&&!declaredModels.some(definition=>definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),headers={...config?.modelOverrides?.[model.id]?.headers,...definition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getModels2=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=extension.oauth.modifyModels(models,extensionOAuthCredential)),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override?applyModelOverride(model,override):model})};getModels2();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model);if(format2&&context.tools&&context.tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,context.tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:getModels2,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;return cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options)),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value2=configuredApiKey(config,extension);if(value2===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value2))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value2);return names.length>0?isConfigValueConfigured(value2)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((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)&&isFiniteNumber2(value2.contextWindow)&&isFiniteNumber2(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)?isFiniteNumber2(value2.input)&&isFiniteNumber2(value2.output)&&isFiniteNumber2(value2.cacheRead)&&isFiniteNumber2(value2.cacheWrite):!1}function isFiniteNumber2(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(`
|
|
709
709
|
|
|
710
|
-
`):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-KZG4OVR7.js"),import("./state-store-5A2TZ4SG.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??[])})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}login(providerId,type2,interaction){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal});return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;if(composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.snapshot.storedProviders.has(providerId)||configuredRequestAuthStatus(this.config.getProvider(providerId),effective)?.configured){let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:effective.oauth&&!effective.apiKey?"oauth":"api_key",source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}return alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=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-k3",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 existsSync30,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync34,realpathSync as realpathSync8,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 join61,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.
|
|
710
|
+
`):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-ZVJEGA2G.js"),import("./state-store-5A2TZ4SG.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??[])})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}login(providerId,type2,interaction){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal});return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;if(composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.snapshot.storedProviders.has(providerId)||configuredRequestAuthStatus(this.config.getProvider(providerId),effective)?.configured){let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:effective.oauth&&!effective.apiKey?"oauth":"api_key",source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}return alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=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-k3",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 existsSync30,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync34,realpathSync as realpathSync8,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 join61,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.
|
|
711
711
|
`,HISTORICAL_SHIM_BANNERS=[`// Generated by senpi. Delete this file to stop loading the default global extension.
|
|
712
712
|
`,`// Generated by pi-coding-agent. Delete this file to stop loading the default global extension.
|
|
713
713
|
`],ACCEPTED_SHIM_BANNERS=[...new Set([GENERATED_SHIM_BANNER,...HISTORICAL_SHIM_BANNERS])],ACCEPTED_SHIM_BANNER_PREFIXES=[...new Set(ACCEPTED_SHIM_BANNERS.map(banner=>banner.split(".")[0]??banner).map(prefix=>`${prefix}.`))];function hasGeneratedShimBanner(content){return ACCEPTED_SHIM_BANNER_PREFIXES.some(prefix=>content.startsWith(prefix))}import{spawn}from"node:child_process";function openBrowser(target){let[cmd,args]=process.platform==="darwin"?["open",[target]]:process.platform==="win32"?["rundll32",["url.dll,FileProtocolHandler",target]]:["xdg-open",[target]];spawn(cmd,args,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}var LOGIN_CANCELLED_MESSAGE="Login cancelled",pendingLogins=new Map;function cancelledError(){return new Error(LOGIN_CANCELLED_MESSAGE)}function ownLoginController(providerId){let controller=new AbortController;return providerId===void 0||(pendingLogins.get(providerId)?.abort(cancelledError()),pendingLogins.set(providerId,controller),controller.signal.addEventListener("abort",()=>{pendingLogins.get(providerId)===controller&&pendingLogins.delete(providerId)},{once:!0})),controller}function createExtensionLoginInteraction(ctx,options){let openBrowser2=options.openBrowser??openBrowser,controller=ownLoginController(options.providerId);return{signal:controller.signal,prompt:prompt=>relayPrompt(ctx,controller,prompt),notify:event=>relayEvent(ctx,event,options.providerLabel,openBrowser2)}}function dialogSignal(loginSignal,promptSignal){return promptSignal?AbortSignal.any([loginSignal,promptSignal]):loginSignal}async function relayPrompt(ctx,login,prompt){let signal=dialogSignal(login.signal,prompt.signal);if(signal.aborted)throw cancelledError();let answer=await answerPrompt(ctx,prompt,{signal});if(signal.aborted)throw cancelledError();if(answer===void 0)throw login.abort(cancelledError()),cancelledError();return answer}async function answerPrompt(ctx,prompt,dialogOptions){switch(prompt.type){case"select":{let label3=await ctx.ui.select(prompt.message,prompt.options.map(option=>option.label),dialogOptions);return prompt.options.find(option=>option.label===label3)?.id}case"text":case"secret":case"manual_code":return ctx.ui.input(prompt.message,prompt.placeholder,dialogOptions)}}function relayEvent(ctx,event,providerLabel,openBrowser2){switch(event.type){case"auth_url":{ctx.mode==="tui"&&openBrowser2(event.url);let lines=[`Open this URL to authorize ${providerLabel}:`,event.url];event.instructions&&lines.push(event.instructions),ctx.ui.notify(lines.join(`
|
|
@@ -1123,8 +1123,8 @@ Objectives are limited to 4,000 characters. For longer instructions, put the ful
|
|
|
1123
1123
|
Replaces the current goal when it is complete and archives it; fails if an unfinished goal exists.`,parameters:typebox_exports.Object({objective:typebox_exports.String({description:"Required. The concrete objective to start pursuing. Limit: 4,000 characters. For longer instructions, put the full objective in a file and refer to that file."})},{additionalProperties:!1}),async execute(_toolCallId,params,_signal,_onUpdate,ctx){let ref=deps.goalStoreRef(ctx),current=await readGoal(ref);if(current!==null&¤t.status!=="complete")throw new Error("cannot create a new goal because this thread already has an unfinished goal; use update_goal only when the existing goal is complete");let validatedObjective=validateObjective(params.objective,objectiveFullTextFileName(ref)),goal=await createGoal(ref,params.objective);deps.beginAgentGoalAccounting(goal),deps.refreshGoalUi(ctx,goal);let notice2=validatedObjective.truncated?objectiveTruncationNotice(objectiveFullTextFileName(ref)):void 0;return toolText(formatGoalToolResponse(goal,notice2),goalToolRenderDetails(goal,notice2))},renderCall:(args,theme2)=>renderGoalToolCall("create_goal",args,theme2),renderResult:(result3,options,theme2)=>renderGoalToolResult(result3,options,theme2)}),pi.registerTool({name:"update_goal",label:"Update Goal",description:"Set the existing goal's status to `complete` or `blocked`; the completion audit and blocked audit in the goal continuation prompt decide which, and only a passing audit permits the call.\n`complete` is rejected while todo tasks are open, and stopping work is never by itself a reason to complete; after it succeeds, report the final elapsed time and token usage from the result to the user.\n`blocked` requires a non-empty `reason` (omit `reason` for `complete`), and is rejected while any resumption channel can still deliver, and again until the same blocker has survived three goal turns since the goal became active or the user last spoke; a user resume starts a fresh blocked audit.\nA missing user decision is a question for the question tool, not a blocked status, until the user fails to answer it. Retries themselves are unbounded.\nPausing and resuming are user or system actions, not this tool.",parameters:typebox_exports.Object({status:typebox_exports.Union(MODEL_SETTABLE_GOAL_STATUS_VALUES.map(status=>typebox_exports.Literal(status)),{description:"Required. Set to complete when achieved or blocked with a non-empty reason."}),reason:typebox_exports.Optional(typebox_exports.String({description:"Required and non-empty when status is blocked; rejected when status is complete."}))},{additionalProperties:!1}),async execute(_toolCallId,params,_signal,_onUpdate,ctx){let reason=typeof params.reason=="string"?params.reason.trim():void 0;if(params.status==="blocked"&&(reason===void 0||reason.length===0))throw new Error("reason is required when status is blocked");if(params.status==="complete"&&reason!==void 0&&reason.length>0)throw new Error("reason must not be provided when status is complete");if(params.status==="complete"){let openTasks=openTodoTaskContents(ctx.sessionManager.getBranch());if(openTasks.length>0)throw new Error(openTodoCompletionError(openTasks))}await deps.accountCurrentAgentTurn(ctx,"active");let goal=await updateGoal(deps.goalStoreRef(ctx),params.status==="blocked"?{status:"blocked",reason}:{status:"complete"},"model");return goal.status==="blocked"?deps.markGoalBlockedThisTurn(goal):deps.markGoalCompletedThisTurn(goal),deps.refreshGoalUi(ctx,goal),toolText(formatGoalToolResponse(goal),goalToolRenderDetails(goal))},renderCall:(args,theme2)=>renderGoalToolCall("update_goal",args,theme2),renderResult:(result3,options,theme2)=>renderGoalToolResult(result3,options,theme2)}),pi.registerTool({name:"get_goal",label:"Get Goal",description:"Get the current goal for this thread, including status, token and elapsed-time usage.",parameters:typebox_exports.Object({},{additionalProperties:!1}),async execute(_toolCallId,_params,_signal,_onUpdate,ctx){let goal=await deps.accountCurrentAgentTurn(ctx,"active");return deps.refreshGoalUi(ctx,goal),toolText(formatGoalToolResponse(goal),goalToolRenderDetails(goal))},renderCall:(args,theme2)=>renderGoalToolCall("get_goal",args,theme2),renderResult:(result3,options,theme2)=>renderGoalToolResult(result3,options,theme2)})}function toolText(text2,details){return{content:[{type:"text",text:text2}],details}}var STATUS_KEY2="goal",OBJECTIVE_PREVIEW_MAX_LENGTH=32;function truncateGoalObjective(objective,maxLength=OBJECTIVE_PREVIEW_MAX_LENGTH){let normalized2=objective.replace(/\s+/g," ").trim();return normalized2.length<=maxLength?normalized2:`${normalized2.slice(0,Math.max(0,maxLength-1)).trimEnd()}\u2026`}function updateGoalUi(ctx,goal,liveElapsedSeconds){ctx.hasUI&&ctx.ui.setStatus(STATUS_KEY2,goal===null?void 0:goalStatusText(goal,liveElapsedSeconds))}function goalStatusText(goal,liveElapsedSeconds){switch(goal.status){case"active":return liveElapsedSeconds!==void 0?`Pursuing goal (${formatGoalElapsedSeconds(liveElapsedSeconds)})`:goal.timeUsedSeconds>0?`Pursuing goal (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`:"Pursuing goal";case"paused":return"Goal paused (/goal resume)";case"blocked":return goal.blockedReason?`Goal blocked: ${goal.blockedReason}`:"Goal blocked";case"complete":{let elapsed=goal.timeUsedSeconds>0?` (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`:"";return`${truncateGoalObjective(goal.objective)} \xB7 Goal achieved${elapsed}`}}}var GOAL_WAIT_BAR_CELLS=12,FILLED_CELL="\u25B0",EMPTY_CELL="\u25B1",SOURCE_ORDER=["terminal-monitors","senpi-task","senpi-codemode","terminal-background-sessions"];function clampRatio(value2){return Number.isFinite(value2)?Math.min(1,Math.max(0,value2)):0}function renderGoalWaitBar(elapsedRatio){let filled=Math.round(clampRatio(elapsedRatio)*GOAL_WAIT_BAR_CELLS);return FILLED_CELL.repeat(filled)+EMPTY_CELL.repeat(GOAL_WAIT_BAR_CELLS-filled)}function elapsedRatioOf(remainingMs2,totalMs){return totalMs<=0?1:clampRatio((totalMs-Math.max(0,remainingMs2))/totalMs)}function sourceSortIndex(source){let index=SOURCE_ORDER.indexOf(source);return index<0?SOURCE_ORDER.length:index}function formatSourceCount(source,count){switch(source){case"terminal-monitors":return count===1?"1 wake source":`${count} wake sources`;case"senpi-task":return count===1?"1 task":`${count} tasks`;case"senpi-codemode":return count===1?"1 eval":`${count} evals`;case"terminal-background-sessions":return count===1?"1 bash":`${count} bash sessions`;default:{let label3=source.replaceAll("-"," ");return count===1?`1 ${label3}`:`${count} ${label3} channels`}}}function channelsOnDuty(channelCounts){return`${Object.entries(channelCounts).filter(([,count])=>count>0).sort(([left],[right])=>sourceSortIndex(left)-sourceSortIndex(right)||left.localeCompare(right)).map(([source,count])=>formatSourceCount(source,count)).join(" \xB7 ")} on duty`}function formatGoalWaitLabel(input){let bar=renderGoalWaitBar(elapsedRatioOf(input.remainingMs,input.totalMs)),remaining=formatWakeDuration(Math.max(0,input.remainingMs));return input.kind==="monitor"?`${bar} goal continues in ${remaining} \xB7 ${channelsOnDuty(input.channelCounts)}`:`${bar} goal resumes in ${remaining}`}var GOAL_WAIT_TICK_INTERVAL_MS=1e3,GOAL_WAIT_STATUS_KEY="goal-wait",GoalWaitTicker=class{constructor(options){this.dueAtMs=0,this.totalMs=0,this.channelCounts={},this.render=options.render,this.now=options.now??Date.now}get running(){return this.intervalId!==void 0}sync(ctx,input){if(this.ctx=ctx,this.kind=input.kind,this.dueAtMs=this.now()+Math.max(0,input.remainingMs),this.totalMs=input.totalMs,this.channelCounts={...input.channelCounts},this.lastRenderedStatus=void 0,this.tick(),this.intervalId!==void 0)return;let handle=setInterval(()=>this.tick(),GOAL_WAIT_TICK_INTERVAL_MS);handle.unref(),this.intervalId=handle}setChannelCounts(channelCounts){this.ctx===void 0||this.kind!=="monitor"||(this.channelCounts={...channelCounts},this.tick())}stop(){this.intervalId!==void 0&&(clearInterval(this.intervalId),this.intervalId=void 0);let ctx=this.ctx;if(this.ctx=void 0,this.kind=void 0,this.lastRenderedStatus=void 0,ctx!==void 0)try{this.render(ctx,void 0)}catch(error2){if(!isStaleExtensionContextError(error2))throw error2}}retire(){this.intervalId!==void 0&&(clearInterval(this.intervalId),this.intervalId=void 0),this.ctx=void 0,this.kind=void 0,this.lastRenderedStatus=void 0}tick(){if(!(this.ctx===void 0||this.kind===void 0))try{let status=this.ctx.isIdle()?formatGoalWaitLabel({kind:this.kind,remainingMs:Math.max(0,this.dueAtMs-this.now()),totalMs:this.totalMs,channelCounts:this.channelCounts}):void 0;if(status===this.lastRenderedStatus)return;this.lastRenderedStatus=status,this.render(this.ctx,status)}catch(error2){if(isStaleExtensionContextError(error2)){this.retire();return}throw error2}}};var RESUME_GOAL_CHOICE="Resume goal",LEAVE_GOAL_STOPPED_CHOICE="Leave stopped";function goalExtension(pi){let agentTurnInProgress=!1,staleGoalReminderSentThisTurn=!1,agentGoalAccounting=null,blockedThisTurnGoalId=null,completedThisTurnGoalId=null,continuationPending=!1,activeContext,turnUsage=new TurnUsageTracker,goalWaitTicker=new GoalWaitTicker({render:(renderCtx,status)=>renderCtx.ui.setStatus(GOAL_WAIT_STATUS_KEY,status)}),monitorContinuation=new MonitorAwareGoalContinuation(pi,()=>continuationPending,()=>{continuationPending=!0},goalWaitTicker),todoOwedBackstop=new TodoOwedBackstop(pi),directInputLifecycle=new GoalDirectInputLifecycle({monitor:monitorContinuation,goalStoreRef:goalStoreRef2,beginAgentGoalAccounting,refreshGoalUi:refreshGoalUiBestEffort,resumeAfterSuppressedLoad:(resumeCtx,goal)=>queueGoalContinuationForCurrentSession(pi,resumeCtx,goal),onAcceptedDirectInput:()=>todoOwedBackstop.resetChain()}),goalTicker=new GoalElapsedTicker({render:(renderCtx,renderGoal,live)=>updateGoalUi(renderCtx,renderGoal,live)});pi.registerEntryRenderer(GOAL_CACHE_WARMUP_ENTRY_TYPE,renderGoalCacheWarmupEntry,{replaces:isSameGoalCacheWarmCard}),registerGoalTools(pi,{goalStoreRef:ctx=>goalStoreRef(ctx.sessionManager,ctx.cwd),accountCurrentAgentTurn,beginAgentGoalAccounting:goal=>{monitorContinuation.noteContinuationStarted(),beginAgentGoalAccounting(goal)},markGoalBlockedThisTurn,markGoalCompletedThisTurn,refreshGoalUi}),registerGoalCommand(pi,{goalStoreRef:ctx=>goalStoreRef(ctx.sessionManager,ctx.cwd),accountCurrentAgentTurn,beginAgentGoalAccounting,stopAgentGoalAccounting,clearAgentGoalAccounting,queueGoalContinuation:(extensionApi,commandCtx,goal)=>{queueGoalContinuationForCurrentSession(extensionApi,commandCtx,goal)},refreshGoalUi});let unsubscribeGoalStoreChanged=pi.events?.on(GOAL_STORE_CHANGED_EVENT,async data=>{if(!isGoalStoreChangedEvent(data))return;let ctx=data.ctx??activeContext;if(ctx===void 0||ctx.sessionManager.getSessionId()!==data.threadId||!ctx.isIdle()||ctx.hasPendingMessages())return;let goal=await readGoal(goalStoreRef2(ctx));goal?.status==="active"&&(monitorContinuation.syncGoal(goal),beginAgentGoalAccounting(goal),refreshGoalUiBestEffort(ctx,goal),pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT,{goalId:goal.id,delayMs:0,activeMonitorCount:0,wakeSources:{},reason:GOAL_STORE_CHANGED_EVENT}),await queueGoalContinuationForCurrentSession(pi,ctx,goal))})??(()=>{});pi.on("session_start",async(event,ctx)=>{activeContext=ctx,monitorContinuation.start(ctx),directInputLifecycle.reset(),todoOwedBackstop.resetChain();let ref=goalStoreRef2(ctx);await migrateLegacyGoalFile(ref);let goal=await readGoal(goalStoreRef2(ctx));if(goal?.status==="active"?beginAgentGoalAccounting(goal):clearAgentGoalAccounting(),refreshGoalUi(ctx,goal),!await maybePromptResumeStoppedGoal(pi,ctx,event.reason,goal)){if(goal&&event.reason==="reload")await reengageGoalAfterReload({ctx,goal,monitor:monitorContinuation,countTrailingContinuations:()=>countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch()),queueContinuation:()=>queueGoalContinuationForCurrentSession(pi,ctx,goal)});else if(goal){let trailingContinuations=countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch());trailingContinuations>=GOAL_CONTINUATION_CAP?(directInputLifecycle.armSuppressedLoadResume(),ctx.ui.notify(`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,"info")):await queueGoalContinuationForCurrentSession(pi,ctx,goal)}}}),pi.on("session_tree",async()=>{todoOwedBackstop.resetChain()}),pi.on("input",async(event,ctx)=>{await directInputLifecycle.onInput(event,ctx)}),pi.on("input_disposition",async(event,ctx)=>{await directInputLifecycle.onDisposition(event,ctx)}),pi.on("turn_start",async()=>{staleGoalReminderSentThisTurn=!1}),pi.on("tool_result",async(event,ctx)=>{if(event.toolName!=="todo"||event.isError||staleGoalReminderSentThisTurn||!todoResultAddsOpenTasks(event.details))return;let reminder=staleGoalTodoReminder(await readGoal(goalStoreRef2(ctx)));if(reminder!==void 0)return staleGoalReminderSentThisTurn=!0,{content:[...event.content,{type:"text",text:reminder}]}}),pi.on("agent_start",async(_event,ctx)=>{let continuationStarted=continuationPending;continuationPending=!1,continuationStarted&&monitorContinuation.noteContinuationStarted(),agentTurnInProgress=!0,blockedThisTurnGoalId=null,completedThisTurnGoalId=null,turnUsage.reset();let goal=await readGoal(goalStoreRef2(ctx));goal?.status==="active"?beginAgentGoalAccounting(goal):agentGoalAccounting=null}),pi.on("message_start",async(event,ctx)=>{if(event.message.role!=="custom"||event.message.customType!==MANUAL_CONTINUE_CUSTOM_TYPE)return;let ref=goalStoreRef2(ctx);(await readGoal(ref))?.status==="blocked"&&syncContinuationGoal(ctx,await updateGoal(ref,{status:"active"},"user"))}),pi.on("message_end",async event=>{turnUsage.noteMessageEnd(event.message)}),pi.on("agent_end",async(event,ctx)=>{let goal=await accountCurrentAgentTurn(ctx,blockedThisTurnGoalId!==null?"activeOrBlocked":completedThisTurnGoalId===null?"active":"activeOrComplete",event.messages);agentTurnInProgress=!1,blockedThisTurnGoalId=null,completedThisTurnGoalId=null,event.aborted===!0&&event.abortSource==="user"&&goal?.status==="active"&&(goal=await updateGoal(goalStoreRef2(ctx),{status:"blocked",reason:"user interrupted the turn"},"model")),goal?.status==="active"?beginAgentGoalAccounting(goal):clearAgentGoalAccounting(),refreshGoalUiBestEffort(ctx,goal);let continuationGoal=await continueGoalAfterAgentEnd(monitorContinuation,{ctx,event,goal});continuationGoal!==goal&&(goal=continuationGoal,syncContinuationGoal(ctx,goal)),todoOwedBackstop.afterAgentEnd({ctx,event,goal,continuationPending,hasActiveWakeSources:monitorContinuation.hasActiveWakeSources()})}),pi.on("agent_settled",async(_event,ctx)=>{let goal=await monitorContinuation.afterAgentSettled();goal!==void 0&&syncContinuationGoal(ctx,goal)}),pi.on("session_abort",async(_event,ctx)=>{if(continuationPending=!1,(await readGoal(goalStoreRef2(ctx)))?.status!=="active")return;if((await accountCurrentAgentTurn(ctx,"active"))?.status==="active"){let blocked=await updateGoal(goalStoreRef2(ctx),{status:"blocked",reason:"user interrupted the turn"},"model");clearAgentGoalAccounting(),refreshGoalUiBestEffort(ctx,blocked)}}),pi.on("session_shutdown",async(_event,ctx)=>{activeContext=void 0,unsubscribeGoalStoreChanged(),agentGoalAccounting!==null&&await accountCurrentAgentTurn(ctx,"active"),clearAgentGoalAccounting(),goalTicker.stop(),monitorContinuation.dispose()});async function maybePromptResumeStoppedGoal(pi2,ctx,sessionStartReason,goal){if(!isResumeOfStoppedGoal(ctx,sessionStartReason,goal))return!1;if(ctx.mode==="rpc")return ctx.ui.notify(`Goal remains ${goal.status} after session resume. Resume it explicitly after the session finishes loading.`,"info"),!0;if(await ctx.ui.select(`Resume ${goal.status} goal?
|
|
1124
1124
|
Goal: ${goal.objective}`,[RESUME_GOAL_CHOICE,LEAVE_GOAL_STOPPED_CHOICE])!==RESUME_GOAL_CHOICE)return!0;let resumed=await updateGoal(goalStoreRef2(ctx),{status:"active"},"user");return beginAgentGoalAccounting(resumed),refreshGoalUi(ctx,resumed),ctx.ui.notify(`Goal ${goalStatusLabel(resumed.status)}
|
|
1125
1125
|
${formatGoalForTool(resumed)}`,"info"),await queueGoalContinuationForCurrentSession(pi2,ctx,resumed),!0}async function queueGoalContinuationForCurrentSession(extensionApi,ctx,goal){let continuedGoal=await queueGoalContinuation(extensionApi,ctx,goal,{continuationPending,markContinuationPending:()=>{continuationPending=!0}});if(continuedGoal===null){clearAgentGoalAccounting(),refreshGoalUiBestEffort(ctx,null);return}continuedGoal.status!==goal.status&&(continuedGoal.status==="active"?beginAgentGoalAccounting(continuedGoal):clearAgentGoalAccounting(),refreshGoalUiBestEffort(ctx,continuedGoal))}function beginAgentGoalAccounting(goal){goal.status==="active"&&agentGoalAccounting?.goalId!==goal.id&&(turnUsage.discardPending(),agentGoalAccounting={goalId:goal.id,measuredFromMilliseconds:Date.now()})}function markGoalBlockedThisTurn(goal){agentTurnInProgress&&(blockedThisTurnGoalId=goal.id)}function markGoalCompletedThisTurn(goal){agentTurnInProgress&&(completedThisTurnGoalId=goal.id,agentGoalAccounting={goalId:goal.id,measuredFromMilliseconds:Date.now()})}function stopAgentGoalAccounting(goalId){agentGoalAccounting?.goalId===goalId&&(agentGoalAccounting=null),blockedThisTurnGoalId===goalId&&(blockedThisTurnGoalId=null),completedThisTurnGoalId===goalId&&(completedThisTurnGoalId=null)}function clearAgentGoalAccounting(){agentGoalAccounting=null,blockedThisTurnGoalId=null,completedThisTurnGoalId=null}function syncContinuationGoal(ctx,goal){goal?.status==="active"?beginAgentGoalAccounting(goal):clearAgentGoalAccounting(),refreshGoalUiBestEffort(ctx,goal)}function refreshGoalUi(ctx,goal){monitorContinuation.syncGoal(goal);let accounting=agentGoalAccounting;if(ctx.hasUI&&goal?.status==="active"&&accounting?.goalId===goal.id){goalTicker.sync(ctx,goal,accounting.measuredFromMilliseconds);return}goalTicker.stop(),updateGoalUi(ctx,goal)}function refreshGoalUiBestEffort(ctx,goal){try{refreshGoalUi(ctx,goal)}catch(error2){if(isStaleExtensionContextError(error2))return;throw error2}}async function accountCurrentAgentTurn(ctx,mode,agentRunMessages){let accounting=agentGoalAccounting,ref=goalStoreRef2(ctx);if(accounting===null)return readGoal(ref);let usage3=agentRunMessages===void 0?turnUsage.takePending():turnUsage.takeRemaining(agentRunMessages),now2=Date.now(),elapsedSeconds=Math.max(0,Math.round((now2-accounting.measuredFromMilliseconds)/1e3)),goal=await accountGoalUsage(ref,usage3,elapsedSeconds,mode,accounting.goalId);return goal?.id===accounting.goalId?agentGoalAccounting={goalId:accounting.goalId,measuredFromMilliseconds:now2}:clearAgentGoalAccounting(),goal}}function countTrailingGoalContinuationEntries(entries){let count=0;for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type==="message"&&entry.message.role==="user")break;entry?.type==="custom_message"&&entry.customType===GOAL_CONTINUATION_MESSAGE_TYPE&&(count+=1)}return count}function goalStoreRef2(ctx){return goalStoreRef(ctx.sessionManager,ctx.cwd)}var CHATGPT_SUBSCRIPTION_PROVIDER_ID="chatgpt-subscription",CHATGPT_SUBSCRIPTION_PROVIDER_LABEL="ChatGPT Subscription OAuth";function parseArgs5(rawArgs){return rawArgs.trim().split(/\s+/).filter(Boolean)}function usage2(ctx){ctx.ui.notify("Usage: /gpt-account [add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]","error")}async function showAccounts4(ctx){let accounts=await getCredentialAccounts(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID),lines=["ChatGPT Subscription OAuth accounts:"];accounts.length===0&&lines.push(" (none)");for(let account of accounts){let states2=[accountLabel(account),account.source,account.blocked?"blocked":"available"];account.pinned&&states2.push("pinned"),lines.push(` ${states2.join(" | ")}`)}ctx.ui.notify(lines.join(`
|
|
1126
|
-
`),"info")}async function addAccount5(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/gpt-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(CHATGPT_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:CHATGPT_SUBSCRIPTION_PROVIDER_LABEL,providerId:CHATGPT_SUBSCRIPTION_PROVIDER_ID,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(CHATGPT_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("ChatGPT Subscription OAuth account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);if(message===LOGIN_CANCELLED_MESSAGE)return;ctx.ui.notify(message,"error")}}async function removeAccount2(ctx,name){if(!name){usage2(ctx);return}await removeCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed ChatGPT Subscription OAuth account '${name}'.`,"info")}async function pinAccount2(ctx,name){if(!name){usage2(ctx);return}await pinCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned ChatGPT Subscription OAuth account '${name}'.`,"info")}function gptAccountExtension(pi,deps={}){pi.registerCommand("gpt-account",{description:"List and manage ChatGPT Subscription OAuth accounts.",argumentHint:"[add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]",handler:async(rawArgs,ctx)=>{if(await accountDisplayNameCommand(ctx,CHATGPT_SUBSCRIPTION_PROVIDER_ID,rawArgs))return;let args=parseArgs5(rawArgs),action=args[0]??"list";try{if(action==="list"){await showAccounts4(ctx);return}if(action==="add"){await addAccount5(ctx,deps);return}if(action==="remove"){await removeAccount2(ctx,args[1]);return}if(action==="pin"&&args[1]!=="unpin"){await pinAccount2(ctx,args[1]);return}if(action==="unpin"||action==="pin"&&args[1]==="unpin"){await pinCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned ChatGPT Subscription OAuth account.","info");return}usage2(ctx)}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}})}var BUILTIN_SLASH_COMMANDS=[{name:"settings",description:"Open settings menu"},{name:"model",description:"Select model (opens selector UI)",argumentHint:"<provider/model>"},{name:"tree",description:"Navigate session tree (switch branches)"},{name:"thinking",description:"Set thinking level",argumentHint:"<level>"},{name:"scoped-models",description:"Enable/disable models for Ctrl+P cycling"},{name:"favorite-models",description:"Manage favorite models for Ctrl+P cycling"},{name:"export",description:"Export session (HTML default, or specify path: .html/.jsonl)"},{name:"import",description:"Import and resume a session from a JSONL file"},{name:"share",description:"Share session as a secret GitHub gist"},{name:"copy",description:"Copy last agent message to clipboard"},{name:"rename",description:"Rename the current session",argumentHint:"[name]"},{name:"name",description:"Alias of /rename (set session display name)"},{name:"session",description:"Show session info and stats"},{name:"changelog",description:"Show changelog entries"},{name:"hotkeys",description:"Show all keyboard shortcuts"},{name:"fork",description:"Create a new fork from a previous user message"},{name:"clone",description:"Duplicate the current session at the current position"},{name:"trust",description:"Save project trust decision for future sessions"},{name:"login",description:"Configure provider authentication",argumentHint:"<provider>"},{name:"logout",description:"Remove provider authentication"},{name:"new",description:"Start a new session"},{name:"compact",description:"Manually compact the session context"},{name:"resume",description:"Resume a different session"},{name:"reload",description:"Reload keybindings, extensions, skills, prompts, themes, and context files"},{name:"quit",description:`Quit ${APP_NAME}`},{name:"exit",description:`Quit ${APP_NAME} (alias of /quit)`}];var KEYBINDING_GROUPS=[{prefix:"tui.editor.",heading:"Editor"},{prefix:"tui.input.",heading:"Input"},{prefix:"tui.select.",heading:"Selection"},{prefix:"tui.altScreen.",heading:"Alt Screen"},{prefix:"app.",heading:"Application"}];function escapeTableCell(value2){return value2.replaceAll("|","\\|").replaceAll(`
|
|
1127
|
-
`," ")}function buildGettingStarted(){let submit=keyDisplayText("tui.input.submit"),newLine=keyDisplayText("tui.input.newLine"),pasteImage=keyDisplayText("app.clipboard.pasteImage"),followUp=keyDisplayText("app.message.followUp");return[`- Press \`${submit}\` to submit; use \`${newLine}\` to add a new line.`,"- Type `!` to run bash, or `!!` to run bash without adding the command or output to context.","- Type `/` for commands.","- Drop files into the terminal to attach them.",`- Press \`${pasteImage}\` to paste an image, with text fallback.`,`- Press \`${followUp}\` to queue a follow-up message.`,"- Press `?` on an empty input to show the shortcut overlay."].join(`
|
|
1126
|
+
`),"info")}async function addAccount5(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/gpt-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(CHATGPT_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:CHATGPT_SUBSCRIPTION_PROVIDER_LABEL,providerId:CHATGPT_SUBSCRIPTION_PROVIDER_ID,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(CHATGPT_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("ChatGPT Subscription OAuth account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);if(message===LOGIN_CANCELLED_MESSAGE)return;ctx.ui.notify(message,"error")}}async function removeAccount2(ctx,name){if(!name){usage2(ctx);return}await removeCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed ChatGPT Subscription OAuth account '${name}'.`,"info")}async function pinAccount2(ctx,name){if(!name){usage2(ctx);return}await pinCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned ChatGPT Subscription OAuth account '${name}'.`,"info")}function gptAccountExtension(pi,deps={}){pi.registerCommand("gpt-account",{description:"List and manage ChatGPT Subscription OAuth accounts.",argumentHint:"[add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]",handler:async(rawArgs,ctx)=>{if(await accountDisplayNameCommand(ctx,CHATGPT_SUBSCRIPTION_PROVIDER_ID,rawArgs))return;let args=parseArgs5(rawArgs),action=args[0]??"list";try{if(action==="list"){await showAccounts4(ctx);return}if(action==="add"){await addAccount5(ctx,deps);return}if(action==="remove"){await removeAccount2(ctx,args[1]);return}if(action==="pin"&&args[1]!=="unpin"){await pinAccount2(ctx,args[1]);return}if(action==="unpin"||action==="pin"&&args[1]==="unpin"){await pinCredentialAccount(ctx.modelRegistry.authStorage,CHATGPT_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned ChatGPT Subscription OAuth account.","info");return}usage2(ctx)}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}})}var BUILTIN_SLASH_COMMANDS=[{name:"settings",description:"Open settings menu"},{name:"model",description:"Select model (opens selector UI)",argumentHint:"<provider/model>"},{name:"tree",description:"Navigate session tree (switch branches)"},{name:"thinking",description:"Set thinking level",argumentHint:"<level>"},{name:"scoped-models",description:"Enable/disable models for Ctrl+P cycling"},{name:"favorite-models",description:"Manage favorite models for Ctrl+P cycling"},{name:"export",description:"Export session (HTML default, or specify path: .html/.jsonl)"},{name:"import",description:"Import and resume a session from a JSONL file"},{name:"share",description:"Share session as a secret GitHub gist"},{name:"copy",description:"Copy last agent message to clipboard"},{name:"rename",description:"Rename the current session",argumentHint:"[name]"},{name:"name",description:"Alias of /rename (set session display name)"},{name:"session",description:"Show session info and stats"},{name:"changelog",description:"Show changelog entries"},{name:"hotkeys",description:"Show all keyboard shortcuts"},{name:"fork",description:"Create a new fork from a previous user message"},{name:"clone",description:"Duplicate the current session at the current position"},{name:"trust",description:"Save project trust decision for future sessions"},{name:"login",description:"Configure provider authentication",argumentHint:"<provider>"},{name:"logout",description:"Remove provider authentication"},{name:"new",description:"Start a new session"},{name:"compact",description:"Manually compact the session context"},{name:"resume",description:"Resume a different session"},{name:"sessions",description:"Alias of /resume (browse and resume past sessions)"},{name:"reload",description:"Reload keybindings, extensions, skills, prompts, themes, and context files"},{name:"quit",description:`Quit ${APP_NAME}`},{name:"exit",description:`Quit ${APP_NAME} (alias of /quit)`}];var KEYBINDING_GROUPS=[{prefix:"tui.editor.",heading:"Editor"},{prefix:"tui.input.",heading:"Input"},{prefix:"tui.select.",heading:"Selection"},{prefix:"tui.altScreen.",heading:"Alt Screen"},{prefix:"app.",heading:"Application"}];function escapeTableCell(value2){return value2.replaceAll("|","\\|").replaceAll(`
|
|
1127
|
+
`," ")}function buildGettingStarted(){let submit=keyDisplayText("tui.input.submit"),newLine=keyDisplayText("tui.input.newLine"),pasteImage=keyDisplayText("app.clipboard.pasteImage"),followUp=keyDisplayText("app.message.followUp"),cycleThinking=keyDisplayText("app.thinking.cycle");return[`- Press \`${submit}\` to submit; use \`${newLine}\` to add a new line.`,"- Type `!` to run bash, or `!!` to run bash without adding the command or output to context.","- Type `/` for commands.",`- Type \`/thinking <level>\` or press \`${cycleThinking}\` to change the thinking level.`,"- Type `/resume` (or `/sessions`) to reopen a past session.","- Drop files into the terminal to attach them.",`- Press \`${pasteImage}\` to paste an image, with text fallback.`,`- Press \`${followUp}\` to queue a follow-up message.`,"- Press `?` on an empty input to show the shortcut overlay."].join(`
|
|
1128
1128
|
`)}function buildKeybindingTables(){let rowsByPrefix=new Map(KEYBINDING_GROUPS.map(group=>[group.prefix,[]]));for(let[id,definition]of Object.entries(KEYBINDINGS)){let group=KEYBINDING_GROUPS.find(candidate=>id.startsWith(candidate.prefix));if(!group)throw new Error(`Unsupported keybinding group: ${id}`);let keys=keyDisplayText(id);if(!keys)continue;let rows=rowsByPrefix.get(group.prefix);if(!rows)throw new Error(`Missing keybinding group: ${group.prefix}`);rows.push(`| \`${escapeTableCell(keys)}\` | ${escapeTableCell(definition.description)} |`)}return KEYBINDING_GROUPS.map(group=>{let rows=rowsByPrefix.get(group.prefix)??[];return[`### ${group.heading}`,"| Key | Action |","|-----|--------|",...rows].join(`
|
|
1129
1129
|
`)}).join(`
|
|
1130
1130
|
|
|
@@ -2366,12 +2366,12 @@ ${renderToolDiff(generateAddedContentDiff(normalizedContent,maxLines),{filePath:
|
|
|
2366
2366
|
|
|
2367
2367
|
${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",line)).join(`
|
|
2368
2368
|
`)}`}remaining>0&&(text2+=`${theme2.fg("muted",`
|
|
2369
|
-
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path13,content)=>fsWriteFile2(path13,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path13,ctx?.cwd||cwd),dir=dirname39(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path13}`}],details:createWriteDetails(path13,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync33,mkdirSync as mkdirSync17}from"node:fs";import{basename as basename23,join as join66,parse as parse4,resolve as resolve34}from"node:path";import{basename as basename22}from"node:path";var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let ext of extensionsResult.extensions){let handlers=ext.handlers.get("project_trust");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=actions.sendMessage,this.runtime.sendUserMessage=actions.sendUserMessage,this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest;for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path13,resolvedPath})=>({path:path13,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename22(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run){let base={type:"tool_hook_status",hookRunId:`${run.toolCallId}:${run.hookName}:${this.nextToolHookRunIndex++}`,hookName:run.hookName,toolName:run.toolName,toolCallId:run.toolCallId,extensionPath:run.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run.extensionPath,run.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},abort:source=>{runner.assertActive(),runner.abortFn(source)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve42=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve42(!0),budget.timeoutMs)),settled.then(()=>resolve42(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}async emit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let ext of this.extensions){let handlers=ext.handlers.get(event.type);if(!(!handlers||handlers.length===0))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("message_end");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_result");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}}if(modified)return{content:currentEvent.content,details:currentEvent.details,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_call");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}}return result3}async emitUserBash(event){for(let ext of this.extensions){let handlers=ext.handlers.get("user_bash");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult)return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack})}}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("context");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler({type:"context",messages:currentMessages},this.createContext(ext.path));handlerResult&&handlerResult.messages&&(currentMessages=handlerResult.messages)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("before_provider_request");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}}return currentPayload}async emitBeforeProviderHeaders(headers){for(let ext of this.extensions){let handlers=ext.handlers.get("before_provider_headers");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let ext of this.extensions){let handlers=ext.handlers.get("before_agent_start");if(!(!handlers||handlers.length===0))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let ext of this.extensions){let handlers=ext.handlers.get("resources_discover");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let ext of this.extensions)for(let handler of ext.handlers.get("input")??[])try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{randomUUID as randomUUID12}from"node:crypto";import{existsSync as existsSync32,mkdirSync as mkdirSync16,readFileSync as readFileSync35,renameSync as renameSync12,rmdirSync,statSync as statSync18,unlinkSync as unlinkSync3,writeFileSync as writeFileSync16}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{dirname as dirname40,join as join64}from"node:path";var SessionHeldError=class extends Error{constructor(sessionFile,holders){let who=holders.map(h=>h.cwd?`pid ${h.pid} in ${h.cwd}`:`pid ${h.pid}`).join("; ");super(`This session is open in another ${APP_NAME} process (${who}). Quit it there, then try again.`),this.code="ESESSIONHELD",this.name="SessionHeldError",this.sessionFile=sessionFile,this.holders=holders}},SessionMovingError=class extends Error{constructor(sessionFile,moverPid){let who=moverPid===void 0?"another process":`another process (pid ${moverPid})`;super(`Session ${sessionFile} is being moved by ${who}. Try again in a moment.`),this.code="ESESSIONMOVING",this.name="SessionMovingError",this.moverPid=moverPid}},SessionMovedError=class extends Error{constructor(sessionFile){super(`Session ${sessionFile} no longer exists: another process moved it. Resume it from its new location.`),this.code="ESESSIONMOVED",this.name="SessionMovedError"}};var HOLDERS_DIR="session-holders",MOVE_LOCK="move.lock",HOLDER_RECORD=/^\d+\.json$/,MOVE_LOCK_STALE_MS=3e4,DEFAULT_MOVE_LOCK_WAIT_MS=5e3,MOVE_LOCK_RETRY_MS=100;function holdersDir(sessionFile,sessionId){return join64(dirname40(sessionFile),HOLDERS_DIR,encodedSessionId(sessionId))}function identityRecord(cwd){return JSON.stringify({pid:process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs(),...cwd===void 0?{}:{cwd}})}function unlinkIfPresentSync(path13){try{unlinkSync3(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}function removeDirIfEmpty(dir){try{rmdirSync(dir)}catch(error2){let code=errorCode2(error2);if(code!=="ENOENT"&&code!=="ENOTEMPTY"&&code!=="EEXIST")throw error2}}var holderRecordRefCounts=new Map,exitCleanupInstalled=!1;function installExitCleanup(){exitCleanupInstalled||(exitCleanupInstalled=!0,process.once("exit",()=>{for(let record7 of holderRecordRefCounts.keys())unlinkIfPresentSync(record7)}))}function pidAlive2(pid){try{return process.kill(pid,0),!0}catch(error2){return errorCode2(error2)==="EPERM"}}function activeMover(lock){let raw,ageMs;try{raw=readFileSync35(lock,"utf8"),ageMs=Date.now()-statSync18(lock).mtimeMs}catch(error2){if(errorCode2(error2)==="ENOENT")return;throw error2}if(ageMs>MOVE_LOCK_STALE_MS)return;let pid=parsePid(raw);return pid===void 0?{pid}:pid===process.pid||pidAlive2(pid)?{pid}:void 0}function parsePid(raw){try{let parsed=JSON.parse(raw);return typeof parsed!="object"||parsed===null||!("pid"in parsed)?void 0:typeof parsed.pid=="number"?parsed.pid:void 0}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}}function parseCwd(raw){let parsed=JSON.parse(raw);if(!(typeof parsed!="object"||parsed===null||!("cwd"in parsed)))return typeof parsed.cwd=="string"?parsed.cwd:void 0}function holdSessionFile(sessionFile,sessionId,options){let dir=holdersDir(sessionFile,sessionId),record7=join64(dir,`${process.pid}.json`),shared=holderRecordRefCounts.get(record7)??0;shared===0&&(publishHolderRecord(dir,record7,identityRecord(options.cwd)),installExitCleanup()),holderRecordRefCounts.set(record7,shared+1);let released=!1,release3=()=>{if(released)return;released=!0;let left=(holderRecordRefCounts.get(record7)??1)-1;if(left>0){holderRecordRefCounts.set(record7,left);return}holderRecordRefCounts.delete(record7),unlinkIfPresentSync(record7),removeDirIfEmpty(dir)},mover=activeMover(join64(dir,MOVE_LOCK));if(mover!==void 0)throw release3(),new SessionMovingError(sessionFile,mover.pid);if(options.expectExisting&&!existsSync32(sessionFile))throw release3(),new SessionMovedError(sessionFile);return{release:release3}}function publishHolderRecord(dir,record7,content){for(let attempt2=0;;attempt2+=1){mkdirSync16(dir,{recursive:!0});let temp=`${record7}.${randomUUID12().slice(0,8)}.tmp`;try{writeFileSync16(temp,content),renameSync12(temp,record7);return}catch(error2){if(errorCode2(error2)!=="ENOENT"||attempt2>0)throw error2}}}async function liveHolders(dir){let holders=[];for(let name of await readdir3(dir)){if(!HOLDER_RECORD.test(name))continue;let path13=join64(dir,name),state=await reclaimLockState(path13);if(state.state==="stale"&&await breakStaleLock(path13,state.raw),state.state!=="held"||state.holder===void 0)continue;let raw=await readLeaseText(path13);holders.push({pid:state.holder.pid,cwd:raw===void 0?void 0:parseCwd(raw)})}return holders}async function takeMoveLock(sessionFile,lock,waitMs){let mine=identityRecord(),deadline=Date.now()+waitMs;for(;;){try{return await publishExclusive(lock,mine),mine}catch(error2){let code=errorCode2(error2);if(code==="ENOENT"){mkdirSync16(dirname40(lock),{recursive:!0});continue}if(code!=="EEXIST")throw error2}let state=await reclaimLockState(lock);if(state.state==="stale"){await breakStaleLock(lock,state.raw);continue}if(state.state!=="free"){if(Date.now()>=deadline)throw new SessionMovingError(sessionFile,state.holder?.pid);await new Promise(resolve42=>setTimeout(resolve42,MOVE_LOCK_RETRY_MS))}}}async function withSessionMoveLock(sessionFile,sessionId,move2,options={}){let dir=holdersDir(sessionFile,sessionId),lock=join64(dir,MOVE_LOCK),mine=await takeMoveLock(sessionFile,lock,options.waitMs??DEFAULT_MOVE_LOCK_WAIT_MS);try{let holders=await liveHolders(dir);if(holders.length>0)throw new SessionHeldError(sessionFile,holders);return await move2()}finally{await readLeaseText(lock)===mine&&await unlinkIfPresent(lock),removeDirIfEmpty(dir)}}import{join as join65}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join65(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join65(agentDir,"auth.json"),agentDir,modelsPath:join65(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}return options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]}),diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile,this._sessionHold=holdActiveSession(_session.sessionManager,wasFlushed(_session.sessionManager))}releaseSessionHold(){this._sessionHold?.release(),this._sessionHold=void 0}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),this.releaseSessionHold(),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3,hold){this._sessionHold=hold??holdActiveSession(result3.session.sessionManager,!1),this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);assertSessionCwdExists(sessionManager,this.cwd);let hold=holdActiveSession(sessionManager,wasFlushed(sessionManager));time("open","switch");try{await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile}),hold)}catch(error2){throw this._sessionHold!==hold&&hold?.release(),error2}return time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync33(currentSessionFile))throw new Error("This session has not been saved yet. Wait for the first assistant response before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync33(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync33(sessionDir)||mkdirSync17(sessionDir,{recursive:!0});let destinationPath=join66(sessionDir,basename23(resolvedPath)),sourceAlreadyStored=resolve34(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse4(destinationPath),suffix=1;for(;existsSync33(destinationPath);)destinationPath=join66(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose(),this.releaseSessionHold()}};function wasFlushed(sessionManager){return sessionManager.getEntries().some(entry=>entry.type==="message"&&entry.message.role==="assistant")}function holdActiveSession(sessionManager,expectExisting){let sessionFile=sessionManager.getSessionFile();if(!(!sessionManager.isPersisted()||sessionFile===void 0))return holdSessionFile(sessionFile,sessionManager.getSessionId(),{cwd:sessionManager.getCwd(),expectExisting})}async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels2(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join67(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join67(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}if(!model&&hasExistingSession&&existingSession.model){let restored=resolveStoredModelReference(existingSession.model.provider,existingSession.model.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}if(thinkingLevel===void 0&&model?.defaultThinkingLevel!==void 0&&(thinkingLevel=model.defaultThinkingLevel),thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"}):thinkingLevel=DEFAULT_THINKING_LEVEL}model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection&&(thinkingSelection={...thinkingSelection,level:thinkingLevel});let defaultActiveToolNames=["read","bash","edit","write","grep"],configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=options2?.serviceTier??resolveRequestServiceTier(model2);return modelRuntime.streamSimple(model2,context,{...options2,...serviceTier!==void 0?{serviceTier}:{},timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{existsSync as existsSync43}from"node:fs";import{join as join80,resolve as resolve38}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
|
|
2369
|
+
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path13,content)=>fsWriteFile2(path13,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path13,ctx?.cwd||cwd),dir=dirname39(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path13}`}],details:createWriteDetails(path13,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync33,mkdirSync as mkdirSync17}from"node:fs";import{basename as basename23,join as join66,parse as parse4,resolve as resolve34}from"node:path";import{basename as basename22}from"node:path";var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let ext of extensionsResult.extensions){let handlers=ext.handlers.get("project_trust");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=actions.sendMessage,this.runtime.sendUserMessage=actions.sendUserMessage,this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest;for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path13,resolvedPath})=>({path:path13,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(message="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename22(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run){let base={type:"tool_hook_status",hookRunId:`${run.toolCallId}:${run.hookName}:${this.nextToolHookRunIndex++}`,hookName:run.hookName,toolName:run.toolName,toolCallId:run.toolCallId,extensionPath:run.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run.extensionPath,run.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},abort:source=>{runner.assertActive(),runner.abortFn(source)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve42=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve42(!0),budget.timeoutMs)),settled.then(()=>resolve42(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}async emit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let ext of this.extensions){let handlers=ext.handlers.get(event.type);if(!(!handlers||handlers.length===0))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("message_end");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_result");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}}if(modified)return{content:currentEvent.content,details:currentEvent.details,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_call");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}}return result3}async emitUserBash(event){for(let ext of this.extensions){let handlers=ext.handlers.get("user_bash");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult)return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack})}}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("context");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler({type:"context",messages:currentMessages},this.createContext(ext.path));handlerResult&&handlerResult.messages&&(currentMessages=handlerResult.messages)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("before_provider_request");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}}return currentPayload}async emitBeforeProviderHeaders(headers){for(let ext of this.extensions){let handlers=ext.handlers.get("before_provider_headers");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let ext of this.extensions){let handlers=ext.handlers.get("before_agent_start");if(!(!handlers||handlers.length===0))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let ext of this.extensions){let handlers=ext.handlers.get("resources_discover");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let ext of this.extensions)for(let handler of ext.handlers.get("input")??[])try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{randomUUID as randomUUID12}from"node:crypto";import{existsSync as existsSync32,mkdirSync as mkdirSync16,readFileSync as readFileSync35,renameSync as renameSync12,rmdirSync,statSync as statSync18,unlinkSync as unlinkSync3,writeFileSync as writeFileSync16}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{dirname as dirname40,join as join64}from"node:path";var SessionHeldError=class extends Error{constructor(sessionFile,holders){let who=holders.map(h=>h.cwd?`pid ${h.pid} in ${h.cwd}`:`pid ${h.pid}`).join("; ");super(`This session is open in another ${APP_NAME} process (${who}). Quit it there, then try again.`),this.code="ESESSIONHELD",this.name="SessionHeldError",this.sessionFile=sessionFile,this.holders=holders}},SessionMovingError=class extends Error{constructor(sessionFile,moverPid){let who=moverPid===void 0?"another process":`another process (pid ${moverPid})`;super(`Session ${sessionFile} is being moved by ${who}. Try again in a moment.`),this.code="ESESSIONMOVING",this.name="SessionMovingError",this.moverPid=moverPid}},SessionMovedError=class extends Error{constructor(sessionFile){super(`Session ${sessionFile} no longer exists: another process moved it. Resume it from its new location.`),this.code="ESESSIONMOVED",this.name="SessionMovedError"}};var HOLDERS_DIR="session-holders",MOVE_LOCK="move.lock",HOLDER_RECORD=/^\d+\.json$/,MOVE_LOCK_STALE_MS=3e4,DEFAULT_MOVE_LOCK_WAIT_MS=5e3,MOVE_LOCK_RETRY_MS=100;function holdersDir(sessionFile,sessionId){return join64(dirname40(sessionFile),HOLDERS_DIR,encodedSessionId(sessionId))}function identityRecord(cwd){return JSON.stringify({pid:process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs(),...cwd===void 0?{}:{cwd}})}function unlinkIfPresentSync(path13){try{unlinkSync3(path13)}catch(error2){if(errorCode2(error2)!=="ENOENT")throw error2}}function removeDirIfEmpty(dir){try{rmdirSync(dir)}catch(error2){let code=errorCode2(error2);if(code!=="ENOENT"&&code!=="ENOTEMPTY"&&code!=="EEXIST")throw error2}}var holderRecordRefCounts=new Map,exitCleanupInstalled=!1;function installExitCleanup(){exitCleanupInstalled||(exitCleanupInstalled=!0,process.once("exit",()=>{for(let record7 of holderRecordRefCounts.keys())unlinkIfPresentSync(record7)}))}function pidAlive2(pid){try{return process.kill(pid,0),!0}catch(error2){return errorCode2(error2)==="EPERM"}}function activeMover(lock){let raw,ageMs;try{raw=readFileSync35(lock,"utf8"),ageMs=Date.now()-statSync18(lock).mtimeMs}catch(error2){if(errorCode2(error2)==="ENOENT")return;throw error2}if(ageMs>MOVE_LOCK_STALE_MS)return;let pid=parsePid(raw);return pid===void 0?{pid}:pid===process.pid||pidAlive2(pid)?{pid}:void 0}function parsePid(raw){try{let parsed=JSON.parse(raw);return typeof parsed!="object"||parsed===null||!("pid"in parsed)?void 0:typeof parsed.pid=="number"?parsed.pid:void 0}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}}function parseCwd(raw){let parsed=JSON.parse(raw);if(!(typeof parsed!="object"||parsed===null||!("cwd"in parsed)))return typeof parsed.cwd=="string"?parsed.cwd:void 0}function holdSessionFile(sessionFile,sessionId,options){let dir=holdersDir(sessionFile,sessionId),record7=join64(dir,`${process.pid}.json`),shared=holderRecordRefCounts.get(record7)??0;shared===0&&(publishHolderRecord(dir,record7,identityRecord(options.cwd)),installExitCleanup()),holderRecordRefCounts.set(record7,shared+1);let released=!1,release3=()=>{if(released)return;released=!0;let left=(holderRecordRefCounts.get(record7)??1)-1;if(left>0){holderRecordRefCounts.set(record7,left);return}holderRecordRefCounts.delete(record7),unlinkIfPresentSync(record7),removeDirIfEmpty(dir)},mover=activeMover(join64(dir,MOVE_LOCK));if(mover!==void 0)throw release3(),new SessionMovingError(sessionFile,mover.pid);if(options.expectExisting&&!existsSync32(sessionFile))throw release3(),new SessionMovedError(sessionFile);return{release:release3}}function publishHolderRecord(dir,record7,content){for(let attempt2=0;;attempt2+=1){mkdirSync16(dir,{recursive:!0});let temp=`${record7}.${randomUUID12().slice(0,8)}.tmp`;try{writeFileSync16(temp,content),renameSync12(temp,record7);return}catch(error2){if(errorCode2(error2)!=="ENOENT"||attempt2>0)throw error2}}}async function liveHolders(dir){let holders=[];for(let name of await readdir3(dir)){if(!HOLDER_RECORD.test(name))continue;let path13=join64(dir,name),state=await reclaimLockState(path13);if(state.state==="stale"&&await breakStaleLock(path13,state.raw),state.state!=="held"||state.holder===void 0)continue;let raw=await readLeaseText(path13);holders.push({pid:state.holder.pid,cwd:raw===void 0?void 0:parseCwd(raw)})}return holders}async function takeMoveLock(sessionFile,lock,waitMs){let mine=identityRecord(),deadline=Date.now()+waitMs;for(;;){try{return await publishExclusive(lock,mine),mine}catch(error2){let code=errorCode2(error2);if(code==="ENOENT"){mkdirSync16(dirname40(lock),{recursive:!0});continue}if(code!=="EEXIST")throw error2}let state=await reclaimLockState(lock);if(state.state==="stale"){await breakStaleLock(lock,state.raw);continue}if(state.state!=="free"){if(Date.now()>=deadline)throw new SessionMovingError(sessionFile,state.holder?.pid);await new Promise(resolve42=>setTimeout(resolve42,MOVE_LOCK_RETRY_MS))}}}async function withSessionMoveLock(sessionFile,sessionId,move2,options={}){let dir=holdersDir(sessionFile,sessionId),lock=join64(dir,MOVE_LOCK),mine=await takeMoveLock(sessionFile,lock,options.waitMs??DEFAULT_MOVE_LOCK_WAIT_MS);try{let holders=await liveHolders(dir);if(holders.length>0)throw new SessionHeldError(sessionFile,holders);return await move2()}finally{await readLeaseText(lock)===mine&&await unlinkIfPresent(lock),removeDirIfEmpty(dir)}}import{join as join65}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join65(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join65(agentDir,"auth.json"),agentDir,modelsPath:join65(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}return options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]}),diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile,this._sessionHold=holdActiveSession(_session.sessionManager,wasFlushed(_session.sessionManager))}releaseSessionHold(){this._sessionHold?.release(),this._sessionHold=void 0}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),this.releaseSessionHold(),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3,hold){this._sessionHold=hold??holdActiveSession(result3.session.sessionManager,!1),this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);assertSessionCwdExists(sessionManager,this.cwd);let hold=holdActiveSession(sessionManager,wasFlushed(sessionManager));time("open","switch");try{await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile}),hold)}catch(error2){throw this._sessionHold!==hold&&hold?.release(),error2}return time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync33(currentSessionFile))throw new Error("This session has not been saved yet. Wait for the first assistant response before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync33(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync33(sessionDir)||mkdirSync17(sessionDir,{recursive:!0});let destinationPath=join66(sessionDir,basename23(resolvedPath)),sourceAlreadyStored=resolve34(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse4(destinationPath),suffix=1;for(;existsSync33(destinationPath);)destinationPath=join66(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose(),this.releaseSessionHold()}};function wasFlushed(sessionManager){return sessionManager.getEntries().some(entry=>entry.type==="message"&&entry.message.role==="assistant")}function holdActiveSession(sessionManager,expectExisting){let sessionFile=sessionManager.getSessionFile();if(!(!sessionManager.isPersisted()||sessionFile===void 0))return holdSessionFile(sessionFile,sessionManager.getSessionId(),{cwd:sessionManager.getCwd(),expectExisting})}async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels2(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join67(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join67(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}if(!model&&hasExistingSession&&existingSession.model){let restored=resolveStoredModelReference(existingSession.model.provider,existingSession.model.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}if(thinkingLevel===void 0&&model?.defaultThinkingLevel!==void 0&&(thinkingLevel=model.defaultThinkingLevel),thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"}):thinkingLevel=DEFAULT_THINKING_LEVEL}model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection&&(thinkingSelection={...thinkingSelection,level:thinkingLevel});let defaultActiveToolNames=["read","bash","edit","write","grep"],configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=options2?.serviceTier??resolveRequestServiceTier(model2);return modelRuntime.streamSimple(model2,context,{...options2,...serviceTier!==void 0?{serviceTier}:{},timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}}catch(error2){throw session.dispose(),error2}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{existsSync as existsSync43}from"node:fs";import{join as join80,resolve as resolve38}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
|
|
2370
2370
|
pi auth print-api-key [--provider <provider>] [--model <model>]
|
|
2371
2371
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2372
2372
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2373
2373
|
|
|
2374
|
-
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync34}from"node:fs";import{readdir as readdir4}from"node:fs/promises";import{join as join68}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync34(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir4(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join68(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync34(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir4(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join68(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync34(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";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-5EEDA35I.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-5EEDA35I.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-3GVJZFFH.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-RORPAC5X.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile22,stat as stat11}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 stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile22(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2374
|
+
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync34}from"node:fs";import{readdir as readdir4}from"node:fs/promises";import{join as join68}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync34(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir4(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join68(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync34(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir4(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join68(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync34(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";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-DXHQ6RKA.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-DXHQ6RKA.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-TOPTGVQB.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-6CJ7YM6W.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile22,stat as stat11}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 stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile22(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2375
2375
|
`;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(`
|
|
2376
2376
|
`)}</file>
|
|
2377
2377
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2430,10 +2430,10 @@ Press any key to continue...`)),await new Promise(resolve42=>{process.stdin.setR
|
|
|
2430
2430
|
`)}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}
|
|
2431
2431
|
`):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
|
|
2432
2432
|
`),writeRawStdout(`${formatProviderNativeBody(content,!1)}
|
|
2433
|
-
`))}}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-
|
|
2433
|
+
`))}}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-RZIMOFDM.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID13}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync42,mkdirSync as mkdirSync24,renameSync as renameSync19,rmSync as rmSync14}from"node:fs";import{basename as basename26,dirname as dirname45,join as join79,relative as relative18,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(basename26(current).toLowerCase()==="node_modules")return join79(current,QUARANTINE_DIR_NAME);let parent=dirname45(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join79(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID13()}`);for(let loadedFile of loadedFiles){if(!existsSync42(loadedFile))continue;let quarantinePath=join79(quarantineRunDir,relative18(resolvedPackageDir,loadedFile));mkdirSync24(dirname45(quarantinePath),{recursive:!0}),renameSync19(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(`
|
|
2434
2434
|
`));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}
|
|
2435
2435
|
`),!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}
|
|
2436
|
-
`),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}),settled=!1,settle=result3=>{settled||(settled=!0,resolve42(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-FTFCQYHH.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync43(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},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}});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,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)});markSwitch("createSession");let 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))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(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),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-S5CANO5W.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-GRHKB7Q2.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join80(agentDir,"auth.json")),authPath:join80(agentDir,"auth.json"),agentDir,modelsPath:join80(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-TIFT2SKR.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"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-HOEA5NGQ.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-LOAADKLH.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 label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2436
|
+
`),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}),settled=!1,settle=result3=>{settled||(settled=!0,resolve42(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-KOPOV6Q4.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync43(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},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}});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,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)});markSwitch("createSession");let 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))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(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),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-FPXDXN7R.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-B4WMZE2G.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join80(agentDir,"auth.json")),authPath:join80(agentDir,"auth.json"),agentDir,modelsPath:join80(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-A3GEIFTU.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"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-PFPNP65F.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ITSFLGF6.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 label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2437
2437
|
|
|
2438
2438
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2439
2439
|
|
|
@@ -2478,8 +2478,8 @@ ${formatToolProgressLine(progress,Date.now(),state.spinnerFrame)}`),this.content
|
|
|
2478
2478
|
`)+`${theme.fg("muted",`
|
|
2479
2479
|
... (${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,label3,labelTimestamp){for(let flatNode of this.flatNodes)if(flatNode.node.entry.id===entryId){flatNode.node.label=label3,flatNode.node.labelTimestamp=label3?labelTimestamp??new Date().toISOString():void 0;break}}getStatusLabels(){let labels="";switch(this.filterMode){case"no-tools":labels+=" [no-tools]";break;case"user-only":labels+=" [user]";break;case"labeled-only":labels+=" [labeled]";break;case"all":labels+=" [all]";break}return this.showLabelTimestamps&&(labels+=" [+label time]"),labels}render(width){let lines=[];if(this.filteredNodes.length===0)return lines.push(truncateToWidth(theme.fg("muted"," No entries found"),width)),lines.push(truncateToWidth(theme.fg("muted",` (0/0)${this.getStatusLabels()}`),width)),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisibleLines/2),this.filteredNodes.length-this.maxVisibleLines)),endIndex=Math.min(startIndex+this.maxVisibleLines,this.filteredNodes.length),renderedRows=[];for(let i=startIndex;i<endIndex;i++){let flatNode=this.filteredNodes[i],entry=flatNode.node.entry,isSelected=i===this.selectedIndex,cursor=isSelected?theme.fg("accent","\u203A "):" ",displayIndent=this.multipleRoots?Math.max(0,flatNode.indent-1):flatNode.indent,connector=flatNode.showConnector&&!flatNode.isVirtualRootChild?flatNode.isLast?"\u2514\u2500 ":"\u251C\u2500 ":"",connectorPosition=connector?displayIndent-1:-1,totalChars=displayIndent*3,prefixChars=[],isFolded=this.foldedNodes.has(entry.id);for(let i2=0;i2<totalChars;i2++){let level=Math.floor(i2/3),posInLevel=i2%3,gutter2=flatNode.gutters.find(g=>g.position===level);if(gutter2)posInLevel===0?prefixChars.push(gutter2.show?"\u2502":" "):prefixChars.push(" ");else if(connector&&level===connectorPosition)if(posInLevel===0)prefixChars.push(flatNode.isLast?"\u2514":"\u251C");else if(posInLevel===1){let foldable=this.isFoldable(entry.id);prefixChars.push(isFolded?"\u229E":foldable?"\u229F":"\u2500")}else prefixChars.push(" ");else prefixChars.push(" ")}let prefix=prefixChars.join(""),showsFoldInConnector=flatNode.showConnector&&!flatNode.isVirtualRootChild,foldMarker=isFolded&&!showsFoldInConnector?theme.fg("accent","\u229E "):"",pathMarker=this.activePathIds.has(entry.id)?theme.fg("accent","\u2022 "):"",label3=flatNode.node.label?theme.fg("warning",`[${flatNode.node.label}] `):"",labelTimestamp=this.showLabelTimestamps&&flatNode.node.label&&flatNode.node.labelTimestamp?theme.fg("muted",`${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `):"",content=this.getEntryDisplayText(flatNode.node,isSelected),prefixPart=theme.fg("dim",prefix)+foldMarker+pathMarker,anchorCol=visibleWidth(prefixPart),gutter=cursor,body=prefixPart+label3+labelTimestamp+content;isSelected&&(gutter=theme.bg("selectedBg",gutter),body=theme.bg("selectedBg",body)),renderedRows.push({gutter,body,anchorCol,bodyWidth:visibleWidth(body),isSelected})}return lines.push(...renderHorizontalViewport(renderedRows,width)),lines.push(truncateToWidth(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredNodes.length})${this.getStatusLabels()}`),width)),lines}getEntryDisplayText(node,isSelected){let entry=node.entry,result3,normalize3=s=>s.replace(/[\n\t]/g," ").trim();switch(entry.type){case"message":{let msg=entry.message,role=msg.role;if(role==="user"){let msgWithContent=msg,content=normalize3(this.extractContent(msgWithContent.content));result3=theme.fg("accent","user: ")+content}else if(role==="assistant"){let msgWithContent=msg,textContent3=normalize3(this.extractContent(msgWithContent.content));if(textContent3)result3=theme.fg("success","assistant: ")+textContent3;else if(msgWithContent.stopReason==="aborted")result3=theme.fg("success","assistant: ")+theme.fg("muted","(aborted)");else if(msgWithContent.errorMessage){let errMsg=normalize3(msgWithContent.errorMessage).slice(0,80);result3=theme.fg("success","assistant: ")+theme.fg("error",errMsg)}else result3=theme.fg("success","assistant: ")+theme.fg("muted","(no content)")}else if(role==="toolResult"){let toolMsg=msg,toolCall=toolMsg.toolCallId?this.toolCallMap.get(toolMsg.toolCallId):void 0;toolCall?result3=theme.fg("muted",this.formatToolCall(toolCall.name,toolCall.arguments)):result3=theme.fg("muted",`[${toolMsg.toolName??"tool"}]`)}else if(role==="bashExecution"){let bashMsg=msg;result3=theme.fg("dim",`[bash]: ${normalize3(bashMsg.command??"")}`)}else result3=theme.fg("dim",`[${role}]`);break}case"custom_message":{let content=typeof entry.content=="string"?entry.content:entry.content.filter(c=>c.type==="text").map(c=>c.text).join("");result3=theme.fg("customMessageLabel",`[${entry.customType}]: `)+normalize3(content);break}case"compaction":{let tokens=Math.round(entry.tokensBefore/1e3);result3=theme.fg("borderAccent",`[compaction: ${tokens}k tokens]`);break}case"branch_summary":result3=theme.fg("warning","[branch summary]: ")+normalize3(entry.summary);break;case"model_change":result3=theme.fg("dim",`[model: ${entry.modelId}]`);break;case"model_change_rejected":result3=theme.fg("warning",`[model rejected: ${entry.modelId} (${entry.reason})]`);break;case"thinking_level_change":result3=theme.fg("dim",`[thinking: ${entry.thinkingLevel}]`);break;case"custom":result3=theme.fg("dim",`[custom: ${entry.customType}]`);break;case"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:label3,labelFirst})=>{let text2=formatHelpKeys(keys);return text2?labelFirst?`${label3} ${text2}`:`${text2} ${label3}`:label3}),availableWidth=Math.max(1,width),indent=" ",separator=" \xB7 ",lines=[],currentLine="";for(let item of items){let candidate=currentLine?`${currentLine}${separator}${item}`:visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item;if(!currentLine||visibleWidth(candidate)<=availableWidth){currentLine=candidate;continue}lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),currentLine=visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item}return currentLine&&lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),lines.map(line=>theme.fg("muted",line))}},TREE_HELP_ITEMS=[{keys:["tui.select.up","tui.select.down"],label:"move"},{keys:["tui.editor.cursorLeft","tui.editor.cursorRight"],label:"page"},{keys:["app.tree.foldOrUp","app.tree.unfoldOrDown"],label:"branch"},{keys:["app.message.copy"],label:"copy"},{keys:["app.tree.editMessage"],label:"edit"},{keys:["app.tree.editLabel"],label:"label"},{keys:["app.tree.toggleLabelTimestamp"],label:"label time"},{keys:["app.tree.filter.default","app.tree.filter.noTools","app.tree.filter.userOnly","app.tree.filter.labeledOnly","app.tree.filter.all"],label:"filters",labelFirst:!0},{keys:["app.tree.filter.cycleForward","app.tree.filter.cycleBackward"],label:"cycle",labelFirst:!0}];function formatHelpKeys(keybindings){let keys=[];for(let keybinding of keybindings){let key=getKeybindings().getKeys(keybinding)[0];key!==void 0&&keys.push(key)}return keys.length===0?"":formatKeyText(compactRawKeys(keys)).replace(/\bpageUp\b/g,"pgup").replace(/\bpageDown\b/g,"pgdn").replace(/\bup\b/g,"\u2191").replace(/\bdown\b/g,"\u2193").replace(/\bleft\b/g,"\u2190").replace(/\bright\b/g,"\u2192")}function compactRawKeys(keys){if(keys.length===1)return keys[0];let parts=keys.map(key=>{let separatorIndex=key.lastIndexOf("+");return separatorIndex===-1?{prefix:"",suffix:key}:{prefix:key.slice(0,separatorIndex+1),suffix:key.slice(separatorIndex+1)}}),prefix=parts[0].prefix;return prefix&&parts.every(part=>part.prefix===prefix)?`${prefix}${parts.map(part=>part.suffix).join("/")}`:keys.join("/")}var LabelInput=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(entryId,currentLabel){this._focused=!1,this.entryId=entryId,this.input=new Input,currentLabel&&this.input.setValue(currentLabel)}invalidate(){}render(width){let lines=[],availableWidth=width-2;return lines.push(truncateToWidth(` ${theme.fg("muted","Label (empty to remove):")}`,width)),lines.push(...this.input.render(availableWidth).map(line=>truncateToWidth(` ${line}`,width))),lines.push(truncateToWidth(` ${keyHint("tui.select.confirm","save")} ${keyHint("tui.select.cancel","cancel")}`,width)),lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.confirm")){let value2=this.input.getValue().trim();this.onSubmit?.(this.entryId,value2||void 0)}else kb.matches(keyData,"tui.select.cancel")?this.onCancel?.():this.input.handleInput(keyData)}},TreeSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.labelInput&&(this.labelInput.focused=value2)}constructor(tree,currentLeafId,terminalHeight,onSelect,onCancel,onLabelChange,initialSelectedId,initialFilterMode){super(),this.labelInput=null,this._focused=!1,this.onLabelChangeCallback=onLabelChange;let maxVisibleLines=Math.max(5,Math.floor(terminalHeight/2));this.treeList=new TreeList(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode),this.treeList.onSelect=onSelect,this.treeList.onCancel=onCancel,this.treeList.onCopy=text2=>this.onCopy?.(text2),this.treeList.onEditMessage=entryId=>this.onEditMessage?.(entryId),this.treeList.onLabelEdit=(entryId,currentLabel)=>this.showLabelInput(entryId,currentLabel),this.treeContainer=new Container,this.treeContainer.addChild(this.treeList),this.labelInputContainer=new Container,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Text(theme.bold(" Session Tree"),1,0)),this.addChild(new TreeHelp),this.addChild(new SearchLine(this.treeList)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(this.treeContainer),this.addChild(this.labelInputContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),tree.length===0&&setTimeout(()=>onCancel(),100)}showLabelInput(entryId,currentLabel){this.labelInput=new LabelInput(entryId,currentLabel),this.labelInput.onSubmit=(id,label3)=>{this.treeList.updateNodeLabel(id,label3),this.onLabelChangeCallback?.(id,label3),this.hideLabelInput()},this.labelInput.onCancel=()=>this.hideLabelInput(),this.labelInput.focused=this._focused,this.treeContainer.clear(),this.labelInputContainer.clear(),this.labelInputContainer.addChild(this.labelInput)}hideLabelInput(){this.labelInput=null,this.labelInputContainer.clear(),this.treeContainer.clear(),this.treeContainer.addChild(this.treeList)}handleInput(keyData){this.labelInput?this.labelInput.handleInput(keyData):this.treeList.handleInput(keyData)}getTreeList(){return this.treeList}};function formatDecision(trustPath,decision){if(decision===null)return"none";let label3=decision.decision?"trusted":"untrusted";return trustPath!==void 0&&decision.path!==trustPath?`${label3} (inherited from ${decision.path})`:`${label3} (${decision.path})`}var TrustSelectorComponent=class extends Container{constructor(options){super(),this.savedDecision=options.savedDecision,this.trustOptions=getProjectTrustOptions(options.cwd),this.selectedIndex=Math.max(0,this.trustOptions.findIndex(option=>this.isSavedOption(option))),this.onSelectCallback=options.onSelect,this.onCancelCallback=options.onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Project trust")),1,0)),this.addChild(new Text(theme.fg("muted",options.cwd),1,0)),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",`Saved decision: ${formatDecision(this.trustOptions[0]?.savedPath,options.savedDecision)}`),1,0)),this.addChild(new Text(theme.fg("muted",`Current session: ${options.projectTrusted?"trusted":"untrusted"}`),1,0)),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new Text(rawKeyHint("\u2191\u2193","navigate")+" "+keyHint("tui.select.confirm","save")+" "+keyHint("tui.select.cancel","cancel"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateList()}isSavedOption(option){return option.savedPath!==void 0&&this.savedDecision?.decision===option.trusted&&this.savedDecision.path===option.savedPath}updateList(){this.listContainer.clear();for(let i=0;i<this.trustOptions.length;i++){let option=this.trustOptions[i];if(!option)continue;let isSelected=i===this.selectedIndex,currentMarker=this.isSavedOption(option)?theme.fg("accent","\u2713 "):" ",prefix=isSelected?theme.fg("accent","\u2192 "):" ",label3=isSelected?theme.fg("accent",option.label):theme.fg("text",option.label);this.listContainer.addChild(new Text(`${prefix}${currentMarker}${label3}`,1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")||keyData==="k")this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList();else if(kb.matches(keyData,"tui.select.down")||keyData==="j")this.selectedIndex=Math.min(this.trustOptions.length-1,this.selectedIndex+1),this.updateList();else if(kb.matches(keyData,"tui.select.confirm")||keyData===`
|
|
2480
2480
|
`){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(`
|
|
2481
|
-
`)){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 statSync21}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync21(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,options){assertActive();let list3=extension.handlers.get(event)??[];list3.push(handler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(handler))},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,label3){assertActive(),runtime.setLabel(entryId,label3)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},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-R4HXF3GD.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 KERNEL_BUILTIN_GLOBALS=new Set(["agent","completion","display","env","log","output","parallel","phase","pipeline","print","read","tool","tool_schema","tools","workpool","write"]),KernelPreludeCollisionError=class extends Error{constructor(toolName,collidingExport){super(`Tool "${toolName}" kernelPrelude export "${collidingExport}" collides with a built-in eval kernel global.`),this.name="KernelPreludeCollisionError",this.toolName=toolName,this.collidingExport=collidingExport}};function projectKernelPrelude(toolName,prelude){let collision=prelude?.exports.find(name=>KERNEL_BUILTIN_GLOBALS.has(name)||name.startsWith("__"));if(collision!==void 0)throw new KernelPreludeCollisionError(toolName,collision);return prelude}var 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}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await untilAborted2(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let systemPrompt=await untilAborted2(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state=agent.state,model=state.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state.reasoningBaseline,state.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state.thinkingSelection!==void 0&&(options.thinkingSelection=state.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted2(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let context=await buildProviderContext({systemPrompt,messages:[],tools:state.tools.slice(),...state.declaredTools!==void 0?{declaredTools:state.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context,options:prepared.options}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted2(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve42=>{onAbort=()=>resolve42(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs}){let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0){await continuation;return}let timer=setTimeout(()=>{getActiveSignal()===ownedSignal&&abortActive()},timeoutMs);try{await continuation}finally{clearTimeout(timer)}}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 chmodSync12,closeSync as closeSync6,mkdirSync as mkdirSync25,openSync as openSync6,renameSync as renameSync20,rmSync as rmSync16,statSync as statSync23,writeSync as writeSync5}from"node:fs";import{dirname as dirname47,join as join83}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=join83(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){mkdirSync25(dirname47(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2482
|
-
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync16(`${filePath}.1`,{force:!0}),renameSync20(filePath,`${filePath}.1`),chmodSync12(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync5(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync12(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync23(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 REASONING_MANDATORY_ERROR=/reasoning is mandatory/i;function initialTitleReasoning(model){if(!model.reasoning)return;let levels=getSupportedThinkingLevels(model);if(!levels.includes("off"))return asReasoningLevel(levels[0])}function mandatoryReasoningRetryLevel(model,sentReasoning,errorMessage8){if(!(sentReasoning!==void 0||errorMessage8===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage8))return asReasoningLevel(clampThinkingLevel(model,"low"))}function asReasoningLevel(level){return level===void 0||level==="off"?void 0:level}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
2481
|
+
`)){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 statSync21}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync21(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,options){assertActive();let list3=extension.handlers.get(event)??[];list3.push(handler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(handler))},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,label3){assertActive(),runtime.setLabel(entryId,label3)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},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-R4HXF3GD.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 KERNEL_BUILTIN_GLOBALS=new Set(["agent","completion","display","env","log","output","parallel","phase","pipeline","print","read","tool","tool_schema","tools","workpool","write"]),KernelPreludeCollisionError=class extends Error{constructor(toolName,collidingExport){super(`Tool "${toolName}" kernelPrelude export "${collidingExport}" collides with a built-in eval kernel global.`),this.name="KernelPreludeCollisionError",this.toolName=toolName,this.collidingExport=collidingExport}};function projectKernelPrelude(toolName,prelude){let collision=prelude?.exports.find(name=>KERNEL_BUILTIN_GLOBALS.has(name)||name.startsWith("__"));if(collision!==void 0)throw new KernelPreludeCollisionError(toolName,collision);return prelude}var 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}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await untilAborted2(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let systemPrompt=await untilAborted2(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state=agent.state,model=state.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state.reasoningBaseline,state.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state.thinkingSelection!==void 0&&(options.thinkingSelection=state.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted2(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let context=await buildProviderContext({systemPrompt,messages:[],tools:state.tools.slice(),...state.declaredTools!==void 0?{declaredTools:state.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context,options:prepared.options}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted2(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve42=>{onAbort=()=>resolve42(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs}){let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0){await continuation;return}let timer=setTimeout(()=>{getActiveSignal()===ownedSignal&&abortActive()},timeoutMs);try{await continuation}finally{clearTimeout(timer)}}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)}function isHealthExhaustionFailure(errorMessage8){return isBillingErrorMessage(errorMessage8)||isQuotaExhaustionMessage(errorMessage8)}var CircuitProbes=class{constructor(circuits){this.circuits=circuits}isOpen(selector){return this.circuits?.isOpen(selector)??!1}governs(selector){return this.circuits?.governs(selector)??!1}admit(selector){let admission=this.circuits?.admit(selector)??{kind:"closed"};return admission.kind==="probe"&&this.token?.selector!==selector&&(this.release(),this.token=admission.token),admission.kind}holds(selector){return this.token?.selector===selector}get probing(){return this.token?.selector}noteFailure(selector,failure2){this.circuits?.noteFailure(selector,failure2),this.token?.selector===selector&&(this.token=void 0)}accept(selector){this.circuits?.close(selector),this.token?.selector===selector&&(this.token=void 0)}release(){this.token&&this.circuits?.release(this.token),this.token=void 0}releaseAll(){this.token=void 0,this.circuits?.releaseAll()}};function firstUsableCandidate(entries,current,filters){let probe;for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,filters.registry);if(!selector){filters.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){filters.skip(raw,"self");continue}let base=baseSelector(selector);if(filters.tried.has(base)){filters.skip(raw,"tried");continue}if(filters.isSuppressed(base)){filters.skip(raw,"suppressed");continue}if(!filters.isAuthAvailable(selector.provider)){filters.skip(raw,"unauthenticated");continue}let model=filters.registry.find(selector.provider,selector.id);if(!model){filters.skip(raw,"unknown");continue}if(filters.isCircuitOpen(base)){filters.skip(raw,"circuit-open"),probe??={selector,model,circuitOpen:!0};continue}return{selector,model,circuitOpen:!1}}return probe}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps,this.probes=new CircuitProbes(deps.circuits)}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.probes.governs(state.originalSelector)?this.probes.isOpen(state.originalSelector):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||this.probes.admit(state.originalSelector)==="open")return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.switchOrRelease(model,thinking,"fallback-revert");let from=formatSelector(current.model);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)),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteHealthFailure(model,thinkingLevel,failure2){this.managedChainKey({model,thinkingLevel})&&this.probes.noteFailure(formatSelector(model),failure2)}async rerouteAroundOpenCircuit(){let current=this.deps.getCurrentSelector();if(!this.deps.circuits||!current)return!1;let currentBase=formatSelector(current.model);if(this.probes.admit(currentBase)!=="open")return!1;let candidate=this.nextCandidate(!1,!0);return!candidate||candidate.circuitOpen?!1:(this.deps.logger.info("circuit_open_skip",{selector:currentBase}),await this.applyCandidate(current,candidate,"transient"),!0)}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector();current&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);return(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage})),await this.applyCandidate(current,candidate,reason),!0}async applyCandidate(current,candidate,reason){let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);this.probes.admit(baseSelector(candidate.selector)),await this.switchOrRelease(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state,pinnedByRefusal=prior?.pinnedByRefusal===!0||reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||reason==="billing";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})}managedChainKey(current){if(!this.deps.getSettings().modelFallback)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey;return chainKey&&chains[chainKey]?chainKey:void 0}nextCandidate(reserve=!0,logDecision=reserve){let current=this.deps.getCurrentSelector();if(!this.deps.getSettings().modelFallback||!current)return;let chainKey=this.managedChainKey(current),entries=chainKey?this.canonicalChains()[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}let candidate=firstUsableCandidate(entries,current,{registry:this.deps.registry,tried:this.triedSelectors,isSuppressed:base=>this.deps.cooldowns.isSuppressed(base),isAuthAvailable:provider=>this.deps.isAuthAvailable(provider),isCircuitOpen:base=>this.deps.circuits?.isOpen(base)??!1,skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(baseSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random){this.expiresAtBySelector=new Map,this.now=now2,this.random=random}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs3,errorMessage:errorMessage8}){if(retryAfterMs3!==void 0&&Number.isFinite(retryAfterMs3)&&retryAfterMs3>0)return retryAfterMs3;let message=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 chmodSync12,closeSync as closeSync6,mkdirSync as mkdirSync25,openSync as openSync6,renameSync as renameSync20,rmSync as rmSync16,statSync as statSync23,writeSync as writeSync5}from"node:fs";import{dirname as dirname47,join as join83}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=join83(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){mkdirSync25(dirname47(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2482
|
+
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync16(`${filePath}.1`,{force:!0}),renameSync20(filePath,`${filePath}.1`),chmodSync12(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync5(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync12(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync23(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}function isAssistantEntry(entry){return entry.type==="message"&&entry.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry))continue;let{message}=entry;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var REASONING_MANDATORY_ERROR=/reasoning is mandatory/i;function initialTitleReasoning(model){if(!model.reasoning)return;let levels=getSupportedThinkingLevels(model);if(!levels.includes("off"))return asReasoningLevel(levels[0])}function mandatoryReasoningRetryLevel(model,sentReasoning,errorMessage8){if(!(sentReasoning!==void 0||errorMessage8===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage8))return asReasoningLevel(clampThinkingLevel(model,"low"))}function asReasoningLevel(level){return level===void 0||level==="off"?void 0:level}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
2483
2483
|
|
|
2484
2484
|
Rules:
|
|
2485
2485
|
- Use 3 to 6 words.
|
|
@@ -2504,7 +2504,7 @@ The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder
|
|
|
2504
2504
|
`||text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2505
2505
|
`;){cursor+=text2[cursor]==="\r"?2:1;let lineStart=cursor;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;if(text2[cursor]!==`
|
|
2506
2506
|
`&&!(text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2507
|
-
`))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):(usage3=getPromptCachePrewarmUsage(entry),usage3&&(key="Tools/summaries")),!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._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,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._environmentContextEnabled=config.environmentContext??!0,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 this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.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??randomUUID14(),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,skipped2=!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:skipped2,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"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(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,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,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-${randomUUID14()}`,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),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}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));this._promptToolNames=validToolNames;let 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(`
|
|
2507
|
+
`))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):(usage3=getPromptCachePrewarmUsage(entry),usage3&&(key="Tools/summaries")),!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._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._probeBackLaneSeq=0,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._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,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}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}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 this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.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??randomUUID14(),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,skipped2=!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:skipped2,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,this._armCircuitProbeWatchdog()),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_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),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&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),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,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});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(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),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"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(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}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 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=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;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}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(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._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),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,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,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-${randomUUID14()}`,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),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}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));this._promptToolNames=validToolNames;let 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(`
|
|
2508
2508
|
|
|
2509
2509
|
`):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
|
|
2510
2510
|
|
|
@@ -2515,8 +2515,8 @@ ${loaderAppendSystemPrompt.join(`
|
|
|
2515
2515
|
${sentences.join(`
|
|
2516
2516
|
|
|
2517
2517
|
`)}`:prompt}async _runInputHandlers(text2,images,source,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"}),promptDisposition?.("handled"),preflightResult?.(!0);return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(this._flushPendingBashMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now()}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(skillBlocks.length>=MAX_SKILL_EXPANSIONS_PER_PROMPT){this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`});break}if(removedTokens.push(token),expandedSkillNames.has(skill.name)){this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}try{let content=readFileSync42(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return;let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options?.enqueueOrder):await this._queueFollowUp(expandedText,processedInput.images,options?.enqueueOrder),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}})}async steer(text2,images,options){await this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){await this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,enqueueOrder){this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"steer",count:this._steeringMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredSteeringMessages.push(message);return}this.agent.steer(message)}async _queueFollowUp(text2,images,enqueueOrder){this._followUpMessages.push(text2),this._recordQueuedInput(text2,"followUp",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"followUp",count:this._followUpMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredFollowUpMessages.push(message);return}this.agent.followUp(message)}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:"extension"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve42=>{resolveBindingPromptReadiness=resolve42});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
|
|
2518
|
-
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy)}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel??=model.defaultThinkingLevel,requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual4(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual4(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID14(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID14(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID14();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID14();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID14(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=estimateMessagesTokens2(sessionContext.messages),this._incrementMessageRevision(),!this._compactionLifecycle.finish({operationId,status:"completed",endedRevision:this._messageRevision}))throw new CompactionCancelledError;return this._delegatedCompactionKey=void 0,request2.owner==="compaction"&&this._compactionAbortController===request2.controller&&(this._compactionAbortController=void 0),this._emit({type:"compaction_end",reason:request2.reason,result:compactionResult,aborted:!1,willRetry:request2.willRetry,requestId,accepted:!0}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!0,compactionEntry:savedEntry,fromExtension,willRetry:request2.willRetry}),await this._onCompactionContextChanged(),{accepted:!0,requestId,result:compactionResult,compactionEntry:savedEntry,fromExtension}}catch(error2){if(error2 instanceof CompactionExecutionError)throw error2;let lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){let currentLeaf=pathEntries[pathEntries.length-1];if(!currentLeaf)return!1;let simulatedCompactionEntry={type:"compaction",id:`simulated-${randomUUID14()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID14();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID14();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve42=>{settle=resolve42}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID14();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options)},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2519
|
-
${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path13){await rm10(path13,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary2(entriesToSummarize,{model:requestModel,apiKey,headers,extraBody,env,signal:this._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,streamFn:this.agent.streamFunction,retry:this.settingsManager.getRetrySettings(),callbacks:this._summarizationRetryCallbacks({source:"branchSummary"})});if(result3.aborted)return{cancelled:!0,aborted:!0};if(result3.error)throw new Error(result3.error);summaryText=result3.summary,summaryUsage=result3.usage,summaryDetails={readFiles:result3.readFiles||[],modifiedFiles:result3.modifiedFiles||[]}}else extensionSummary&&(summaryText=extensionSummary.summary,summaryDetails=extensionSummary.details,summaryUsage=extensionSummary.usage);let resume=options.intent==="resume"&&!replacement,newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:resume?newLeafId=targetId:targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=this.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,fromExtension,summaryUsage);summaryEntry=this.sessionManager.getEntry(summaryId),label3&&this.sessionManager.appendLabelChange(summaryId,label3)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label3&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label3),resume&&(summaryText||label3)&&this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision(),await this._extensionRunner.emit({type:"session_tree",newLeafId:this.sessionManager.getLeafId(),oldLeafId,summaryEntry,fromExtension:summaryText?fromExtension:void 0}),resume&&this.sessionManager.getLeafId()!==targetId&&(this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),{editorText,cancelled:!1,summaryEntry,entryId:editedEntryId}}finally{this._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text2=contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage()}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this.model;if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname48(filePath);existsSync45(dir)||mkdirSync26(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync23(filePath,`${lines.join(`
|
|
2518
|
+
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy),await this._retryFallback.rerouteAroundOpenCircuit()}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel??=model.defaultThinkingLevel,requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual4(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual4(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID14(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID14(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID14();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID14();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID14(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=estimateMessagesTokens2(sessionContext.messages),this._incrementMessageRevision(),!this._compactionLifecycle.finish({operationId,status:"completed",endedRevision:this._messageRevision}))throw new CompactionCancelledError;return this._delegatedCompactionKey=void 0,request2.owner==="compaction"&&this._compactionAbortController===request2.controller&&(this._compactionAbortController=void 0),this._emit({type:"compaction_end",reason:request2.reason,result:compactionResult,aborted:!1,willRetry:request2.willRetry,requestId,accepted:!0}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!0,compactionEntry:savedEntry,fromExtension,willRetry:request2.willRetry}),await this._onCompactionContextChanged(),{accepted:!0,requestId,result:compactionResult,compactionEntry:savedEntry,fromExtension}}catch(error2){if(error2 instanceof CompactionExecutionError)throw error2;let lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){let currentLeaf=pathEntries[pathEntries.length-1];if(!currentLeaf)return!1;let simulatedCompactionEntry={type:"compaction",id:`simulated-${randomUUID14()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID14();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID14();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve42=>{settle=resolve42}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID14();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options)},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2519
|
+
${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path13){await rm10(path13,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary2(entriesToSummarize,{model:requestModel,apiKey,headers,extraBody,env,signal:this._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,streamFn:this.agent.streamFunction,retry:this.settingsManager.getRetrySettings(),callbacks:this._summarizationRetryCallbacks({source:"branchSummary"})});if(result3.aborted)return{cancelled:!0,aborted:!0};if(result3.error)throw new Error(result3.error);summaryText=result3.summary,summaryUsage=result3.usage,summaryDetails={readFiles:result3.readFiles||[],modifiedFiles:result3.modifiedFiles||[]}}else extensionSummary&&(summaryText=extensionSummary.summary,summaryDetails=extensionSummary.details,summaryUsage=extensionSummary.usage);let resume=options.intent==="resume"&&!replacement,newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:resume?newLeafId=targetId:targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=this.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,fromExtension,summaryUsage);summaryEntry=this.sessionManager.getEntry(summaryId),label3&&this.sessionManager.appendLabelChange(summaryId,label3)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label3&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label3),resume&&(summaryText||label3)&&this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision(),await this._extensionRunner.emit({type:"session_tree",newLeafId:this.sessionManager.getLeafId(),oldLeafId,summaryEntry,fromExtension:summaryText?fromExtension:void 0}),resume&&this.sessionManager.getLeafId()!==targetId&&(this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),{editorText,cancelled:!1,summaryEntry,entryId:editedEntryId}}finally{this._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text2=contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this.model;if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname48(filePath);existsSync45(dir)||mkdirSync26(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync23(filePath,`${lines.join(`
|
|
2520
2520
|
`)}
|
|
2521
2521
|
`),filePath}getLastAssistantText(){let lastAssistant=this.messages.slice().reverse().find(m=>{if(m.role!=="assistant")return!1;let msg=m;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text2="";for(let content of lastAssistant.content)content.type==="text"&&(text2+=content.text);return text2.trim()||void 0}createReplacedSessionContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()));return context.sendMessage=(message,options)=>this.sendCustomMessage(message,options),context.sendUserMessage=(content,options)=>this.sendUserMessage(content,options),context}hasExtensionHandlers(eventType){return this._extensionRunner.hasHandlers(eventType)}get extensionRunner(){return this._extensionRunner}};function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals.missedTokens+=miss.missedTokens,totals.missedCost+=miss.missedCost,totals.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}function createAllToolRenderers(){return{read:readRenderers,bash:createShellRenderers("$"),powershell:createShellRenderers("PS>"),edit:editRenderers,write:writeRenderers,grep:grepRenderers,find:findRenderers,ls:lsRenderers}}function withBuiltInRenderers(toolName,definition){let builtIn=createAllToolRenderers()[toolName];return definition?builtIn?{...definition,renderCall:definition.renderCall??builtIn.renderCall,renderResult:definition.renderResult??builtIn.renderResult}:definition:builtIn}var import_semver=__toESM(require_semver(),1);import path10 from"node:path";import{existsSync as existsSync46,readFileSync as readFileSync43}from"fs";var GITHUB_REPO="earendil-works/pi",CHANGELOG_LINK_BASE_PATH="packages/coding-agent",LEGACY_REPO_RE=/^https:\/\/github\.com\/(?:badlogic|earendil-works)\/pi-mono(?=\/|$)/,URL_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,INLINE_MARKDOWN_LINK_RE=/(!?\[[^\]\n]+\]\()([^\s)]+)((?:\s+[^)]*)?\))/g;function entryVersion(entry){return entry.version??`${entry.major}.${entry.minor}.${entry.patch}${entry.suffix?`-${entry.suffix}`:""}`}var VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/,CALVER_RE=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([2-9]\d*))?$/;function isValidDate(value2){let match=/^(\d{4})-(\d{2})-(\d{2})$/.exec(value2);if(!match)return!1;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]),date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}function isForeignVersion(version){return version.startsWith("0.0.0-omob.")||/^\d+\.\d+\.\d+-0\.beta\./.test(version)}function compareVersionStrings(left,right){let leftCalver=CALVER_RE.exec(left),rightCalver=CALVER_RE.exec(right);if(leftCalver&&rightCalver){let leftParts=[Number(leftCalver[1]),Number(leftCalver[2]),Number(leftCalver[3]),Number(leftCalver[4]??1)],rightParts=[Number(rightCalver[1]),Number(rightCalver[2]),Number(rightCalver[3]),Number(rightCalver[4]??1)];for(let index=0;index<leftParts.length;index+=1)if(leftParts[index]!==rightParts[index])return leftParts[index]<rightParts[index]?-1:1;return 0}let leftValid=(0,import_semver.valid)(left),rightValid=(0,import_semver.valid)(right);if(!(!leftValid||!rightValid||isForeignVersion(left)!==isForeignVersion(right)))return Math.sign((0,import_semver.compare)(leftValid,rightValid))}function normalizeTag(version){let versionString=typeof version=="string"?version:entryVersion(version);return versionString.startsWith("v")?versionString:`v${versionString}`}function splitLocalTarget(target){let hashIndex=target.indexOf("#"),beforeHash=hashIndex===-1?target:target.slice(0,hashIndex),fragment=hashIndex===-1?"":target.slice(hashIndex),queryIndex=beforeHash.indexOf("?");return queryIndex===-1?{fragment,pathPart:beforeHash,query:""}:{fragment,pathPart:beforeHash.slice(0,queryIndex),query:beforeHash.slice(queryIndex)}}function normalizePathPart(value2){return value2.replaceAll("\\","/")}function resolveRepositoryPath(targetPath){let normalizedTarget=normalizePathPart(targetPath),joined=normalizedTarget.startsWith("/")?path10.posix.normalize(normalizedTarget.replace(/^\/+/,"")):path10.posix.normalize(path10.posix.join(CHANGELOG_LINK_BASE_PATH,normalizedTarget));if(!(joined==="."||joined.startsWith("../")||joined===".."))return joined}function isDirectoryTarget(originalPath,repositoryPath){return originalPath.endsWith("/")?!0:!path10.posix.basename(repositoryPath).includes(".")}function normalizeChangelogLinkTarget(target,tag){let canonicalTarget=target.replace(LEGACY_REPO_RE,`https://github.com/${GITHUB_REPO}`),repoUrl=`https://github.com/${GITHUB_REPO}`;for(let route2 of["blob","tree"])for(let branch of["main","master"]){let floatingRefPrefix=`${repoUrl}/${route2}/${branch}/`;canonicalTarget.startsWith(floatingRefPrefix)&&(canonicalTarget=`${repoUrl}/${route2}/${tag}/${canonicalTarget.slice(floatingRefPrefix.length)}`)}if(canonicalTarget.startsWith("#")||canonicalTarget.startsWith("//")||URL_SCHEME_RE.test(canonicalTarget))return canonicalTarget;let{fragment,pathPart,query}=splitLocalTarget(canonicalTarget);if(!pathPart)return canonicalTarget;let repositoryPath=resolveRepositoryPath(pathPart);if(!repositoryPath)return canonicalTarget;let route=isDirectoryTarget(pathPart,repositoryPath)?"tree":"blob";return`https://github.com/${GITHUB_REPO}/${route}/${tag}/${encodeURI(repositoryPath)}${query}${fragment}`}function normalizeChangelogLinks(markdown,version){let tag=normalizeTag(version);return markdown.replace(INLINE_MARKDOWN_LINK_RE,(_match,prefix,target,suffix)=>`${prefix}${normalizeChangelogLinkTarget(target,tag)}${suffix}`)}function parseChangelog(changelogPath){if(!existsSync46(changelogPath))return[];try{let lines=readFileSync43(changelogPath,"utf-8").split(`
|
|
2522
2522
|
`),entries=[],currentLines=[],currentVersion=null,fence=null;for(let line of lines){let fenceMatch=/^ {0,3}(`{3,}|~{3,})/.exec(line);if(fenceMatch){let character=fenceMatch[1][0]==="`"?"`":"~";fence?fence.character===character&&fenceMatch[1].length>=fence.length&&(fence=null):fence={character,length:fenceMatch[1].length}}let headerMatch=fence===null?/^##[ \t]+(?:\[([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?)\]|([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)))(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/.exec(line):null;if(headerMatch||fence===null&&/^##[ \t]+\[?Unreleased\]?[ \t]*(?:-[ \t]+\d{4}-\d{2}-\d{2})?[ \t]*$/.test(line))if(currentVersion&¤tLines.length>0&&entries.push({...currentVersion,content:currentLines.join(`
|
|
@@ -2541,14 +2541,19 @@ ${codeSpan(styledWarning)}
|
|
|
2541
2541
|
`)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.notice?.setSummary(void 0)}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source){return source.usesDefaultSessionDir()?{}:{sessionDir:source.getSessionDir()}}function currentScopeSessions(source,onProgress){let cwd=source.getCwd();return withMovedSessions(SessionManager.list(cwd,source.getSessionDir(),onProgress),cwd,sharedSessionDir(source))}async function allScopeSessions(source,onProgress){let sessions2=source.usesDefaultSessionDir()?await SessionManager.listAll(onProgress):await SessionManager.listAll(source.getSessionDir(),onProgress);return markMovedSessions(sessions2,source.getCwd())}async function chooseResumePath(sessionPath,source,ui){let cwd=source.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
|
|
2542
2542
|
This directory is the same git repository: ${cwd}
|
|
2543
2543
|
Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync47,mkdirSync as mkdirSync28,readFileSync as readFileSync47,realpathSync as realpathSync10,writeFileSync as writeFileSync24}from"node:fs";import{join as join85}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform4){return platform4==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync47(join85(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync28(agentDir,{recursive:!0}),writeFileSync24(join85(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2544
|
-
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync47,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}function
|
|
2544
|
+
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync47,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
|
|
2545
|
+
${theme.bold("Failures")}
|
|
2546
|
+
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2547
|
+
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|
|
2548
|
+
`,report.postFailureRequests>0){let misses=report.postFailureFullMissRequests,tokens=report.postFailureFullMissInputTokens.toLocaleString();info+=`${label3("Retries after a failure with no cache hit:")} ${misses} of ${report.postFailureRequests} ${label3(`(${tokens} uncached input tokens)`)}
|
|
2549
|
+
`}return info}function countGraphemesFrom(text2,start){let count=0,tailStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))count+=1,tailStart=start+segment2.index;return{count,tailStart}}function segmentFrom(text2,start,clusters){let count=0,end=start,lastStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))if(count+=1,lastStart=start+segment2.index,end=lastStart+segment2.segment.length,count>=clusters)break;return{count,end,lastStart}}var BlockUnitCounter=class{#entries=new Map;#sliceEntries=new Map;count(index,text2){let entry=this.#entries.get(index);if(entry!==void 0){if(entry.text===text2)return entry.count;if(entry.count>0&&text2.length>entry.text.length&&text2.startsWith(entry.text)){let tail=countGraphemesFrom(text2,entry.tailStart),next={text:text2,count:entry.count-1+tail.count,tailStart:tail.tailStart};return this.#entries.set(index,next),next.count}}let full=countGraphemesFrom(text2,0);return this.#entries.set(index,{text:text2,count:full.count,tailStart:full.tailStart}),full.count}slice(index,text2,units){let wholeUnits=Math.floor(units);if(wholeUnits<=0||text2.length===0)return"";let entry=this.#sliceEntries.get(index);if(entry?.text===text2&&entry.units===wholeUnits)return entry.end>=text2.length?text2:text2.slice(0,entry.end);if(entry!==void 0&&(entry.text===text2||text2.startsWith(entry.text))&&wholeUnits>=entry.units){let segment3=segmentFrom(text2,entry.lastStart,wholeUnits-entry.units+1);return this.#sliceEntries.set(index,{text:text2,units:entry.units-1+segment3.count,end:segment3.end,lastStart:segment3.lastStart}),segment3.end>=text2.length?text2:text2.slice(0,segment3.end)}let segment2=segmentFrom(text2,0,wholeUnits);return this.#sliceEntries.set(index,{text:text2,units:segment2.count,end:segment2.end,lastStart:segment2.lastStart}),segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}reset(){this.#entries.clear(),this.#sliceEntries.clear()}};function countGraphemes(text2){return countGraphemesFrom(text2,0).count}function sliceGraphemes(text2,units){if(units<=0||text2.length===0)return"";let segment2=segmentFrom(text2,0,units);return segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}function countVisibleUnits(message,hideThinking,countOf){let total=0;for(let index=0;index<message.content.length;index++){let block=message.content[index];block?.type==="text"?total+=countOf(index,block.text):block?.type==="thinking"&&!hideThinking&&(total+=countOf(index,block.thinking))}return total}function buildDisplayMessage(target,revealed,hideThinking,countOf=(_index,text2)=>countGraphemes(text2),sliceOf=(_index,text2,units)=>sliceGraphemes(text2,units)){let remaining=Math.max(0,Math.floor(revealed)),content=[];for(let index=0;index<target.content.length;index++){let block=target.content[index];if(block)if(block.type==="text"){let units=countOf(index,block.text);content.push(remaining<=0?block.text.length===0?block:{...block,text:""}:remaining>=units?block:{...block,text:sliceOf(index,block.text,remaining)}),remaining=Math.max(0,remaining-units)}else if(block.type==="thinking"&&!hideThinking){let units=countOf(index,block.thinking);content.push(remaining<=0?block.thinking.length===0?block:{...block,thinking:""}:remaining>=units?block:{...block,thinking:sliceOf(index,block.thinking,remaining)}),remaining=Math.max(0,remaining-units)}else content.push(block)}return{...target,content}}function updateArrivalRate(currentRate,appendedUnits,elapsedMs){if(appendedUnits<=0||elapsedMs<=0)return currentRate;let sampleRate=appendedUnits*1e3/elapsedMs,maximumSample=Math.max(45,currentRate*4),boundedSample=Math.min(maximumSample,Math.max(45,sampleRate));return currentRate+.25*(boundedSample-currentRate)}function nextStep(backlog,dtMs,arrivalRate=90){if(backlog<=0)return 0;let dt=Math.min(Math.max(dtMs,1),100),baseArrivalRate=Math.max(45,arrivalRate),targetBacklog=baseArrivalRate*140/1e3,backlogError=backlog-targetBacklog,correctionRate=Math.min(600,Math.max(-baseArrivalRate,backlogError*(1e3/267))),revealRate=Math.max(0,baseArrivalRate+correctionRate);return Math.min(backlog,revealRate*dt/1e3)}var StreamingRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#getHideThinkingBlock;#requestRender;#unitCounter=new BlockUnitCounter;#countOf=(index,text2)=>this.#unitCounter.count(index,text2);#sliceOf=(index,text2,units)=>this.#unitCounter.slice(index,text2,units);#target;#component;#timer;#timerFps;#revealed=0;#lastTickAt=0;#firstBufferedAt;#lastTargetAt;#arrivalRate=90;#stepCarry=0;#hideThinkingBlock=!1;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#getHideThinkingBlock=options.getHideThinkingBlock,this.#requestRender=options.requestRender}begin(component,message){if(this.stop(),this.#component=component,this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#visibleUnits(message)>0){let now2=performance.now();this.#firstBufferedAt=now2,this.#lastTargetAt=now2}this.#applyTarget()}setTarget(message){let now2=performance.now(),previousUnits=this.#target?this.#visibleUnits(this.#target):0;this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock();let total=this.#visibleUnits(message),appended=Math.max(0,total-previousUnits);appended>0&&(this.#firstBufferedAt===void 0&&(this.#firstBufferedAt=now2),this.#lastTargetAt!==void 0&&now2>this.#lastTargetAt&&(this.#arrivalRate=updateArrivalRate(this.#arrivalRate,appended,now2-this.#lastTargetAt)),this.#lastTargetAt=now2),this.#component&&this.#applyTarget()}resyncVisibility(){!this.#target||!this.#component||(this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#revealed=Math.min(this.#revealed,this.#visibleUnits(this.#target)),this.#applyTarget())}isPacingHead(message){return!this.#target||!this.#component?!1:this.#getSmoothStreaming()&&!message.content.some(block=>block.type==="toolCall")}stop(){this.#stopTimer(),this.#target=void 0,this.#component=void 0,this.#revealed=0,this.#lastTickAt=0,this.#unitCounter.reset(),this.#firstBufferedAt=void 0,this.#lastTargetAt=void 0,this.#arrivalRate=90,this.#stepCarry=0}#applyTarget(){let target=this.#target,component=this.#component;if(!target||!component)return;let total=this.#visibleUnits(target);if(!this.#getSmoothStreaming()||target.content.some(block=>block.type==="toolCall")){this.#revealed=total,this.#stepCarry=0,this.#stopTimer(),component.updateContent(target);return}this.#revealed=Math.min(this.#revealed,total),this.#renderCurrent(),this.#syncTimer(total)}#visibleUnits(message){return countVisibleUnits(message,this.#hideThinkingBlock,this.#countOf)}#renderCurrent(){!this.#target||!this.#component||this.#component.updateContent(buildDisplayMessage(this.#target,this.#revealed,this.#hideThinkingBlock,this.#countOf,this.#sliceOf))}#syncTimer(total){if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}this.#startTimer()}#startTimer(){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(this.#timer&&this.#timerFps===fps)return;this.#stopTimer(),this.#lastTickAt=performance.now();let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){let target=this.#target;if(!target||!this.#component){this.stop();return}let total=this.#visibleUnits(target);if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}let now2=performance.now(),dt=now2-this.#lastTickAt;if(this.#lastTickAt=now2,this.#firstBufferedAt!==void 0&&now2-this.#firstBufferedAt<80)return;this.#stepCarry+=nextStep(total-this.#revealed,dt,this.#arrivalRate);let wholeStep=Math.floor(this.#stepCarry);wholeStep<=0||(this.#stepCarry-=wholeStep,this.#revealed=Math.min(total,this.#revealed+wholeStep),this.#renderCurrent(),this.#requestRender(),this.#revealed>=total&&(this.#stepCarry=0,this.#stopTimer()))}};import{mkdirSync as mkdirSync29,readFileSync as readFileSync48,renameSync as renameSync21,writeFileSync as writeFileSync25}from"node:fs";import{dirname as dirname50,join as join86}from"node:path";function hintPath(agentDir=getAgentDir()){return join86(agentDir,"cache","terminal-theme.json")}function readTerminalThemeHint(agentDir){try{let parsed=JSON.parse(readFileSync48(hintPath(agentDir),"utf8"));if(typeof parsed!="object"||parsed===null)return;let value2=parsed.terminalTheme;return value2==="light"||value2==="dark"?value2:void 0}catch{return}}function writeTerminalThemeHint(terminalTheme,agentDir){try{let path13=hintPath(agentDir);mkdirSync29(dirname50(path13),{recursive:!0});let temporary=`${path13}.${process.pid}.tmp`;writeFileSync25(temporary,`${JSON.stringify({terminalTheme})}
|
|
2545
2550
|
`),renameSync21(temporary,path13)}catch{}}var InteractiveThemeController=class{constructor(ui,options){this.terminalTheme=readTerminalThemeHint()??detectTerminalBackgroundFromEnv().theme,this.autoSyncEnabled=!1,this.detectionGeneration=0,this.detectionTask=Promise.resolve(),this.ui=ui,this.getSettingsManager=options.getSettingsManager,this.showError=options.showError,this.onChanged=options.onChanged,this.currentThemeSetting=options.initialThemeSetting,this.activeThemeName=resolveThemeSetting(this.currentThemeSetting??this.getSettingsManager().getThemeSetting(),this.terminalTheme),initTheme(this.activeThemeName,!0),this.bindTerminalColorSchemeListener()}rebindTui(){this.terminalColorSchemeUnsubscribe?.(),this.bindTerminalColorSchemeListener(),this.ui.setTerminalColorSchemeNotifications(this.autoSyncEnabled)}async applyFromSettings(){let settingsManager=this.getSettingsManager(),themeSetting=this.currentThemeSetting??settingsManager.getThemeSetting(),autoTheme=parseAutoThemeSetting(themeSetting),generation2=++this.detectionGeneration;if(autoTheme){this.setAutoSync(!0),this.applyThemeName(this.terminalTheme==="light"?autoTheme.lightTheme:autoTheme.darkTheme,!0),this.detectionTask=this.resolveAutoTheme(generation2,autoTheme);return}if(this.setAutoSync(!1),themeSetting!==void 0){this.applyThemeName(themeSetting,!0),this.detectionTask=Promise.resolve();return}this.applyThemeName(this.terminalTheme),this.detectionTask=this.resolveBackgroundTheme(generation2,settingsManager)}settleBackgroundDetection(){return this.detectionTask}getThemeSelection(){return this.currentThemeSetting??this.getSettingsManager().getThemeSetting()??this.activeThemeName}setThemeName(themeName,showError=!1){this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1);let result3=this.applyThemeName(themeName,showError);return result3.success&&(this.currentThemeSetting=themeName),result3}async setThemeSetting(themeSetting){this.currentThemeSetting=themeSetting,await this.applyFromSettings()}setThemeInstance(themeInstance){return this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1),setThemeInstance(themeInstance),this.activeThemeName="<in-memory>",this.notifyChanged(),{success:!0}}preview(themeSettingOrName){let themeName=resolveThemeSetting(themeSettingOrName,this.terminalTheme)??this.activeThemeName;themeName&&setTheme(themeName,!0).success&&(this.ui.invalidate(),this.ui.requestRender())}disableAutoSync(){this.setAutoSync(!1)}dispose(){this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1),this.terminalColorSchemeUnsubscribe?.(),this.terminalColorSchemeUnsubscribe=void 0}getTerminalTheme(){return this.terminalTheme}async resolveAutoTheme(generation2,autoTheme){try{let detected=await detectTerminalThemeForAuto({ui:this.ui,timeoutMs:100});if(generation2!==this.detectionGeneration)return;this.terminalTheme=detected,writeTerminalThemeHint(detected),this.applyThemeName(detected==="light"?autoTheme.lightTheme:autoTheme.darkTheme,!0)}catch{}}async resolveBackgroundTheme(generation2,settingsManager){try{let detection=await detectTerminalBackgroundTheme({ui:this.ui,timeoutMs:100});if(generation2!==this.detectionGeneration||(this.terminalTheme=detection.theme,writeTerminalThemeHint(detection.theme),!this.applyThemeName(detection.theme).success))return;detection.confidence==="high"&&(settingsManager.setTheme(detection.theme),await settingsManager.flush())}catch{}}applyThemeName(themeName,showError=!1){let result3=setTheme(themeName,!0);return this.activeThemeName=result3.success?themeName:"dark",this.notifyChanged(),!result3.success&&showError&&this.showError(`Failed to load theme "${themeName}": ${result3.error}
|
|
2546
2551
|
Fell back to dark theme.`),result3}notifyChanged(){this.ui.invalidate(),this.onChanged()}setAutoSync(enabled){this.autoSyncEnabled!==enabled&&(this.autoSyncEnabled=enabled,this.ui.setTerminalColorSchemeNotifications(enabled))}bindTerminalColorSchemeListener(){this.terminalColorSchemeUnsubscribe=this.ui.onTerminalColorSchemeChange(terminalTheme=>this.applyTerminalTheme(terminalTheme))}applyTerminalTheme(terminalTheme){if(!this.autoSyncEnabled)return;this.terminalTheme=terminalTheme;let autoTheme=parseAutoThemeSetting(this.currentThemeSetting??this.getSettingsManager().getThemeSetting());if(!autoTheme){this.setAutoSync(!1);return}let themeName=terminalTheme==="light"?autoTheme.lightTheme:autoTheme.darkTheme;themeName!==this.activeThemeName&&this.applyThemeName(themeName)}};function buildFavoriteCycleStatusMessage(kind){let openSelector=keyText("app.model.select"),toggleFavorite=keyText("app.models.toggleFavorite"),setupHint=`Press ${openSelector} then ${toggleFavorite} to favorite models, or run /favorite-models.`;return kind==="single"?`Only one favorite model available. ${setupHint}`:`No favorite models configured. ${setupHint} See /help for the full reference.`}function recordTipShown(history,tipId,now2){return{...history,[tipId]:now2}}function appendTipLine(container,tipLine){container.addChild(new Spacer(1));let tip=new Text(tipLine,1,0);return container.addChild(tip),tip}function appendStartupHeader(container,header2,tipLine){container.addChild(new Spacer(1)),container.addChild(header2);let tipComponent=tipLine?appendTipLine(container,tipLine):void 0;return container.addChild(new Spacer(1)),tipComponent}function selectTip(definitions,history,now2,options={}){let keys=options.keys,hasCommand=options.hasCommand,oldestTip,oldestTimestamp=Number.POSITIVE_INFINITY;for(let tip of definitions){if(options.exclude?.has(tip.id)||keys&&tip.bindings.length>0&&tip.bindings.every(binding=>keys(binding)==="")||hasCommand&&tip.requiresCommand!==void 0&&!hasCommand(tip.requiresCommand))continue;if(!Object.hasOwn(history,tip.id))return tip;let lastShown=history[tip.id];(oldestTip===void 0||lastShown<oldestTimestamp)&&(oldestTip=tip,oldestTimestamp=lastShown)}return oldestTip}function resolveStartupTipLine(options){if(!options.tipsEnabled||options.quietStartup)return;let selectOptions={keys:options.keys,...options.hasCommand?{hasCommand:options.hasCommand}:{},...options.exclude?{exclude:options.exclude}:{}},tip=selectTip(options.definitions,options.history,options.now,selectOptions);return tip?{line:`Tip: ${tip.render(options.keys).replace(/\s*\n\s*/g," ").trim()}
|
|
2547
2552
|
\u21B3 Want the full story on any tip? Ask about it \u2014 the give-me-tips skill has the tour.`,tipId:tip.id}:void 0}var WorkingTipCache=class{resetForNewTurn(){this.cached=void 0}resolve(compute,onFirstResolve){if(this.cached!==void 0)return this.cached.value;let value2=compute();return this.cached={value:value2},value2&&onFirstResolve?.(value2),value2}};function resolveWorkingTipLine(options){if(!options.tipsEnabled)return;let tip=selectTip(options.definitions,options.history,options.now,{keys:options.keys,...options.hasCommand?{hasCommand:options.hasCommand}:{},exclude:options.sessionShownTipIds});return tip?{line:`Tip: ${tip.render(options.keys).replace(/\s*\n\s*/g," ").trim()}
|
|
2548
2553
|
\u21B3 Want the full story on any tip? Ask about it \u2014 the give-me-tips skill has the tour.`,tipId:tip.id}:void 0}function buildTmuxSetupWarning(check){let recommendations=[];if(check.extendedKeys!=="on"&&check.extendedKeys!=="always"&&recommendations.push({setting:"set -g extended-keys on",reason:"modified Enter keys (Shift+Enter, ...)"}),check.extendedKeysFormat==="xterm"&&recommendations.push({setting:"set -g extended-keys-format csi-u",reason:"Pi works best with csi-u"}),!check.imagesEnabled&&check.outerKittyCapable){let versionMatch=check.version?.match(/^(\d+)\.(\d+)/),major=Number(versionMatch?.[1]??0),minor=Number(versionMatch?.[2]??0);check.version&&(major<3||major===3&&minor<3)?recommendations.push({setting:`upgrade tmux (current ${check.version})`,reason:"inline images need tmux >= 3.3"}):(["1","on","all"].includes(check.allowPassthrough??"")||recommendations.push({setting:"set -g allow-passthrough on",reason:"inline images (Kitty graphics)"}),["1","on"].includes(check.focusEvents??"")||recommendations.push({setting:"set -g focus-events on",reason:"repaint images after pane activation"}))}if(recommendations.length===0)return;let settingWidth=Math.max(...recommendations.map(entry=>entry.setting.length));return`tmux is not fully configured. Add to ~/.tmux.conf and restart tmux:
|
|
2549
2554
|
|
|
2550
2555
|
${recommendations.map(entry=>` ${entry.setting.padEnd(settingWidth)} # ${entry.reason}`).join(`
|
|
2551
|
-
`)}`}var MIN_TOOL_ARGS_PARSE_DELTA=64;function isHighSurrogate2(code){return code>=55296&&code<=56319}function isLowSurrogate2(code){return code>=56320&&code<=57343}function advancePastSurrogateBoundary(text2,end){return end<=0||end>=text2.length?end:isHighSurrogate2(text2.charCodeAt(end-1))&&isLowSurrogate2(text2.charCodeAt(end))?end+1:end}var ToolArgsRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#requestRender;#states=new Map;#timer;#timerFps;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#requestRender=options.requestRender}update(id,component,partialJson){if(!this.#getSmoothStreaming()||partialJson.length===0)return this.finish(id),!1;let existing=this.#states.get(id);if(existing===void 0||existing.component!==component||!partialJson.startsWith(existing.target))return component.updateArgs(parseStreamingJson(partialJson)),this.#states.set(id,{component,target:partialJson,revealed:partialJson.length,rendered:partialJson.length,lastTickAt:performance.now()}),this.#syncTimer(),!0;let wasCaughtUp=existing.revealed>=existing.target.length;return existing.target=partialJson,wasCaughtUp&&existing.revealed<partialJson.length&&(existing.lastTickAt=performance.now()),this.#syncTimer(),!0}flush(id,exactArgs){let state=this.#states.get(id);return state===void 0?!1:(state.component.updateArgs(exactArgs),this.#states.delete(id),this.#syncTimer(),!0)}flushAll(){for(let state of this.#states.values())state.component.updateArgs(parseStreamingJson(state.target));this.#states.clear(),this.#stopTimer()}finish(id){this.#states.delete(id)&&this.#syncTimer()}refresh(){if(!this.#getSmoothStreaming()){this.flushAll();return}if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!0)}stop(){this.#stopTimer(),this.#states.clear()}#syncTimer(){if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!1)}#hasBacklog(){for(let state of this.#states.values())if(state.revealed<state.target.length)return!0;return!1}#startTimer(restart){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(!restart&&this.#timer!==void 0&&this.#timerFps===fps)return;this.#stopTimer();let now2=performance.now();for(let state of this.#states.values())state.revealed<state.target.length&&(state.lastTickAt=now2);let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer!==void 0&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){if(!this.#getSmoothStreaming()){this.flushAll(),this.#requestRender();return}let now2=performance.now(),rendered=!1;for(let state of this.#states.values()){let backlog=state.target.length-state.revealed;if(backlog<=0)continue;let step=Math.max(1,nextStep(backlog,now2-state.lastTickAt));if(state.revealed=Math.min(state.target.length,state.revealed+step),state.lastTickAt=now2,state.revealed-state.rendered<MIN_TOOL_ARGS_PARSE_DELTA)continue;let renderEnd=advancePastSurrogateBoundary(state.target,Math.min(state.target.length,state.rendered+MIN_TOOL_ARGS_PARSE_DELTA));state.component.updateArgs(parseStreamingJson(state.target.slice(0,renderEnd))),state.rendered=renderEnd,rendered=!0}rendered&&this.#requestRender(),this.#syncTimer()}};function firstText(result3){let block=result3.content[0];return block?.type==="text"?block.text:void 0}function displayResult(state,revealed=state.revealed){let first=state.target.content[0];if(first?.type!=="text")throw new Error("Expected a text tool result");return{content:[{...first,text:state.unitCounter.slice(0,state.text,revealed)},...state.target.content.slice(1)],details:state.target.details,isError:!1}}var ToolResultRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#requestRender;#states=new Map;#timer;#timerFps;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#requestRender=options.requestRender}update(id,component,partialResult){let text2=firstText(partialResult);if(!this.#getSmoothStreaming()||text2===void 0)return this.#discard(id),!1;let existing=this.#states.get(id);if(existing===void 0||existing.component!==component||!text2.startsWith(existing.text)){let state={component,target:partialResult,text:text2,revealed:0,lastTickAt:performance.now(),unitCounter:new BlockUnitCounter};return state.revealed=state.unitCounter.count(0,text2),component.updateResult(displayResult(state),!0),this.#states.set(id,state),this.#syncTimer(),!0}let wasCaughtUp=existing.revealed>=existing.unitCounter.count(0,existing.text);existing.target=partialResult,existing.text=text2;let total=existing.unitCounter.count(0,text2);return wasCaughtUp&&existing.revealed<total&&(existing.lastTickAt=performance.now()),this.#syncTimer(),!0}finish(id){let state=this.#states.get(id);state!==void 0&&(state.component.updateResult(displayResult(state,state.unitCounter.count(0,state.text)),!0),this.#states.delete(id),this.#syncTimer())}refresh(){if(!this.#getSmoothStreaming()){this.#flushAll();return}if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!0)}stop(){this.#stopTimer(),this.#states.clear()}#discard(id){this.#states.delete(id)&&this.#syncTimer()}#flushAll(){for(let state of this.#states.values())state.component.updateResult(displayResult(state,state.unitCounter.count(0,state.text)),!0);this.#states.clear(),this.#stopTimer()}#hasBacklog(){for(let state of this.#states.values())if(state.revealed<state.unitCounter.count(0,state.text))return!0;return!1}#syncTimer(){if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!1)}#startTimer(restart){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(!restart&&this.#timer!==void 0&&this.#timerFps===fps)return;this.#stopTimer();let now2=performance.now();for(let state of this.#states.values())state.revealed<state.unitCounter.count(0,state.text)&&(state.lastTickAt=now2);let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer!==void 0&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){if(!this.#getSmoothStreaming()){this.#flushAll(),this.#requestRender();return}let now2=performance.now(),rendered=!1;for(let state of this.#states.values()){let total=state.unitCounter.count(0,state.text),backlog=total-state.revealed;backlog<=0||(state.revealed=Math.min(total,state.revealed+nextStep(backlog,now2-state.lastTickAt)),state.lastTickAt=now2,state.component.updateResult(displayResult(state),!0),rendered=!0)}rendered&&this.#requestRender(),this.#syncTimer()}};function createInteractiveTui(options){let terminal=options.terminal??new ProcessTerminal({onExternalStdoutWrite:appendHiddenTuiStdout,observeExternalStderrWrites:observeVisibleStderrWrites});if(options.tuiMode==="fullscreen"){let styleSearchMatch=text2=>theme.bg("searchMatchBg",theme.fg("searchMatchText",text2));return new TuiAltScreen(terminal,options.showHardwareCursor,options.logDirectory,{mouse:options.mouse,searchMatchStyle:text2=>theme.underline(styleSearchMatch(text2)),searchCurrentMatchStyle:text2=>theme.bold(theme.inverse(styleSearchMatch(text2))),searchNavigationButtonStyle:(text2,hovered)=>hovered?theme.underline(text2):text2,scrollToEndIndicator:()=>{let shortcut=keyDisplayText("tui.altScreen.bottom"),label3=` \u2193 Jump to latest message${shortcut?` \xB7 ${shortcut}`:""} `;return theme.bg("selectedBg",theme.fg("text",label3))},openUrl:openBrowser,onRightClickPaste:options.onRightClickPaste,copyOnSelect:options.fullscreenCopyOnSelect,copySelection:async text2=>{try{return await copyToClipboard(text2),!0}catch{return!1}}})}return new TuiMainScreen(terminal,options.showHardwareCursor,options.logDirectory)}function createInteractiveTuiReference(getTui){return new Proxy({},{get:(_target,property)=>{let tui=getTui(),value2=Reflect.get(tui,property,tui);if(typeof value2!="function")return value2;let methodTui=tui,method=value2;return(...args)=>{let currentTui=getTui();if(currentTui!==methodTui){let currentMethod=Reflect.get(currentTui,property,currentTui);if(typeof currentMethod!="function")throw new TypeError(`TUI property ${String(property)} is not callable`);methodTui=currentTui,method=currentMethod}return Reflect.apply(method,methodTui,args)}},set:(_target,property,value2)=>{let tui=getTui();return Reflect.set(tui,property,value2,tui)},has:(_target,property)=>Reflect.has(getTui(),property),getPrototypeOf:()=>Reflect.getPrototypeOf(getTui())})}function llamaCppPostLoginGuidance(actionLabel,loadedModelCount){return loadedModelCount===0?`${actionLabel}. No llama.cpp models are loaded. Use /llama to load a model, then /model to select it.`:`${actionLabel}. Use /model to select a loaded llama.cpp model, or /llama to manage models.`}function isWorkingStatusEditor(editor){return"embedWorkingStatus"in editor&&editor.embedWorkingStatus===!0&&"setWorkingStatusIndicator"in editor&&typeof editor.setWorkingStatusIndicator=="function"}function embedStatusIndicatorInEditor(defaultEditor,editor,indicator){return defaultEditor&&isWorkingStatusEditor(defaultEditor)&&defaultEditor.setWorkingStatusIndicator(void 0),!editor||!isWorkingStatusEditor(editor)?!1:(editor.setWorkingStatusIndicator(indicator),!0)}function isExpandable(obj){return typeof obj=="object"&&obj!==null&&"setExpanded"in obj&&typeof obj.setExpanded=="function"}var ExpandableText=class extends Text{constructor(getCollapsedText,getExpandedText,expanded=!1,paddingX=0,paddingY=0){super(expanded?getExpandedText():getCollapsedText(),paddingX,paddingY),this.getCollapsedText=getCollapsedText,this.getExpandedText=getExpandedText}setExpanded(expanded){this.setText(expanded?this.getExpandedText():this.getCollapsedText())}};function shouldShowRetryIndicator(delayMs,fallbackApplied){return delayMs!==0||!fallbackApplied}function getStreamingToolCallPartialJson(content){if(!(typeof content!="object"||content===null||!("partialJson"in content)))return typeof content.partialJson=="string"?content.partialJson:void 0}function formatToolHookTerminalTitle(event){let hookName=sanitizeWorkingStatusPlainText(event.hookName)||"hook",statusMessage=sanitizeWorkingStatusPlainText(event.statusMessage);return`${APP_TITLE} - ${hookName}: ${statusMessage}`}function isCustomSessionEntry(item){return"type"in item&&item.type==="custom"}function isCompactionCostNotice(item){return"type"in item&&item.type==="compaction_cost"}var DEAD_TERMINAL_ERROR_CODES=new Set(["EIO","EPIPE","ENOTCONN"]),EIO_ERRNO=5,DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS=80,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS=6e4,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS=600,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS=32,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS=6e4,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS=1e3,FALLBACK_STATUS_KEY="fallback",RGB_FOREGROUND_PATTERN=/\x1b\[38;2;(\d+);(\d+);(\d+)m/,DARK_DEFAULT_WORKING_TEXT_RGB={r:229,g:229,b:231},LIGHT_DEFAULT_WORKING_TEXT_RGB={r:17,g:17,b:17},DARK_DEFAULT_WORKING_BASE_RGB={r:102,g:102,b:102},LIGHT_DEFAULT_WORKING_BASE_RGB={r:118,g:118,b:118};function parseAnsiRgbForeground(ansi){let match=RGB_FOREGROUND_PATTERN.exec(ansi),red=match?.[1],green=match?.[2],blue=match?.[3];if(!(red===void 0||green===void 0||blue===void 0))return{r:Number.parseInt(red,10),g:Number.parseInt(green,10),b:Number.parseInt(blue,10)}}function isWorkingLightTheme(){return theme.name?.toLowerCase().includes("light")??!1}function formatWorkingStatusShimmerText(text2,intensity){if(theme.getColorMode()!=="truecolor")return intensity<.2?theme.fg("dim",text2):intensity<.6?theme.fg("text",text2):theme.bold(theme.fg("text",text2));let lightTheme=isWorkingLightTheme(),highlight=parseAnsiRgbForeground(theme.getFgAnsi("dim"))??(lightTheme?LIGHT_DEFAULT_WORKING_BASE_RGB:DARK_DEFAULT_WORKING_BASE_RGB),base=parseAnsiRgbForeground(theme.getFgAnsi("text"))??(lightTheme?LIGHT_DEFAULT_WORKING_TEXT_RGB:DARK_DEFAULT_WORKING_TEXT_RGB),color=blendWorkingStatusShimmerRgbColor(highlight,base,intensity*.9);return`\x1B[1m\x1B[38;2;${color.r};${color.g};${color.b}m${text2}\x1B[39m\x1B[22m`}function isDeadTerminalError(error2){if(!error2||typeof error2!="object")return!1;if("code"in error2){let code=error2.code;if(code!==void 0&&DEAD_TERMINAL_ERROR_CODES.has(code))return!0}if("errno"in error2){let errno=error2.errno;return errno===EIO_ERRNO||errno===-EIO_ERRNO}return!1}function storageWriteCrashMessage(error2){if(!error2||typeof error2!="object"||!("code"in error2))return;let code=error2.code;if(code==="EDQUOT")return"Disk quota exceeded (EDQUOT). Free space or quota on the filesystem, then retry.";if(code==="ENOSPC")return"Disk full (ENOSPC). Free space on the filesystem, then retry."}var ANTHROPIC_SUBSCRIPTION_AUTH_WARNING="Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage. Disable this warning in /settings.";function isAnthropicSubscriptionAuthKey(apiKey){return typeof apiKey=="string"&&apiKey.startsWith("sk-ant-oat")}function isUnknownModel(model){return!!model&&model.provider==="unknown"&&model.id==="unknown"&&model.api==="unknown"}function quoteIfNeeded(value2){return value2.length>0&&!/[^a-zA-Z0-9_\-./~:@]/.test(value2)?value2:`'${value2.replace(/'/g,"'\\''")}'`}function formatResumeCommand(sessionManager){if(!process.stdout.isTTY||!sessionManager.isPersisted())return;let sessionFile=sessionManager.getSessionFile();if(!sessionFile||!fs6.existsSync(sessionFile))return;let args=[APP_COMMAND];return sessionManager.usesDefaultSessionDir()||args.push("--session-dir",quoteIfNeeded(sessionManager.getSessionDir())),args.push("--session",sessionManager.getSessionId()),args.join(" ")}function hasDefaultModelProvider(providerId){return providerId in defaultModelPerProvider}var AUTH_TYPE_ORDER={oauth:0,api_key:1};function createFuzzyAutocompleteItems(items,prefix,getSearchText,toAutocompleteItem){let filtered=fuzzyFilter(items,prefix,getSearchText);return filtered.length===0?null:filtered.map(toAutocompleteItem)}function getLoginProviderCompletionOptions(providerOptions){let byId=new Map;for(let provider of providerOptions){let existing=byId.get(provider.id);if(existing){existing.authTypes.includes(provider.authType)||(existing.authTypes.push(provider.authType),existing.authTypes.sort((a,b)=>AUTH_TYPE_ORDER[a]-AUTH_TYPE_ORDER[b]));continue}byId.set(provider.id,{id:provider.id,name:provider.name,authTypes:[provider.authType]})}return Array.from(byId.values()).sort((a,b)=>a.name.localeCompare(b.name))}function getLoginProviderSearchText(provider){let authTypes=provider.authTypes.map(authType=>`${authType} ${formatAuthSelectorProviderType(authType)}`).join(" ");return`${provider.id} ${provider.name} ${authTypes}`}function formatLoginProviderCompletionDescription(provider){let authTypes=provider.authTypes.map(formatAuthSelectorProviderType).join("/");return provider.name===provider.id?authTypes:`${provider.name} \xB7 ${authTypes}`}function assistantStreamingHeadMessage(message){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");return firstToolIndex===-1?message:{...message,content:message.content.slice(0,firstToolIndex+1)}}var OptimisticUserEchoController=class{constructor(render2){this.nextId=0,this.pending=[],this.render=render2}begin(text2){let id=`pending-user-${++this.nextId}`;return this.pending.push({id,handle:this.render(text2),eligibleForCanonicalStart:!1}),id}promptOptions(id){return{preflightResult:success=>{success||this.reject(id)},promptDisposition:disposition=>{let record7=this.pending.find(candidate=>candidate.id===id);record7&&(disposition==="started"?record7.eligibleForCanonicalStart=!0:this.reject(id))}}}reject(id){if(id===void 0)return;let index=this.pending.findIndex(record8=>record8.id===id);if(index===-1)return;let[record7]=this.pending.splice(index,1);record7?.handle.remove()}remove(id){this.reject(id)}replaceNext(message){if(!this.pending[0]?.eligibleForCanonicalStart)return!1;let[record7]=this.pending.splice(0,1);return record7?(record7.handle.replace(message),!0):!1}},IMAGE_MARKER_PATTERN2=/\[Image #([1-9]\d*)\]/g;async function attachClipboardImage(deps,image){if(deps.settings.getBlockImages())return deps.showStatus("Image paste blocked by the images.blockImages setting"),!1;if(!deps.editor.insertImageMarker)return deps.showStatus("Image paste is not supported by the active editor"),!1;if(deps.isCompacting())return deps.showStatus("Image paste dropped: messages sent during compaction cannot carry images - paste again after compaction finishes"),!0;let processed=await processImage(image.bytes,image.mimeType,{autoResizeImages:deps.settings.getImageAutoResize()});if(!processed.ok)return deps.showStatus(processed.message),!1;let id=deps.editor.insertImageMarker();return deps.pendingImages.set(id,{type:"image",data:processed.data,mimeType:processed.mimeType}),deps.requestRender(),!0}function linesFactory(lines){if(lines!==void 0)return()=>{let container=new Container;for(let line of lines)container.addChild(new Text(line,1,0));return container}}var InteractiveMode=class _InteractiveMode{static restoreCompactionEscapeOverride(host){host.compactionEscapeOverrideActive&&(host.defaultEditor.onEscape=host.autoCompactionEscapeHandler,host.autoCompactionEscapeHandler=void 0,host.compactionEscapeOverrideActive=!1)}requestStreamingRender(){this.ui.requestRender()}applySmoothStreamingRenderFps(){let fps=this.settingsManager.getSmoothStreaming()?this.settingsManager.getSmoothStreamingFps():60;this.ui.setMaxRenderFps(fps)}get shownQuestion(){return this.shownQuestionId===void 0?void 0:this.pendingQuestions.get(this.shownQuestionId)}get session(){return this.runtimeHost?.session}get sessionManager(){return this.session.sessionManager}get settingsManager(){return this.session.settingsManager}constructor(runtimeHost,options={}){this.sessionShownTipIds=new Set,this.lastEditorText="",this.lastInputWasPaste=!1,this.continuityNotices=new ContinuityNoticeTracker,this.turnWorkingTip=new WorkingTipCache,this.autocompleteProviderWrappers=[],this.isInitialized=!1,this.pendingUserInputs=[],this.agentIdle=!1,this.pendingImages=new Map,this.activeStatusIndicator=void 0,this.activeWorkingIndicatorEmbedded=!1,this.idleStatus=new IdleStatus,this.workingMessage=void 0,this.workingVisible=!0,this.workingIndicatorOptions=void 0,this.workingStartedAt=void 0,this.defaultWorkingMessage="Working",this.defaultHiddenThinkingLabel="Thinking...",this.hiddenThinkingLabel=this.defaultHiddenThinkingLabel,this.activeToolExecutions=new Map,this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.activeToolHooks=new Map,this.hookStatusIntervalId=void 0,this.activeToolTerminalTitle=void 0,this.extensionTerminalTitle=void 0,this.lastSigintTime=0,this.lastEscapeTime=0,this.changelogMarkdown=void 0,this.startupNoticesShown=!1,this.anthropicSubscriptionWarningShown=!1,this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.managedToolStatusStarted=!1,this.streamingComponent=void 0,this.assistantTextSegments=new Map,this.streamingMessage=void 0,this.pendingTools=new Map,this.toolOutputExpanded=!1,this.hideThinkingBlock=!1,this.outputPad=1,this.mermaidMarkdownTransformer=createMermaidMarkdownTransformer({getMode:()=>this.settingsManager.getMermaidRenderingMode(),theme}),this.skillCommands=new Map,this.signalCleanupHandlers=[],this.isBashMode=!1,this.bashComponent=void 0,this.pendingBashComponents=[],this.compactionEscapeOverrideActive=!1,this.externalOwnerCompactionNoticeShown=!1,this.autoCompactionProgressText="",this.fallbackAppliedBeforeRetryStart=!1,this.pendingZeroDelayRetryIndicator=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers=new Map,this.compactionQueueGeneration=0,this.shutdownRequested=!1,this.extensionSelector=void 0,this.extensionInput=void 0,this.extensionEditor=void 0,this.askUserQuestion=void 0,this.pendingQuestions=new Map,this.pendingOrder=[],this.questionSurface="collapsed",this.composerDestination={kind:"chat"},this.questionArrivalEpochMs=Date.now(),this.wantsMouseLease=!1,this.questionMousePaused=!1,this.extensionTerminalInputSubscriptions=new Set,this.extensionWidgetsAbove=new Map,this.extensionWidgetsBelow=new Map,this.customFooter=void 0,this.builtInHeader=void 0,this.customHeader=void 0,this.onRightClickPaste=()=>{this.handleRightClickPaste()},this.isShuttingDown=!1,this.runtimeHost=runtimeHost,this.optimisticUserEchoes=new OptimisticUserEchoController(text2=>this.renderPendingUserEcho(text2));let tuiMode=options.tuiMode??this.settingsManager.getTuiMode();this.options={...options,tuiMode},this.chrome=options.chrome==="grok"?new GrokChrome:options.chrome,this.autoTrustOnReloadCwd=options.autoTrustOnReloadCwd,this.runtimeHost.setBeforeSessionInvalidate(()=>{_InteractiveMode.restoreCompactionEscapeOverride(this),this.resetExtensionUI()}),this.runtimeHost.setRebindSession(async()=>{await this.rebindCurrentSession({renderBeforeBind:!0}),await this.themeController.applyFromSettings()}),this.runtimeHost.setHostUiHandler?.(request2=>this.handleHostUiRequest(request2)),this.version=DISPLAY_VERSION,this.renderer=createInteractiveTui({tuiMode,showHardwareCursor:this.settingsManager.getShowHardwareCursor(),logDirectory:getAgentDir(),onRightClickPaste:this.onRightClickPaste,fullscreenCopyOnSelect:this.settingsManager.getFullscreenCopyOnSelect?.()??!0,mouse:this.terminalMouseMode!=="off"}),this.ui=createInteractiveTuiReference(()=>this.renderer),this.streamingReveal=new StreamingRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),getHideThinkingBlock:()=>this.hideThinkingBlock,requestRender:()=>this.ui.requestRender()}),this.toolArgsReveal=new ToolArgsRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),requestRender:()=>this.ui.requestRender()}),this.toolResultReveal=new ToolResultRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),requestRender:()=>this.ui.requestRender()}),this.applySmoothStreamingRenderFps(),this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink()),this.headerContainer=new Container,this.loadedResourcesContainer=new Container,this.chatContainer=new ExplorationTranscriptContainer({tailBudget:DEFAULT_TAIL_BUDGET,warmChunkSize:DEFAULT_WARM_CHUNK_SIZE,requestRender:()=>this.ui.requestRender()}),this.documentContainer=new Container,this.documentContainer.addChild(this.headerContainer),this.documentContainer.addChild(this.loadedResourcesContainer),this.documentContainer.addChild(this.chatContainer),this.pendingMessagesContainer=new Container,this.statusContainer=new Container,this.hookStatusContainer=new Container,this.widgetContainerAbove=new Container,this.widgetContainerBelow=new Container,this.keybindings=KeybindingsManager.create(),setKeybindings(this.keybindings);let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.chrome?this.defaultEditor=this.chrome.createBaseEditor({ui:this.ui,keybindings:this.keybindings,editorOptions:{paddingX:editorPaddingX,autocompleteMaxVisible}}):this.defaultEditor=new CustomEditor(this.ui,getEditorTheme(),this.keybindings,{paddingX:editorPaddingX,autocompleteMaxVisible,embedWorkingStatus:!0}),this.editor=this.defaultEditor,this.editorContainer=new Container,this.editorContainer.addChild(this.editor),this.footerDataProvider=new FooterDataProvider(this.sessionManager.getCwd()),this.footer=this.chrome?this.chrome.createFooter(this.session,this.footerDataProvider):new FooterComponent(this.session,this.footerDataProvider),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerContainer=new Container,this.footerContainer.addChild(this.footer),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.themeController=new InteractiveThemeController(this.ui,{getSettingsManager:()=>this.settingsManager,showError:message=>this.showError(message),onChanged:()=>this.updateEditorBorderColor(),initialThemeSetting:options.initialThemeSetting})}getAutocompleteSourceTag(sourceInfo){if(!sourceInfo)return;let scopePrefix=getScopeAutocompleteTag(sourceInfo.scope),source=sourceInfo.source.trim();if(source==="auto"||source==="local"||source==="cli")return scopePrefix;if(source.startsWith("npm:"))return`${scopePrefix}:${source}`;let gitSource=parseGitUrl(source);if(gitSource){let ref=gitSource.ref?`@${gitSource.ref}`:"";return`${scopePrefix}:git:${gitSource.host}/${gitSource.path}${ref}`}return scopePrefix}prefixAutocompleteDescription(description,sourceInfo){let sourceTag=this.getAutocompleteSourceTag(sourceInfo);return sourceTag?description?`[${sourceTag}] ${description}`:`[${sourceTag}]`:description}getBuiltInCommandConflictDiagnostics(extensionRunner){let builtinNames=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name));return extensionRunner.getRegisteredCommands().filter(command=>builtinNames.has(command.name)).map(command=>({type:"warning",message:command.invocationName===command.name?`Extension command '/${command.name}' conflicts with built-in interactive command. Skipping in autocomplete.`:`Extension command '/${command.name}' conflicts with built-in interactive command. Available as '/${command.invocationName}'.`,path:command.sourceInfo.path}))}createBaseAutocompleteProvider(){let slashCommands=BUILTIN_SLASH_COMMANDS.map(command=>({name:command.name,description:command.description,...command.argumentHint&&{argumentHint:command.argumentHint}})),modelCommand=slashCommands.find(command=>command.name==="model");modelCommand&&(modelCommand.getArgumentCompletions=prefix=>{let models=this.session.scopedModels.length>0?this.session.scopedModels.map(s=>s.model):this.session.modelRuntime.getAvailableSnapshot();if(models.length===0)return null;let items=models.map(m=>({id:m.id,provider:m.provider,name:m.name,label:`${m.provider}/${m.id}`}));return createFuzzyAutocompleteItems(items,prefix,getModelSearchText,item=>({value:item.label,label:item.id,description:item.provider}))});let loginCommand=slashCommands.find(command=>command.name==="login");loginCommand&&(loginCommand.getArgumentCompletions=prefix=>{let providers=getLoginProviderCompletionOptions(this.getLoginProviderOptions());return createFuzzyAutocompleteItems(providers,prefix,getLoginProviderSearchText,provider=>({value:provider.id,label:provider.id,description:formatLoginProviderCompletionDescription(provider)}))});let templateCommands=this.session.promptTemplates.map(cmd=>({name:cmd.name,description:this.prefixAutocompleteDescription(cmd.description,cmd.sourceInfo),...cmd.argumentHint&&{argumentHint:cmd.argumentHint}})),builtinCommandNames=new Set(slashCommands.map(c=>c.name)),extensionCommands=this.session.extensionRunner.getRegisteredCommands().filter(cmd=>!builtinCommandNames.has(cmd.name)).map(cmd=>({name:cmd.invocationName,description:this.prefixAutocompleteDescription(cmd.description,cmd.sourceInfo),getArgumentCompletions:cmd.getArgumentCompletions}));this.skillCommands.clear();let skillCommandList=[];if(this.settingsManager.getEnableSkillCommands())for(let skill of this.session.resourceLoader.getSkills().skills){let commandName=`skill:${skill.name}`;this.skillCommands.set(commandName,skill.filePath),skillCommandList.push({name:commandName,description:this.prefixAutocompleteDescription(skill.description,skill.sourceInfo)})}return new CombinedAutocompleteProvider([...slashCommands,...templateCommands,...extensionCommands,...skillCommandList],this.sessionManager.getCwd(),this.fdPath)}setupAutocompleteProvider(){let provider=this.createBaseAutocompleteProvider(),triggerCharacters=[];for(let wrapProvider of this.autocompleteProviderWrappers)provider=wrapProvider(provider),triggerCharacters.push(...provider.triggerCharacters??[]);triggerCharacters.length>0&&(provider.triggerCharacters=[...new Set(triggerCharacters)]),this.autocompleteProvider=provider,this.defaultEditor.setAutocompleteProvider(provider),this.editor!==this.defaultEditor&&this.editor.setAutocompleteProvider?.(provider)}showStartupNoticesIfNeeded(){if(!this.startupNoticesShown&&(this.startupNoticesShown=!0,!!this.changelogMarkdown)){if(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.settingsManager.getCollapseChangelog()){let versionMatch=this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/),condensedText=`Updated to v${versionMatch?versionMatch[1]:this.version}. Use ${theme.bold("/changelog")} to view full changelog.`;this.chatContainer.addChild(new Text(condensedText,1,0))}else this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent","What's New")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(this.changelogMarkdown.trim(),1,0,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new Spacer(1));this.chatContainer.addChild(new DynamicBorder)}}get terminalMouseMode(){return this.runtimeHost?.session?.settingsManager?.getTerminalMouse?.()??"whilePending"}syncQuestionMouseCapture(){this.wantsMouseLease=(this.pendingQuestions?.size??0)>0||!!this.askUserQuestion;let enabled=!this.questionMousePaused&&this.terminalMouseMode!=="off";enabled&&this.wantsMouseLease?this.releaseMouseLease??=this.ui.acquireMouseCapture("pending-question"):(this.releaseMouseLease?.(),this.releaseMouseLease=void 0),enabled&&this.terminalMouseMode==="always"&&this.ui.mode==="regular"?this.releaseAlwaysMouseLease??=this.ui.acquireMouseCapture("always"):(this.releaseAlwaysMouseLease?.(),this.releaseAlwaysMouseLease=void 0)}pauseQuestionMouseCapture(){this.questionMousePaused=!0,this.releaseMouseLease?.(),this.releaseMouseLease=void 0,this.releaseAlwaysMouseLease?.(),this.releaseAlwaysMouseLease=void 0}resumeQuestionMouseCapture(){this.questionMousePaused=!1,this.syncQuestionMouseCapture()}mountInteractiveTui(tui,components){for(let component of components)tui.addChild(component);if(isViewportTUI(tui)){if(!this.fullscreenLayoutRoot)throw new Error("Fullscreen layout is not initialized");tui.setLayoutRoot(this.fullscreenLayoutRoot)}}stopInteractiveTui(fullscreenExitOutput){if(this.renderer.mode==="fullscreen"&&fullscreenExitOutput==="transcript"){for(;this.renderer.hasOverlayEntries;)this.renderer.hideOverlay();this.switchTuiMode("regular",!1,!1),this.renderer.renderNow()}this.pauseQuestionMouseCapture(),this.ui.stop({preserveScreen:this.renderer.mode==="fullscreen"})}switchTuiMode(mode,restoreProgress=!0,startRenderer=!0,recreate=!1){let previousUi=this.renderer;if(mode===previousUi.mode&&!recreate)return!0;if(previousUi.hasOverlayEntries)return!1;let components=[...previousUi.children],focus=previousUi.getFocusedComponent(),terminal=previousUi.terminal,showHardwareCursor=previousUi.getShowHardwareCursor(),clearOnShrink=previousUi.getClearOnShrink(),onDebug=previousUi.onDebug;previousUi instanceof TuiMainScreen&&(this.mainScreenRenderState=previousUi.captureRenderState()),this.pauseQuestionMouseCapture(),previousUi.stop({preserveScreen:!0}),previousUi.setFocus(null),previousUi.detachAll(),isViewportTUI(previousUi)&&previousUi.setLayoutRoot(void 0);let nextUi=createInteractiveTui({tuiMode:mode,showHardwareCursor,logDirectory:getAgentDir(),terminal,onRightClickPaste:this.onRightClickPaste,fullscreenCopyOnSelect:this.runtimeHost?.session?.settingsManager?.getFullscreenCopyOnSelect?.()??!0,mouse:this.terminalMouseMode!=="off"});return nextUi.setClearOnShrink(clearOnShrink),nextUi.onDebug=onDebug,nextUi instanceof TuiMainScreen&&this.mainScreenRenderState&&nextUi.restoreRenderState(this.mainScreenRenderState),this.renderer=nextUi,this.options.tuiMode=mode,this.mountInteractiveTui(nextUi,components),nextUi.invalidate(),nextUi.setFocus(focus),startRenderer&&(nextUi.start(),this.resumeQuestionMouseCapture(),this.themeController.rebindTui(),this.rebindExtensionTerminalInputListeners(),restoreProgress&&this.settingsManager.getShowTerminalProgress()&&(this.session.isStreaming||this.session.isCompacting)&&terminal.setProgress(!0)),!0}async init(){if(this.isInitialized)return;if(resetTimings("tui"),this.registerSignalHandlers(),this.changelogMarkdown=this.getChangelogForDisplay(),time("changelog","tui"),this.session.scopedModels.length>0&&(this.options.verbose||!this.settingsManager.getQuietStartup())){let modelList=this.session.scopedModels.map(sm=>{let thinkingStr=sm.thinkingLevel?`:${sm.thinkingLevel}`:"";return`${sm.model.id}${thinkingStr}`}).join(", "),cycleKeys=this.keybindings.getKeys("app.model.cycleForward"),cycleHint=cycleKeys.length>0?theme.fg("muted",` (${formatKeyText(cycleKeys.join("/"),{capitalize:!0})} to cycle)`):"";console.log(theme.fg("dim",`Model scope: ${modelList}${cycleHint}`))}this.renderWidgets();let viewport=createChatViewport({document:this.documentContainer,pendingMessages:this.pendingMessagesContainer,status:this.statusContainer,hookStatus:this.hookStatusContainer,widgetsAbove:this.widgetContainerAbove,editor:this.editorContainer,widgetsBelow:this.widgetContainerBelow,footer:this.footerContainer,scrollbar:this.settingsManager.getFullscreenScrollbar(),scrollbarTrackStyle:text2=>theme.fg("scrollbarTrack",text2),scrollbarThumbStyle:text2=>theme.fg("scrollbarThumb",text2)});this.transcriptScrollView=viewport.transcript,this.fullscreenLayoutRoot=viewport.root;let rootComponents=[this.documentContainer,this.pendingMessagesContainer,this.statusContainer,this.hookStatusContainer,this.widgetContainerAbove,this.editorContainer,this.widgetContainerBelow,this.footerContainer];if(this.chrome)for(let component of this.chrome.arrangeRoot(rootComponents,this.ui))this.renderer.addChild(component);else this.mountInteractiveTui(this.renderer,rootComponents);this.defaultEditor&&(this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onSubmit=text2=>this.handleStartupSubmit(text2)),this.ui.setFocus(this.editor);try{takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture()}catch(error2){throw restoreInteractiveStderr(),error2}if(this.isInitialized=!0,this.runtimeHost?.setClientInfo?.(this.ui.terminal.columns),time("componentTree+uiStart","tui"),await this.themeController.applyFromSettings(),time("theme","tui"),this.chrome)this.builtInHeader=this.chrome.createWelcomeContent(APP_NAME,this.version),this.headerContainer.addChild(new Spacer(1)),this.headerContainer.addChild(this.builtInHeader),this.headerContainer.addChild(new Spacer(1));else if(this.options.verbose||!this.settingsManager.getQuietStartup()){let logo=theme.bold(theme.fg("accent",APP_NAME))+theme.fg("dim",` ${formatDisplayVersion(this.version)}`),hint=(keybinding,description)=>keyHint(keybinding,description),expandedInstructions=[hint("app.interrupt","to interrupt"),hint("app.clear","to clear"),rawKeyHint(`${keyText("app.clear")} twice`,"to exit"),hint("app.exit","to exit (empty)"),hint("app.suspend","to suspend"),keyHint("tui.editor.deleteToLineEnd","to delete to end"),hint("app.thinking.cycle","to cycle thinking level"),rawKeyHint(`${keyText("app.model.cycleForward")}/${keyText("app.model.cycleBackward")}`,"to cycle models"),hint("app.model.select","to select model"),hint("app.tools.expand","to expand tools"),hint("app.thinking.toggle","to expand thinking"),hint("app.editor.external","for external editor"),rawKeyHint("/","for commands"),rawKeyHint("!","to run bash"),rawKeyHint("!!","to run bash (no context)"),hint("app.message.followUp","to queue follow-up"),hint("app.message.dequeue","to edit all queued messages"),hint("app.clipboard.pasteImage","to paste image (with text fallback)"),rawKeyHint("drop files","to attach")].join(`
|
|
2556
|
+
`)}`}var MIN_TOOL_ARGS_PARSE_DELTA=64;function isHighSurrogate2(code){return code>=55296&&code<=56319}function isLowSurrogate2(code){return code>=56320&&code<=57343}function advancePastSurrogateBoundary(text2,end){return end<=0||end>=text2.length?end:isHighSurrogate2(text2.charCodeAt(end-1))&&isLowSurrogate2(text2.charCodeAt(end))?end+1:end}var ToolArgsRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#requestRender;#states=new Map;#timer;#timerFps;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#requestRender=options.requestRender}update(id,component,partialJson){if(!this.#getSmoothStreaming()||partialJson.length===0)return this.finish(id),!1;let existing=this.#states.get(id);if(existing===void 0||existing.component!==component||!partialJson.startsWith(existing.target))return component.updateArgs(parseStreamingJson(partialJson)),this.#states.set(id,{component,target:partialJson,revealed:partialJson.length,rendered:partialJson.length,lastTickAt:performance.now()}),this.#syncTimer(),!0;let wasCaughtUp=existing.revealed>=existing.target.length;return existing.target=partialJson,wasCaughtUp&&existing.revealed<partialJson.length&&(existing.lastTickAt=performance.now()),this.#syncTimer(),!0}flush(id,exactArgs){let state=this.#states.get(id);return state===void 0?!1:(state.component.updateArgs(exactArgs),this.#states.delete(id),this.#syncTimer(),!0)}flushAll(){for(let state of this.#states.values())state.component.updateArgs(parseStreamingJson(state.target));this.#states.clear(),this.#stopTimer()}finish(id){this.#states.delete(id)&&this.#syncTimer()}refresh(){if(!this.#getSmoothStreaming()){this.flushAll();return}if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!0)}stop(){this.#stopTimer(),this.#states.clear()}#syncTimer(){if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!1)}#hasBacklog(){for(let state of this.#states.values())if(state.revealed<state.target.length)return!0;return!1}#startTimer(restart){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(!restart&&this.#timer!==void 0&&this.#timerFps===fps)return;this.#stopTimer();let now2=performance.now();for(let state of this.#states.values())state.revealed<state.target.length&&(state.lastTickAt=now2);let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer!==void 0&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){if(!this.#getSmoothStreaming()){this.flushAll(),this.#requestRender();return}let now2=performance.now(),rendered=!1;for(let state of this.#states.values()){let backlog=state.target.length-state.revealed;if(backlog<=0)continue;let step=Math.max(1,nextStep(backlog,now2-state.lastTickAt));if(state.revealed=Math.min(state.target.length,state.revealed+step),state.lastTickAt=now2,state.revealed-state.rendered<MIN_TOOL_ARGS_PARSE_DELTA)continue;let renderEnd=advancePastSurrogateBoundary(state.target,Math.min(state.target.length,state.rendered+MIN_TOOL_ARGS_PARSE_DELTA));state.component.updateArgs(parseStreamingJson(state.target.slice(0,renderEnd))),state.rendered=renderEnd,rendered=!0}rendered&&this.#requestRender(),this.#syncTimer()}};function firstText(result3){let block=result3.content[0];return block?.type==="text"?block.text:void 0}function displayResult(state,revealed=state.revealed){let first=state.target.content[0];if(first?.type!=="text")throw new Error("Expected a text tool result");return{content:[{...first,text:state.unitCounter.slice(0,state.text,revealed)},...state.target.content.slice(1)],details:state.target.details,isError:!1}}var ToolResultRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#requestRender;#states=new Map;#timer;#timerFps;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#requestRender=options.requestRender}update(id,component,partialResult){let text2=firstText(partialResult);if(!this.#getSmoothStreaming()||text2===void 0)return this.#discard(id),!1;let existing=this.#states.get(id);if(existing===void 0||existing.component!==component||!text2.startsWith(existing.text)){let state={component,target:partialResult,text:text2,revealed:0,lastTickAt:performance.now(),unitCounter:new BlockUnitCounter};return state.revealed=state.unitCounter.count(0,text2),component.updateResult(displayResult(state),!0),this.#states.set(id,state),this.#syncTimer(),!0}let wasCaughtUp=existing.revealed>=existing.unitCounter.count(0,existing.text);existing.target=partialResult,existing.text=text2;let total=existing.unitCounter.count(0,text2);return wasCaughtUp&&existing.revealed<total&&(existing.lastTickAt=performance.now()),this.#syncTimer(),!0}finish(id){let state=this.#states.get(id);state!==void 0&&(state.component.updateResult(displayResult(state,state.unitCounter.count(0,state.text)),!0),this.#states.delete(id),this.#syncTimer())}refresh(){if(!this.#getSmoothStreaming()){this.#flushAll();return}if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!0)}stop(){this.#stopTimer(),this.#states.clear()}#discard(id){this.#states.delete(id)&&this.#syncTimer()}#flushAll(){for(let state of this.#states.values())state.component.updateResult(displayResult(state,state.unitCounter.count(0,state.text)),!0);this.#states.clear(),this.#stopTimer()}#hasBacklog(){for(let state of this.#states.values())if(state.revealed<state.unitCounter.count(0,state.text))return!0;return!1}#syncTimer(){if(!this.#hasBacklog()){this.#stopTimer();return}this.#startTimer(!1)}#startTimer(restart){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(!restart&&this.#timer!==void 0&&this.#timerFps===fps)return;this.#stopTimer();let now2=performance.now();for(let state of this.#states.values())state.revealed<state.unitCounter.count(0,state.text)&&(state.lastTickAt=now2);let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer!==void 0&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){if(!this.#getSmoothStreaming()){this.#flushAll(),this.#requestRender();return}let now2=performance.now(),rendered=!1;for(let state of this.#states.values()){let total=state.unitCounter.count(0,state.text),backlog=total-state.revealed;backlog<=0||(state.revealed=Math.min(total,state.revealed+nextStep(backlog,now2-state.lastTickAt)),state.lastTickAt=now2,state.component.updateResult(displayResult(state),!0),rendered=!0)}rendered&&this.#requestRender(),this.#syncTimer()}};function createInteractiveTui(options){let terminal=options.terminal??new ProcessTerminal({onExternalStdoutWrite:appendHiddenTuiStdout,observeExternalStderrWrites:observeVisibleStderrWrites});if(options.tuiMode==="fullscreen"){let styleSearchMatch=text2=>theme.bg("searchMatchBg",theme.fg("searchMatchText",text2));return new TuiAltScreen(terminal,options.showHardwareCursor,options.logDirectory,{mouse:options.mouse,searchMatchStyle:text2=>theme.underline(styleSearchMatch(text2)),searchCurrentMatchStyle:text2=>theme.bold(theme.inverse(styleSearchMatch(text2))),searchNavigationButtonStyle:(text2,hovered)=>hovered?theme.underline(text2):text2,scrollToEndIndicator:()=>{let shortcut=keyDisplayText("tui.altScreen.bottom"),label3=` \u2193 Jump to latest message${shortcut?` \xB7 ${shortcut}`:""} `;return theme.bg("selectedBg",theme.fg("text",label3))},openUrl:openBrowser,onRightClickPaste:options.onRightClickPaste,copyOnSelect:options.fullscreenCopyOnSelect,copySelection:async text2=>{try{return await copyToClipboard(text2),!0}catch{return!1}}})}return new TuiMainScreen(terminal,options.showHardwareCursor,options.logDirectory)}function createInteractiveTuiReference(getTui){return new Proxy({},{get:(_target,property)=>{let tui=getTui(),value2=Reflect.get(tui,property,tui);if(typeof value2!="function")return value2;let methodTui=tui,method=value2;return(...args)=>{let currentTui=getTui();if(currentTui!==methodTui){let currentMethod=Reflect.get(currentTui,property,currentTui);if(typeof currentMethod!="function")throw new TypeError(`TUI property ${String(property)} is not callable`);methodTui=currentTui,method=currentMethod}return Reflect.apply(method,methodTui,args)}},set:(_target,property,value2)=>{let tui=getTui();return Reflect.set(tui,property,value2,tui)},has:(_target,property)=>Reflect.has(getTui(),property),getPrototypeOf:()=>Reflect.getPrototypeOf(getTui())})}function llamaCppPostLoginGuidance(actionLabel,loadedModelCount){return loadedModelCount===0?`${actionLabel}. No llama.cpp models are loaded. Use /llama to load a model, then /model to select it.`:`${actionLabel}. Use /model to select a loaded llama.cpp model, or /llama to manage models.`}function isWorkingStatusEditor(editor){return"embedWorkingStatus"in editor&&editor.embedWorkingStatus===!0&&"setWorkingStatusIndicator"in editor&&typeof editor.setWorkingStatusIndicator=="function"}function embedStatusIndicatorInEditor(defaultEditor,editor,indicator){return defaultEditor&&isWorkingStatusEditor(defaultEditor)&&defaultEditor.setWorkingStatusIndicator(void 0),!editor||!isWorkingStatusEditor(editor)?!1:(editor.setWorkingStatusIndicator(indicator),!0)}function isExpandable(obj){return typeof obj=="object"&&obj!==null&&"setExpanded"in obj&&typeof obj.setExpanded=="function"}var ExpandableText=class extends Text{constructor(getCollapsedText,getExpandedText,expanded=!1,paddingX=0,paddingY=0){super(expanded?getExpandedText():getCollapsedText(),paddingX,paddingY),this.getCollapsedText=getCollapsedText,this.getExpandedText=getExpandedText}setExpanded(expanded){this.setText(expanded?this.getExpandedText():this.getCollapsedText())}};function shouldShowRetryIndicator(delayMs,fallbackApplied){return delayMs!==0||!fallbackApplied}function getStreamingToolCallPartialJson(content){if(!(typeof content!="object"||content===null||!("partialJson"in content)))return typeof content.partialJson=="string"?content.partialJson:void 0}function formatToolHookTerminalTitle(event){let hookName=sanitizeWorkingStatusPlainText(event.hookName)||"hook",statusMessage=sanitizeWorkingStatusPlainText(event.statusMessage);return`${APP_TITLE} - ${hookName}: ${statusMessage}`}function isCustomSessionEntry(item){return"type"in item&&item.type==="custom"}function isCompactionCostNotice(item){return"type"in item&&item.type==="compaction_cost"}var DEAD_TERMINAL_ERROR_CODES=new Set(["EIO","EPIPE","ENOTCONN"]),EIO_ERRNO=5,DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS=80,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS=6e4,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS=600,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS=32,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS=6e4,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS=1e3,FALLBACK_STATUS_KEY="fallback",RGB_FOREGROUND_PATTERN=/\x1b\[38;2;(\d+);(\d+);(\d+)m/,DARK_DEFAULT_WORKING_TEXT_RGB={r:229,g:229,b:231},LIGHT_DEFAULT_WORKING_TEXT_RGB={r:17,g:17,b:17},DARK_DEFAULT_WORKING_BASE_RGB={r:102,g:102,b:102},LIGHT_DEFAULT_WORKING_BASE_RGB={r:118,g:118,b:118};function parseAnsiRgbForeground(ansi){let match=RGB_FOREGROUND_PATTERN.exec(ansi),red=match?.[1],green=match?.[2],blue=match?.[3];if(!(red===void 0||green===void 0||blue===void 0))return{r:Number.parseInt(red,10),g:Number.parseInt(green,10),b:Number.parseInt(blue,10)}}function isWorkingLightTheme(){return theme.name?.toLowerCase().includes("light")??!1}function formatWorkingStatusShimmerText(text2,intensity){if(theme.getColorMode()!=="truecolor")return intensity<.2?theme.fg("dim",text2):intensity<.6?theme.fg("text",text2):theme.bold(theme.fg("text",text2));let lightTheme=isWorkingLightTheme(),highlight=parseAnsiRgbForeground(theme.getFgAnsi("dim"))??(lightTheme?LIGHT_DEFAULT_WORKING_BASE_RGB:DARK_DEFAULT_WORKING_BASE_RGB),base=parseAnsiRgbForeground(theme.getFgAnsi("text"))??(lightTheme?LIGHT_DEFAULT_WORKING_TEXT_RGB:DARK_DEFAULT_WORKING_TEXT_RGB),color=blendWorkingStatusShimmerRgbColor(highlight,base,intensity*.9);return`\x1B[1m\x1B[38;2;${color.r};${color.g};${color.b}m${text2}\x1B[39m\x1B[22m`}function isDeadTerminalError(error2){if(!error2||typeof error2!="object")return!1;if("code"in error2){let code=error2.code;if(code!==void 0&&DEAD_TERMINAL_ERROR_CODES.has(code))return!0}if("errno"in error2){let errno=error2.errno;return errno===EIO_ERRNO||errno===-EIO_ERRNO}return!1}function storageWriteCrashMessage(error2){if(!error2||typeof error2!="object"||!("code"in error2))return;let code=error2.code;if(code==="EDQUOT")return"Disk quota exceeded (EDQUOT). Free space or quota on the filesystem, then retry.";if(code==="ENOSPC")return"Disk full (ENOSPC). Free space on the filesystem, then retry."}var ANTHROPIC_SUBSCRIPTION_AUTH_WARNING="Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage. Disable this warning in /settings.";function isAnthropicSubscriptionAuthKey(apiKey){return typeof apiKey=="string"&&apiKey.startsWith("sk-ant-oat")}function isUnknownModel(model){return!!model&&model.provider==="unknown"&&model.id==="unknown"&&model.api==="unknown"}function quoteIfNeeded(value2){return value2.length>0&&!/[^a-zA-Z0-9_\-./~:@]/.test(value2)?value2:`'${value2.replace(/'/g,"'\\''")}'`}function formatResumeCommand(sessionManager){if(!process.stdout.isTTY||!sessionManager.isPersisted())return;let sessionFile=sessionManager.getSessionFile();if(!sessionFile||!fs6.existsSync(sessionFile))return;let args=[APP_COMMAND];return sessionManager.usesDefaultSessionDir()||args.push("--session-dir",quoteIfNeeded(sessionManager.getSessionDir())),args.push("--session",sessionManager.getSessionId()),args.join(" ")}function hasDefaultModelProvider(providerId){return providerId in defaultModelPerProvider}var AUTH_TYPE_ORDER={oauth:0,api_key:1};function createFuzzyAutocompleteItems(items,prefix,getSearchText,toAutocompleteItem){let filtered=fuzzyFilter(items,prefix,getSearchText);return filtered.length===0?null:filtered.map(toAutocompleteItem)}function getLoginProviderCompletionOptions(providerOptions){let byId=new Map;for(let provider of providerOptions){let existing=byId.get(provider.id);if(existing){existing.authTypes.includes(provider.authType)||(existing.authTypes.push(provider.authType),existing.authTypes.sort((a,b)=>AUTH_TYPE_ORDER[a]-AUTH_TYPE_ORDER[b]));continue}byId.set(provider.id,{id:provider.id,name:provider.name,authTypes:[provider.authType]})}return Array.from(byId.values()).sort((a,b)=>a.name.localeCompare(b.name))}function getLoginProviderSearchText(provider){let authTypes=provider.authTypes.map(authType=>`${authType} ${formatAuthSelectorProviderType(authType)}`).join(" ");return`${provider.id} ${provider.name} ${authTypes}`}function formatLoginProviderCompletionDescription(provider){let authTypes=provider.authTypes.map(formatAuthSelectorProviderType).join("/");return provider.name===provider.id?authTypes:`${provider.name} \xB7 ${authTypes}`}function assistantStreamingHeadMessage(message){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");return firstToolIndex===-1?message:{...message,content:message.content.slice(0,firstToolIndex+1)}}var OptimisticUserEchoController=class{constructor(render2){this.nextId=0,this.pending=[],this.render=render2}begin(text2){let id=`pending-user-${++this.nextId}`;return this.pending.push({id,handle:this.render(text2),eligibleForCanonicalStart:!1}),id}promptOptions(id){return{preflightResult:success=>{success||this.reject(id)},promptDisposition:disposition=>{let record7=this.pending.find(candidate=>candidate.id===id);record7&&(disposition==="started"?record7.eligibleForCanonicalStart=!0:this.reject(id))}}}reject(id){if(id===void 0)return;let index=this.pending.findIndex(record8=>record8.id===id);if(index===-1)return;let[record7]=this.pending.splice(index,1);record7?.handle.remove()}remove(id){this.reject(id)}replaceNext(message){if(!this.pending[0]?.eligibleForCanonicalStart)return!1;let[record7]=this.pending.splice(0,1);return record7?(record7.handle.replace(message),!0):!1}},IMAGE_MARKER_PATTERN2=/\[Image #([1-9]\d*)\]/g;async function attachClipboardImage(deps,image){if(deps.settings.getBlockImages())return deps.showStatus("Image paste blocked by the images.blockImages setting"),!1;if(!deps.editor.insertImageMarker)return deps.showStatus("Image paste is not supported by the active editor"),!1;if(deps.isCompacting())return deps.showStatus("Image paste dropped: messages sent during compaction cannot carry images - paste again after compaction finishes"),!0;let processed=await processImage(image.bytes,image.mimeType,{autoResizeImages:deps.settings.getImageAutoResize()});if(!processed.ok)return deps.showStatus(processed.message),!1;let id=deps.editor.insertImageMarker();return deps.pendingImages.set(id,{type:"image",data:processed.data,mimeType:processed.mimeType}),deps.requestRender(),!0}function linesFactory(lines){if(lines!==void 0)return()=>{let container=new Container;for(let line of lines)container.addChild(new Text(line,1,0));return container}}var InteractiveMode=class _InteractiveMode{static restoreCompactionEscapeOverride(host){host.compactionEscapeOverrideActive&&(host.defaultEditor.onEscape=host.autoCompactionEscapeHandler,host.autoCompactionEscapeHandler=void 0,host.compactionEscapeOverrideActive=!1)}requestStreamingRender(){this.ui.requestRender()}applySmoothStreamingRenderFps(){let fps=this.settingsManager.getSmoothStreaming()?this.settingsManager.getSmoothStreamingFps():60;this.ui.setMaxRenderFps(fps)}get shownQuestion(){return this.shownQuestionId===void 0?void 0:this.pendingQuestions.get(this.shownQuestionId)}get session(){return this.runtimeHost?.session}get sessionManager(){return this.session.sessionManager}get settingsManager(){return this.session.settingsManager}constructor(runtimeHost,options={}){this.sessionShownTipIds=new Set,this.lastEditorText="",this.lastInputWasPaste=!1,this.continuityNotices=new ContinuityNoticeTracker,this.turnWorkingTip=new WorkingTipCache,this.autocompleteProviderWrappers=[],this.isInitialized=!1,this.pendingUserInputs=[],this.agentIdle=!1,this.pendingImages=new Map,this.activeStatusIndicator=void 0,this.activeWorkingIndicatorEmbedded=!1,this.idleStatus=new IdleStatus,this.workingMessage=void 0,this.workingVisible=!0,this.workingIndicatorOptions=void 0,this.workingStartedAt=void 0,this.defaultWorkingMessage="Working",this.defaultHiddenThinkingLabel="Thinking...",this.hiddenThinkingLabel=this.defaultHiddenThinkingLabel,this.activeToolExecutions=new Map,this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.activeToolHooks=new Map,this.hookStatusIntervalId=void 0,this.activeToolTerminalTitle=void 0,this.extensionTerminalTitle=void 0,this.lastSigintTime=0,this.lastEscapeTime=0,this.changelogMarkdown=void 0,this.startupNoticesShown=!1,this.anthropicSubscriptionWarningShown=!1,this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.managedToolStatusStarted=!1,this.streamingComponent=void 0,this.assistantTextSegments=new Map,this.streamingMessage=void 0,this.pendingTools=new Map,this.toolOutputExpanded=!1,this.hideThinkingBlock=!1,this.outputPad=1,this.mermaidMarkdownTransformer=createMermaidMarkdownTransformer({getMode:()=>this.settingsManager.getMermaidRenderingMode(),theme}),this.skillCommands=new Map,this.signalCleanupHandlers=[],this.isBashMode=!1,this.bashComponent=void 0,this.pendingBashComponents=[],this.compactionEscapeOverrideActive=!1,this.externalOwnerCompactionNoticeShown=!1,this.autoCompactionProgressText="",this.fallbackAppliedBeforeRetryStart=!1,this.pendingZeroDelayRetryIndicator=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers=new Map,this.compactionQueueGeneration=0,this.shutdownRequested=!1,this.extensionSelector=void 0,this.extensionInput=void 0,this.extensionEditor=void 0,this.askUserQuestion=void 0,this.pendingQuestions=new Map,this.pendingOrder=[],this.questionSurface="collapsed",this.composerDestination={kind:"chat"},this.questionArrivalEpochMs=Date.now(),this.wantsMouseLease=!1,this.questionMousePaused=!1,this.extensionTerminalInputSubscriptions=new Set,this.extensionWidgetsAbove=new Map,this.extensionWidgetsBelow=new Map,this.customFooter=void 0,this.builtInHeader=void 0,this.customHeader=void 0,this.onRightClickPaste=()=>{this.handleRightClickPaste()},this.isShuttingDown=!1,this.runtimeHost=runtimeHost,this.optimisticUserEchoes=new OptimisticUserEchoController(text2=>this.renderPendingUserEcho(text2));let tuiMode=options.tuiMode??this.settingsManager.getTuiMode();this.options={...options,tuiMode},this.chrome=options.chrome==="grok"?new GrokChrome:options.chrome,this.autoTrustOnReloadCwd=options.autoTrustOnReloadCwd,this.runtimeHost.setBeforeSessionInvalidate(()=>{_InteractiveMode.restoreCompactionEscapeOverride(this),this.resetExtensionUI()}),this.runtimeHost.setRebindSession(async()=>{await this.rebindCurrentSession({renderBeforeBind:!0}),await this.themeController.applyFromSettings()}),this.runtimeHost.setHostUiHandler?.(request2=>this.handleHostUiRequest(request2)),this.version=DISPLAY_VERSION,this.renderer=createInteractiveTui({tuiMode,showHardwareCursor:this.settingsManager.getShowHardwareCursor(),logDirectory:getAgentDir(),onRightClickPaste:this.onRightClickPaste,fullscreenCopyOnSelect:this.settingsManager.getFullscreenCopyOnSelect?.()??!0,mouse:this.terminalMouseMode!=="off"}),this.ui=createInteractiveTuiReference(()=>this.renderer),this.streamingReveal=new StreamingRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),getHideThinkingBlock:()=>this.hideThinkingBlock,requestRender:()=>this.ui.requestRender()}),this.toolArgsReveal=new ToolArgsRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),requestRender:()=>this.ui.requestRender()}),this.toolResultReveal=new ToolResultRevealController({getSmoothStreaming:()=>this.settingsManager.getSmoothStreaming(),getSmoothStreamingFps:()=>this.settingsManager.getSmoothStreamingFps(),requestRender:()=>this.ui.requestRender()}),this.applySmoothStreamingRenderFps(),this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink()),this.headerContainer=new Container,this.loadedResourcesContainer=new Container,this.chatContainer=new ExplorationTranscriptContainer({tailBudget:DEFAULT_TAIL_BUDGET,warmChunkSize:DEFAULT_WARM_CHUNK_SIZE,requestRender:()=>this.ui.requestRender()}),this.documentContainer=new Container,this.documentContainer.addChild(this.headerContainer),this.documentContainer.addChild(this.loadedResourcesContainer),this.documentContainer.addChild(this.chatContainer),this.pendingMessagesContainer=new Container,this.statusContainer=new Container,this.hookStatusContainer=new Container,this.widgetContainerAbove=new Container,this.widgetContainerBelow=new Container,this.keybindings=KeybindingsManager.create(),setKeybindings(this.keybindings);let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.chrome?this.defaultEditor=this.chrome.createBaseEditor({ui:this.ui,keybindings:this.keybindings,editorOptions:{paddingX:editorPaddingX,autocompleteMaxVisible}}):this.defaultEditor=new CustomEditor(this.ui,getEditorTheme(),this.keybindings,{paddingX:editorPaddingX,autocompleteMaxVisible,embedWorkingStatus:!0}),this.editor=this.defaultEditor,this.editorContainer=new Container,this.editorContainer.addChild(this.editor),this.footerDataProvider=new FooterDataProvider(this.sessionManager.getCwd()),this.footer=this.chrome?this.chrome.createFooter(this.session,this.footerDataProvider):new FooterComponent(this.session,this.footerDataProvider),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerContainer=new Container,this.footerContainer.addChild(this.footer),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.themeController=new InteractiveThemeController(this.ui,{getSettingsManager:()=>this.settingsManager,showError:message=>this.showError(message),onChanged:()=>this.updateEditorBorderColor(),initialThemeSetting:options.initialThemeSetting})}getAutocompleteSourceTag(sourceInfo){if(!sourceInfo)return;let scopePrefix=getScopeAutocompleteTag(sourceInfo.scope),source=sourceInfo.source.trim();if(source==="auto"||source==="local"||source==="cli")return scopePrefix;if(source.startsWith("npm:"))return`${scopePrefix}:${source}`;let gitSource=parseGitUrl(source);if(gitSource){let ref=gitSource.ref?`@${gitSource.ref}`:"";return`${scopePrefix}:git:${gitSource.host}/${gitSource.path}${ref}`}return scopePrefix}prefixAutocompleteDescription(description,sourceInfo){let sourceTag=this.getAutocompleteSourceTag(sourceInfo);return sourceTag?description?`[${sourceTag}] ${description}`:`[${sourceTag}]`:description}getBuiltInCommandConflictDiagnostics(extensionRunner){let builtinNames=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name));return extensionRunner.getRegisteredCommands().filter(command=>builtinNames.has(command.name)).map(command=>({type:"warning",message:command.invocationName===command.name?`Extension command '/${command.name}' conflicts with built-in interactive command. Skipping in autocomplete.`:`Extension command '/${command.name}' conflicts with built-in interactive command. Available as '/${command.invocationName}'.`,path:command.sourceInfo.path}))}createBaseAutocompleteProvider(){let slashCommands=BUILTIN_SLASH_COMMANDS.map(command=>({name:command.name,description:command.description,...command.argumentHint&&{argumentHint:command.argumentHint}})),modelCommand=slashCommands.find(command=>command.name==="model");modelCommand&&(modelCommand.getArgumentCompletions=prefix=>{let models=this.session.scopedModels.length>0?this.session.scopedModels.map(s=>s.model):this.session.modelRuntime.getAvailableSnapshot();if(models.length===0)return null;let items=models.map(m=>({id:m.id,provider:m.provider,name:m.name,label:`${m.provider}/${m.id}`}));return createFuzzyAutocompleteItems(items,prefix,getModelSearchText,item=>({value:item.label,label:item.id,description:item.provider}))});let loginCommand=slashCommands.find(command=>command.name==="login");loginCommand&&(loginCommand.getArgumentCompletions=prefix=>{let providers=getLoginProviderCompletionOptions(this.getLoginProviderOptions());return createFuzzyAutocompleteItems(providers,prefix,getLoginProviderSearchText,provider=>({value:provider.id,label:provider.id,description:formatLoginProviderCompletionDescription(provider)}))});let thinkingCommand=slashCommands.find(command=>command.name==="thinking");thinkingCommand&&(thinkingCommand.getArgumentCompletions=async prefix=>{let levels=await this.session.getAvailableThinkingLevels();return createFuzzyAutocompleteItems(levels,prefix,level=>level,level=>({value:level,label:level}))});let templateCommands=this.session.promptTemplates.map(cmd=>({name:cmd.name,description:this.prefixAutocompleteDescription(cmd.description,cmd.sourceInfo),...cmd.argumentHint&&{argumentHint:cmd.argumentHint}})),builtinCommandNames=new Set(slashCommands.map(c=>c.name)),extensionCommands=this.session.extensionRunner.getRegisteredCommands().filter(cmd=>!builtinCommandNames.has(cmd.name)).map(cmd=>({name:cmd.invocationName,description:this.prefixAutocompleteDescription(cmd.description,cmd.sourceInfo),getArgumentCompletions:cmd.getArgumentCompletions}));this.skillCommands.clear();let skillCommandList=[];if(this.settingsManager.getEnableSkillCommands())for(let skill of this.session.resourceLoader.getSkills().skills){let commandName=`skill:${skill.name}`;this.skillCommands.set(commandName,skill.filePath),skillCommandList.push({name:commandName,description:this.prefixAutocompleteDescription(skill.description,skill.sourceInfo)})}return new CombinedAutocompleteProvider([...slashCommands,...templateCommands,...extensionCommands,...skillCommandList],this.sessionManager.getCwd(),this.fdPath)}setupAutocompleteProvider(){let provider=this.createBaseAutocompleteProvider(),triggerCharacters=[];for(let wrapProvider of this.autocompleteProviderWrappers)provider=wrapProvider(provider),triggerCharacters.push(...provider.triggerCharacters??[]);triggerCharacters.length>0&&(provider.triggerCharacters=[...new Set(triggerCharacters)]),this.autocompleteProvider=provider,this.defaultEditor.setAutocompleteProvider(provider),this.editor!==this.defaultEditor&&this.editor.setAutocompleteProvider?.(provider)}showStartupNoticesIfNeeded(){if(!this.startupNoticesShown&&(this.startupNoticesShown=!0,!!this.changelogMarkdown)){if(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.settingsManager.getCollapseChangelog()){let versionMatch=this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/),condensedText=`Updated to v${versionMatch?versionMatch[1]:this.version}. Use ${theme.bold("/changelog")} to view full changelog.`;this.chatContainer.addChild(new Text(condensedText,1,0))}else this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent","What's New")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(this.changelogMarkdown.trim(),1,0,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new Spacer(1));this.chatContainer.addChild(new DynamicBorder)}}get terminalMouseMode(){return this.runtimeHost?.session?.settingsManager?.getTerminalMouse?.()??"whilePending"}syncQuestionMouseCapture(){this.wantsMouseLease=(this.pendingQuestions?.size??0)>0||!!this.askUserQuestion;let enabled=!this.questionMousePaused&&this.terminalMouseMode!=="off";enabled&&this.wantsMouseLease?this.releaseMouseLease??=this.ui.acquireMouseCapture("pending-question"):(this.releaseMouseLease?.(),this.releaseMouseLease=void 0),enabled&&this.terminalMouseMode==="always"&&this.ui.mode==="regular"?this.releaseAlwaysMouseLease??=this.ui.acquireMouseCapture("always"):(this.releaseAlwaysMouseLease?.(),this.releaseAlwaysMouseLease=void 0)}pauseQuestionMouseCapture(){this.questionMousePaused=!0,this.releaseMouseLease?.(),this.releaseMouseLease=void 0,this.releaseAlwaysMouseLease?.(),this.releaseAlwaysMouseLease=void 0}resumeQuestionMouseCapture(){this.questionMousePaused=!1,this.syncQuestionMouseCapture()}mountInteractiveTui(tui,components){for(let component of components)tui.addChild(component);if(isViewportTUI(tui)){if(!this.fullscreenLayoutRoot)throw new Error("Fullscreen layout is not initialized");tui.setLayoutRoot(this.fullscreenLayoutRoot)}}stopInteractiveTui(fullscreenExitOutput){if(this.renderer.mode==="fullscreen"&&fullscreenExitOutput==="transcript"){for(;this.renderer.hasOverlayEntries;)this.renderer.hideOverlay();this.switchTuiMode("regular",!1,!1),this.renderer.renderNow()}this.pauseQuestionMouseCapture(),this.ui.stop({preserveScreen:this.renderer.mode==="fullscreen"})}switchTuiMode(mode,restoreProgress=!0,startRenderer=!0,recreate=!1){let previousUi=this.renderer;if(mode===previousUi.mode&&!recreate)return!0;if(previousUi.hasOverlayEntries)return!1;let components=[...previousUi.children],focus=previousUi.getFocusedComponent(),terminal=previousUi.terminal,showHardwareCursor=previousUi.getShowHardwareCursor(),clearOnShrink=previousUi.getClearOnShrink(),onDebug=previousUi.onDebug;previousUi instanceof TuiMainScreen&&(this.mainScreenRenderState=previousUi.captureRenderState()),this.pauseQuestionMouseCapture(),previousUi.stop({preserveScreen:!0}),previousUi.setFocus(null),previousUi.detachAll(),isViewportTUI(previousUi)&&previousUi.setLayoutRoot(void 0);let nextUi=createInteractiveTui({tuiMode:mode,showHardwareCursor,logDirectory:getAgentDir(),terminal,onRightClickPaste:this.onRightClickPaste,fullscreenCopyOnSelect:this.runtimeHost?.session?.settingsManager?.getFullscreenCopyOnSelect?.()??!0,mouse:this.terminalMouseMode!=="off"});return nextUi.setClearOnShrink(clearOnShrink),nextUi.onDebug=onDebug,nextUi instanceof TuiMainScreen&&this.mainScreenRenderState&&nextUi.restoreRenderState(this.mainScreenRenderState),this.renderer=nextUi,this.options.tuiMode=mode,this.mountInteractiveTui(nextUi,components),nextUi.invalidate(),nextUi.setFocus(focus),startRenderer&&(nextUi.start(),this.resumeQuestionMouseCapture(),this.themeController.rebindTui(),this.rebindExtensionTerminalInputListeners(),restoreProgress&&this.settingsManager.getShowTerminalProgress()&&(this.session.isStreaming||this.session.isCompacting)&&terminal.setProgress(!0)),!0}async init(){if(this.isInitialized)return;if(resetTimings("tui"),this.registerSignalHandlers(),this.changelogMarkdown=this.getChangelogForDisplay(),time("changelog","tui"),this.session.scopedModels.length>0&&(this.options.verbose||!this.settingsManager.getQuietStartup())){let modelList=this.session.scopedModels.map(sm=>{let thinkingStr=sm.thinkingLevel?`:${sm.thinkingLevel}`:"";return`${sm.model.id}${thinkingStr}`}).join(", "),cycleKeys=this.keybindings.getKeys("app.model.cycleForward"),cycleHint=cycleKeys.length>0?theme.fg("muted",` (${formatKeyText(cycleKeys.join("/"),{capitalize:!0})} to cycle)`):"";console.log(theme.fg("dim",`Model scope: ${modelList}${cycleHint}`))}this.renderWidgets();let viewport=createChatViewport({document:this.documentContainer,pendingMessages:this.pendingMessagesContainer,status:this.statusContainer,hookStatus:this.hookStatusContainer,widgetsAbove:this.widgetContainerAbove,editor:this.editorContainer,widgetsBelow:this.widgetContainerBelow,footer:this.footerContainer,scrollbar:this.settingsManager.getFullscreenScrollbar(),scrollbarTrackStyle:text2=>theme.fg("scrollbarTrack",text2),scrollbarThumbStyle:text2=>theme.fg("scrollbarThumb",text2)});this.transcriptScrollView=viewport.transcript,this.fullscreenLayoutRoot=viewport.root;let rootComponents=[this.documentContainer,this.pendingMessagesContainer,this.statusContainer,this.hookStatusContainer,this.widgetContainerAbove,this.editorContainer,this.widgetContainerBelow,this.footerContainer];if(this.chrome)for(let component of this.chrome.arrangeRoot(rootComponents,this.ui))this.renderer.addChild(component);else this.mountInteractiveTui(this.renderer,rootComponents);this.defaultEditor&&(this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onSubmit=text2=>this.handleStartupSubmit(text2)),this.ui.setFocus(this.editor);try{takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture()}catch(error2){throw restoreInteractiveStderr(),error2}if(this.isInitialized=!0,this.runtimeHost?.setClientInfo?.(this.ui.terminal.columns),time("componentTree+uiStart","tui"),await this.themeController.applyFromSettings(),time("theme","tui"),this.chrome)this.builtInHeader=this.chrome.createWelcomeContent(APP_NAME,this.version),this.headerContainer.addChild(new Spacer(1)),this.headerContainer.addChild(this.builtInHeader),this.headerContainer.addChild(new Spacer(1));else if(this.options.verbose||!this.settingsManager.getQuietStartup()){let logo=theme.bold(theme.fg("accent",APP_NAME))+theme.fg("dim",` ${formatDisplayVersion(this.version)}`),hint=(keybinding,description)=>keyHint(keybinding,description),expandedInstructions=[hint("app.interrupt","to interrupt"),hint("app.clear","to clear"),rawKeyHint(`${keyText("app.clear")} twice`,"to exit"),hint("app.exit","to exit (empty)"),hint("app.suspend","to suspend"),keyHint("tui.editor.deleteToLineEnd","to delete to end"),hint("app.thinking.cycle","to cycle thinking level"),rawKeyHint(`${keyText("app.model.cycleForward")}/${keyText("app.model.cycleBackward")}`,"to cycle models"),hint("app.model.select","to select model"),hint("app.tools.expand","to expand tools"),hint("app.thinking.toggle","to expand thinking"),hint("app.editor.external","for external editor"),rawKeyHint("/","for commands"),rawKeyHint("!","to run bash"),rawKeyHint("!!","to run bash (no context)"),hint("app.message.followUp","to queue follow-up"),hint("app.message.dequeue","to edit all queued messages"),hint("app.clipboard.pasteImage","to paste image (with text fallback)"),rawKeyHint("drop files","to attach")].join(`
|
|
2552
2557
|
`),compactInstructions=[hint("app.interrupt","interrupt"),rawKeyHint(`${keyText("app.clear")}/${keyText("app.exit")}`,"clear/exit"),rawKeyHint("/","commands"),rawKeyHint("!","bash"),hint("app.tools.expand","more")].join(theme.fg("muted"," \xB7 ")),compactOnboarding=theme.fg("dim",`Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`),startupTip=resolveStartupTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),quietStartup:this.settingsManager.getQuietStartup(),history:this.settingsManager.getTipsHistory(),now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)});startupTip&&this.recordShownTip(startupTip.tipId);let tipLine=startupTip?theme.fg("dim",startupTip.line):void 0,onboarding=theme.fg("dim","Pi can explain its own features and look up its docs. Ask it how to use or extend Pi.");this.builtInHeader=new ExpandableText(()=>`${logo}
|
|
2553
2558
|
${compactInstructions}
|
|
2554
2559
|
${compactOnboarding}
|
|
@@ -2564,7 +2569,7 @@ ${expandedBody}`,this.getStartupExpansionState());this.loadedResourcesContainer.
|
|
|
2564
2569
|
`),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(),time("render","switch")),await this.bindCurrentSessionExtensions(),time("bindExtensions","switch"),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err2=>{this.showError(`Shortcut handler error: ${err2 instanceof Error?err2.message:String(err2)}`)}),!0;return!1}}async withBlockedHostDialog(id,label3,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label3,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}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 label3=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame2,elapsedMs)=>formatWorkingStatusShimmerText(frame2,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text2=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text2):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label3){this.hiddenThinkingLabel=label3??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing2=map.get(key);existing2?.dispose&&existing2.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container;for(let line of content.slice(0,_InteractiveMode.MAX_WIDGET_LINES))container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new Text(theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing=targetMap.get(key);existing?.dispose&&existing.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state of this.pendingQuestions.values())state.finish({status:"cancelled",answers:{},unanswered:state.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text2)=>this.setExtensionStatus(key,text2),setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label3=>this.setHiddenThinkingLabel(label3),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text2=>this.editor.handleInput(`\x1B[200~${text2}\x1B[201~`),setEditorText:text2=>this.editor.setText(text2),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(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}
|
|
2565
2570
|
${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 cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled2()),state={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,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),errorText6=new Text(theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
|
|
2566
2571
|
`).slice(1).map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
|
|
2567
|
-
`);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 label3=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"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)})`:"",label3=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label3}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label3="Cache miss";miss.modelChanged?label3="Cache miss after model switch":miss.idleMs>=3e5&&(label3=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label3}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(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}
|
|
2572
|
+
`);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==="/thinking"||text2.startsWith("/thinking ")){let searchTerm=text2.startsWith("/thinking ")?text2.slice(10).trim():void 0;this.editor.setText(""),await this.handleThinkingCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText(""),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"||text2==="/sessions"){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 label3=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"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)})`:"",label3=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`${label3}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message){if(this.settingsManager.getShowCacheMissNotices())for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;if(!Array.isArray(transformations))continue;let dropped=transformations.flatMap(transformation=>{if(typeof transformation!="object"||transformation===null)return[];let details=transformation;if(details.type!=="thinking_dropped")return[];let reason=typeof details.reason=="string"?details.reason:"unknown reason",location=typeof details.path=="string"?` at ${details.path}`:"";return[`${reason}${location}`]});if(dropped.length===0)continue;let noun=dropped.length===1?"thinking block":`${dropped.length} thinking blocks`;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`Anthropic dropped ${noun}: ${dropped.join("; ")}`),1,0))}}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label3="Cache miss";miss.modelChanged?label3="Cache miss after model switch":miss.idleMs>=3e5&&(label3=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`);let text2=theme.fg("warning",`${label3}: ${reBilled}`);this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(text2,1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(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}
|
|
2568
2573
|
`),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(`
|
|
2569
2574
|
|
|
2570
2575
|
`),currentText=options?.currentText??this.editor.getText(),combinedText=[queuedText,currentText].filter(t=>t.trim()).join(`
|
|
@@ -2573,7 +2578,7 @@ ${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){
|
|
|
2573
2578
|
|
|
2574
2579
|
`),currentText=this.editor.getText(),combinedText=[queuedText,currentText].filter(t=>t.trim()).join(`
|
|
2575
2580
|
|
|
2576
|
-
`);return this.editor.setText(combinedText),allQueued.length}queueCompactionMessage(text2,mode,droppedImageCount=0){this.compactionQueuedMessages.push({text:text2,mode,enqueueOrder:this.session.reserveQueuedInputOrder()}),this.getSessionLogger().debug("compaction_queue_enqueue",{mode,count:this.compactionQueuedMessages.length}),this.editor.addToHistory?.(text2),this.editor.setText(""),this.updatePendingMessagesDisplay(),this.showStatus(droppedImageCount>0?`Queued message for after compaction; dropped ${droppedImageCount} image${droppedImageCount>1?"s":""}: messages sent during compaction cannot carry images - paste again after compaction finishes`:"Queued message for after compaction")}queueCompactionSubmission(text2,mode){let images=this.takeSubmissionImages(text2);if(images.length===0){this.queueCompactionMessage(text2,mode);return}let queued=text2.replace(IMAGE_MARKER_PATTERN2,"").trim();if(queued){this.queueCompactionMessage(queued,mode,images.length);return}this.showStatus(`Dropped ${images.length} image${images.length>1?"s":""}: messages sent during compaction cannot carry images - paste again after compaction finishes`)}hasRegisteredCommand(command){return!!this.session.extensionRunner.getCommand(command)}isExtensionCommand(text2){if(!text2.startsWith("/"))return!1;let extensionRunner=this.session.extensionRunner,spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);return!!extensionRunner.getCommand(commandName)}async flushCompactionQueue(options){let session=this.session,generation2=this.compactionQueueGeneration??0,previousFlush=this.compactionQueueFlushTail,runTransfer=async()=>{(this.compactionQueueGeneration??0)!==generation2||this.session!==session||(await transferCompactionQueue({takeBatch:()=>{let batch=this.compactionQueuedMessages;this.compactionQueuedMessages=[],this.compactionInFlightMessages.push(...batch);for(let message of batch)this.compactionTransferAbortControllers.set(message,new AbortController);return this.updatePendingMessagesDisplay(),batch},commitAccepted:message=>{let index=this.compactionInFlightMessages.indexOf(message);return index===-1?!1:(this.compactionInFlightMessages.splice(index,1),this.compactionTransferAbortControllers.delete(message),this.updatePendingMessagesDisplay(),!0)},restoreUndelivered:messages=>{let restorable=messages.filter(message=>this.compactionInFlightMessages.includes(message)),restorableSet=new Set(restorable);this.compactionInFlightMessages=this.compactionInFlightMessages.filter(message=>!restorableSet.has(message));for(let message of restorable)this.compactionTransferAbortControllers.delete(message);return this.compactionQueuedMessages=[...restorable,...this.compactionQueuedMessages],this.updatePendingMessagesDisplay(),restorable.length},isCommand:message=>this.isExtensionCommand(message.text),deliverCommand:async message=>{let pendingEchoId=message.pendingEchoId;try{await session.prompt(message.text,pendingEchoId?this.optimisticUserEchoes.promptOptions(pendingEchoId):void 0)}catch(error2){throw pendingEchoId&&this.optimisticUserEchoes.reject(pendingEchoId),error2}},deliverFirstPrompt:message=>waitForPromptDisposition((preflightResult,promptDisposition)=>{let echoOptions=message.pendingEchoId?this.optimisticUserEchoes.promptOptions(message.pendingEchoId):void 0;return session.prompt(message.text,{streamingBehavior:message.mode,preflightResult:success=>{echoOptions?.preflightResult(success),preflightResult(success)},promptDisposition:disposition=>{echoOptions?.promptDisposition(disposition),promptDisposition(disposition)},signal:this.compactionTransferAbortControllers.get(message)?.signal})},error2=>{(this.compactionQueueGeneration??0)!==generation2||this.session!==session||this.showError(`Queued prompt failed after acceptance: ${error2 instanceof Error?error2.message:String(error2)}`)}),deliverQueued:message=>message.enqueueOrder===void 0?message.mode==="followUp"?session.followUp(message.text):session.steer(message.text):message.mode==="followUp"?session.followUp(message.text,void 0,{enqueueOrder:message.enqueueOrder}):session.steer(message.text,void 0,{enqueueOrder:message.enqueueOrder}),reportFailure:(error2,undeliveredCount)=>{this.showError(`Failed to send queued message${undeliveredCount===1?"":"s"}: ${error2 instanceof Error?error2.message:String(error2)}`)}},options),this.updatePendingMessagesDisplay())},currentFlush=previousFlush?previousFlush.then(runTransfer,runTransfer):runTransfer(),settledFlush=currentFlush.catch(()=>{});this.compactionQueueFlushTail=settledFlush;try{await currentFlush}finally{this.compactionQueueFlushTail===settledFlush&&(this.compactionQueueFlushTail=void 0)}}flushPendingBashComponents(){for(let component of this.pendingBashComponents)this.pendingMessagesContainer.removeChild(component),this.chatContainer.addChild(component);this.pendingBashComponents=[]}disposeActiveSelector(){let dispose=this.activeSelectorDispose;this.activeSelectorToken=void 0,this.activeSelectorDispose=void 0,dispose?.()}showSelector(create){let token={},dispose,created=create(()=>{dispose?.(),this.activeSelectorToken===token&&(this.activeSelectorToken=void 0,this.activeSelectorDispose=void 0,this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor))});dispose=created.dispose,this.disposeActiveSelector(),this.activeSelectorToken=token,this.activeSelectorDispose=dispose,this.editorContainer.clear(),this.editorContainer.addChild(created.component),this.ui.setFocus(created.focus),this.ui.requestRender()}async showSettingsSelector(){let availableThinkingLevels=await this.session.getAvailableThinkingLevels();this.showSelector(done=>{let selector;return selector=new SettingsSelectorComponent({autoCompact:this.session.autoCompactionEnabled,showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells(),autoResizeImages:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages(),enableSkillCommands:this.settingsManager.getEnableSkillCommands(),steeringMode:this.session.steeringMode,followUpMode:this.session.followUpMode,transport:this.settingsManager.getTransport(),httpIdleTimeoutMs:this.settingsManager.getHttpIdleTimeoutMs(),thinkingLevel:this.session.thinkingLevel,availableThinkingLevels,currentTheme:this.themeController.getThemeSelection()||"dark",terminalTheme:this.themeController.getTerminalTheme(),availableThemes:getAvailableThemes(),hideThinkingBlock:this.hideThinkingBlock,smoothStreaming:this.settingsManager.getSmoothStreaming(),smoothStreamingFps:this.settingsManager.getSmoothStreamingFps(),mermaidRenderingMode:this.settingsManager.getMermaidRenderingMode(),collapseChangelog:this.settingsManager.getCollapseChangelog(),enableInstallTelemetry:this.settingsManager.getEnableInstallTelemetry(),doubleEscapeAction:this.settingsManager.getDoubleEscapeAction(),treeFilterMode:this.settingsManager.getTreeFilterMode(),showHardwareCursor:this.settingsManager.getShowHardwareCursor(),showCacheMissNotices:this.settingsManager.getShowCacheMissNotices(),defaultProjectTrust:this.settingsManager.getDefaultProjectTrust(),editorPaddingX:this.settingsManager.getEditorPaddingX(),outputPad:this.settingsManager.getOutputPad(),autocompleteMaxVisible:this.settingsManager.getAutocompleteMaxVisible(),quietStartup:this.settingsManager.getQuietStartup(),clearOnShrink:this.settingsManager.getClearOnShrink(),showTerminalProgress:this.settingsManager.getShowTerminalProgress(),tuiMode:this.ui.mode,fullscreenExitOutput:this.settingsManager.getFullscreenExitOutput(),fullscreenScrollbar:this.settingsManager.getFullscreenScrollbar(),fullscreenCopyOnSelect:this.settingsManager.getFullscreenCopyOnSelect?.()??!0,terminalMouse:this.settingsManager.getTerminalMouse(),warnings:this.settingsManager.getWarnings()},{onAutoCompactChange:enabled=>{this.settingsManager.setCompactionEnabled(enabled),this.session.setAutoCompactionEnabled(enabled),this.footer.setAutoCompactEnabled(enabled)},onShowImagesChange:enabled=>{this.settingsManager.setShowImages(enabled);for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.setShowImages(enabled)},onImageWidthCellsChange:width=>{this.settingsManager.setImageWidthCells(width);for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.setImageWidthCells(width)},onAutoResizeImagesChange:enabled=>{this.settingsManager.setImageAutoResize(enabled)},onBlockImagesChange:blocked=>{this.settingsManager.setBlockImages(blocked)},onEnableSkillCommandsChange:enabled=>{this.settingsManager.setEnableSkillCommands(enabled),this.setupAutocompleteProvider()},onSteeringModeChange:mode=>{this.session.setSteeringMode(mode)},onFollowUpModeChange:mode=>{this.session.setFollowUpMode(mode)},onTransportChange:transport=>{this.settingsManager.setTransport(transport),this.session.agent.transport=transport},onHttpIdleTimeoutMsChange:timeoutMs=>{this.settingsManager.setHttpIdleTimeoutMs(timeoutMs),configureHttpDispatcher(timeoutMs),this.session.agent.timeoutMs=this.settingsManager.getAgentStreamIdleTimeoutMs(),this.session.agent.streamStartTimeoutMs=this.settingsManager.getAgentStreamStartTimeoutMs(),this.showStatus(`HTTP idle timeout: ${formatHttpIdleTimeoutMs(timeoutMs)}`)},onThinkingLevelChange:level=>{this.session.setThinkingLevel(level),this.footer.invalidate(),this.updateEditorBorderColor()},onThemeChange:themeSetting=>{this.settingsManager.setTheme(themeSetting),this.themeController.setThemeSetting(themeSetting)},onThemePreview:themeName=>this.themeController.preview(themeName),onHideThinkingBlockChange:hidden=>{this.hideThinkingBlock=hidden,this.settingsManager.setHideThinkingBlock(hidden);for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHideThinkingBlock(hidden);this.chatContainer.clear(),this.rebuildChatFromMessages(),this.streamingComponent&&this.streamingMessage&&(this.streamingComponent.setHideThinkingBlock(hidden),this.streamingReveal.resyncVisibility(),this.chatContainer.addChild(this.streamingComponent)),this.ui.requestRender()},onSmoothStreamingChange:enabled=>{this.settingsManager.setSmoothStreaming(enabled),this.applySmoothStreamingRenderFps(),this.toolArgsReveal.refresh(),this.toolResultReveal.refresh(),this.streamingMessage&&this.streamingReveal.setTarget(this.streamingMessage),this.ui.requestRender()},onSmoothStreamingFpsChange:fps=>{this.settingsManager.setSmoothStreamingFps(fps),this.toolArgsReveal.refresh(),this.toolResultReveal.refresh(),this.settingsManager.getSmoothStreaming()&&(this.applySmoothStreamingRenderFps(),this.streamingMessage&&this.streamingReveal.setTarget(this.streamingMessage))},onMermaidRenderingModeChange:mode=>{this.settingsManager.setMermaidRenderingMode(mode),this.chatContainer.invalidate(),this.ui.requestRender()},onShowCacheMissNoticesChange:shown=>{this.settingsManager.setShowCacheMissNotices(shown),this.rebuildChatFromMessages()},onCollapseChangelogChange:collapsed=>{this.settingsManager.setCollapseChangelog(collapsed)},onEnableInstallTelemetryChange:enabled=>{this.settingsManager.setEnableInstallTelemetry(enabled)},onQuietStartupChange:enabled=>{this.settingsManager.setQuietStartup(enabled)},onDefaultProjectTrustChange:defaultProjectTrust=>{this.settingsManager.setDefaultProjectTrust(defaultProjectTrust)},onDoubleEscapeActionChange:action=>{this.settingsManager.setDoubleEscapeAction(action)},onTreeFilterModeChange:mode=>{this.settingsManager.setTreeFilterMode(mode)},onShowHardwareCursorChange:enabled=>{this.settingsManager.setShowHardwareCursor(enabled),this.ui.setShowHardwareCursor(enabled)},onEditorPaddingXChange:padding=>{this.settingsManager.setEditorPaddingX(padding),this.defaultEditor.setPaddingX(padding),this.editor!==this.defaultEditor&&this.editor.setPaddingX!==void 0&&this.editor.setPaddingX(padding)},onOutputPadChange:padding=>{if(this.settingsManager.setOutputPad(padding),this.outputPad=padding,this.streamingComponent||this.session.isStreaming){for(let child of this.chatContainer.children)(child instanceof AssistantMessageComponent||child instanceof CustomMessageComponent||child instanceof UserMessageComponent)&&child.setOutputPad(padding);this.streamingComponent&&this.streamingComponent.setOutputPad(padding),this.ui.requestRender();return}this.rebuildChatFromMessages()},onAutocompleteMaxVisibleChange:maxVisible=>{this.settingsManager.setAutocompleteMaxVisible(maxVisible),this.defaultEditor.setAutocompleteMaxVisible(maxVisible),this.editor!==this.defaultEditor&&this.editor.setAutocompleteMaxVisible!==void 0&&this.editor.setAutocompleteMaxVisible(maxVisible)},onClearOnShrinkChange:enabled=>{this.settingsManager.setClearOnShrink(enabled),this.ui.setClearOnShrink(enabled),!enabled&&!this.activeStatusIndicator&&this.statusContainer.clear()},onShowTerminalProgressChange:enabled=>{this.settingsManager.setShowTerminalProgress(enabled)},onTerminalMouseChange:mode=>{if(this.renderer.hasOverlayEntries){selector?.getSettingsList().updateValue("terminal-mouse",this.terminalMouseMode),this.showStatus("Close active overlays before changing mouse capture");return}this.settingsManager.setTerminalMouse(mode),this.switchTuiMode(this.renderer.mode,!0,!0,!0),this.refreshAsyncWidget()},onTuiModeChange:mode=>{if(!this.switchTuiMode(mode)){selector?.getSettingsList().updateValue("tui-mode",this.ui.mode),this.showStatus("Close active overlays before changing TUI mode");return}this.settingsManager.setTuiMode(mode),this.activeStatusIndicator||this.statusContainer.clear(),this.showStatus(`TUI mode: ${mode}`)},onFullscreenExitOutputChange:output=>{this.settingsManager.setFullscreenExitOutput(output)},onFullscreenScrollbarChange:mode=>{this.settingsManager.setFullscreenScrollbar(mode),this.applyFullscreenScrollbarSetting()},onFullscreenCopyOnSelectChange:enabled=>{this.settingsManager.setFullscreenCopyOnSelect(enabled),this.renderer instanceof TuiAltScreen&&this.renderer.setCopyOnSelect(enabled)},onWarningsChange:warnings=>{this.settingsManager.setWarnings(warnings)},onCancel:()=>{done(),this.ui.requestRender()}}),{component:selector,focus:selector.getSettingsList()}})}async handleModelCommand(searchTerm){if(!searchTerm){this.showModelSelector();return}let model=await this.findExactModelMatch(searchTerm);if(model){await this.selectModelFromUi(model);return}this.showModelSelector(searchTerm)}async findExactModelMatch(searchTerm){let cachedModels=this.session.scopedModels.length>0?this.session.scopedModels.map(scoped=>scoped.model):[...this.session.modelRuntime.getAvailableSnapshot()],cachedMatch=findExactModelReferenceMatch(searchTerm,cachedModels);if(cachedMatch||this.session.scopedModels.length>0)return cachedMatch;this.showStatus("Refreshing model catalogs\u2026");let controller=new AbortController,timedOut=!1,timeout=setTimeout(()=>{timedOut=!0,controller.abort()},15e3);try{let result3=await refreshModelCatalogs(this.session.modelRuntime,controller.signal);result3.aborted&&timedOut?this.showWarning("Model refresh timed out; searching cached models."):result3.errors.size>0&&this.showWarning(`Could not refresh ${[...result3.errors.keys()].join(", ")}; searching cached models.`)}catch(error2){this.showWarning(timedOut?"Model refresh timed out; searching cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`)}finally{clearTimeout(timeout)}return findExactModelReferenceMatch(searchTerm,[...this.session.modelRuntime.getAvailableSnapshot()])}async selectModelFromUi(model,done){done?.(),this.ui?.requestRender();try{let systemPromptChange=await this.session.setModel(model);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.updateEditorBorderColor();let systemPromptStr=systemPromptChange?.systemPromptName?` (optimized system prompt applied: ${systemPromptChange.systemPromptName})`:"";this.showStatus(`Model: ${model.id}${systemPromptStr}`),this.showRiskyMainModelWarning(model),this.maybeWarnAboutAnthropicSubscriptionAuth(model),this.checkDaxnutsEasterEgg(model)}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}async resolveFavoriteModelsForUi(patterns,candidateModels){let candidateIds=new Set(candidateModels.map(getModelFullId)),warnings=[],resolvedModels=await resolveModelScope(patterns,this.session.modelRuntime,{onWarning:message=>warnings.push(message)});for(let warning of warnings)this.showWarning(warning);return resolvedModels.filter(resolved=>candidateIds.has(getModelFullId(resolved.model)))}async getFavoriteModelIdsForUi(candidateModels){let candidateIds=new Set(candidateModels.map(getModelFullId)),sessionFavoriteIds=this.session.favoriteModels.map(favorite=>getModelFullId(favorite.model)).filter(id=>candidateIds.has(id));if(sessionFavoriteIds.length>0)return sessionFavoriteIds;let patterns=this.settingsManager.getFavoriteModels()??[];return patterns.length===0?[]:(await this.resolveFavoriteModelsForUi(patterns,candidateModels)).map(favorite=>getModelFullId(favorite.model))}async captureFavoritePatternSnapshot(){let storedPatterns=this.settingsManager.getFavoriteModels()??[],{patternResolutions}=await resolveModelScopeWithDiagnostics(storedPatterns,this.session.modelRuntime);return{storedPatterns,patternResolutions}}async applyFavoriteSelection(favoriteIds,candidateModels,persist,patternSnapshot){let{storedPatterns,patternResolutions}=patternSnapshot,mergedPatterns=mergeFavoritePatternsForPersist({storedPatterns,patternResolutions,selectedIds:favoriteIds,candidateIds:candidateModels.map(getModelFullId)}),newFavoriteModels=mergedPatterns?await resolveModelScope(mergedPatterns,this.session.modelRuntime):[];this.session.setFavoriteModels(newFavoriteModels.map(favorite=>({model:favorite.model,thinkingLevel:favorite.thinkingLevel,serviceTier:favorite.serviceTier}))),persist&&this.settingsManager.setFavoriteModels(mergedPatterns),this.ui.requestRender()}updateAvailableProviderCount(){let models=this.session.scopedModels.length>0?this.session.scopedModels.map(scoped=>scoped.model):this.session.modelRuntime.getAvailableSnapshot(),uniqueProviders=new Set(models.map(model=>model.provider));this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size)}async maybeWarnAboutAnthropicSubscriptionAuth(model=this.session.model){if(this.settingsManager.getWarnings().anthropicExtraUsage!==!1&&!this.anthropicSubscriptionWarningShown&&model?.provider==="anthropic")try{if((await this.session.modelRuntime.checkAuth("anthropic"))?.type==="oauth"){this.anthropicSubscriptionWarningShown=!0,this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);return}let apiKey=(await this.session.modelRuntime.getAuth(model.provider))?.auth.apiKey;if(!isAnthropicSubscriptionAuthKey(apiKey))return;this.anthropicSubscriptionWarningShown=!0,this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING)}catch{}}maybeSaveImplicitProjectTrustAfterReload(){let cwd=this.sessionManager.getCwd();if(this.autoTrustOnReloadCwd!==cwd||!this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(cwd))return!1;let trustStore=new ProjectTrustStore(this.runtimeHost.services.agentDir);try{return trustStore.get(cwd)!==null?(this.autoTrustOnReloadCwd=void 0,!1):(trustStore.set(cwd,!0),this.autoTrustOnReloadCwd=void 0,!0)}catch(error2){return this.showWarning(`Could not save project trust after reload: ${error2 instanceof Error?error2.message:String(error2)}`),!1}}showTrustSelector(){let cwd=this.sessionManager.getCwd(),trustStore=new ProjectTrustStore(this.runtimeHost.services.agentDir),savedDecision=trustStore.getEntry(cwd);this.showSelector(done=>{let selector=new TrustSelectorComponent({cwd,savedDecision,projectTrusted:this.settingsManager.isProjectTrusted(),onSelect:selection=>{trustStore.setMany(selection.updates),done(),this.showStatus(`Saved trust decision: ${selection.trusted?"trusted":"untrusted"}. Restart ${APP_NAME} for this to take effect.`)},onCancel:()=>{done(),this.ui.requestRender()}});return{component:selector,focus:selector}})}showModelSelector(initialSearchInput){let favoritePatternSnapshot=this.captureFavoritePatternSnapshot();this.showSelector(done=>{let favoriteModelIds=this.session.favoriteModels.map(favorite=>getModelFullId(favorite.model)),selector=new ModelSelectorComponent(this.ui,this.session.model,this.settingsManager,this.session.modelRuntime,this.session.scopedModels,model=>{this.selectModelFromUi(model,done)},()=>{done(),this.ui.requestRender()},initialSearchInput,{favoriteModelIds,onFavoriteChange:async(favoriteIds,allModels)=>{await this.applyFavoriteSelection(favoriteIds,allModels,!0,await favoritePatternSnapshot)}});return{component:selector,focus:selector,dispose:()=>selector.dispose()}})}async showFavoriteModelsSelector(){let allModels=[...this.session.modelRuntime.getAvailableSnapshot()];if(allModels.length===0){this.showStatus("No models available");return}let currentFavoriteIds=await this.getFavoriteModelIdsForUi(allModels),favoritePatternSnapshot=await this.captureFavoritePatternSnapshot();this.showSelector(done=>{let selector=new FavoriteModelsSelectorComponent({allModels,favoriteModelIds:currentFavoriteIds,currentModel:this.session.model},{onChange:async favoriteIds=>{await this.applyFavoriteSelection(favoriteIds,allModels,!1,favoritePatternSnapshot)},onPersist:favoriteIds=>{this.applyFavoriteSelection(favoriteIds,allModels,!0,favoritePatternSnapshot).then(()=>{this.showStatus("Favorite models saved to settings")})},onSelect:model=>{this.selectModelFromUi(model,done)},onCancel:()=>{done(),this.ui.requestRender()}});return{component:selector,focus:selector}})}showScopedModelsSelector(){let availableModels2=[...this.session.modelRuntime.getAvailableSnapshot()],availableModelIds=new Set(availableModels2.map(model=>`${model.provider}/${model.id}`)),configuredPatterns=this.settingsManager.getEnabledModels(),sessionScopedModels=this.session.scopedModels,configuredEnabledIds=models=>{if(!configuredPatterns?.length)return null;let resolved=resolveModelScopeFromModels(configuredPatterns,models),ids=resolved.scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`);for(let diagnostic2 of resolved.diagnostics)diagnostic2.code==="no-match"&&!ids.includes(diagnostic2.pattern)&&ids.push(diagnostic2.pattern);return ids},currentEnabledIds=sessionScopedModels.length>0?sessionScopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`):configuredEnabledIds(availableModels2),selectionChanged=!1,updateSessionModels=enabledIds=>{currentEnabledIds=enabledIds===null?null:[...enabledIds];let hasEnabledAvailableModel=enabledIds?.some(id=>availableModelIds.has(id))??!1,allAvailableModelsEnabled=enabledIds!==null&&[...availableModelIds].every(id=>enabledIds.includes(id));if(enabledIds&&hasEnabledAvailableModel&&!allAvailableModelsEnabled){let newScopedModels=resolveModelScopeFromModels(enabledIds,availableModels2).scopedModels;this.session.setScopedModels(newScopedModels.map(scoped=>({model:scoped.model,thinkingLevel:scoped.thinkingLevel})))}else this.session.setScopedModels([]);this.updateAvailableProviderCount(),this.ui.requestRender()};this.showSelector(done=>{let disposed=!1,timedOut=!1,controller=new AbortController,timeout=setTimeout(()=>{timedOut=!0,controller.abort()},15e3),selector=new ScopedModelsSelectorComponent({allModels:availableModels2,enabledModelIds:currentEnabledIds,refreshStatus:"Refreshing model catalogs\u2026"},{onChange:enabledIds=>{selectionChanged=!0,updateSessionModels(enabledIds)},onPersist:enabledIds=>{let allEnabled=enabledIds!==null&&enabledIds.length===availableModels2.length&&enabledIds.every(id=>availableModelIds.has(id)),newPatterns=enabledIds===null||allEnabled?void 0:enabledIds;this.settingsManager.setEnabledModels(newPatterns?[...newPatterns]:void 0),this.showStatus("Model selection saved to settings")},onCancel:()=>{done(),this.ui.requestRender()}});return refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(result3=>{disposed||(availableModels2=[...this.session.modelRuntime.getAvailableSnapshot()],availableModelIds=new Set(availableModels2.map(model=>`${model.provider}/${model.id}`)),!selectionChanged&&sessionScopedModels.length===0?(currentEnabledIds=configuredEnabledIds(availableModels2),selector.updateModels(availableModels2,currentEnabledIds)):selector.updateModels(availableModels2),currentEnabledIds!==null&&updateSessionModels(currentEnabledIds),result3.aborted&&timedOut?selector.setRefreshStatus("Model refresh timed out; showing cached models.","warning"):result3.errors.size>0?selector.setRefreshStatus(`Could not refresh ${[...result3.errors.keys()].join(", ")}; showing cached models.`,"warning"):selector.setRefreshStatus("Model catalogs refreshed.","success"),this.ui.requestRender())}).catch(error2=>{disposed||(selector.setRefreshStatus(timedOut?"Model refresh timed out; showing cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`,"warning"),this.ui.requestRender())}).finally(()=>clearTimeout(timeout)),{component:selector,focus:selector,dispose:()=>{disposed=!0,clearTimeout(timeout),controller.abort()}}})}async showUserMessageSelector(){let userMessages=await this.session.getUserMessagesForForking();if(userMessages.length===0){this.showStatus("No messages to fork from");return}let initialSelectedId=userMessages[userMessages.length-1]?.entryId;this.showSelector(done=>{let selector=new UserMessageSelectorComponent(userMessages.map(m=>({id:m.entryId,text:m.text})),async entryId=>{done();try{let result3=await this.runtimeHost.fork(entryId);if(result3.cancelled){this.ui.requestRender();return}this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}},()=>{done(),this.ui.requestRender()},initialSelectedId);return{component:selector,focus:selector.getMessageList()}})}async handleCloneCommand(){let leafId=this.sessionManager.getLeafId();if(!leafId){this.showStatus("Nothing to clone yet");return}try{if((await this.runtimeHost.fork(leafId,{position:"at"})).cancelled){this.ui.requestRender();return}this.editor.setText(""),this.showStatus("Cloned to new session")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}showTreeSelector(initialSelectedId){let tree=this.sessionManager.getTree(),realLeafId=this.sessionManager.getLeafId(),initialFilterMode=this.settingsManager.getTreeFilterMode();if(tree.length===0){this.showStatus("No entries in session");return}this.showSelector(done=>{let selector=new TreeSelectorComponent(tree,realLeafId,this.ui.terminal.rows,async entryId=>{if(entryId===this.sessionManager.getLeafId()){done(),this.showStatus("Already at this point");return}done(),await this.runTreeNavigation(entryId,{promptForSummary:!0,navigate:options=>this.session.navigateTree(entryId,options),successStatus:"Navigated to selected point"})},()=>{done(),this.ui.requestRender()},(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3),this.ui.requestRender()},initialSelectedId,initialFilterMode);return selector.onCopy=async text2=>{if(!text2){this.showError("Selected entry has no text to copy");return}try{await copyToClipboard(text2),this.showStatus("Copied selected message to clipboard")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}},selector.onEditMessage=entryId=>{done(),this.editAssistantMessageFromTree(entryId)},{component:selector,focus:selector}})}async editAssistantMessageFromTree(entryId){let entry=this.sessionManager.getEntry(entryId);if(entry?.type!=="message"||entry.message.role!=="assistant"){this.showError("Only assistant responses can be edited here");return}let message=entry.message,expectedLeafId=this.sessionManager.getLeafId()??void 0,title=message.content.some(block=>block.type==="toolCall")?"Edit assistant response (its tool calls will be dropped)":"Edit assistant response",edited=await this.showExtensionEditor(title,contentText(message.content,""));if(edited===void 0){this.showTreeSelector(entryId);return}if(!edited.trim()){this.showError("Assistant response cannot be empty"),this.showTreeSelector(entryId);return}if(assistantTextEquals(message,edited)){this.showStatus("Assistant response unchanged");return}await this.runTreeNavigation(entryId,{promptForSummary:this.treeNavigationAbandonsConversation(entryId),navigate:async options=>{try{return await this.session.editAssistantMessage(entryId,edited,{...options,expectedLeafId})}catch(error2){throw error2 instanceof AssistantEditError&&error2.reason==="stale-leaf"?new Error("The session changed while you were editing; reopen /tree and try again"):error2}},successStatus:"Replaced assistant response with your edit"})}treeNavigationAbandonsConversation(targetId){let{entries}=collectEntriesForBranchSummary2(this.sessionManager,this.sessionManager.getLeafId(),targetId);return entries.some(entry=>entry.type==="message"||entry.type==="custom_message"||entry.type==="compaction"||entry.type==="branch_summary")}async promptBranchSummaryChoice(){for(;;){let summaryChoice=await this.showExtensionSelector("Summarize branch?",["No summary","Summarize","Summarize with custom prompt"]);if(summaryChoice===void 0)return;if(summaryChoice!=="Summarize with custom prompt")return{summarize:summaryChoice!=="No summary"};let customInstructions=await this.showExtensionEditor("Custom summarization instructions");if(customInstructions!==void 0)return{summarize:!0,customInstructions}}}async runTreeNavigation(entryId,flow){let wantsSummary=!1,customInstructions;if(flow.promptForSummary&&!this.settingsManager.getBranchSummarySkipPrompt()){let choice=await this.promptBranchSummaryChoice();if(choice===void 0){this.showTreeSelector(entryId);return}wantsSummary=choice.summarize,customInstructions=choice.customInstructions}if(this.session.isStreaming&&(this.restoreQueuedMessagesToEditor(),await this.session.abort()),this.session.isCompacting){this.showError("Wait for the current compaction or tree navigation to finish before navigating the session tree.");return}let showingSummaryIndicator=!1,originalOnEscape=this.defaultEditor.onEscape;wantsSummary&&(this.defaultEditor.onEscape=()=>{this.session.abortBranchSummary()},this.chatContainer.addChild(new Spacer(1)),this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)),showingSummaryIndicator=!0,this.ui.requestRender());try{let result3=await flow.navigate({summarize:wantsSummary,customInstructions});if(result3.aborted){this.showStatus("Branch summarization cancelled"),this.showTreeSelector(entryId);return}if(result3.cancelled){this.showStatus("Navigation cancelled");return}this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus(flow.successStatus),this.flushCompactionQueue({willRetry:!1})}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}finally{showingSummaryIndicator&&this.clearStatusIndicator("branchSummary"),this.defaultEditor.onEscape=originalOnEscape}}showSessionSelector(){this.showSelector(done=>{let selector=new SessionSelectorComponent(onProgress=>currentScopeSessions(this.sessionManager,onProgress),onProgress=>allScopeSessions(this.sessionManager,onProgress),async sessionPath=>{done();let target=await chooseResumePath(sessionPath,this.sessionManager,{confirm:(title,message)=>this.showExtensionConfirm(title,message),showError:message=>this.showError(message)});target!==void 0&&await this.handleResumeSession(target)},()=>{done(),this.ui.requestRender()},()=>{this.shutdown()},()=>this.ui.requestRender(),{renameSession:async(sessionFilePath,nextName)=>{let next=(nextName??"").trim();if(!next)return;SessionManager.open(sessionFilePath).appendSessionInfo(next)},showRenameHint:!0,keybindings:this.keybindings},this.sessionManager.getSessionFile());return{component:selector,focus:selector}})}async handleResumeSession(sessionPath,options){this.clearStatusIndicator();try{let result3=await this.runtimeHost.switchSession(sessionPath,{withSession:options?.withSession,projectTrustContextFactory:cwd=>this.createProjectTrustContext(cwd)});if(result3.cancelled)return result3;let switchTimings=formatTimings("switch");return this.showStatus(switchTimings===void 0?"Resumed session":`Resumed session | switch timings: ${switchTimings}`),result3}catch(error2){if(error2 instanceof MissingSessionCwdError){let selectedCwd=await this.promptForMissingSessionCwd(error2);if(!selectedCwd)return this.showStatus("Resume cancelled"),{cancelled:!0};let result3=await this.runtimeHost.switchSession(sessionPath,{cwdOverride:selectedCwd,withSession:options?.withSession,projectTrustContextFactory:cwd=>this.createProjectTrustContext(cwd)});return result3.cancelled||this.showStatus("Resumed session in current cwd"),result3}return this.handleFatalRuntimeError("Failed to resume session",error2)}}getLoginProviderOptions(authType){let options=[];for(let provider of this.session.modelRuntime.getProviders()){let authStatus=this.session.modelRuntime.getProviderAuthStatus(provider.id),status=authStatus.configured?{type:this.session.modelRuntime.isUsingOAuth(provider.id)?"oauth":"api_key",source:authStatus.label??authStatus.source}:void 0;(!authType||authType==="oauth")&&provider.auth.oauth&&options.push({id:provider.id,name:provider.name,authType:"oauth",method:provider.auth.oauth,status}),(!authType||authType==="api_key")&&provider.auth.apiKey&&options.push({id:provider.id,name:provider.name,authType:"api_key",method:provider.auth.apiKey,status})}return options.sort((a,b)=>a.name.localeCompare(b.name))}async getLogoutProviderOptions(){return(await this.session.modelRuntime.listCredentials({signal:AbortSignal.timeout(15e3)})).map(({providerId,type:type2})=>({id:providerId,name:this.session.modelRuntime.getProvider(providerId)?.name??providerId,authType:type2,status:{type:type2,source:"stored credential"}})).sort((a,b)=>a.name.localeCompare(b.name))}findLoginProviderOptions(providerRef){let normalizedProviderRef=providerRef.trim().toLowerCase();return normalizedProviderRef?this.getLoginProviderOptions().filter(provider=>provider.id.toLowerCase()===normalizedProviderRef||provider.name.toLowerCase()===normalizedProviderRef):[]}async handleLoginCommand(providerRef){if(!providerRef){this.showLoginAuthTypeSelector();return}let rejection=legacyProviderIdRejection(providerRef);if(rejection){this.showError(rejection);return}let providerOptions=this.findLoginProviderOptions(providerRef);if(providerOptions.length===1){await this.startProviderLogin(providerOptions[0]);return}if(providerOptions.length>1&&new Set(providerOptions.map(provider=>provider.id)).size===1){this.showLoginAuthTypeSelector(providerOptions);return}this.showLoginProviderSelector(void 0,providerRef)}async startProviderLogin(providerOption){providerOption.authType==="oauth"?await this.showLoginDialog(providerOption.id,providerOption.name):providerOption.method?.login?await this.showApiKeyLoginDialog(providerOption.id,providerOption.name):this.showAmbientAuthDialog(providerOption)}showLoginAuthTypeSelector(providerOptions){let oauthProvider=providerOptions?.find(provider=>provider.authType==="oauth"),subscriptionLabel=(oauthProvider?.method&&"loginLabel"in oauthProvider.method?oauthProvider.method.loginLabel:void 0)??"Sign in with an account",apiKeyLabel="Sign in with an API key",availableAuthTypes=providerOptions?new Set(providerOptions.map(provider=>provider.authType)):new Set(["oauth","api_key"]),options=[];if(availableAuthTypes.has("oauth")&&options.push(subscriptionLabel),availableAuthTypes.has("api_key")&&options.push(apiKeyLabel),options.length===0){this.showStatus("No login methods available.");return}if(providerOptions&&options.length===1){let providerOption=providerOptions[0];providerOption&&this.startProviderLogin(providerOption);return}let title=providerOptions?.[0]?`Select authentication method for ${providerOptions[0].name}:`:"Select authentication method:";this.showSelector(done=>{let selector=new ExtensionSelectorComponent(title,options,option=>{done();let authType=option===subscriptionLabel?"oauth":"api_key";if(providerOptions){let providerOption=providerOptions.find(provider=>provider.authType===authType);providerOption&&this.startProviderLogin(providerOption);return}this.showLoginProviderSelector(authType)},()=>{done(),this.ui.requestRender()});return{component:selector,focus:selector}})}showLoginProviderSelector(authType,initialSearchInput){let providerOptions=this.getLoginProviderOptions(authType);if(providerOptions.length===0){let message=authType==="oauth"?"No subscription providers available.":authType==="api_key"?"No API key providers available.":"No login providers available.";this.showStatus(message);return}this.showSelector(done=>{let selector=new OAuthSelectorComponent("login",providerOptions,async(providerId,selectedAuthType)=>{done();let providerOption=providerOptions.find(provider=>provider.id===providerId&&provider.authType===selectedAuthType);providerOption&&await this.startProviderLogin(providerOption)},()=>{done(),authType?this.showLoginAuthTypeSelector():this.ui.requestRender()},initialSearchInput);return{component:selector,focus:selector}})}async showOAuthSelector(mode){if(mode==="login"){this.showLoginAuthTypeSelector();return}let providerOptions;try{providerOptions=await this.getLogoutProviderOptions()}catch(error2){this.showError(`Could not read stored credentials: ${error2 instanceof Error?error2.message:String(error2)}`);return}if(providerOptions.length===0){this.showStatus("No stored credentials to remove. /logout only removes credentials saved by /login; environment variables and models.json config are unchanged.");return}this.showSelector(done=>{let selector=new OAuthSelectorComponent(mode,providerOptions,async providerId=>{done();let providerOption=providerOptions.find(provider=>provider.id===providerId);if(providerOption)try{await this.session.modelRuntime.logout(providerOption.id,{signal:AbortSignal.timeout(15e3)}),this.updateAvailableProviderCount();let message=providerOption.authType==="oauth"?`Logged out of ${providerOption.name}`:`Removed stored API key for ${providerOption.name}. Environment variables and models.json config are unchanged.`;this.showStatus(message)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(error2 instanceof CredentialSynchronizationError?`Credentials removed for ${providerOption.name}, but local model state could not be synchronized: ${message}`:`Logout failed: ${message}`)}},()=>{done(),this.ui.requestRender()});return{component:selector,focus:selector}})}async completeProviderAuthentication(providerId,providerName,authType,previousModel){let actionLabel=authType==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`,session=this.session,deferSelection=isUnknownModel(previousModel)&&hasDefaultModelProvider(providerId)&&!session.modelRuntime.getAvailableSnapshot().some(model=>model.provider===providerId&&model.id===defaultModelPerProvider[providerId]),finishAuthentication=async()=>{let selectedModel,systemPromptName,selectionError;if(isUnknownModel(previousModel)){let providerModels=this.session.modelRuntime.getAvailableSnapshot().filter(model=>model.provider===providerId);if(providerId==="llama.cpp")selectionError=llamaCppPostLoginGuidance(actionLabel,providerModels.length);else if(!hasDefaultModelProvider(providerId))selectionError=`${actionLabel}, but no default model is configured for provider "${providerId}". Use /model to select a model.`;else if(providerModels.length===0)selectionError=`${actionLabel}, but no models are available for that provider. Use /model to select a model.`;else{let defaultModelId=defaultModelPerProvider[providerId];if(selectedModel=providerModels.find(model=>model.id===defaultModelId)??(providerId==="radius"?providerModels[0]:void 0),!selectedModel)selectionError=`${actionLabel}, but its default model "${defaultModelId}" is not available. Use /model to select a model.`;else try{systemPromptName=(await this.session.setModel(selectedModel))?.systemPromptName}catch(error2){selectedModel=void 0;let errorMessage8=error2 instanceof Error?error2.message:String(error2);selectionError=`${actionLabel}, but selecting its default model failed: ${errorMessage8}. Use /model to select a model.`}}}if(this.updateAvailableProviderCount(),this.footer.invalidate(),this.updateEditorBorderColor(),selectedModel){let systemPromptStr=systemPromptName?` System prompt: ${systemPromptName}.`:"";this.showStatus(`${actionLabel}. Selected ${selectedModel.id}.${systemPromptStr} Credentials saved to ${getAuthPath()}`),this.showRiskyMainModelWarning(selectedModel),this.maybeWarnAboutAnthropicSubscriptionAuth(selectedModel),this.checkDaxnutsEasterEgg(selectedModel)}else this.showStatus(`${actionLabel}. Credentials saved to ${getAuthPath()}`),selectionError?this.showError(selectionError):this.maybeWarnAboutAnthropicSubscriptionAuth()};deferSelection?this.showStatus(`${actionLabel}. Credentials saved to ${getAuthPath()}. Refreshing model catalog\u2026`):await finishAuthentication();let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3),refreshProviders=providerId==="cursor"?[providerId,"cursor-cli-oauth"]:[providerId];session.modelRuntime.refresh({allowNetwork:!0,providers:refreshProviders,signal:controller.signal}).then(async result3=>{result3.aborted?this.showWarning(`${actionLabel}, but its model catalog refresh timed out; using cached models.`):result3.errors.size>0&&this.showWarning(`${actionLabel}, but its model catalog could not be refreshed; using cached models.`),deferSelection&&this.session===session&&session.model===previousModel&&await finishAuthentication(),this.updateAvailableProviderCount(),this.footer.invalidate(),this.ui.requestRender()}).catch(error2=>{this.showWarning(`${actionLabel}, but its model catalog could not be refreshed: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>clearTimeout(timeout))}showAmbientAuthDialog(providerOption){let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()},dialog=new LoginDialogComponent(this.ui,providerOption.id,()=>restoreEditor(),providerOption.name,`${providerOption.name} setup`);dialog.showInfo(`${providerOption.method?.name??"Authentication"} is configured outside ${APP_NAME}.`,[],!0),this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender()}async showApiKeyLoginDialog(providerId,providerName){let previousModel=this.session.model,dialog=new LoginDialogComponent(this.ui,providerId,(_success,_message)=>{},providerName);providerId==="amazon-bedrock"&&dialog.showDetails([theme.fg("text","You can also use an AWS profile, IAM keys, or role-based credentials."),theme.fg("muted","See:"),theme.fg("accent",` ${path12.join(getDocsPath(),"providers.md")}`)]),this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender();let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()};try{await this.loginProvider(dialog,providerId,"api_key"),restoreEditor(),await this.completeProviderAuthentication(providerId,providerName,"api_key",previousModel)}catch(error2){restoreEditor(),this.showLoginFailure(describeLoginFailure(error2,providerName,"api_key"))}}showAuthSelect(dialog,prompt){return new Promise((resolve42,reject)=>{let restoreDialog=()=>{this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender()},labels=prompt.options.map(option=>option.label),selector=new ExtensionSelectorComponent(prompt.message,labels,optionLabel=>{restoreDialog();let id=prompt.options.find(option=>option.label===optionLabel)?.id;id?resolve42(id):reject(new Error("Login cancelled"))},()=>{restoreDialog(),reject(new Error("Login cancelled"))});this.editorContainer.clear(),this.editorContainer.addChild(selector),this.ui.setFocus(selector),this.ui.requestRender()})}async showAuthPrompt(dialog,prompt){let response;if(prompt.type==="select"?response=this.showAuthSelect(dialog,prompt):prompt.type==="manual_code"?response=dialog.showManualInput(prompt.message):response=dialog.showPrompt(prompt.message,prompt.placeholder),!prompt.signal)return response;if(prompt.signal.aborted)throw new Error("Login cancelled");let signal=prompt.signal,onAbort,aborted=new Promise((_resolve,reject)=>{onAbort=()=>reject(new Error("Login cancelled")),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([response,aborted])}finally{onAbort&&signal.removeEventListener("abort",onAbort)}}notifyAuthDialog(dialog,event){event.type==="auth_url"?dialog.showAuth(event.url,event.instructions):event.type==="device_code"?(dialog.showDeviceCode(event),dialog.showWaiting("Waiting for authentication...")):event.type==="info"?dialog.showInfo(event.message,event.links):dialog.showProgress(event.message)}async loginProvider(dialog,providerId,method){await this.session.modelRuntime.login(providerId,method,{signal:dialog.signal,prompt:prompt=>this.showAuthPrompt(dialog,prompt),notify:event=>this.notifyAuthDialog(dialog,event)})}async showLoginDialog(providerId,providerName){let previousModel=this.session.model,dialog=new LoginDialogComponent(this.ui,providerId,(_success,_message)=>{},providerName);this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender();let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()};try{await this.loginProvider(dialog,providerId,"oauth"),restoreEditor(),await this.completeProviderAuthentication(providerId,providerName,"oauth",previousModel)}catch(error2){restoreEditor(),this.showLoginFailure(describeLoginFailure(error2,providerName,"oauth"))}}showLoginFailure(notice2){notice2.level==="status"?this.showStatus(notice2.message):this.showError(notice2.message)}async handleReloadCommand(){if(this.session.isStreaming){this.showWarning("Wait for the current response to finish before reloading.");return}if(this.session.isCompacting){this.showWarning("Wait for compaction to finish before reloading.");return}let veto=await this.session.checkReloadVeto();if(veto.cancelled){this.showWarning(veto.reason??"Reload blocked by an extension.");return}let reloadBox=new Container,borderColor=s=>theme.fg("border",s);reloadBox.addChild(new DynamicBorder(borderColor)),reloadBox.addChild(new Spacer(1)),reloadBox.addChild(new Text(theme.fg("muted","Reloading keybindings, extensions, skills, prompts, themes, and context files..."),1,0)),reloadBox.addChild(new Spacer(1)),reloadBox.addChild(new DynamicBorder(borderColor));let previousEditor=this.editor;this.editorContainer.clear(),this.editorContainer.addChild(reloadBox),this.ui.setFocus(reloadBox),this.ui.requestRender(!0),await new Promise(resolve42=>process.nextTick(resolve42));let dismissReloadBox=editor=>{this.editorContainer.clear(),this.editorContainer.addChild(editor),this.ui.setFocus(editor),this.ui.requestRender()},chatRestoredBeforeSessionStart=!1,reloadBoxDismissed=!1,restoreChatBeforeSessionStart=()=>{chatRestoredBeforeSessionStart||(this.resetExtensionUI(),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.rebuildChatFromMessages(),time("chatRebuild","reload"),chatRestoredBeforeSessionStart=!0)};try{let reloadResult=await this.session.reload({beforeSessionStart:restoreChatBeforeSessionStart});if(reloadResult.cancelled){dismissReloadBox(previousEditor),reloadBoxDismissed=!0,this.showWarning(reloadResult.reason??"Reload blocked by an extension.");return}restoreChatBeforeSessionStart(),this.keybindings.reload();let activeHeader=this.customHeader??this.builtInHeader;isExpandable(activeHeader)&&activeHeader.setExpanded(this.toolOutputExpanded),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.applyRuntimeSettings(),await this.themeController.applyFromSettings(),this.setupAutocompleteProvider();let runner=this.session.extensionRunner;this.setupExtensionShortcuts(runner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0});let savedImplicitProjectTrust=this.maybeSaveImplicitProjectTrustAfterReload(),modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);let reloadedMessage=savedImplicitProjectTrust?"Reloaded keybindings, extensions, skills, prompts, themes, and context files; saved project trust":"Reloaded keybindings, extensions, skills, prompts, themes, and context files",reloadTimings=formatTimings("reload");this.showStatus(reloadTimings===void 0?reloadedMessage:`${reloadedMessage} | reload timings: ${reloadTimings}`),dismissReloadBox(this.editor),reloadBoxDismissed=!0}catch(error2){reloadBoxDismissed||dismissReloadBox(previousEditor),this.showError(`Reload failed: ${error2 instanceof Error?error2.message:String(error2)}`)}}async handleExportCommand(text2){let outputPath=this.getPathCommandArgument(text2,"/export");try{if(outputPath?.endsWith(".jsonl")){let filePath=await this.session.exportToJsonl(outputPath);this.showStatus(`Session exported to: ${filePath}`)}else{let filePath=await this.session.exportToHtml(outputPath,{themeName:theme.name});this.showStatus(`Session exported to: ${filePath}`)}}catch(error2){this.showError(`Failed to export session: ${error2 instanceof Error?error2.message:"Unknown error"}`)}}getPathCommandArgument(text2,command){if(text2===command||!text2.startsWith(`${command} `))return;let argsString=text2.slice(command.length+1).trimStart();if(!argsString)return;let firstChar=argsString[0];if(firstChar==='"'||firstChar==="'"){let closingQuoteIndex=argsString.indexOf(firstChar,1);return closingQuoteIndex<0?void 0:expandTildePath(argsString.slice(1,closingQuoteIndex))}let firstWhitespaceIndex=argsString.search(/\s/);return firstWhitespaceIndex<0?expandTildePath(argsString):expandTildePath(argsString.slice(0,firstWhitespaceIndex))}async handleImportCommand(text2){let inputPath=this.getPathCommandArgument(text2,"/import");if(!inputPath){this.showError("Usage: /import <path.jsonl>");return}if(!await this.showExtensionConfirm("Import session",`Replace current session with ${inputPath}?`)){this.showStatus("Import cancelled");return}try{if(this.clearStatusIndicator(),(await this.runtimeHost.importFromJsonl(inputPath)).cancelled){this.showStatus("Import cancelled");return}this.showStatus(`Session imported from: ${inputPath}`)}catch(error2){if(error2 instanceof MissingSessionCwdError){let selectedCwd=await this.promptForMissingSessionCwd(error2);if(!selectedCwd){this.showStatus("Import cancelled");return}if((await this.runtimeHost.importFromJsonl(inputPath,selectedCwd)).cancelled){this.showStatus("Import cancelled");return}this.showStatus(`Session imported from: ${inputPath}`);return}if(error2 instanceof SessionImportFileNotFoundError){this.showError(`Failed to import session: ${error2.message}`);return}await this.handleFatalRuntimeError("Failed to import session",error2)}}async handleShareCommand(){try{if(spawnSync("gh",["auth","status"],{encoding:"utf-8"}).status!==0){this.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");return}}catch{this.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");return}let tmpFile=path12.join(os6.tmpdir(),"session.html");try{await this.session.exportToHtml(tmpFile,{themeName:theme.name})}catch(error2){this.showError(`Failed to export session: ${error2 instanceof Error?error2.message:"Unknown error"}`);return}let loader=new BorderedLoader(this.ui,theme,"Creating gist...");this.editorContainer.clear(),this.editorContainer.addChild(loader),this.ui.setFocus(loader),this.ui.requestRender();let restoreEditor=()=>{loader.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor);try{fs6.unlinkSync(tmpFile)}catch{}},proc=null;loader.onAbort=()=>{proc?.kill(),restoreEditor(),this.showStatus("Share cancelled")};try{let result3=await new Promise(resolve42=>{proc=spawn11("gh",["gist","create","--public=false",tmpFile]);let stdout="",stderr="";proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),proc.on("close",code=>resolve42({stdout,stderr,code}))});if(loader.signal.aborted)return;if(restoreEditor(),result3.code!==0){let errorMsg=result3.stderr?.trim()||"Unknown error";this.showError(`Failed to create gist: ${errorMsg}`);return}let gistUrl=result3.stdout?.trim(),gistId=gistUrl?.split("/").pop();if(!gistId){this.showError("Failed to parse gist ID from gh output");return}let previewUrl=getShareViewerUrl(gistId);this.showStatus(`Share URL: ${previewUrl}
|
|
2581
|
+
`);return this.editor.setText(combinedText),allQueued.length}queueCompactionMessage(text2,mode,droppedImageCount=0){this.compactionQueuedMessages.push({text:text2,mode,enqueueOrder:this.session.reserveQueuedInputOrder()}),this.getSessionLogger().debug("compaction_queue_enqueue",{mode,count:this.compactionQueuedMessages.length}),this.editor.addToHistory?.(text2),this.editor.setText(""),this.updatePendingMessagesDisplay(),this.showStatus(droppedImageCount>0?`Queued message for after compaction; dropped ${droppedImageCount} image${droppedImageCount>1?"s":""}: messages sent during compaction cannot carry images - paste again after compaction finishes`:"Queued message for after compaction")}queueCompactionSubmission(text2,mode){let images=this.takeSubmissionImages(text2);if(images.length===0){this.queueCompactionMessage(text2,mode);return}let queued=text2.replace(IMAGE_MARKER_PATTERN2,"").trim();if(queued){this.queueCompactionMessage(queued,mode,images.length);return}this.showStatus(`Dropped ${images.length} image${images.length>1?"s":""}: messages sent during compaction cannot carry images - paste again after compaction finishes`)}hasRegisteredCommand(command){return!!this.session.extensionRunner.getCommand(command)}isExtensionCommand(text2){if(!text2.startsWith("/"))return!1;let extensionRunner=this.session.extensionRunner,spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);return!!extensionRunner.getCommand(commandName)}async flushCompactionQueue(options){let session=this.session,generation2=this.compactionQueueGeneration??0,previousFlush=this.compactionQueueFlushTail,runTransfer=async()=>{(this.compactionQueueGeneration??0)!==generation2||this.session!==session||(await transferCompactionQueue({takeBatch:()=>{let batch=this.compactionQueuedMessages;this.compactionQueuedMessages=[],this.compactionInFlightMessages.push(...batch);for(let message of batch)this.compactionTransferAbortControllers.set(message,new AbortController);return this.updatePendingMessagesDisplay(),batch},commitAccepted:message=>{let index=this.compactionInFlightMessages.indexOf(message);return index===-1?!1:(this.compactionInFlightMessages.splice(index,1),this.compactionTransferAbortControllers.delete(message),this.updatePendingMessagesDisplay(),!0)},restoreUndelivered:messages=>{let restorable=messages.filter(message=>this.compactionInFlightMessages.includes(message)),restorableSet=new Set(restorable);this.compactionInFlightMessages=this.compactionInFlightMessages.filter(message=>!restorableSet.has(message));for(let message of restorable)this.compactionTransferAbortControllers.delete(message);return this.compactionQueuedMessages=[...restorable,...this.compactionQueuedMessages],this.updatePendingMessagesDisplay(),restorable.length},isCommand:message=>this.isExtensionCommand(message.text),deliverCommand:async message=>{let pendingEchoId=message.pendingEchoId;try{await session.prompt(message.text,pendingEchoId?this.optimisticUserEchoes.promptOptions(pendingEchoId):void 0)}catch(error2){throw pendingEchoId&&this.optimisticUserEchoes.reject(pendingEchoId),error2}},deliverFirstPrompt:message=>waitForPromptDisposition((preflightResult,promptDisposition)=>{let echoOptions=message.pendingEchoId?this.optimisticUserEchoes.promptOptions(message.pendingEchoId):void 0;return session.prompt(message.text,{streamingBehavior:message.mode,preflightResult:success=>{echoOptions?.preflightResult(success),preflightResult(success)},promptDisposition:disposition=>{echoOptions?.promptDisposition(disposition),promptDisposition(disposition)},signal:this.compactionTransferAbortControllers.get(message)?.signal})},error2=>{(this.compactionQueueGeneration??0)!==generation2||this.session!==session||this.showError(`Queued prompt failed after acceptance: ${error2 instanceof Error?error2.message:String(error2)}`)}),deliverQueued:message=>message.enqueueOrder===void 0?message.mode==="followUp"?session.followUp(message.text):session.steer(message.text):message.mode==="followUp"?session.followUp(message.text,void 0,{enqueueOrder:message.enqueueOrder}):session.steer(message.text,void 0,{enqueueOrder:message.enqueueOrder}),reportFailure:(error2,undeliveredCount)=>{this.showError(`Failed to send queued message${undeliveredCount===1?"":"s"}: ${error2 instanceof Error?error2.message:String(error2)}`)}},options),this.updatePendingMessagesDisplay())},currentFlush=previousFlush?previousFlush.then(runTransfer,runTransfer):runTransfer(),settledFlush=currentFlush.catch(()=>{});this.compactionQueueFlushTail=settledFlush;try{await currentFlush}finally{this.compactionQueueFlushTail===settledFlush&&(this.compactionQueueFlushTail=void 0)}}flushPendingBashComponents(){for(let component of this.pendingBashComponents)this.pendingMessagesContainer.removeChild(component),this.chatContainer.addChild(component);this.pendingBashComponents=[]}disposeActiveSelector(){let dispose=this.activeSelectorDispose;this.activeSelectorToken=void 0,this.activeSelectorDispose=void 0,dispose?.()}showSelector(create){let token={},dispose,created=create(()=>{dispose?.(),this.activeSelectorToken===token&&(this.activeSelectorToken=void 0,this.activeSelectorDispose=void 0,this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor))});dispose=created.dispose,this.disposeActiveSelector(),this.activeSelectorToken=token,this.activeSelectorDispose=dispose,this.editorContainer.clear(),this.editorContainer.addChild(created.component),this.ui.setFocus(created.focus),this.ui.requestRender()}async showSettingsSelector(){let availableThinkingLevels=await this.session.getAvailableThinkingLevels();this.showSelector(done=>{let selector;return selector=new SettingsSelectorComponent({autoCompact:this.session.autoCompactionEnabled,showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells(),autoResizeImages:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages(),enableSkillCommands:this.settingsManager.getEnableSkillCommands(),steeringMode:this.session.steeringMode,followUpMode:this.session.followUpMode,transport:this.settingsManager.getTransport(),httpIdleTimeoutMs:this.settingsManager.getHttpIdleTimeoutMs(),thinkingLevel:this.session.thinkingLevel,availableThinkingLevels,currentTheme:this.themeController.getThemeSelection()||"dark",terminalTheme:this.themeController.getTerminalTheme(),availableThemes:getAvailableThemes(),hideThinkingBlock:this.hideThinkingBlock,smoothStreaming:this.settingsManager.getSmoothStreaming(),smoothStreamingFps:this.settingsManager.getSmoothStreamingFps(),mermaidRenderingMode:this.settingsManager.getMermaidRenderingMode(),collapseChangelog:this.settingsManager.getCollapseChangelog(),enableInstallTelemetry:this.settingsManager.getEnableInstallTelemetry(),doubleEscapeAction:this.settingsManager.getDoubleEscapeAction(),treeFilterMode:this.settingsManager.getTreeFilterMode(),showHardwareCursor:this.settingsManager.getShowHardwareCursor(),showCacheMissNotices:this.settingsManager.getShowCacheMissNotices(),defaultProjectTrust:this.settingsManager.getDefaultProjectTrust(),editorPaddingX:this.settingsManager.getEditorPaddingX(),outputPad:this.settingsManager.getOutputPad(),autocompleteMaxVisible:this.settingsManager.getAutocompleteMaxVisible(),quietStartup:this.settingsManager.getQuietStartup(),clearOnShrink:this.settingsManager.getClearOnShrink(),showTerminalProgress:this.settingsManager.getShowTerminalProgress(),tuiMode:this.ui.mode,fullscreenExitOutput:this.settingsManager.getFullscreenExitOutput(),fullscreenScrollbar:this.settingsManager.getFullscreenScrollbar(),fullscreenCopyOnSelect:this.settingsManager.getFullscreenCopyOnSelect?.()??!0,terminalMouse:this.settingsManager.getTerminalMouse(),warnings:this.settingsManager.getWarnings()},{onAutoCompactChange:enabled=>{this.settingsManager.setCompactionEnabled(enabled),this.session.setAutoCompactionEnabled(enabled),this.footer.setAutoCompactEnabled(enabled)},onShowImagesChange:enabled=>{this.settingsManager.setShowImages(enabled);for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.setShowImages(enabled)},onImageWidthCellsChange:width=>{this.settingsManager.setImageWidthCells(width);for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.setImageWidthCells(width)},onAutoResizeImagesChange:enabled=>{this.settingsManager.setImageAutoResize(enabled)},onBlockImagesChange:blocked=>{this.settingsManager.setBlockImages(blocked)},onEnableSkillCommandsChange:enabled=>{this.settingsManager.setEnableSkillCommands(enabled),this.setupAutocompleteProvider()},onSteeringModeChange:mode=>{this.session.setSteeringMode(mode)},onFollowUpModeChange:mode=>{this.session.setFollowUpMode(mode)},onTransportChange:transport=>{this.settingsManager.setTransport(transport),this.session.agent.transport=transport},onHttpIdleTimeoutMsChange:timeoutMs=>{this.settingsManager.setHttpIdleTimeoutMs(timeoutMs),configureHttpDispatcher(timeoutMs),this.session.agent.timeoutMs=this.settingsManager.getAgentStreamIdleTimeoutMs(),this.session.agent.streamStartTimeoutMs=this.settingsManager.getAgentStreamStartTimeoutMs(),this.showStatus(`HTTP idle timeout: ${formatHttpIdleTimeoutMs(timeoutMs)}`)},onThinkingLevelChange:level=>{this.session.setThinkingLevel(level),this.footer.invalidate(),this.updateEditorBorderColor()},onThemeChange:themeSetting=>{this.settingsManager.setTheme(themeSetting),this.themeController.setThemeSetting(themeSetting)},onThemePreview:themeName=>this.themeController.preview(themeName),onHideThinkingBlockChange:hidden=>{this.hideThinkingBlock=hidden,this.settingsManager.setHideThinkingBlock(hidden);for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHideThinkingBlock(hidden);this.chatContainer.clear(),this.rebuildChatFromMessages(),this.streamingComponent&&this.streamingMessage&&(this.streamingComponent.setHideThinkingBlock(hidden),this.streamingReveal.resyncVisibility(),this.chatContainer.addChild(this.streamingComponent)),this.ui.requestRender()},onSmoothStreamingChange:enabled=>{this.settingsManager.setSmoothStreaming(enabled),this.applySmoothStreamingRenderFps(),this.toolArgsReveal.refresh(),this.toolResultReveal.refresh(),this.streamingMessage&&this.streamingReveal.setTarget(this.streamingMessage),this.ui.requestRender()},onSmoothStreamingFpsChange:fps=>{this.settingsManager.setSmoothStreamingFps(fps),this.toolArgsReveal.refresh(),this.toolResultReveal.refresh(),this.settingsManager.getSmoothStreaming()&&(this.applySmoothStreamingRenderFps(),this.streamingMessage&&this.streamingReveal.setTarget(this.streamingMessage))},onMermaidRenderingModeChange:mode=>{this.settingsManager.setMermaidRenderingMode(mode),this.chatContainer.invalidate(),this.ui.requestRender()},onShowCacheMissNoticesChange:shown=>{this.settingsManager.setShowCacheMissNotices(shown),this.rebuildChatFromMessages()},onCollapseChangelogChange:collapsed=>{this.settingsManager.setCollapseChangelog(collapsed)},onEnableInstallTelemetryChange:enabled=>{this.settingsManager.setEnableInstallTelemetry(enabled)},onQuietStartupChange:enabled=>{this.settingsManager.setQuietStartup(enabled)},onDefaultProjectTrustChange:defaultProjectTrust=>{this.settingsManager.setDefaultProjectTrust(defaultProjectTrust)},onDoubleEscapeActionChange:action=>{this.settingsManager.setDoubleEscapeAction(action)},onTreeFilterModeChange:mode=>{this.settingsManager.setTreeFilterMode(mode)},onShowHardwareCursorChange:enabled=>{this.settingsManager.setShowHardwareCursor(enabled),this.ui.setShowHardwareCursor(enabled)},onEditorPaddingXChange:padding=>{this.settingsManager.setEditorPaddingX(padding),this.defaultEditor.setPaddingX(padding),this.editor!==this.defaultEditor&&this.editor.setPaddingX!==void 0&&this.editor.setPaddingX(padding)},onOutputPadChange:padding=>{if(this.settingsManager.setOutputPad(padding),this.outputPad=padding,this.streamingComponent||this.session.isStreaming){for(let child of this.chatContainer.children)(child instanceof AssistantMessageComponent||child instanceof CustomMessageComponent||child instanceof UserMessageComponent)&&child.setOutputPad(padding);this.streamingComponent&&this.streamingComponent.setOutputPad(padding),this.ui.requestRender();return}this.rebuildChatFromMessages()},onAutocompleteMaxVisibleChange:maxVisible=>{this.settingsManager.setAutocompleteMaxVisible(maxVisible),this.defaultEditor.setAutocompleteMaxVisible(maxVisible),this.editor!==this.defaultEditor&&this.editor.setAutocompleteMaxVisible!==void 0&&this.editor.setAutocompleteMaxVisible(maxVisible)},onClearOnShrinkChange:enabled=>{this.settingsManager.setClearOnShrink(enabled),this.ui.setClearOnShrink(enabled),!enabled&&!this.activeStatusIndicator&&this.statusContainer.clear()},onShowTerminalProgressChange:enabled=>{this.settingsManager.setShowTerminalProgress(enabled)},onTerminalMouseChange:mode=>{if(this.renderer.hasOverlayEntries){selector?.getSettingsList().updateValue("terminal-mouse",this.terminalMouseMode),this.showStatus("Close active overlays before changing mouse capture");return}this.settingsManager.setTerminalMouse(mode),this.switchTuiMode(this.renderer.mode,!0,!0,!0),this.refreshAsyncWidget()},onTuiModeChange:mode=>{if(!this.switchTuiMode(mode)){selector?.getSettingsList().updateValue("tui-mode",this.ui.mode),this.showStatus("Close active overlays before changing TUI mode");return}this.settingsManager.setTuiMode(mode),this.activeStatusIndicator||this.statusContainer.clear(),this.showStatus(`TUI mode: ${mode}`)},onFullscreenExitOutputChange:output=>{this.settingsManager.setFullscreenExitOutput(output)},onFullscreenScrollbarChange:mode=>{this.settingsManager.setFullscreenScrollbar(mode),this.applyFullscreenScrollbarSetting()},onFullscreenCopyOnSelectChange:enabled=>{this.settingsManager.setFullscreenCopyOnSelect(enabled),this.renderer instanceof TuiAltScreen&&this.renderer.setCopyOnSelect(enabled)},onWarningsChange:warnings=>{this.settingsManager.setWarnings(warnings)},onCancel:()=>{done(),this.ui.requestRender()}}),{component:selector,focus:selector.getSettingsList()}})}async handleThinkingCommand(searchTerm){if(!searchTerm){await this.showThinkingSelector();return}let availableLevels=await this.session.getAvailableThinkingLevels(),normalized2=searchTerm.trim().toLowerCase(),level=availableLevels.find(candidate=>candidate.toLowerCase()===normalized2);if(!level){this.showError(`Unknown thinking level "${searchTerm}". Available levels: ${availableLevels.join(", ")}.`);return}this.selectThinkingLevel(level,!1)}selectThinkingLevel(level,persist){try{persist?this.session.setThinkingLevel(level):this.session.setSessionThinkingLevel(level),this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(persist?`Default thinking level: ${level}`:`Thinking level: ${level}`)}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}async showThinkingSelector(){let availableLevels=await this.session.getAvailableThinkingLevels();this.showSelector(done=>{let selectLevel=(level,persist)=>{this.selectThinkingLevel(level,persist),done()},selector=new ThinkingSelectorComponent(this.session.thinkingLevel,availableLevels,level=>selectLevel(level,!1),()=>{done(),this.ui.requestRender()},level=>selectLevel(level,!0),this.settingsManager.getDefaultThinkingLevel());return{component:selector,focus:selector}})}async handleModelCommand(searchTerm){if(!searchTerm){this.showModelSelector();return}let model=await this.findExactModelMatch(searchTerm);if(model){await this.selectModelFromUi(model);return}this.showModelSelector(searchTerm)}async findExactModelMatch(searchTerm){let cachedModels=this.session.scopedModels.length>0?this.session.scopedModels.map(scoped=>scoped.model):[...this.session.modelRuntime.getAvailableSnapshot()],cachedMatch=findExactModelReferenceMatch(searchTerm,cachedModels);if(cachedMatch||this.session.scopedModels.length>0)return cachedMatch;this.showStatus("Refreshing model catalogs\u2026");let controller=new AbortController,timedOut=!1,timeout=setTimeout(()=>{timedOut=!0,controller.abort()},15e3);try{let result3=await refreshModelCatalogs(this.session.modelRuntime,controller.signal);result3.aborted&&timedOut?this.showWarning("Model refresh timed out; searching cached models."):result3.errors.size>0&&this.showWarning(`Could not refresh ${[...result3.errors.keys()].join(", ")}; searching cached models.`)}catch(error2){this.showWarning(timedOut?"Model refresh timed out; searching cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`)}finally{clearTimeout(timeout)}return findExactModelReferenceMatch(searchTerm,[...this.session.modelRuntime.getAvailableSnapshot()])}async selectModelFromUi(model,done){done?.(),this.ui?.requestRender();try{let systemPromptChange=await this.session.setModel(model);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.updateEditorBorderColor();let systemPromptStr=systemPromptChange?.systemPromptName?` (optimized system prompt applied: ${systemPromptChange.systemPromptName})`:"";this.showStatus(`Model: ${model.id}${systemPromptStr}`),this.showRiskyMainModelWarning(model),this.maybeWarnAboutAnthropicSubscriptionAuth(model),this.checkDaxnutsEasterEgg(model)}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}async resolveFavoriteModelsForUi(patterns,candidateModels){let candidateIds=new Set(candidateModels.map(getModelFullId)),warnings=[],resolvedModels=await resolveModelScope(patterns,this.session.modelRuntime,{onWarning:message=>warnings.push(message)});for(let warning of warnings)this.showWarning(warning);return resolvedModels.filter(resolved=>candidateIds.has(getModelFullId(resolved.model)))}async getFavoriteModelIdsForUi(candidateModels){let candidateIds=new Set(candidateModels.map(getModelFullId)),sessionFavoriteIds=this.session.favoriteModels.map(favorite=>getModelFullId(favorite.model)).filter(id=>candidateIds.has(id));if(sessionFavoriteIds.length>0)return sessionFavoriteIds;let patterns=this.settingsManager.getFavoriteModels()??[];return patterns.length===0?[]:(await this.resolveFavoriteModelsForUi(patterns,candidateModels)).map(favorite=>getModelFullId(favorite.model))}async captureFavoritePatternSnapshot(){let storedPatterns=this.settingsManager.getFavoriteModels()??[],{patternResolutions}=await resolveModelScopeWithDiagnostics(storedPatterns,this.session.modelRuntime);return{storedPatterns,patternResolutions}}async applyFavoriteSelection(favoriteIds,candidateModels,persist,patternSnapshot){let{storedPatterns,patternResolutions}=patternSnapshot,mergedPatterns=mergeFavoritePatternsForPersist({storedPatterns,patternResolutions,selectedIds:favoriteIds,candidateIds:candidateModels.map(getModelFullId)}),newFavoriteModels=mergedPatterns?await resolveModelScope(mergedPatterns,this.session.modelRuntime):[];this.session.setFavoriteModels(newFavoriteModels.map(favorite=>({model:favorite.model,thinkingLevel:favorite.thinkingLevel,serviceTier:favorite.serviceTier}))),persist&&this.settingsManager.setFavoriteModels(mergedPatterns),this.ui.requestRender()}updateAvailableProviderCount(){let models=this.session.scopedModels.length>0?this.session.scopedModels.map(scoped=>scoped.model):this.session.modelRuntime.getAvailableSnapshot(),uniqueProviders=new Set(models.map(model=>model.provider));this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size)}async maybeWarnAboutAnthropicSubscriptionAuth(model=this.session.model){if(this.settingsManager.getWarnings().anthropicExtraUsage!==!1&&!this.anthropicSubscriptionWarningShown&&model?.provider==="anthropic")try{if((await this.session.modelRuntime.checkAuth("anthropic"))?.type==="oauth"){this.anthropicSubscriptionWarningShown=!0,this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);return}let apiKey=(await this.session.modelRuntime.getAuth(model.provider))?.auth.apiKey;if(!isAnthropicSubscriptionAuthKey(apiKey))return;this.anthropicSubscriptionWarningShown=!0,this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING)}catch{}}maybeSaveImplicitProjectTrustAfterReload(){let cwd=this.sessionManager.getCwd();if(this.autoTrustOnReloadCwd!==cwd||!this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(cwd))return!1;let trustStore=new ProjectTrustStore(this.runtimeHost.services.agentDir);try{return trustStore.get(cwd)!==null?(this.autoTrustOnReloadCwd=void 0,!1):(trustStore.set(cwd,!0),this.autoTrustOnReloadCwd=void 0,!0)}catch(error2){return this.showWarning(`Could not save project trust after reload: ${error2 instanceof Error?error2.message:String(error2)}`),!1}}showTrustSelector(){let cwd=this.sessionManager.getCwd(),trustStore=new ProjectTrustStore(this.runtimeHost.services.agentDir),savedDecision=trustStore.getEntry(cwd);this.showSelector(done=>{let selector=new TrustSelectorComponent({cwd,savedDecision,projectTrusted:this.settingsManager.isProjectTrusted(),onSelect:selection=>{trustStore.setMany(selection.updates),done(),this.showStatus(`Saved trust decision: ${selection.trusted?"trusted":"untrusted"}. Restart ${APP_NAME} for this to take effect.`)},onCancel:()=>{done(),this.ui.requestRender()}});return{component:selector,focus:selector}})}showModelSelector(initialSearchInput){let favoritePatternSnapshot=this.captureFavoritePatternSnapshot();this.showSelector(done=>{let favoriteModelIds=this.session.favoriteModels.map(favorite=>getModelFullId(favorite.model)),selector=new ModelSelectorComponent(this.ui,this.session.model,this.settingsManager,this.session.modelRuntime,this.session.scopedModels,model=>{this.selectModelFromUi(model,done)},()=>{done(),this.ui.requestRender()},initialSearchInput,{favoriteModelIds,onFavoriteChange:async(favoriteIds,allModels)=>{await this.applyFavoriteSelection(favoriteIds,allModels,!0,await favoritePatternSnapshot)}});return{component:selector,focus:selector,dispose:()=>selector.dispose()}})}async showFavoriteModelsSelector(){let allModels=[...this.session.modelRuntime.getAvailableSnapshot()];if(allModels.length===0){this.showStatus("No models available");return}let currentFavoriteIds=await this.getFavoriteModelIdsForUi(allModels),favoritePatternSnapshot=await this.captureFavoritePatternSnapshot();this.showSelector(done=>{let selector=new FavoriteModelsSelectorComponent({allModels,favoriteModelIds:currentFavoriteIds,currentModel:this.session.model},{onChange:async favoriteIds=>{await this.applyFavoriteSelection(favoriteIds,allModels,!1,favoritePatternSnapshot)},onPersist:favoriteIds=>{this.applyFavoriteSelection(favoriteIds,allModels,!0,favoritePatternSnapshot).then(()=>{this.showStatus("Favorite models saved to settings")})},onSelect:model=>{this.selectModelFromUi(model,done)},onCancel:()=>{done(),this.ui.requestRender()}});return{component:selector,focus:selector}})}showScopedModelsSelector(){let availableModels2=[...this.session.modelRuntime.getAvailableSnapshot()],availableModelIds=new Set(availableModels2.map(model=>`${model.provider}/${model.id}`)),configuredPatterns=this.settingsManager.getEnabledModels(),sessionScopedModels=this.session.scopedModels,configuredEnabledIds=models=>{if(!configuredPatterns?.length)return null;let resolved=resolveModelScopeFromModels(configuredPatterns,models),ids=resolved.scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`);for(let diagnostic2 of resolved.diagnostics)diagnostic2.code==="no-match"&&!ids.includes(diagnostic2.pattern)&&ids.push(diagnostic2.pattern);return ids},currentEnabledIds=sessionScopedModels.length>0?sessionScopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`):configuredEnabledIds(availableModels2),selectionChanged=!1,updateSessionModels=enabledIds=>{currentEnabledIds=enabledIds===null?null:[...enabledIds];let hasEnabledAvailableModel=enabledIds?.some(id=>availableModelIds.has(id))??!1,allAvailableModelsEnabled=enabledIds!==null&&[...availableModelIds].every(id=>enabledIds.includes(id));if(enabledIds&&hasEnabledAvailableModel&&!allAvailableModelsEnabled){let newScopedModels=resolveModelScopeFromModels(enabledIds,availableModels2).scopedModels;this.session.setScopedModels(newScopedModels.map(scoped=>({model:scoped.model,thinkingLevel:scoped.thinkingLevel})))}else this.session.setScopedModels([]);this.updateAvailableProviderCount(),this.ui.requestRender()};this.showSelector(done=>{let disposed=!1,timedOut=!1,controller=new AbortController,timeout=setTimeout(()=>{timedOut=!0,controller.abort()},15e3),selector=new ScopedModelsSelectorComponent({allModels:availableModels2,enabledModelIds:currentEnabledIds,refreshStatus:"Refreshing model catalogs\u2026"},{onChange:enabledIds=>{selectionChanged=!0,updateSessionModels(enabledIds)},onPersist:enabledIds=>{let allEnabled=enabledIds!==null&&enabledIds.length===availableModels2.length&&enabledIds.every(id=>availableModelIds.has(id)),newPatterns=enabledIds===null||allEnabled?void 0:enabledIds;this.settingsManager.setEnabledModels(newPatterns?[...newPatterns]:void 0),this.showStatus("Model selection saved to settings")},onCancel:()=>{done(),this.ui.requestRender()}});return refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(result3=>{disposed||(availableModels2=[...this.session.modelRuntime.getAvailableSnapshot()],availableModelIds=new Set(availableModels2.map(model=>`${model.provider}/${model.id}`)),!selectionChanged&&sessionScopedModels.length===0?(currentEnabledIds=configuredEnabledIds(availableModels2),selector.updateModels(availableModels2,currentEnabledIds)):selector.updateModels(availableModels2),currentEnabledIds!==null&&updateSessionModels(currentEnabledIds),result3.aborted&&timedOut?selector.setRefreshStatus("Model refresh timed out; showing cached models.","warning"):result3.errors.size>0?selector.setRefreshStatus(`Could not refresh ${[...result3.errors.keys()].join(", ")}; showing cached models.`,"warning"):selector.setRefreshStatus("Model catalogs refreshed.","success"),this.ui.requestRender())}).catch(error2=>{disposed||(selector.setRefreshStatus(timedOut?"Model refresh timed out; showing cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`,"warning"),this.ui.requestRender())}).finally(()=>clearTimeout(timeout)),{component:selector,focus:selector,dispose:()=>{disposed=!0,clearTimeout(timeout),controller.abort()}}})}async showUserMessageSelector(){let userMessages=await this.session.getUserMessagesForForking();if(userMessages.length===0){this.showStatus("No messages to fork from");return}let initialSelectedId=userMessages[userMessages.length-1]?.entryId;this.showSelector(done=>{let selector=new UserMessageSelectorComponent(userMessages.map(m=>({id:m.entryId,text:m.text})),async entryId=>{done();try{let result3=await this.runtimeHost.fork(entryId);if(result3.cancelled){this.ui.requestRender();return}this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}},()=>{done(),this.ui.requestRender()},initialSelectedId);return{component:selector,focus:selector.getMessageList()}})}async handleCloneCommand(){let leafId=this.sessionManager.getLeafId();if(!leafId){this.showStatus("Nothing to clone yet");return}try{if((await this.runtimeHost.fork(leafId,{position:"at"})).cancelled){this.ui.requestRender();return}this.editor.setText(""),this.showStatus("Cloned to new session")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}showTreeSelector(initialSelectedId){let tree=this.sessionManager.getTree(),realLeafId=this.sessionManager.getLeafId(),initialFilterMode=this.settingsManager.getTreeFilterMode();if(tree.length===0){this.showStatus("No entries in session");return}this.showSelector(done=>{let selector=new TreeSelectorComponent(tree,realLeafId,this.ui.terminal.rows,async entryId=>{if(entryId===this.sessionManager.getLeafId()){done(),this.showStatus("Already at this point");return}done(),await this.runTreeNavigation(entryId,{promptForSummary:!0,navigate:options=>this.session.navigateTree(entryId,options),successStatus:"Navigated to selected point"})},()=>{done(),this.ui.requestRender()},(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3),this.ui.requestRender()},initialSelectedId,initialFilterMode);return selector.onCopy=async text2=>{if(!text2){this.showError("Selected entry has no text to copy");return}try{await copyToClipboard(text2),this.showStatus("Copied selected message to clipboard")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}},selector.onEditMessage=entryId=>{done(),this.editAssistantMessageFromTree(entryId)},{component:selector,focus:selector}})}async editAssistantMessageFromTree(entryId){let entry=this.sessionManager.getEntry(entryId);if(entry?.type!=="message"||entry.message.role!=="assistant"){this.showError("Only assistant responses can be edited here");return}let message=entry.message,expectedLeafId=this.sessionManager.getLeafId()??void 0,title=message.content.some(block=>block.type==="toolCall")?"Edit assistant response (its tool calls will be dropped)":"Edit assistant response",edited=await this.showExtensionEditor(title,contentText(message.content,""));if(edited===void 0){this.showTreeSelector(entryId);return}if(!edited.trim()){this.showError("Assistant response cannot be empty"),this.showTreeSelector(entryId);return}if(assistantTextEquals(message,edited)){this.showStatus("Assistant response unchanged");return}await this.runTreeNavigation(entryId,{promptForSummary:this.treeNavigationAbandonsConversation(entryId),navigate:async options=>{try{return await this.session.editAssistantMessage(entryId,edited,{...options,expectedLeafId})}catch(error2){throw error2 instanceof AssistantEditError&&error2.reason==="stale-leaf"?new Error("The session changed while you were editing; reopen /tree and try again"):error2}},successStatus:"Replaced assistant response with your edit"})}treeNavigationAbandonsConversation(targetId){let{entries}=collectEntriesForBranchSummary2(this.sessionManager,this.sessionManager.getLeafId(),targetId);return entries.some(entry=>entry.type==="message"||entry.type==="custom_message"||entry.type==="compaction"||entry.type==="branch_summary")}async promptBranchSummaryChoice(){for(;;){let summaryChoice=await this.showExtensionSelector("Summarize branch?",["No summary","Summarize","Summarize with custom prompt"]);if(summaryChoice===void 0)return;if(summaryChoice!=="Summarize with custom prompt")return{summarize:summaryChoice!=="No summary"};let customInstructions=await this.showExtensionEditor("Custom summarization instructions");if(customInstructions!==void 0)return{summarize:!0,customInstructions}}}async runTreeNavigation(entryId,flow){let wantsSummary=!1,customInstructions;if(flow.promptForSummary&&!this.settingsManager.getBranchSummarySkipPrompt()){let choice=await this.promptBranchSummaryChoice();if(choice===void 0){this.showTreeSelector(entryId);return}wantsSummary=choice.summarize,customInstructions=choice.customInstructions}if(this.session.isStreaming&&(this.restoreQueuedMessagesToEditor(),await this.session.abort()),this.session.isCompacting){this.showError("Wait for the current compaction or tree navigation to finish before navigating the session tree.");return}let showingSummaryIndicator=!1,originalOnEscape=this.defaultEditor.onEscape;wantsSummary&&(this.defaultEditor.onEscape=()=>{this.session.abortBranchSummary()},this.chatContainer.addChild(new Spacer(1)),this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)),showingSummaryIndicator=!0,this.ui.requestRender());try{let result3=await flow.navigate({summarize:wantsSummary,customInstructions});if(result3.aborted){this.showStatus("Branch summarization cancelled"),this.showTreeSelector(entryId);return}if(result3.cancelled){this.showStatus("Navigation cancelled");return}this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus(flow.successStatus),this.flushCompactionQueue({willRetry:!1})}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}finally{showingSummaryIndicator&&this.clearStatusIndicator("branchSummary"),this.defaultEditor.onEscape=originalOnEscape}}showSessionSelector(){this.showSelector(done=>{let selector=new SessionSelectorComponent(onProgress=>currentScopeSessions(this.sessionManager,onProgress),onProgress=>allScopeSessions(this.sessionManager,onProgress),async sessionPath=>{done();let target=await chooseResumePath(sessionPath,this.sessionManager,{confirm:(title,message)=>this.showExtensionConfirm(title,message),showError:message=>this.showError(message)});target!==void 0&&await this.handleResumeSession(target)},()=>{done(),this.ui.requestRender()},()=>{this.shutdown()},()=>this.ui.requestRender(),{renameSession:async(sessionFilePath,nextName)=>{let next=(nextName??"").trim();if(!next)return;SessionManager.open(sessionFilePath).appendSessionInfo(next)},showRenameHint:!0,keybindings:this.keybindings},this.sessionManager.getSessionFile());return{component:selector,focus:selector}})}async handleResumeSession(sessionPath,options){this.clearStatusIndicator();try{let result3=await this.runtimeHost.switchSession(sessionPath,{withSession:options?.withSession,projectTrustContextFactory:cwd=>this.createProjectTrustContext(cwd)});if(result3.cancelled)return result3;let switchTimings=formatTimings("switch");return this.showStatus(switchTimings===void 0?"Resumed session":`Resumed session | switch timings: ${switchTimings}`),result3}catch(error2){if(error2 instanceof MissingSessionCwdError){let selectedCwd=await this.promptForMissingSessionCwd(error2);if(!selectedCwd)return this.showStatus("Resume cancelled"),{cancelled:!0};let result3=await this.runtimeHost.switchSession(sessionPath,{cwdOverride:selectedCwd,withSession:options?.withSession,projectTrustContextFactory:cwd=>this.createProjectTrustContext(cwd)});return result3.cancelled||this.showStatus("Resumed session in current cwd"),result3}return this.handleFatalRuntimeError("Failed to resume session",error2)}}getLoginProviderOptions(authType){let options=[];for(let provider of this.session.modelRuntime.getProviders()){let authStatus=this.session.modelRuntime.getProviderAuthStatus(provider.id),status=authStatus.configured?{type:this.session.modelRuntime.isUsingOAuth(provider.id)?"oauth":"api_key",source:authStatus.label??authStatus.source}:void 0;(!authType||authType==="oauth")&&provider.auth.oauth&&options.push({id:provider.id,name:provider.name,authType:"oauth",method:provider.auth.oauth,status}),(!authType||authType==="api_key")&&provider.auth.apiKey&&options.push({id:provider.id,name:provider.name,authType:"api_key",method:provider.auth.apiKey,status})}return options.sort((a,b)=>a.name.localeCompare(b.name))}async getLogoutProviderOptions(){return(await this.session.modelRuntime.listCredentials({signal:AbortSignal.timeout(15e3)})).map(({providerId,type:type2})=>({id:providerId,name:this.session.modelRuntime.getProvider(providerId)?.name??providerId,authType:type2,status:{type:type2,source:"stored credential"}})).sort((a,b)=>a.name.localeCompare(b.name))}findLoginProviderOptions(providerRef){let normalizedProviderRef=providerRef.trim().toLowerCase();return normalizedProviderRef?this.getLoginProviderOptions().filter(provider=>provider.id.toLowerCase()===normalizedProviderRef||provider.name.toLowerCase()===normalizedProviderRef):[]}async handleLoginCommand(providerRef){if(!providerRef){this.showLoginAuthTypeSelector();return}let rejection=legacyProviderIdRejection(providerRef);if(rejection){this.showError(rejection);return}let providerOptions=this.findLoginProviderOptions(providerRef);if(providerOptions.length===1){await this.startProviderLogin(providerOptions[0]);return}if(providerOptions.length>1&&new Set(providerOptions.map(provider=>provider.id)).size===1){this.showLoginAuthTypeSelector(providerOptions);return}this.showLoginProviderSelector(void 0,providerRef)}async startProviderLogin(providerOption){providerOption.authType==="oauth"?await this.showLoginDialog(providerOption.id,providerOption.name):providerOption.method?.login?await this.showApiKeyLoginDialog(providerOption.id,providerOption.name):this.showAmbientAuthDialog(providerOption)}showLoginAuthTypeSelector(providerOptions){let oauthProvider=providerOptions?.find(provider=>provider.authType==="oauth"),subscriptionLabel=(oauthProvider?.method&&"loginLabel"in oauthProvider.method?oauthProvider.method.loginLabel:void 0)??"Sign in with an account",apiKeyLabel="Sign in with an API key",availableAuthTypes=providerOptions?new Set(providerOptions.map(provider=>provider.authType)):new Set(["oauth","api_key"]),options=[];if(availableAuthTypes.has("oauth")&&options.push(subscriptionLabel),availableAuthTypes.has("api_key")&&options.push(apiKeyLabel),options.length===0){this.showStatus("No login methods available.");return}if(providerOptions&&options.length===1){let providerOption=providerOptions[0];providerOption&&this.startProviderLogin(providerOption);return}let title=providerOptions?.[0]?`Select authentication method for ${providerOptions[0].name}:`:"Select authentication method:";this.showSelector(done=>{let selector=new ExtensionSelectorComponent(title,options,option=>{done();let authType=option===subscriptionLabel?"oauth":"api_key";if(providerOptions){let providerOption=providerOptions.find(provider=>provider.authType===authType);providerOption&&this.startProviderLogin(providerOption);return}this.showLoginProviderSelector(authType)},()=>{done(),this.ui.requestRender()});return{component:selector,focus:selector}})}showLoginProviderSelector(authType,initialSearchInput){let providerOptions=this.getLoginProviderOptions(authType);if(providerOptions.length===0){let message=authType==="oauth"?"No subscription providers available.":authType==="api_key"?"No API key providers available.":"No login providers available.";this.showStatus(message);return}this.showSelector(done=>{let selector=new OAuthSelectorComponent("login",providerOptions,async(providerId,selectedAuthType)=>{done();let providerOption=providerOptions.find(provider=>provider.id===providerId&&provider.authType===selectedAuthType);providerOption&&await this.startProviderLogin(providerOption)},()=>{done(),authType?this.showLoginAuthTypeSelector():this.ui.requestRender()},initialSearchInput);return{component:selector,focus:selector}})}async showOAuthSelector(mode){if(mode==="login"){this.showLoginAuthTypeSelector();return}let providerOptions;try{providerOptions=await this.getLogoutProviderOptions()}catch(error2){this.showError(`Could not read stored credentials: ${error2 instanceof Error?error2.message:String(error2)}`);return}if(providerOptions.length===0){this.showStatus("No stored credentials to remove. /logout only removes credentials saved by /login; environment variables and models.json config are unchanged.");return}this.showSelector(done=>{let selector=new OAuthSelectorComponent(mode,providerOptions,async providerId=>{done();let providerOption=providerOptions.find(provider=>provider.id===providerId);if(providerOption)try{await this.session.modelRuntime.logout(providerOption.id,{signal:AbortSignal.timeout(15e3)}),this.updateAvailableProviderCount();let message=providerOption.authType==="oauth"?`Logged out of ${providerOption.name}`:`Removed stored API key for ${providerOption.name}. Environment variables and models.json config are unchanged.`;this.showStatus(message)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(error2 instanceof CredentialSynchronizationError?`Credentials removed for ${providerOption.name}, but local model state could not be synchronized: ${message}`:`Logout failed: ${message}`)}},()=>{done(),this.ui.requestRender()});return{component:selector,focus:selector}})}async completeProviderAuthentication(providerId,providerName,authType,previousModel){let actionLabel=authType==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`,session=this.session,deferSelection=isUnknownModel(previousModel)&&hasDefaultModelProvider(providerId)&&!session.modelRuntime.getAvailableSnapshot().some(model=>model.provider===providerId&&model.id===defaultModelPerProvider[providerId]),finishAuthentication=async()=>{let selectedModel,systemPromptName,selectionError;if(isUnknownModel(previousModel)){let providerModels=this.session.modelRuntime.getAvailableSnapshot().filter(model=>model.provider===providerId);if(providerId==="llama.cpp")selectionError=llamaCppPostLoginGuidance(actionLabel,providerModels.length);else if(!hasDefaultModelProvider(providerId))selectionError=`${actionLabel}, but no default model is configured for provider "${providerId}". Use /model to select a model.`;else if(providerModels.length===0)selectionError=`${actionLabel}, but no models are available for that provider. Use /model to select a model.`;else{let defaultModelId=defaultModelPerProvider[providerId];if(selectedModel=providerModels.find(model=>model.id===defaultModelId)??(providerId==="radius"?providerModels[0]:void 0),!selectedModel)selectionError=`${actionLabel}, but its default model "${defaultModelId}" is not available. Use /model to select a model.`;else try{systemPromptName=(await this.session.setModel(selectedModel))?.systemPromptName}catch(error2){selectedModel=void 0;let errorMessage8=error2 instanceof Error?error2.message:String(error2);selectionError=`${actionLabel}, but selecting its default model failed: ${errorMessage8}. Use /model to select a model.`}}}if(this.updateAvailableProviderCount(),this.footer.invalidate(),this.updateEditorBorderColor(),selectedModel){let systemPromptStr=systemPromptName?` System prompt: ${systemPromptName}.`:"";this.showStatus(`${actionLabel}. Selected ${selectedModel.id}.${systemPromptStr} Credentials saved to ${getAuthPath()}`),this.showRiskyMainModelWarning(selectedModel),this.maybeWarnAboutAnthropicSubscriptionAuth(selectedModel),this.checkDaxnutsEasterEgg(selectedModel)}else this.showStatus(`${actionLabel}. Credentials saved to ${getAuthPath()}`),selectionError?this.showError(selectionError):this.maybeWarnAboutAnthropicSubscriptionAuth()};deferSelection?this.showStatus(`${actionLabel}. Credentials saved to ${getAuthPath()}. Refreshing model catalog\u2026`):await finishAuthentication();let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3),refreshProviders=providerId==="cursor"?[providerId,"cursor-cli-oauth"]:[providerId];session.modelRuntime.refresh({allowNetwork:!0,providers:refreshProviders,signal:controller.signal}).then(async result3=>{result3.aborted?this.showWarning(`${actionLabel}, but its model catalog refresh timed out; using cached models.`):result3.errors.size>0&&this.showWarning(`${actionLabel}, but its model catalog could not be refreshed; using cached models.`),deferSelection&&this.session===session&&session.model===previousModel&&await finishAuthentication(),this.updateAvailableProviderCount(),this.footer.invalidate(),this.ui.requestRender()}).catch(error2=>{this.showWarning(`${actionLabel}, but its model catalog could not be refreshed: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>clearTimeout(timeout))}showAmbientAuthDialog(providerOption){let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()},dialog=new LoginDialogComponent(this.ui,providerOption.id,()=>restoreEditor(),providerOption.name,`${providerOption.name} setup`);dialog.showInfo(`${providerOption.method?.name??"Authentication"} is configured outside ${APP_NAME}.`,[],!0),this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender()}async showApiKeyLoginDialog(providerId,providerName){let previousModel=this.session.model,dialog=new LoginDialogComponent(this.ui,providerId,(_success,_message)=>{},providerName);providerId==="amazon-bedrock"&&dialog.showDetails([theme.fg("text","You can also use an AWS profile, IAM keys, or role-based credentials."),theme.fg("muted","See:"),theme.fg("accent",` ${path12.join(getDocsPath(),"providers.md")}`)]),this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender();let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()};try{await this.loginProvider(dialog,providerId,"api_key"),restoreEditor(),await this.completeProviderAuthentication(providerId,providerName,"api_key",previousModel)}catch(error2){restoreEditor(),this.showLoginFailure(describeLoginFailure(error2,providerName,"api_key"))}}showAuthSelect(dialog,prompt){return new Promise((resolve42,reject)=>{let restoreDialog=()=>{this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender()},labels=prompt.options.map(option=>option.label),selector=new ExtensionSelectorComponent(prompt.message,labels,optionLabel=>{restoreDialog();let id=prompt.options.find(option=>option.label===optionLabel)?.id;id?resolve42(id):reject(new Error("Login cancelled"))},()=>{restoreDialog(),reject(new Error("Login cancelled"))});this.editorContainer.clear(),this.editorContainer.addChild(selector),this.ui.setFocus(selector),this.ui.requestRender()})}async showAuthPrompt(dialog,prompt){let response;if(prompt.type==="select"?response=this.showAuthSelect(dialog,prompt):prompt.type==="manual_code"?response=dialog.showManualInput(prompt.message):response=dialog.showPrompt(prompt.message,prompt.placeholder),!prompt.signal)return response;if(prompt.signal.aborted)throw new Error("Login cancelled");let signal=prompt.signal,onAbort,aborted=new Promise((_resolve,reject)=>{onAbort=()=>reject(new Error("Login cancelled")),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([response,aborted])}finally{onAbort&&signal.removeEventListener("abort",onAbort)}}notifyAuthDialog(dialog,event){event.type==="auth_url"?dialog.showAuth(event.url,event.instructions):event.type==="device_code"?(dialog.showDeviceCode(event),dialog.showWaiting("Waiting for authentication...")):event.type==="info"?dialog.showInfo(event.message,event.links):dialog.showProgress(event.message)}async loginProvider(dialog,providerId,method){await this.session.modelRuntime.login(providerId,method,{signal:dialog.signal,prompt:prompt=>this.showAuthPrompt(dialog,prompt),notify:event=>this.notifyAuthDialog(dialog,event)})}async showLoginDialog(providerId,providerName){let previousModel=this.session.model,dialog=new LoginDialogComponent(this.ui,providerId,(_success,_message)=>{},providerName);this.editorContainer.clear(),this.editorContainer.addChild(dialog),this.ui.setFocus(dialog),this.ui.requestRender();let restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()};try{await this.loginProvider(dialog,providerId,"oauth"),restoreEditor(),await this.completeProviderAuthentication(providerId,providerName,"oauth",previousModel)}catch(error2){restoreEditor(),this.showLoginFailure(describeLoginFailure(error2,providerName,"oauth"))}}showLoginFailure(notice2){notice2.level==="status"?this.showStatus(notice2.message):this.showError(notice2.message)}async handleReloadCommand(){if(this.session.isStreaming){this.showWarning("Wait for the current response to finish before reloading.");return}if(this.session.isCompacting){this.showWarning("Wait for compaction to finish before reloading.");return}let veto=await this.session.checkReloadVeto();if(veto.cancelled){this.showWarning(veto.reason??"Reload blocked by an extension.");return}let reloadBox=new Container,borderColor=s=>theme.fg("border",s);reloadBox.addChild(new DynamicBorder(borderColor)),reloadBox.addChild(new Spacer(1)),reloadBox.addChild(new Text(theme.fg("muted","Reloading keybindings, extensions, skills, prompts, themes, and context files..."),1,0)),reloadBox.addChild(new Spacer(1)),reloadBox.addChild(new DynamicBorder(borderColor));let previousEditor=this.editor;this.editorContainer.clear(),this.editorContainer.addChild(reloadBox),this.ui.setFocus(reloadBox),this.ui.requestRender(!0),await new Promise(resolve42=>process.nextTick(resolve42));let dismissReloadBox=editor=>{this.editorContainer.clear(),this.editorContainer.addChild(editor),this.ui.setFocus(editor),this.ui.requestRender()},chatRestoredBeforeSessionStart=!1,reloadBoxDismissed=!1,restoreChatBeforeSessionStart=()=>{chatRestoredBeforeSessionStart||(this.resetExtensionUI(),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.rebuildChatFromMessages(),time("chatRebuild","reload"),chatRestoredBeforeSessionStart=!0)};try{let reloadResult=await this.session.reload({beforeSessionStart:restoreChatBeforeSessionStart});if(reloadResult.cancelled){dismissReloadBox(previousEditor),reloadBoxDismissed=!0,this.showWarning(reloadResult.reason??"Reload blocked by an extension.");return}restoreChatBeforeSessionStart(),this.keybindings.reload();let activeHeader=this.customHeader??this.builtInHeader;isExpandable(activeHeader)&&activeHeader.setExpanded(this.toolOutputExpanded),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.applyRuntimeSettings(),await this.themeController.applyFromSettings(),this.setupAutocompleteProvider();let runner=this.session.extensionRunner;this.setupExtensionShortcuts(runner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0});let savedImplicitProjectTrust=this.maybeSaveImplicitProjectTrustAfterReload(),modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);let reloadedMessage=savedImplicitProjectTrust?"Reloaded keybindings, extensions, skills, prompts, themes, and context files; saved project trust":"Reloaded keybindings, extensions, skills, prompts, themes, and context files",reloadTimings=formatTimings("reload");this.showStatus(reloadTimings===void 0?reloadedMessage:`${reloadedMessage} | reload timings: ${reloadTimings}`),dismissReloadBox(this.editor),reloadBoxDismissed=!0}catch(error2){reloadBoxDismissed||dismissReloadBox(previousEditor),this.showError(`Reload failed: ${error2 instanceof Error?error2.message:String(error2)}`)}}async handleExportCommand(text2){let outputPath=this.getPathCommandArgument(text2,"/export");try{if(outputPath?.endsWith(".jsonl")){let filePath=await this.session.exportToJsonl(outputPath);this.showStatus(`Session exported to: ${filePath}`)}else{let filePath=await this.session.exportToHtml(outputPath,{themeName:theme.name});this.showStatus(`Session exported to: ${filePath}`)}}catch(error2){this.showError(`Failed to export session: ${error2 instanceof Error?error2.message:"Unknown error"}`)}}getPathCommandArgument(text2,command){if(text2===command||!text2.startsWith(`${command} `))return;let argsString=text2.slice(command.length+1).trimStart();if(!argsString)return;let firstChar=argsString[0];if(firstChar==='"'||firstChar==="'"){let closingQuoteIndex=argsString.indexOf(firstChar,1);return closingQuoteIndex<0?void 0:expandTildePath(argsString.slice(1,closingQuoteIndex))}let firstWhitespaceIndex=argsString.search(/\s/);return firstWhitespaceIndex<0?expandTildePath(argsString):expandTildePath(argsString.slice(0,firstWhitespaceIndex))}async handleImportCommand(text2){let inputPath=this.getPathCommandArgument(text2,"/import");if(!inputPath){this.showError("Usage: /import <path.jsonl>");return}if(!await this.showExtensionConfirm("Import session",`Replace current session with ${inputPath}?`)){this.showStatus("Import cancelled");return}try{if(this.clearStatusIndicator(),(await this.runtimeHost.importFromJsonl(inputPath)).cancelled){this.showStatus("Import cancelled");return}this.showStatus(`Session imported from: ${inputPath}`)}catch(error2){if(error2 instanceof MissingSessionCwdError){let selectedCwd=await this.promptForMissingSessionCwd(error2);if(!selectedCwd){this.showStatus("Import cancelled");return}if((await this.runtimeHost.importFromJsonl(inputPath,selectedCwd)).cancelled){this.showStatus("Import cancelled");return}this.showStatus(`Session imported from: ${inputPath}`);return}if(error2 instanceof SessionImportFileNotFoundError){this.showError(`Failed to import session: ${error2.message}`);return}await this.handleFatalRuntimeError("Failed to import session",error2)}}async handleShareCommand(){try{if(spawnSync("gh",["auth","status"],{encoding:"utf-8"}).status!==0){this.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");return}}catch{this.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");return}let tmpFile=path12.join(os6.tmpdir(),"session.html");try{await this.session.exportToHtml(tmpFile,{themeName:theme.name})}catch(error2){this.showError(`Failed to export session: ${error2 instanceof Error?error2.message:"Unknown error"}`);return}let loader=new BorderedLoader(this.ui,theme,"Creating gist...");this.editorContainer.clear(),this.editorContainer.addChild(loader),this.ui.setFocus(loader),this.ui.requestRender();let restoreEditor=()=>{loader.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor);try{fs6.unlinkSync(tmpFile)}catch{}},proc=null;loader.onAbort=()=>{proc?.kill(),restoreEditor(),this.showStatus("Share cancelled")};try{let result3=await new Promise(resolve42=>{proc=spawn11("gh",["gist","create","--public=false",tmpFile]);let stdout="",stderr="";proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),proc.on("close",code=>resolve42({stdout,stderr,code}))});if(loader.signal.aborted)return;if(restoreEditor(),result3.code!==0){let errorMsg=result3.stderr?.trim()||"Unknown error";this.showError(`Failed to create gist: ${errorMsg}`);return}let gistUrl=result3.stdout?.trim(),gistId=gistUrl?.split("/").pop();if(!gistId){this.showError("Failed to parse gist ID from gh output");return}let previewUrl=getShareViewerUrl(gistId);this.showStatus(`Share URL: ${previewUrl}
|
|
2577
2582
|
Gist: ${gistUrl}`)}catch(error2){loader.signal.aborted||(restoreEditor(),this.showError(`Failed to create gist: ${error2 instanceof Error?error2.message:"Unknown error"}`))}}async handleCopyCommand(options={}){if(options.preferSelection&&this.ui instanceof TuiAltScreen&&!this.ui.getCopyOnSelect()&&this.ui.hasActiveSelection()){await this.ui.copyActiveSelectionToClipboard();return}let text2=this.session.getLastAssistantText();if(!text2){this.showError("No agent messages to copy yet.");return}try{await copyToClipboard(text2),options.flashConfirmation&&this.ui instanceof TuiAltScreen?this.ui.flash("Copied!"):this.showStatus("Copied last agent message to clipboard")}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}async handleRenameCommand(text2){let name=text2.replace(/^\/(?:rename|name)\s*/,"").trim();if(!name){this.showSessionRenameInput();return}await this.applySessionName(name)}async applySessionName(name){await this.session.setSessionName(name);let sessionName2=this.session.sessionName;sessionName2!==name&&this.showWarning(`Session name was normalized from ${JSON.stringify(name)} to ${JSON.stringify(sessionName2)}`),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("dim",`Session name set: ${sessionName2??name}`),1,0)),this.ui.requestRender()}showSessionRenameInput(){this.extensionInput=new ExtensionInputComponent("Rename session",void 0,value2=>{this.hideExtensionInput(),this.commitSessionRename(value2)},()=>this.hideExtensionInput(),{tui:this.ui,initialValue:this.sessionManager.getSessionName()??""}),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()}async commitSessionRename(value2){let name=value2.trim();if(!name){this.showWarning("Session name cannot be empty");return}name!==this.sessionManager.getSessionName()&&await this.applySessionName(name)}async handleSessionCommand(){let stats=await this.session.getSessionStats(),sessionName2=this.session.sessionName,entries=this.sessionManager.getEntries(),cacheWaste=computeCacheWaste(entries,this.session.modelRuntime),usageBreakdown=getUsageCostBreakdown(entries),info=`${theme.bold("Session Info")}
|
|
2578
2583
|
|
|
2579
2584
|
`;sessionName2&&(info+=`${theme.fg("dim","Name:")} ${sessionName2}
|
|
@@ -2597,7 +2602,7 @@ ${theme.bold("Cost")}
|
|
|
2597
2602
|
`,info+=`${theme.fg("dim","Total:")} $${stats.cost.toFixed(3)}`,usageBreakdown.length>1)for(let entry of usageBreakdown)info+=`
|
|
2598
2603
|
${theme.fg("dim",`${entry.key}:`)} $${entry.cost.toFixed(3)} ${theme.fg("dim",`(${formatTokens(entry.tokens)} tokens)`)}`;if(cacheWaste.missedTokens>0){let missLabel=cacheWaste.missCount===1?"1 miss":`${cacheWaste.missCount} misses`,detail=`${cacheWaste.missedTokens.toLocaleString()} tokens, ${missLabel}`;info+=cacheWaste.missedCost>=1e-4?`
|
|
2599
2604
|
${theme.fg("dim","Cache Re-billed:")} $${cacheWaste.missedCost.toFixed(3)} ${theme.fg("dim",`(${detail})`)}`:`
|
|
2600
|
-
${theme.fg("dim","Cache Re-billed:")} ${detail}`}}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(info,1,0)),this.ui.requestRender()}handleChangelogCommand(){let source=resolveChangelogSource(),changelogPath=source.path,allEntries=parseChangelog(changelogPath),changelogMarkdown=allEntries.length>0?allEntries.reverse().map(e=>source.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
|
|
2605
|
+
${theme.fg("dim","Cache Re-billed:")} ${detail}`}}info+=formatSessionFailureInfo(stats.failures),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(info,1,0)),this.ui.requestRender()}handleChangelogCommand(){let source=resolveChangelogSource(),changelogPath=source.path,allEntries=parseChangelog(changelogPath),changelogMarkdown=allEntries.length>0?allEntries.reverse().map(e=>source.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
|
|
2601
2606
|
|
|
2602
2607
|
`):"No changelog entries found.";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent","What's New")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(changelogMarkdown,1,1,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new DynamicBorder),this.ui.requestRender()}getAppKeyDisplay(action){return keyDisplayText(action)}getEditorKeyDisplay(action){return keyDisplayText(action)}handleHotkeysCommand(){let cursorUp=this.getEditorKeyDisplay("tui.editor.cursorUp"),cursorDown=this.getEditorKeyDisplay("tui.editor.cursorDown"),cursorLeft=this.getEditorKeyDisplay("tui.editor.cursorLeft"),cursorRight=this.getEditorKeyDisplay("tui.editor.cursorRight"),cursorWordLeft=this.getEditorKeyDisplay("tui.editor.cursorWordLeft"),cursorWordRight=this.getEditorKeyDisplay("tui.editor.cursorWordRight"),cursorLineStart=this.getEditorKeyDisplay("tui.editor.cursorLineStart"),cursorLineEnd=this.getEditorKeyDisplay("tui.editor.cursorLineEnd"),jumpForward=this.getEditorKeyDisplay("tui.editor.jumpForward"),jumpBackward=this.getEditorKeyDisplay("tui.editor.jumpBackward"),pageUp=this.getEditorKeyDisplay("tui.editor.pageUp"),pageDown=this.getEditorKeyDisplay("tui.editor.pageDown"),submit=this.getEditorKeyDisplay("tui.input.submit"),newLine=this.getEditorKeyDisplay("tui.input.newLine"),deleteWordBackward=this.getEditorKeyDisplay("tui.editor.deleteWordBackward"),deleteWordForward=this.getEditorKeyDisplay("tui.editor.deleteWordForward"),deleteToLineStart=this.getEditorKeyDisplay("tui.editor.deleteToLineStart"),deleteToLineEnd=this.getEditorKeyDisplay("tui.editor.deleteToLineEnd"),yank=this.getEditorKeyDisplay("tui.editor.yank"),yankPop=this.getEditorKeyDisplay("tui.editor.yankPop"),undo=this.getEditorKeyDisplay("tui.editor.undo"),tab=this.getEditorKeyDisplay("tui.input.tab"),interrupt=this.getAppKeyDisplay("app.interrupt"),clear=this.getAppKeyDisplay("app.clear"),exit=this.getAppKeyDisplay("app.exit"),suspend=this.getAppKeyDisplay("app.suspend"),cycleThinkingLevel=this.getAppKeyDisplay("app.thinking.cycle"),cycleModelForward=this.getAppKeyDisplay("app.model.cycleForward"),selectModel=this.getAppKeyDisplay("app.model.select"),expandTools=this.getAppKeyDisplay("app.tools.expand"),toggleThinking=this.getAppKeyDisplay("app.thinking.toggle"),externalEditor=this.getAppKeyDisplay("app.editor.external"),cycleModelBackward=this.getAppKeyDisplay("app.model.cycleBackward"),copyMessage=this.getAppKeyDisplay("app.message.copy"),followUp=this.getAppKeyDisplay("app.message.followUp"),dequeue=this.getAppKeyDisplay("app.message.dequeue"),answerQuestion=this.getAppKeyDisplay("app.question.answer"),nextQuestion=this.getAppKeyDisplay("app.question.next"),pasteImage=this.getAppKeyDisplay("app.clipboard.pasteImage"),hotkeys=`
|
|
2603
2608
|
**Navigation**
|
|
@@ -2653,4 +2658,4 @@ ${theme.fg("dim","Cache Re-billed:")} ${detail}`}}this.chatContainer.addChild(ne
|
|
|
2653
2658
|
|-----|--------|
|
|
2654
2659
|
`;for(let[key,shortcut]of shortcuts){let description=shortcut.description??shortcut.extensionPath,keyDisplay=formatKeyText(key,{capitalize:!0});hotkeys+=`| \`${keyDisplay}\` | ${description} |
|
|
2655
2660
|
`}}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent","Keyboard Shortcuts")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(hotkeys.trim(),1,1,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new DynamicBorder),this.ui.requestRender()}async handleClearCommand(){this.clearStatusIndicator();try{if((await this.runtimeHost.newSession()).cancelled)return;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(`${theme.fg("accent","\u2713 New session started")}`,1,1)),this.ui.requestRender()}catch(error2){await this.handleFatalRuntimeError("Failed to create session",error2)}}handleDebugCommand(){let width=this.ui.terminal.columns,height=this.ui.terminal.rows,allLines=this.ui.render(width),debugLogPath=getDebugLogPath(),debugData=[`Debug output at ${new Date().toISOString()}`,`Terminal: ${width}x${height}`,`Total lines: ${allLines.length}`,"","=== All rendered lines with visible widths ===",...allLines.map((line,idx)=>{let vw=visibleWidth(line),escaped=JSON.stringify(line);return`[${idx}] (w=${vw}) ${escaped}`}),"","=== Agent messages (JSONL) ===",...this.session.messages.map(msg=>JSON.stringify(msg)),""].join(`
|
|
2656
|
-
`);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let eventResult=await this.session.extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()});if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,createSyntheticSourceInfo,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,isSessionBusySnapshot,parseSkillBlock,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,copyToClipboard,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatResumeCommand,OptimisticUserEchoController,InteractiveMode,runPrintMode,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,
|
|
2661
|
+
`);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let eventResult=await this.session.extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()});if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,CredentialSynchronizationError,ModelRuntime,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,createSyntheticSourceInfo,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,isSessionBusySnapshot,parseSkillBlock,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,copyToClipboard,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatResumeCommand,OptimisticUserEchoController,InteractiveMode,runPrintMode,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};
|