@bastani/atomic 0.9.11-alpha.9 → 0.9.11
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 +134 -0
- package/README.md +1 -1
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/subagent-relay.ts +8 -5
- package/dist/builtin/mcp/CHANGELOG.md +10 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +20 -0
- package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
- package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
- package/dist/builtin/subagents/agents/worker.md +2 -2
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/notification-content.ts +14 -9
- package/dist/builtin/subagents/src/runs/background/notify.ts +20 -4
- package/dist/builtin/web-access/CHANGELOG.md +20 -0
- package/dist/builtin/web-access/content-tools.ts +1 -0
- package/dist/builtin/web-access/flat-string.ts +37 -0
- package/dist/builtin/web-access/github-api.ts +2 -1
- package/dist/builtin/web-access/github-extract.ts +3 -2
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +57 -0
- package/dist/builtin/workflows/builtin/goal-ledger.ts +6 -4
- package/dist/builtin/workflows/builtin/goal-runner.ts +2 -1
- package/dist/builtin/workflows/builtin/goal.ts +1 -1
- package/dist/builtin/workflows/builtin/ralph-core.ts +8 -9
- package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +2 -4
- package/dist/builtin/workflows/builtin/ralph-models.ts +4 -4
- package/dist/builtin/workflows/builtin/ralph-runner.ts +5 -8
- package/dist/builtin/workflows/builtin/ralph.ts +2 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +14 -8
- package/dist/builtin/workflows/src/durable/completed-inspection.ts +10 -11
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +1 -1
- package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +36 -37
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +10 -2
- package/dist/builtin/workflows/src/engine/run.ts +1 -0
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +12 -8
- package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +5 -2
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +1966 -880
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +6 -3
- package/dist/builtin/workflows/src/extension/postmortem-deps.ts +3 -2
- package/dist/builtin/workflows/src/extension/render-result.ts +4 -11
- package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +17 -20
- package/dist/builtin/workflows/src/extension/runtime.ts +3 -3
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +3 -7
- package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +21 -24
- package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +38 -26
- package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +2 -1
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +56 -64
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +2 -2
- package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +0 -5
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +17 -20
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +24 -51
- package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +7 -29
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +5 -13
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +4 -13
- package/dist/builtin/workflows/src/runs/background/quit.ts +4 -3
- package/dist/builtin/workflows/src/runs/background/run-inspect.ts +8 -8
- package/dist/builtin/workflows/src/runs/background/status.ts +2 -1
- package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +2 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +5 -5
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +4 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +2 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +23 -8
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +6 -2
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +5 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +56 -10
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +6 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +137 -6
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +2 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +2 -0
- package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +159 -10
- package/dist/builtin/workflows/src/shared/flat-string.ts +33 -0
- package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +144 -0
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +2 -3
- package/dist/builtin/workflows/src/shared/run-id.ts +36 -0
- package/dist/builtin/workflows/src/shared/store-internal.ts +32 -3
- package/dist/builtin/workflows/src/shared/store-observation.ts +10 -0
- package/dist/builtin/workflows/src/shared/store-public-types.ts +8 -0
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +14 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +4 -0
- package/dist/builtin/workflows/src/shared/types.ts +2 -0
- package/dist/builtin/workflows/src/shared/workflow-artifacts.ts +261 -0
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +39 -23
- package/dist/builtin/workflows/src/tui/graph-canvas.ts +26 -9
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +3 -0
- package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +95 -98
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +7 -20
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +160 -13
- package/dist/builtin/workflows/src/tui/layout.ts +8 -2
- package/dist/builtin/workflows/src/tui/node-card.ts +57 -45
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -2
- package/dist/builtin/workflows/src/tui/prompt-card-render.ts +291 -21
- package/dist/builtin/workflows/src/tui/prompt-card.ts +1 -1
- package/dist/builtin/workflows/src/tui/renderers.ts +0 -1
- package/dist/builtin/workflows/src/tui/run-detail.ts +52 -35
- package/dist/builtin/workflows/src/tui/run-identity-rows.ts +97 -0
- package/dist/builtin/workflows/src/tui/session-overlays.ts +24 -3
- package/dist/builtin/workflows/src/tui/session-picker.ts +94 -41
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +190 -26
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +52 -18
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +9 -5
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +44 -4
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +3 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -2
- package/dist/builtin/workflows/src/tui/status-list.ts +67 -45
- package/dist/builtin/workflows/src/tui/store-widget-installer.ts +7 -6
- package/dist/builtin/workflows/src/tui/widget.ts +49 -40
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +15 -10
- package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +21 -8
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +5 -0
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +5 -0
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +3 -0
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +2 -1
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +3 -7
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +27 -13
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +5 -3
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.js +6 -3
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +11 -2
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -3
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +4 -0
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +4 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +12 -1
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/bounded-model-refresh.d.ts +14 -0
- package/dist/core/bounded-model-refresh.d.ts.map +1 -0
- package/dist/core/bounded-model-refresh.js +38 -0
- package/dist/core/bounded-model-refresh.js.map +1 -0
- package/dist/core/context-tool-pairing.d.ts +4 -4
- package/dist/core/context-tool-pairing.js +4 -4
- package/dist/core/context-tool-pairing.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +26 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/messages.d.ts +18 -6
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +46 -18
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-refresh-timeout.d.ts +9 -0
- package/dist/core/model-refresh-timeout.d.ts.map +1 -0
- package/dist/core/model-refresh-timeout.js +9 -0
- package/dist/core/model-refresh-timeout.js.map +1 -0
- package/dist/core/model-runtime-snapshot.d.ts +3 -0
- package/dist/core/model-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/model-runtime-snapshot.js +59 -0
- package/dist/core/model-runtime-snapshot.js.map +1 -1
- package/dist/core/model-runtime.d.ts +7 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +72 -17
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +4 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +1 -1
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +2 -2
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +1 -1
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +2 -1
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +2 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +3 -0
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main-app-mode.d.ts +1 -0
- package/dist/main-app-mode.d.ts.map +1 -1
- package/dist/main-app-mode.js +3 -0
- package/dist/main-app-mode.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts +7 -2
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js +13 -4
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts +3 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.js +2 -2
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts +3 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +5 -4
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +16 -2
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +35 -5
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +0 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +25 -35
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +2 -1
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +1 -1
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +4 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +4 -1
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-pause.d.ts +3 -1
- package/dist/modes/interactive/interactive-pause.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-pause.js +5 -1
- package/dist/modes/interactive/interactive-pause.js.map +1 -1
- package/dist/modes/interactive/interactive-queueing.js +3 -3
- package/dist/modes/interactive/interactive-queueing.js.map +1 -1
- package/dist/modes/interactive-engine/engine-health.d.ts +6 -0
- package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-health.js +15 -1
- package/dist/modes/interactive-engine/engine-health.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +1 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +7 -1
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js +5 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +23 -7
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +3 -1
- package/docs/index.md +10 -0
- package/docs/keybindings.md +1 -1
- package/docs/models.md +2 -0
- package/docs/providers.md +7 -3
- package/docs/quickstart.md +7 -1
- package/docs/session-format.md +2 -0
- package/docs/termux.md +3 -1
- package/docs/usage.md +3 -2
- package/docs/workflows.md +82 -46
- package/npm-shrinkwrap.json +59 -27
- package/package.json +3 -3
- package/dist/builtin/workflows/src/tui/toast.ts +0 -107
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode-surface.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-surface.ts"],"names":[],"mappings":"AAAA,4EAA4E","sourcesContent":["/** Method surface installed onto InteractiveModeBase by sibling modules. */\n\nimport type { CustomEntry, SessionEntry } from \"../../core/session-manager.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport type {\n\tAgentMessage,\n\tAgentSession,\n\tAgentSessionEvent,\n\tApi,\n\tAppKeybinding,\n\tAuthSelectorProvider,\n\tAutocompleteProvider,\n\tChatMessageEntry,\n\tChatMessageRenderOptions,\n\tComponent,\n\tContainer,\n\tEditorFactory,\n\tExtensionCommandContext,\n\tExtensionEditorComponent,\n\tExtensionInputComponent,\n\tExtensionRunner,\n\tExtensionSelectorComponent,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tHostCustomUiState,\n\tHostCustomUiStateListener,\n\tKeybinding,\n\tKeybindingsManager,\n\tLoader,\n\tLoaderIndicatorOptions,\n\tLoginDialogComponent,\n\tMarkdownTheme,\n\tMessage,\n\tMissingSessionCwdError,\n\tModel,\n\tOAuthSelectPrompt,\n\tOverlayHandle,\n\tOverlayOptions,\n\tProjectTrustContext,\n\tReadonlyFooterDataProvider,\n\tResourceDiagnostic,\n\tSessionContext,\n\tSlashCommand,\n\tSourceInfo,\n\tTheme,\n\tTUI,\n\tVerbatimCompactionResult,\n} from \"./interactive-mode-deps.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\n\ndeclare module \"./interactive-mode-base.ts\" {\n\tinterface InteractiveModeBase {\n\t\tgetAutocompleteSourceTag(sourceInfo?: SourceInfo): string | undefined;\n\t\tprefixAutocompleteDescription(description: string | undefined, sourceInfo?: SourceInfo): string | undefined;\n\t\tgetBuiltInCommandConflictDiagnostics(extensionRunner: ExtensionRunner): ResourceDiagnostic[];\n\t\tgetCodexFastModeCandidateModels(): Model<Api>[];\n\t\thasCodexFastModeSupportedModels(): boolean;\n\t\tcreateBaseAutocompleteProvider(): AutocompleteProvider;\n\t\tbuildRemoteSlashCommands(localCommands: SlashCommand[]): SlashCommand[];\n\t\tsetupAutocompleteProvider(): void;\n\t\tshowStartupNoticesIfNeeded(targetContainer?: Container): void;\n\t\thadLastChangelogVersionAtStartup: boolean;\n\t\tfirstRunNoticeVisible: boolean;\n\t\tfirstRunOnboardingNoticeComponents: Component[];\n\t\tinitializeFirstRunOnboardingMarkers(): void;\n\t\tisFirstRunOnboardingEligible(): boolean;\n\t\tclearFirstRunOnboardingUi(): void;\n\t\tinit(): Promise<void>;\n\t\tcompleteDeferredStartup(): Promise<void>;\n\t\tretryDeferredModelRestore(targetContainer?: Container): Promise<void>;\n\t\tupdateTerminalTitle(): void;\n\t\trun(): Promise<void>;\n\t\tcheckForPackageUpdates(): Promise<string[]>;\n\t\tcheckTmuxKeyboardSetup(): Promise<string | undefined>;\n\t\tgetChangelogForDisplay(): string | undefined;\n\t\treportInstallTelemetry(version: string): void;\n\t\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\t\tformatDisplayPath(p: string): string;\n\t\tformatExtensionDisplayPath(path: string): string;\n\t\tformatContextPath(p: string): string;\n\t\tgetStartupModelLabel(): string;\n\t\tgetStartupIdentityText(maxWidth?: number, gap?: number, manifestoPhase?: number): string;\n\t\tgetAtomicAnsiMarkLines(gap?: number): string[];\n\t\tgetStartupExpansionState(): boolean;\n\t\tgetShortPath(fullPath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactPathLabel(resourcePath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactPackageSourceLabel(sourceInfo?: SourceInfo): string;\n\t\tgetCompactExtensionLabel(resourcePath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactDisplayPathSegments(resourcePath: string): string[];\n\t\tgetCompactNonPackageExtensionLabel(\n\t\t\tresourcePath: string,\n\t\t\tindex: number,\n\t\t\tallPaths: Array<{ path: string; segments: string[] }>,\n\t\t): string;\n\t\tgetCompactExtensionLabels(extensions: Array<{ path: string; sourceInfo?: SourceInfo }>): string[];\n\t\tgetDisplaySourceInfo(sourceInfo?: SourceInfo): {\n\t\t\tlabel: string;\n\t\t\tscopeLabel?: string;\n\t\t\tcolor: \"accent\" | \"muted\";\n\t\t};\n\t\tgetScopeGroup(sourceInfo?: SourceInfo): \"user\" | \"project\" | \"path\";\n\t\tisPackageSource(sourceInfo?: SourceInfo): boolean;\n\t\tbuildScopeGroups(items: Array<{ path: string; sourceInfo?: SourceInfo }>): Array<{\n\t\t\tscope: \"user\" | \"project\" | \"path\";\n\t\t\tpaths: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tpackages: Map<string, Array<{ path: string; sourceInfo?: SourceInfo }>>;\n\t\t}>;\n\t\tformatScopeGroups(\n\t\t\tgroups: Array<{\n\t\t\t\tscope: \"user\" | \"project\" | \"path\";\n\t\t\t\tpaths: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\t\tpackages: Map<string, Array<{ path: string; sourceInfo?: SourceInfo }>>;\n\t\t\t}>,\n\t\t\toptions: {\n\t\t\t\tformatPath: (item: { path: string; sourceInfo?: SourceInfo }) => string;\n\t\t\t\tformatPackagePath: (item: { path: string; sourceInfo?: SourceInfo }, source: string) => string;\n\t\t\t},\n\t\t): string;\n\t\tfindSourceInfoForPath(p: string, sourceInfos: Map<string, SourceInfo>): SourceInfo | undefined;\n\t\tformatPathWithSource(p: string, sourceInfo?: SourceInfo): string;\n\t\tformatDiagnostics(diagnostics: readonly ResourceDiagnostic[], sourceInfos: Map<string, SourceInfo>): string;\n\t\tgetResourceDiagnosticsTotal(values: ResourceDiagnostic[][]): number;\n\t\tformatResourceCount(count: number, singular: string, plural?: string): string | undefined;\n\t\taddResourceDisclosure(options: {\n\t\t\tcontextFiles: ReadonlyArray<{ path: string }>;\n\t\t\tskills: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\tprompts: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\ttemplates: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\textensions: ReadonlyArray<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tthemes: ReadonlyArray<{ name?: string; sourcePath?: string }>;\n\t\t\tdiagnosticsTotal: number;\n\t\t\texpandedBody: string;\n\t\t\ttargetContainer?: Container;\n\t\t}): void;\n\t\tshowLoadedResources(options?: {\n\t\t\textensions?: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tforce?: boolean;\n\t\t\tshowDiagnosticsWhenQuiet?: boolean;\n\t\t\ttargetContainer?: Container;\n\t\t}): void;\n\t\tbindCurrentSessionExtensions(): Promise<void>;\n\t\tapplyRuntimeSettings(): void;\n\t\trebindCurrentSession(): Promise<void>;\n\t\thandleFatalRuntimeError(prefix: string, error: unknown): Promise<never>;\n\t\trenderCurrentSessionState(): void;\n\t\tgetRegisteredToolDefinition(toolName: string): ReturnType<AgentSession[\"getToolDefinition\"]>;\n\t\tsetupExtensionShortcuts(extensionRunner: ExtensionRunner): void;\n\t\tsetExtensionStatus(key: string, text: string | undefined): void;\n\t\tgetWorkingLoaderMessage(): string;\n\t\tcreateWorkingLoader(): Loader | AtomicWorkingLoader;\n\t\tstopWorkingLoader(): void;\n\t\tshowWorkingLoaderNow(): void;\n\t\tsetWorkingVisible(visible: boolean): void;\n\t\tsetWorkingIndicator(options?: LoaderIndicatorOptions): void;\n\t\tsetHiddenThinkingLabel(label?: string): void;\n\t\tsetExtensionWidget(\n\t\t\tkey: string,\n\t\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\t\toptions?: ExtensionWidgetOptions,\n\t\t): void;\n\t\tclearExtensionWidgets(): void;\n\t\tresetExtensionUI(): void;\n\t\trenderWidgets(): void;\n\t\trenderWidgetContainer(\n\t\t\tcontainer: Container,\n\t\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\t\tspacerWhenEmpty: boolean,\n\t\t\tleadingSpacer: boolean,\n\t\t): void;\n\t\tsetExtensionFooter(\n\t\t\tfactory:\n\t\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t\t| undefined,\n\t\t): void;\n\t\tsetExtensionHeader(factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void;\n\t\taddExtensionTerminalInputListener(\n\t\t\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n\t\t): () => void;\n\t\tclearExtensionTerminalInputListeners(): void;\n\t\tgetHostCustomUiState(): HostCustomUiState;\n\t\tnotifyHostCustomUiStateListeners(): void;\n\t\tbeginHostInlineCustomUi(): () => void;\n\t\tbeginInlineCustomUiFocusDeferral(): () => void;\n\t\tshouldDeferInlineCustomUiFocus(): boolean;\n\t\tfocusHostInlineCustomUi(): boolean;\n\t\tonHostCustomUiStateChange(listener: HostCustomUiStateListener): () => void;\n\t\tcreateProjectTrustContext(cwd: string): ProjectTrustContext;\n\t\tcreateExtensionUIContext(): ExtensionUIContext;\n\t\tshowExtensionSelector(\n\t\t\ttitle: string,\n\t\t\toptions: string[],\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionSelector(instance?: ExtensionSelectorComponent): void;\n\t\tshowExtensionConfirm(title: string, message: string, opts?: ExtensionUIDialogOptions): Promise<boolean>;\n\t\tpromptForMissingSessionCwd(error: MissingSessionCwdError): Promise<string | undefined>;\n\t\tshowExtensionInput(\n\t\t\ttitle: string,\n\t\t\tplaceholder?: string,\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionInput(instance?: ExtensionInputComponent): void;\n\t\tshowExtensionEditor(\n\t\t\ttitle: string,\n\t\t\tprefill?: string,\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionEditor(instance?: ExtensionEditorComponent): void;\n\t\tsetCustomEditorComponent(factory: EditorFactory | undefined): void;\n\t\tshowExtensionNotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void;\n\t\tshowExtensionCustom<T>(\n\t\t\tfactory: (\n\t\t\t\ttui: TUI,\n\t\t\t\ttheme: Theme,\n\t\t\t\tkeybindings: KeybindingsManager,\n\t\t\t\tdone: (result: T) => void,\n\t\t\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\t\t\toptions?: {\n\t\t\t\toverlay?: boolean;\n\t\t\t\tdeferInlineCustomUiFocus?: boolean;\n\t\t\t\tsignal?: AbortSignal;\n\t\t\t\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\t\t\t\tonHandle?: (handle: OverlayHandle) => void;\n\t\t\t},\n\t\t): Promise<T>;\n\t\tshowExtensionError(extensionPath: string, error: string, stack?: string): void;\n\t\tsetupKeyHandlers(): void;\n\t\thandleClipboardImagePaste(): Promise<void>;\n\t\tsetupEditorSubmitHandler(): void;\n\t\tdeliverStartupReplayPrompt(text: string): void;\n\t\trecoverCookedStartupInput(): boolean;\n\t\tdrainStartupReplayCommands(): Promise<void>;\n\t\tadvanceStartupInputReplay(submittedText: string): void;\n\t\tsubscribeToAgent(): void;\n\t\thandleEvent(event: AgentSessionEvent): Promise<void>;\n\t\tgetUserMessageText(message: Message): string;\n\t\tshowStatus(message: string): void;\n\t\tchatMessageRenderOptions(): ChatMessageRenderOptions;\n\t\taddRenderedChatEntry(entry: ChatMessageEntry): Component;\n\t\taddCompactionBoundaryToChat(result: VerbatimCompactionResult): void;\n\t\taddMessageToChat(message: AgentMessage, options?: { populateHistory?: boolean }): void;\n\t\taddCustomEntryToChat(entry: CustomEntry): void;\n\t\trenderSessionContext(\n\t\t\tsessionContext: SessionContext,\n\t\t\toptions?: { updateFooter?: boolean; populateHistory?: boolean },\n\t\t): void;\n\t\trenderSessionEntries(\n\t\t\tentries: SessionEntry[],\n\t\t\toptions?: {\n\t\t\t\tupdateFooter?: boolean;\n\t\t\t\tpopulateHistory?: boolean;\n\t\t\t\tsuppressCompactionBoundary?: VerbatimCompactionResult;\n\t\t\t},\n\t\t): void;\n\t\trenderInitialMessages(): void;\n\t\tattachStartupNoticesContainer(options?: { resetDetached?: boolean }): void;\n\t\tgetUserInput(): Promise<InteractiveSubmission>;\n\t\trunUserPromptTurn(submission: InteractiveSubmission | string): Promise<void>;\n\t\trenderDeferredUserInput(text: string): void;\n\t\tconsumeDeferredRenderedUserInput(text: string): boolean;\n\t\tdiscardDeferredRenderedUserInput(text: string): void;\n\t\tensureDeferredStartupComplete(): Promise<void>;\n\t\trebuildChatFromMessages(options?: {\n\t\t\tsuppressCompactionBoundary?: VerbatimCompactionResult;\n\t\t\tresetStartupDisclosure?: boolean;\n\t\t}): void;\n\t\thandleCtrlC(): void;\n\t\tinterruptActiveOperation(): boolean;\n\t\thandleCtrlD(): void;\n\t\tshutdown(options?: { fromSignal?: boolean }): Promise<void>;\n\t\temergencyTerminalExit(): never;\n\t\tuncaughtCrash(error: Error): never;\n\t\tcheckShutdownRequested(): Promise<void>;\n\t\tregisterSignalHandlers(): void;\n\t\tunregisterSignalHandlers(): void;\n\t\thandleCtrlZ(): void;\n\t\thandleFollowUp(): Promise<void>;\n\t\thandleDequeue(): void;\n\t\trefreshBuiltInHeader(): void;\n\t\tupdateEditorBorderColor(): void;\n\t\tcycleThinkingLevel(): void;\n\t\tcycleModel(direction: \"forward\" | \"backward\"): Promise<void>;\n\t\ttoggleToolOutputExpansion(): void;\n\t\tsetToolsExpanded(expanded: boolean): void;\n\t\ttoggleThinkingBlockVisibility(): void;\n\t\topenExternalEditor(): Promise<void>;\n\t\tclearEditor(): void;\n\t\tshowError(errorMessage: string): void;\n\t\tshowWarning(warningMessage: string, targetContainer?: Container): void;\n\t\tshowNewVersionNotification(newVersion: string, targetContainer?: Container): void;\n\t\tshowPackageUpdateNotification(packages: string[], targetContainer?: Container): void;\n\t\tgetAllQueuedMessages(): { steering: string[]; followUp: string[] };\n\t\tclearAllQueues(): { steering: string[]; followUp: string[] };\n\t\tupdatePendingMessagesDisplay(): void;\n\t\trestoreQueuedMessagesToEditor(options?: { abort?: boolean; currentText?: string }): number;\n\t\tqueueCompactionMessage(text: string, mode: \"steer\" | \"followUp\"): void;\n\t\tisExtensionCommand(text: string): boolean;\n\t\tflushCompactionQueue(options?: { willRetry?: boolean }): Promise<void>;\n\t\tflushPendingBashComponents(): void;\n\t\tshowSelector(create: (done: () => void) => { component: Component; focus: Component }): void;\n\t\tshowFastModeSelector(): void;\n\t\tshowSettingsSelector(): void;\n\t\thandleModelCommand(searchTerm?: string): Promise<void>;\n\t\tfindExactModelMatch(searchTerm: string): Promise<Model<Api> | undefined>;\n\t\tgetModelCandidates(): Promise<Model<Api>[]>;\n\t\tupdateAvailableProviderCount(): Promise<void>;\n\t\tmaybeWarnAboutAnthropicSubscriptionAuth(\n\t\t\tmodel?: Model<Api> | undefined,\n\t\t\ttargetContainer?: Container,\n\t\t): Promise<void>;\n\t\tshowModelSelector(initialSearchInput?: string): void;\n\t\tshowModelsSelector(): Promise<void>;\n\t\tshowUserMessageSelector(): Promise<void>;\n\t\thandleCloneCommand(): Promise<void>;\n\t\tmaybeSaveImplicitProjectTrustAfterReload(): boolean;\n\t\tshowTrustSelector(): void;\n\t\tshowTreeSelector(initialSelectedId?: string): Promise<void>;\n\t\tshowSessionSelector(): void;\n\t\thandleResumeSession(\n\t\t\tsessionPath: string,\n\t\t\toptions?: Parameters<ExtensionCommandContext[\"switchSession\"]>[1],\n\t\t): Promise<{ cancelled: boolean }>;\n\t\tgetLoginProviderOptions(authType?: \"oauth\" | \"api_key\"): AuthSelectorProvider[];\n\t\tgetLogoutProviderOptions(): AuthSelectorProvider[];\n\t\thandleLoginCommand(providerRef?: string): Promise<void>;\n\t\tstartProviderLogin(providerOption: AuthSelectorProvider): Promise<void>;\n\t\tshowLoginAuthTypeSelector(providerOptions?: AuthSelectorProvider[]): void;\n\t\tshowLoginProviderSelector(authType?: \"oauth\" | \"api_key\", initialSearchInput?: string): void;\n\t\tshowOAuthSelector(mode: \"login\" | \"logout\"): Promise<void>;\n\t\tcompleteProviderAuthentication(\n\t\t\tproviderId: string,\n\t\t\tproviderName: string,\n\t\t\tauthType: \"oauth\" | \"api_key\",\n\t\t\tpreviousModel: Model<Api> | undefined,\n\t\t\toptions?: { modelsRefreshed?: boolean },\n\t\t): Promise<void>;\n\t\tshowBedrockSetupDialog(providerId: string, providerName: string): void;\n\t\tshowApiKeyLoginDialog(providerId: string, providerName: string): Promise<void>;\n\t\tshowOAuthLoginSelect(dialog: LoginDialogComponent, prompt: OAuthSelectPrompt): Promise<string | undefined>;\n\t\tshowLoginDialog(providerId: string, providerName: string): Promise<void>;\n\t\thandleReloadCommand(): Promise<void>;\n\t\thandleExportCommand(text: string): Promise<void>;\n\t\tgetPathCommandArgument(text: string, command: \"/export\" | \"/import\"): string | undefined;\n\t\thandleImportCommand(text: string): Promise<void>;\n\t\thandleShareCommand(): Promise<void>;\n\t\thandleCopyCommand(): Promise<void>;\n\t\thandleNameCommand(text: string): void;\n\t\thandleSessionCommand(): void;\n\t\thandleChangelogCommand(): void;\n\t\tgetAppKeyDisplay(action: AppKeybinding): string;\n\t\tgetEditorKeyDisplay(action: Keybinding): string;\n\t\thandleHotkeysCommand(): void;\n\t\thandleClearCommand(): Promise<void>;\n\t\thandleDebugCommand(): void;\n\t\thandleArminSaysHi(): void;\n\t\thandleDementedDelves(): void;\n\t\thandleDaxnuts(): void;\n\t\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n\t\thandleBashCommand(command: string, excludeFromContext?: boolean): Promise<void>;\n\t\thandleCompactCommand(): Promise<void>;\n\t\tstop(): void;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-mode-surface.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-surface.ts"],"names":[],"mappings":"AAAA,4EAA4E","sourcesContent":["/** Method surface installed onto InteractiveModeBase by sibling modules. */\n\nimport type { CustomEntry, SessionEntry } from \"../../core/session-manager.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport type {\n\tAgentMessage,\n\tAgentSession,\n\tAgentSessionEvent,\n\tApi,\n\tAppKeybinding,\n\tAuthSelectorProvider,\n\tAutocompleteProvider,\n\tChatMessageEntry,\n\tChatMessageRenderOptions,\n\tComponent,\n\tContainer,\n\tEditorFactory,\n\tExtensionCommandContext,\n\tExtensionEditorComponent,\n\tExtensionInputComponent,\n\tExtensionRunner,\n\tExtensionSelectorComponent,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tHostCustomUiState,\n\tHostCustomUiStateListener,\n\tKeybinding,\n\tKeybindingsManager,\n\tLoader,\n\tLoaderIndicatorOptions,\n\tLoginDialogComponent,\n\tMarkdownTheme,\n\tMessage,\n\tMissingSessionCwdError,\n\tModel,\n\tOAuthSelectPrompt,\n\tOverlayHandle,\n\tOverlayOptions,\n\tProjectTrustContext,\n\tReadonlyFooterDataProvider,\n\tResourceDiagnostic,\n\tSessionContext,\n\tSlashCommand,\n\tSourceInfo,\n\tTheme,\n\tTUI,\n\tVerbatimCompactionResult,\n} from \"./interactive-mode-deps.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\n\ndeclare module \"./interactive-mode-base.ts\" {\n\tinterface InteractiveModeBase {\n\t\tgetAutocompleteSourceTag(sourceInfo?: SourceInfo): string | undefined;\n\t\tprefixAutocompleteDescription(description: string | undefined, sourceInfo?: SourceInfo): string | undefined;\n\t\tgetBuiltInCommandConflictDiagnostics(extensionRunner: ExtensionRunner): ResourceDiagnostic[];\n\t\tgetCodexFastModeCandidateModels(): Model<Api>[];\n\t\thasCodexFastModeSupportedModels(): boolean;\n\t\tcreateBaseAutocompleteProvider(): AutocompleteProvider;\n\t\tbuildRemoteSlashCommands(localCommands: SlashCommand[]): SlashCommand[];\n\t\tsetupAutocompleteProvider(): void;\n\t\tshowStartupNoticesIfNeeded(targetContainer?: Container): void;\n\t\thadLastChangelogVersionAtStartup: boolean;\n\t\tfirstRunNoticeVisible: boolean;\n\t\tfirstRunOnboardingNoticeComponents: Component[];\n\t\tinitializeFirstRunOnboardingMarkers(): void;\n\t\tisFirstRunOnboardingEligible(): boolean;\n\t\tclearFirstRunOnboardingUi(): void;\n\t\tinit(): Promise<void>;\n\t\tcompleteDeferredStartup(): Promise<void>;\n\t\tretryDeferredModelRestore(targetContainer?: Container): Promise<void>;\n\t\tupdateTerminalTitle(): void;\n\t\trun(): Promise<void>;\n\t\tcheckForPackageUpdates(): Promise<string[]>;\n\t\tcheckTmuxKeyboardSetup(): Promise<string | undefined>;\n\t\tgetChangelogForDisplay(): string | undefined;\n\t\treportInstallTelemetry(version: string): void;\n\t\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\t\tformatDisplayPath(p: string): string;\n\t\tformatExtensionDisplayPath(path: string): string;\n\t\tformatContextPath(p: string): string;\n\t\tgetStartupModelLabel(): string;\n\t\tgetStartupIdentityText(maxWidth?: number, gap?: number, manifestoPhase?: number): string;\n\t\tgetAtomicAnsiMarkLines(gap?: number): string[];\n\t\tgetStartupExpansionState(): boolean;\n\t\tgetShortPath(fullPath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactPathLabel(resourcePath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactPackageSourceLabel(sourceInfo?: SourceInfo): string;\n\t\tgetCompactExtensionLabel(resourcePath: string, sourceInfo?: SourceInfo): string;\n\t\tgetCompactDisplayPathSegments(resourcePath: string): string[];\n\t\tgetCompactNonPackageExtensionLabel(\n\t\t\tresourcePath: string,\n\t\t\tindex: number,\n\t\t\tallPaths: Array<{ path: string; segments: string[] }>,\n\t\t): string;\n\t\tgetCompactExtensionLabels(extensions: Array<{ path: string; sourceInfo?: SourceInfo }>): string[];\n\t\tgetDisplaySourceInfo(sourceInfo?: SourceInfo): {\n\t\t\tlabel: string;\n\t\t\tscopeLabel?: string;\n\t\t\tcolor: \"accent\" | \"muted\";\n\t\t};\n\t\tgetScopeGroup(sourceInfo?: SourceInfo): \"user\" | \"project\" | \"path\";\n\t\tisPackageSource(sourceInfo?: SourceInfo): boolean;\n\t\tbuildScopeGroups(items: Array<{ path: string; sourceInfo?: SourceInfo }>): Array<{\n\t\t\tscope: \"user\" | \"project\" | \"path\";\n\t\t\tpaths: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tpackages: Map<string, Array<{ path: string; sourceInfo?: SourceInfo }>>;\n\t\t}>;\n\t\tformatScopeGroups(\n\t\t\tgroups: Array<{\n\t\t\t\tscope: \"user\" | \"project\" | \"path\";\n\t\t\t\tpaths: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\t\tpackages: Map<string, Array<{ path: string; sourceInfo?: SourceInfo }>>;\n\t\t\t}>,\n\t\t\toptions: {\n\t\t\t\tformatPath: (item: { path: string; sourceInfo?: SourceInfo }) => string;\n\t\t\t\tformatPackagePath: (item: { path: string; sourceInfo?: SourceInfo }, source: string) => string;\n\t\t\t},\n\t\t): string;\n\t\tfindSourceInfoForPath(p: string, sourceInfos: Map<string, SourceInfo>): SourceInfo | undefined;\n\t\tformatPathWithSource(p: string, sourceInfo?: SourceInfo): string;\n\t\tformatDiagnostics(diagnostics: readonly ResourceDiagnostic[], sourceInfos: Map<string, SourceInfo>): string;\n\t\tgetResourceDiagnosticsTotal(values: ResourceDiagnostic[][]): number;\n\t\tformatResourceCount(count: number, singular: string, plural?: string): string | undefined;\n\t\taddResourceDisclosure(options: {\n\t\t\tcontextFiles: ReadonlyArray<{ path: string }>;\n\t\t\tskills: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\tprompts: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\ttemplates: ReadonlyArray<{ filePath: string; name: string }>;\n\t\t\textensions: ReadonlyArray<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tthemes: ReadonlyArray<{ name?: string; sourcePath?: string }>;\n\t\t\tdiagnosticsTotal: number;\n\t\t\texpandedBody: string;\n\t\t\ttargetContainer?: Container;\n\t\t}): void;\n\t\tshowLoadedResources(options?: {\n\t\t\textensions?: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\t\tforce?: boolean;\n\t\t\tshowDiagnosticsWhenQuiet?: boolean;\n\t\t\ttargetContainer?: Container;\n\t\t}): void;\n\t\tbindCurrentSessionExtensions(): Promise<void>;\n\t\tapplyRuntimeSettings(): void;\n\t\trebindCurrentSession(): Promise<void>;\n\t\thandleFatalRuntimeError(prefix: string, error: unknown): Promise<never>;\n\t\trenderCurrentSessionState(): void;\n\t\tgetRegisteredToolDefinition(toolName: string): ReturnType<AgentSession[\"getToolDefinition\"]>;\n\t\tsetupExtensionShortcuts(extensionRunner: ExtensionRunner): void;\n\t\tsetExtensionStatus(key: string, text: string | undefined): void;\n\t\tgetWorkingLoaderMessage(): string;\n\t\tcreateWorkingLoader(): Loader | AtomicWorkingLoader;\n\t\tstopWorkingLoader(): void;\n\t\tshowWorkingLoaderNow(): void;\n\t\tsetWorkingVisible(visible: boolean): void;\n\t\tsetWorkingIndicator(options?: LoaderIndicatorOptions): void;\n\t\tsetHiddenThinkingLabel(label?: string): void;\n\t\tsetExtensionWidget(\n\t\t\tkey: string,\n\t\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\t\toptions?: ExtensionWidgetOptions,\n\t\t): void;\n\t\tclearExtensionWidgets(): void;\n\t\tresetExtensionUI(): void;\n\t\trenderWidgets(): void;\n\t\trenderWidgetContainer(\n\t\t\tcontainer: Container,\n\t\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\t\tspacerWhenEmpty: boolean,\n\t\t\tleadingSpacer: boolean,\n\t\t): void;\n\t\tsetExtensionFooter(\n\t\t\tfactory:\n\t\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t\t| undefined,\n\t\t): void;\n\t\tsetExtensionHeader(factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void;\n\t\taddExtensionTerminalInputListener(\n\t\t\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n\t\t): () => void;\n\t\tclearExtensionTerminalInputListeners(): void;\n\t\tgetHostCustomUiState(): HostCustomUiState;\n\t\tnotifyHostCustomUiStateListeners(): void;\n\t\tbeginHostInlineCustomUi(): () => void;\n\t\tbeginInlineCustomUiFocusDeferral(): () => void;\n\t\tshouldDeferInlineCustomUiFocus(): boolean;\n\t\tfocusHostInlineCustomUi(): boolean;\n\t\tonHostCustomUiStateChange(listener: HostCustomUiStateListener): () => void;\n\t\tcreateProjectTrustContext(cwd: string): ProjectTrustContext;\n\t\tcreateExtensionUIContext(): ExtensionUIContext;\n\t\tshowExtensionSelector(\n\t\t\ttitle: string,\n\t\t\toptions: string[],\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionSelector(instance?: ExtensionSelectorComponent): void;\n\t\tshowExtensionConfirm(title: string, message: string, opts?: ExtensionUIDialogOptions): Promise<boolean>;\n\t\tpromptForMissingSessionCwd(error: MissingSessionCwdError): Promise<string | undefined>;\n\t\tshowExtensionInput(\n\t\t\ttitle: string,\n\t\t\tplaceholder?: string,\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionInput(instance?: ExtensionInputComponent): void;\n\t\tshowExtensionEditor(\n\t\t\ttitle: string,\n\t\t\tprefill?: string,\n\t\t\topts?: ExtensionUIDialogOptions,\n\t\t): Promise<string | undefined>;\n\t\thideExtensionEditor(instance?: ExtensionEditorComponent): void;\n\t\tsetCustomEditorComponent(factory: EditorFactory | undefined): void;\n\t\tshowExtensionNotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void;\n\t\tshowExtensionCustom<T>(\n\t\t\tfactory: (\n\t\t\t\ttui: TUI,\n\t\t\t\ttheme: Theme,\n\t\t\t\tkeybindings: KeybindingsManager,\n\t\t\t\tdone: (result: T) => void,\n\t\t\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\t\t\toptions?: {\n\t\t\t\toverlay?: boolean;\n\t\t\t\tdeferInlineCustomUiFocus?: boolean;\n\t\t\t\tsignal?: AbortSignal;\n\t\t\t\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\t\t\t\tonHandle?: (handle: OverlayHandle) => void;\n\t\t\t},\n\t\t): Promise<T>;\n\t\tshowExtensionError(extensionPath: string, error: string, stack?: string): void;\n\t\tsetupKeyHandlers(): void;\n\t\thandleClipboardImagePaste(): Promise<void>;\n\t\tsetupEditorSubmitHandler(): void;\n\t\tdeliverStartupReplayPrompt(text: string): void;\n\t\trecoverCookedStartupInput(): boolean;\n\t\tdrainStartupReplayCommands(): Promise<void>;\n\t\tadvanceStartupInputReplay(submittedText: string): void;\n\t\tsubscribeToAgent(): void;\n\t\thandleEvent(event: AgentSessionEvent): Promise<void>;\n\t\tgetUserMessageText(message: Message): string;\n\t\tshowStatus(message: string): void;\n\t\tchatMessageRenderOptions(): ChatMessageRenderOptions;\n\t\taddRenderedChatEntry(entry: ChatMessageEntry): Component;\n\t\taddCompactionBoundaryToChat(result: VerbatimCompactionResult): void;\n\t\taddMessageToChat(message: AgentMessage, options?: { populateHistory?: boolean }): void;\n\t\taddCustomEntryToChat(entry: CustomEntry): void;\n\t\trenderSessionContext(\n\t\t\tsessionContext: SessionContext,\n\t\t\toptions?: { updateFooter?: boolean; populateHistory?: boolean },\n\t\t): void;\n\t\trenderSessionEntries(\n\t\t\tentries: SessionEntry[],\n\t\t\toptions?: {\n\t\t\t\tupdateFooter?: boolean;\n\t\t\t\tpopulateHistory?: boolean;\n\t\t\t\tsuppressCompactionBoundary?: VerbatimCompactionResult;\n\t\t\t},\n\t\t): void;\n\t\trenderInitialMessages(): void;\n\t\tattachStartupNoticesContainer(options?: { resetDetached?: boolean }): void;\n\t\tgetUserInput(): Promise<InteractiveSubmission>;\n\t\trunUserPromptTurn(submission: InteractiveSubmission | string): Promise<void>;\n\t\trenderDeferredUserInput(text: string): void;\n\t\tconsumeDeferredRenderedUserInput(text: string): boolean;\n\t\tdiscardDeferredRenderedUserInput(text: string): void;\n\t\tensureDeferredStartupComplete(): Promise<void>;\n\t\trebuildChatFromMessages(options?: {\n\t\t\tsuppressCompactionBoundary?: VerbatimCompactionResult;\n\t\t\tresetStartupDisclosure?: boolean;\n\t\t}): void;\n\t\thandleCtrlC(): void;\n\t\tinterruptActiveOperation(): boolean;\n\t\thandleCtrlD(): void;\n\t\tshutdown(options?: { fromSignal?: boolean }): Promise<void>;\n\t\temergencyTerminalExit(): never;\n\t\tuncaughtCrash(error: Error): never;\n\t\tcheckShutdownRequested(): Promise<void>;\n\t\tregisterSignalHandlers(): void;\n\t\tunregisterSignalHandlers(): void;\n\t\thandleCtrlZ(): void;\n\t\thandleFollowUp(): Promise<void>;\n\t\thandleDequeue(): void;\n\t\trefreshBuiltInHeader(): void;\n\t\tupdateEditorBorderColor(): void;\n\t\tcycleThinkingLevel(): void;\n\t\tcycleModel(direction: \"forward\" | \"backward\"): Promise<void>;\n\t\ttoggleToolOutputExpansion(): void;\n\t\tsetToolsExpanded(expanded: boolean): void;\n\t\ttoggleThinkingBlockVisibility(): void;\n\t\topenExternalEditor(): Promise<void>;\n\t\tclearEditor(): void;\n\t\tshowError(errorMessage: string): void;\n\t\tshowWarning(warningMessage: string, targetContainer?: Container): void;\n\t\tshowNewVersionNotification(newVersion: string, targetContainer?: Container): void;\n\t\tshowPackageUpdateNotification(packages: string[], targetContainer?: Container): void;\n\t\tgetAllQueuedMessages(): { steering: string[]; followUp: string[] };\n\t\tclearAllQueues(options?: { preserveUnprotectedCustomMessages?: boolean }): {\n\t\t\tsteering: string[];\n\t\t\tfollowUp: string[];\n\t\t};\n\t\tupdatePendingMessagesDisplay(): void;\n\t\trestoreQueuedMessagesToEditor(options?: {\n\t\t\tabort?: boolean;\n\t\t\tcurrentText?: string;\n\t\t\tpreserveUnprotectedCustomMessages?: boolean;\n\t\t}): number;\n\t\tqueueCompactionMessage(text: string, mode: \"steer\" | \"followUp\"): void;\n\t\tisExtensionCommand(text: string): boolean;\n\t\tflushCompactionQueue(options?: { willRetry?: boolean }): Promise<void>;\n\t\tflushPendingBashComponents(): void;\n\t\tshowSelector(create: (done: () => void) => { component: Component; focus: Component }): void;\n\t\tshowFastModeSelector(): void;\n\t\tshowSettingsSelector(): void;\n\t\thandleModelCommand(searchTerm?: string): Promise<void>;\n\t\tfindExactModelMatch(searchTerm: string): Promise<Model<Api> | undefined>;\n\t\tgetModelCandidates(): Promise<Model<Api>[]>;\n\t\tupdateAvailableProviderCount(): Promise<void>;\n\t\tmaybeWarnAboutAnthropicSubscriptionAuth(\n\t\t\tmodel?: Model<Api> | undefined,\n\t\t\ttargetContainer?: Container,\n\t\t): Promise<void>;\n\t\tshowModelSelector(initialSearchInput?: string): void;\n\t\tshowModelsSelector(): Promise<void>;\n\t\tshowUserMessageSelector(): Promise<void>;\n\t\thandleCloneCommand(): Promise<void>;\n\t\tmaybeSaveImplicitProjectTrustAfterReload(): boolean;\n\t\tshowTrustSelector(): void;\n\t\tshowTreeSelector(initialSelectedId?: string): Promise<void>;\n\t\tshowSessionSelector(): void;\n\t\thandleResumeSession(\n\t\t\tsessionPath: string,\n\t\t\toptions?: Parameters<ExtensionCommandContext[\"switchSession\"]>[1],\n\t\t): Promise<{ cancelled: boolean }>;\n\t\tgetLoginProviderOptions(authType?: \"oauth\" | \"api_key\"): AuthSelectorProvider[];\n\t\tgetLogoutProviderOptions(): AuthSelectorProvider[];\n\t\thandleLoginCommand(providerRef?: string): Promise<void>;\n\t\tstartProviderLogin(providerOption: AuthSelectorProvider): Promise<void>;\n\t\tshowLoginAuthTypeSelector(providerOptions?: AuthSelectorProvider[]): void;\n\t\tshowLoginProviderSelector(authType?: \"oauth\" | \"api_key\", initialSearchInput?: string): void;\n\t\tshowOAuthSelector(mode: \"login\" | \"logout\"): Promise<void>;\n\t\tcompleteProviderAuthentication(\n\t\t\tproviderId: string,\n\t\t\tproviderName: string,\n\t\t\tauthType: \"oauth\" | \"api_key\",\n\t\t\tpreviousModel: Model<Api> | undefined,\n\t\t\toptions?: { modelsRefreshed?: boolean },\n\t\t): Promise<void>;\n\t\tshowBedrockSetupDialog(providerId: string, providerName: string): void;\n\t\tshowApiKeyLoginDialog(providerId: string, providerName: string): Promise<void>;\n\t\tshowOAuthLoginSelect(dialog: LoginDialogComponent, prompt: OAuthSelectPrompt): Promise<string | undefined>;\n\t\tshowLoginDialog(providerId: string, providerName: string): Promise<void>;\n\t\thandleReloadCommand(): Promise<void>;\n\t\thandleExportCommand(text: string): Promise<void>;\n\t\tgetPathCommandArgument(text: string, command: \"/export\" | \"/import\"): string | undefined;\n\t\thandleImportCommand(text: string): Promise<void>;\n\t\thandleShareCommand(): Promise<void>;\n\t\thandleCopyCommand(): Promise<void>;\n\t\thandleNameCommand(text: string): void;\n\t\thandleSessionCommand(): void;\n\t\thandleChangelogCommand(): void;\n\t\tgetAppKeyDisplay(action: AppKeybinding): string;\n\t\tgetEditorKeyDisplay(action: Keybinding): string;\n\t\thandleHotkeysCommand(): void;\n\t\thandleClearCommand(): Promise<void>;\n\t\thandleDebugCommand(): void;\n\t\thandleArminSaysHi(): void;\n\t\thandleDementedDelves(): void;\n\t\thandleDaxnuts(): void;\n\t\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n\t\thandleBashCommand(command: string, excludeFromContext?: boolean): Promise<void>;\n\t\thandleCompactCommand(): Promise<void>;\n\t\tstop(): void;\n\t}\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { boundedInteractiveModelRefresh } from "../../core/bounded-model-refresh.js";
|
|
1
2
|
import { isOfflineModeEnabled } from "../../core/package-manager-env.js";
|
|
2
3
|
import { InteractiveModeBase } from "./interactive-mode-base.js";
|
|
3
4
|
import { findExactModelReferenceMatch, ModelSelectorComponent, resolveModelScope, resolveModelScopeWithDiagnostics, ScopedModelsSelectorComponent, UserMessageSelectorComponent, } from "./interactive-mode-deps.js";
|
|
@@ -33,7 +34,9 @@ InteractiveModeBase.prototype.getModelCandidates = async function () {
|
|
|
33
34
|
return this.session.scopedModels.map((scoped) => scoped.model);
|
|
34
35
|
}
|
|
35
36
|
const allowNetwork = !isOfflineModeEnabled();
|
|
36
|
-
await this.session.modelRuntime.refresh({
|
|
37
|
+
await boundedInteractiveModelRefresh((refreshOptions) => this.session.modelRuntime.refresh(refreshOptions), {
|
|
38
|
+
allowNetwork,
|
|
39
|
+
});
|
|
37
40
|
try {
|
|
38
41
|
return [...this.session.modelRuntime.getAvailableSnapshot()];
|
|
39
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAEN,4BAA4B,EAE5B,sBAAsB,EACtB,iBAAiB,EACjB,gCAAgC,EAChC,6BAA6B,EAC7B,4BAA4B,GAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mCAAmC,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAEpH,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK,WAEvD,UAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,mBAAmB,GAAG,KAAK,WAExD,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC/C,OAAO,4BAA4B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK;IACvD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,oBAAoB,EAAE,CAAC;IAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,GAAG,KAAK;IACjE,MAAM,MAAM,GACX,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;IACrD,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,uCAAuC,GAAG,KAAK,WAE5E,KAAK,GAA2B,IAAI,CAAC,OAAO,CAAC,KAAK,EAClD,eAAe,GAAG,IAAI,CAAC,aAAa;IAEpC,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;QACtE,OAAO;IACR,CAAC;IACD,IAAI,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAC5C,OAAO;IACR,CAAC;IACD,IAAI,KAAK,EAAE,QAAQ,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO;IACR,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,mCAAmC,EAAE,eAAe,CAAC,CAAC;QACvE,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,OAAO;QACR,CAAC;QACD,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,mCAAmC,EAAE,eAAe,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACR,uDAAuD;IACxD,CAAC;AACF,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAEjD,kBAA2B;IAE3B,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,OAAO,CAAC,KAAK,EAClB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,CAAC,YAAY,EACzB,IAAI,CAAC,OAAO,CAAC,YAAY,EACzB,KAAK,EAAE,KAAK,EAAE,EAAE;YACf,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC;gBACP,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;QACF,CAAC,EACD,GAAG,EAAE;YACJ,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,EACD,kBAAkB,CAClB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK;IACvD,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAEtD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,EAAE,MAAM;QACjD,CAAC,CAAC,MAAM,gCAAgC,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QACvF,CAAC,CAAC,SAAS,CAAC;IACb,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,IAAI,iBAAiB,GAAoB,IAAI,CAAC;IAC9C,IAAI,eAAe,EAAE,CAAC;QACrB,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC5B,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC;QAC7D,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAC7C,iBAAiB,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,UAA2B,EAAE,EAAE;QACjE,iBAAiB,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACjE,MAAM,wBAAwB,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;QACxF,MAAM,yBAAyB,GAAG,UAAU,KAAK,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,IAAI,wBAAwB,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC1E,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACvF,IAAI,CAAC,OAAO,CAAC,eAAe,CAC3B,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CACnF,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CACjD;YACC,SAAS;YACT,eAAe,EAAE,iBAAiB;SAClC,EACD;YACC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC9B,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YACD,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE;gBACzB,MAAM,UAAU,GACf,UAAU,KAAK,IAAI;oBACnB,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;oBACtC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/C,MAAM,WAAW,GAAG,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC/E,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAClF,IAAI,CAAC,UAAU,CAAC,mCAAmC,CAAC,CAAC;YACtD,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;gBACd,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;SACD,CACD,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,uBAAuB,GAAG,KAAK;IAC5D,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAE9D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAC5C,OAAO;IACR,CAAC;IAED,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAEzE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,4BAA4B,CAChD,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1D,KAAK,EAAE,OAAO,EAAE,EAAE;YACjB,IAAI,gBAAgB;gBAAE,OAAO;YAC7B,gBAAgB,GAAG,IAAI,CAAC;YACxB,IAAI,EAAE,CAAC;YACP,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;oBACxB,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;QACF,CAAC,EACD,GAAG,EAAE;YACJ,IAAI,gBAAgB;gBAAE,OAAO;YAC7B,gBAAgB,GAAG,IAAI,CAAC;YACxB,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,EACD,iBAAiB,CACjB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { isOfflineModeEnabled } from \"../../core/package-manager-env.ts\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Api,\n\tfindExactModelReferenceMatch,\n\ttype Model,\n\tModelSelectorComponent,\n\tresolveModelScope,\n\tresolveModelScopeWithDiagnostics,\n\tScopedModelsSelectorComponent,\n\tUserMessageSelectorComponent,\n} from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function (\n\tthis: InteractiveModeBase,\n\tsearchTerm?: string,\n): Promise<void> {\n\tif (!searchTerm) {\n\t\tthis.showModelSelector();\n\t\treturn;\n\t}\n\n\tconst model = await this.findExactModelMatch(searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait this.session.setModel(model);\n\t\t\tthis.footer.invalidate();\n\t\t\tthis.updateEditorBorderColor();\n\t\t\tthis.showStatus(`Model: ${model.id}`);\n\t\t\tvoid this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\tthis.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tthis.showModelSelector(searchTerm);\n};\n\nInteractiveModeBase.prototype.findExactModelMatch = async function (\n\tthis: InteractiveModeBase,\n\tsearchTerm: string,\n): Promise<Model<Api> | undefined> {\n\tconst models = await this.getModelCandidates();\n\treturn findExactModelReferenceMatch(searchTerm, models);\n};\n\nInteractiveModeBase.prototype.getModelCandidates = async function (this: InteractiveModeBase): Promise<Model<Api>[]> {\n\tif (this.session.scopedModels.length > 0) {\n\t\treturn this.session.scopedModels.map((scoped) => scoped.model);\n\t}\n\n\tconst allowNetwork = !isOfflineModeEnabled();\n\tawait this.session.modelRuntime.refresh({ allowNetwork });\n\ttry {\n\t\treturn [...this.session.modelRuntime.getAvailableSnapshot()];\n\t} catch {\n\t\treturn [];\n\t}\n};\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function (this: InteractiveModeBase): Promise<void> {\n\tconst models =\n\t\tthis.session.scopedModels.length > 0\n\t\t\t? this.session.scopedModels.map((scoped) => scoped.model)\n\t\t\t: this.session.modelRuntime.getAvailableSnapshot();\n\tthis.footerDataProvider.setAvailableProviderCount(new Set(models.map((model) => model.provider)).size);\n};\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function (\n\tthis: InteractiveModeBase,\n\tmodel: Model<Api> | undefined = this.session.model,\n\ttargetContainer = this.chatContainer,\n): Promise<void> {\n\tif (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n\t\treturn;\n\t}\n\tif (this.anthropicSubscriptionWarningShown) {\n\t\treturn;\n\t}\n\tif (model?.provider !== \"anthropic\") {\n\t\treturn;\n\t}\n\n\tif (this.session.modelRuntime.isUsingOAuth(\"anthropic\")) {\n\t\tthis.anthropicSubscriptionWarningShown = true;\n\t\tthis.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, targetContainer);\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst storedCredential = await this.session.modelRuntime.getAuth(\"anthropic\");\n\t\tconst apiKey = storedCredential?.auth.apiKey;\n\t\tif (!isAnthropicSubscriptionAuthKey(apiKey)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.anthropicSubscriptionWarningShown = true;\n\t\tthis.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, targetContainer);\n\t} catch {\n\t\t// Ignore auth lookup failures for warning-only checks.\n\t}\n};\n\nInteractiveModeBase.prototype.showModelSelector = function (\n\tthis: InteractiveModeBase,\n\tinitialSearchInput?: string,\n): void {\n\tthis.showSelector((done) => {\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\tthis.ui,\n\t\t\tthis.session.model,\n\t\t\tthis.settingsManager,\n\t\t\tthis.session.modelRuntime,\n\t\t\tthis.session.scopedModels,\n\t\t\tasync (model) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.session.setModel(model);\n\t\t\t\t\tthis.footer.invalidate();\n\t\t\t\t\tthis.updateEditorBorderColor();\n\t\t\t\t\tdone();\n\t\t\t\t\tvoid this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\t\tthis.checkDaxnutsEasterEgg(model);\n\t\t\t\t\tthis.showStatus(`Model: ${model.id}`);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tdone();\n\t\t\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n};\n\nInteractiveModeBase.prototype.showModelsSelector = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.session.modelRuntime.refresh({ allowNetwork: !isOfflineModeEnabled() });\n\tconst allModels = [...this.session.modelRuntime.getAvailableSnapshot()];\n\tconst allModelIds = new Set(allModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = this.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = this.session.scopedModels;\n\n\tif (allModels.length === 0 && !configuredPatterns?.length && sessionScopedModels.length === 0) {\n\t\tthis.showStatus(\"No models available\");\n\t\treturn;\n\t}\n\n\tconst configuredScope = configuredPatterns?.length\n\t\t? await resolveModelScopeWithDiagnostics(configuredPatterns, this.session.modelRuntime)\n\t\t: undefined;\n\tconst hasSessionScope = sessionScopedModels.length > 0;\n\tlet currentEnabledIds: string[] | null = null;\n\tif (hasSessionScope) {\n\t\tcurrentEnabledIds = sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t} else if (configuredScope) {\n\t\tcurrentEnabledIds = configuredScope.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t}\n\tfor (const diagnostic of configuredScope?.diagnostics ?? []) {\n\t\tif (diagnostic.code !== \"no-match\") continue;\n\t\tcurrentEnabledIds ??= [];\n\t\tif (!currentEnabledIds.includes(diagnostic.pattern)) currentEnabledIds.push(diagnostic.pattern);\n\t}\n\n\tconst updateSessionModels = async (enabledIds: string[] | null) => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => allModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled = enabledIds !== null && [...allModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = await resolveModelScope(enabledIds, this.session.modelRuntime);\n\t\t\tthis.session.setScopedModels(\n\t\t\t\tnewScopedModels.map((sm) => ({ model: sm.model, thinkingLevel: sm.thinkingLevel })),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t\tawait this.updateAvailableProviderCount();\n\t\tthis.setupAutocompleteProvider();\n\t\tthis.ui.requestRender();\n\t};\n\n\tthis.showSelector((done) => {\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: async (enabledIds) => {\n\t\t\t\t\tawait updateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === allModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => allModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\tthis.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\tthis.showStatus(\"Model selection saved to settings\");\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n};\n\nInteractiveModeBase.prototype.showUserMessageSelector = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.ensureDeferredStartupComplete();\n\tconst userMessages = this.session.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\tthis.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\tthis.showSelector((done) => {\n\t\tlet selectionHandled = false;\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({ id: m.entryId, text: m.text })),\n\t\t\tasync (entryId) => {\n\t\t\t\tif (selectionHandled) return;\n\t\t\t\tselectionHandled = true;\n\t\t\t\tdone();\n\t\t\t\ttry {\n\t\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\t\tconst result = await this.runtimeHost.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.renderCurrentSessionState();\n\t\t\t\t\tthis.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\tthis.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tif (selectionHandled) return;\n\t\t\t\tselectionHandled = true;\n\t\t\t\tdone();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n};\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { boundedInteractiveModelRefresh } from \"../../core/bounded-model-refresh.ts\";\nimport { isOfflineModeEnabled } from \"../../core/package-manager-env.ts\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Api,\n\tfindExactModelReferenceMatch,\n\ttype Model,\n\tModelSelectorComponent,\n\tresolveModelScope,\n\tresolveModelScopeWithDiagnostics,\n\tScopedModelsSelectorComponent,\n\tUserMessageSelectorComponent,\n} from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function (\n\tthis: InteractiveModeBase,\n\tsearchTerm?: string,\n): Promise<void> {\n\tif (!searchTerm) {\n\t\tthis.showModelSelector();\n\t\treturn;\n\t}\n\n\tconst model = await this.findExactModelMatch(searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait this.session.setModel(model);\n\t\t\tthis.footer.invalidate();\n\t\t\tthis.updateEditorBorderColor();\n\t\t\tthis.showStatus(`Model: ${model.id}`);\n\t\t\tvoid this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\tthis.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tthis.showModelSelector(searchTerm);\n};\n\nInteractiveModeBase.prototype.findExactModelMatch = async function (\n\tthis: InteractiveModeBase,\n\tsearchTerm: string,\n): Promise<Model<Api> | undefined> {\n\tconst models = await this.getModelCandidates();\n\treturn findExactModelReferenceMatch(searchTerm, models);\n};\n\nInteractiveModeBase.prototype.getModelCandidates = async function (this: InteractiveModeBase): Promise<Model<Api>[]> {\n\tif (this.session.scopedModels.length > 0) {\n\t\treturn this.session.scopedModels.map((scoped) => scoped.model);\n\t}\n\n\tconst allowNetwork = !isOfflineModeEnabled();\n\tawait boundedInteractiveModelRefresh((refreshOptions) => this.session.modelRuntime.refresh(refreshOptions), {\n\t\tallowNetwork,\n\t});\n\ttry {\n\t\treturn [...this.session.modelRuntime.getAvailableSnapshot()];\n\t} catch {\n\t\treturn [];\n\t}\n};\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function (this: InteractiveModeBase): Promise<void> {\n\tconst models =\n\t\tthis.session.scopedModels.length > 0\n\t\t\t? this.session.scopedModels.map((scoped) => scoped.model)\n\t\t\t: this.session.modelRuntime.getAvailableSnapshot();\n\tthis.footerDataProvider.setAvailableProviderCount(new Set(models.map((model) => model.provider)).size);\n};\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function (\n\tthis: InteractiveModeBase,\n\tmodel: Model<Api> | undefined = this.session.model,\n\ttargetContainer = this.chatContainer,\n): Promise<void> {\n\tif (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n\t\treturn;\n\t}\n\tif (this.anthropicSubscriptionWarningShown) {\n\t\treturn;\n\t}\n\tif (model?.provider !== \"anthropic\") {\n\t\treturn;\n\t}\n\n\tif (this.session.modelRuntime.isUsingOAuth(\"anthropic\")) {\n\t\tthis.anthropicSubscriptionWarningShown = true;\n\t\tthis.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, targetContainer);\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst storedCredential = await this.session.modelRuntime.getAuth(\"anthropic\");\n\t\tconst apiKey = storedCredential?.auth.apiKey;\n\t\tif (!isAnthropicSubscriptionAuthKey(apiKey)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.anthropicSubscriptionWarningShown = true;\n\t\tthis.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, targetContainer);\n\t} catch {\n\t\t// Ignore auth lookup failures for warning-only checks.\n\t}\n};\n\nInteractiveModeBase.prototype.showModelSelector = function (\n\tthis: InteractiveModeBase,\n\tinitialSearchInput?: string,\n): void {\n\tthis.showSelector((done) => {\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\tthis.ui,\n\t\t\tthis.session.model,\n\t\t\tthis.settingsManager,\n\t\t\tthis.session.modelRuntime,\n\t\t\tthis.session.scopedModels,\n\t\t\tasync (model) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.session.setModel(model);\n\t\t\t\t\tthis.footer.invalidate();\n\t\t\t\t\tthis.updateEditorBorderColor();\n\t\t\t\t\tdone();\n\t\t\t\t\tvoid this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\t\tthis.checkDaxnutsEasterEgg(model);\n\t\t\t\t\tthis.showStatus(`Model: ${model.id}`);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tdone();\n\t\t\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n};\n\nInteractiveModeBase.prototype.showModelsSelector = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.session.modelRuntime.refresh({ allowNetwork: !isOfflineModeEnabled() });\n\tconst allModels = [...this.session.modelRuntime.getAvailableSnapshot()];\n\tconst allModelIds = new Set(allModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = this.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = this.session.scopedModels;\n\n\tif (allModels.length === 0 && !configuredPatterns?.length && sessionScopedModels.length === 0) {\n\t\tthis.showStatus(\"No models available\");\n\t\treturn;\n\t}\n\n\tconst configuredScope = configuredPatterns?.length\n\t\t? await resolveModelScopeWithDiagnostics(configuredPatterns, this.session.modelRuntime)\n\t\t: undefined;\n\tconst hasSessionScope = sessionScopedModels.length > 0;\n\tlet currentEnabledIds: string[] | null = null;\n\tif (hasSessionScope) {\n\t\tcurrentEnabledIds = sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t} else if (configuredScope) {\n\t\tcurrentEnabledIds = configuredScope.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t}\n\tfor (const diagnostic of configuredScope?.diagnostics ?? []) {\n\t\tif (diagnostic.code !== \"no-match\") continue;\n\t\tcurrentEnabledIds ??= [];\n\t\tif (!currentEnabledIds.includes(diagnostic.pattern)) currentEnabledIds.push(diagnostic.pattern);\n\t}\n\n\tconst updateSessionModels = async (enabledIds: string[] | null) => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => allModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled = enabledIds !== null && [...allModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = await resolveModelScope(enabledIds, this.session.modelRuntime);\n\t\t\tthis.session.setScopedModels(\n\t\t\t\tnewScopedModels.map((sm) => ({ model: sm.model, thinkingLevel: sm.thinkingLevel })),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.session.setScopedModels([]);\n\t\t}\n\t\tawait this.updateAvailableProviderCount();\n\t\tthis.setupAutocompleteProvider();\n\t\tthis.ui.requestRender();\n\t};\n\n\tthis.showSelector((done) => {\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: async (enabledIds) => {\n\t\t\t\t\tawait updateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === allModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => allModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\tthis.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\tthis.showStatus(\"Model selection saved to settings\");\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n};\n\nInteractiveModeBase.prototype.showUserMessageSelector = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.ensureDeferredStartupComplete();\n\tconst userMessages = this.session.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\tthis.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\tthis.showSelector((done) => {\n\t\tlet selectionHandled = false;\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({ id: m.entryId, text: m.text })),\n\t\t\tasync (entryId) => {\n\t\t\t\tif (selectionHandled) return;\n\t\t\t\tselectionHandled = true;\n\t\t\t\tdone();\n\t\t\t\ttry {\n\t\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\t\tconst result = await this.runtimeHost.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.renderCurrentSessionState();\n\t\t\t\t\tthis.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\tthis.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tthis.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tif (selectionHandled) return;\n\t\t\t\tselectionHandled = true;\n\t\t\t\tdone();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n};\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { InteractiveModeBase } from "./interactive-mode-base.ts";
|
|
2
2
|
/** Establish the queue hold before aborting and surface asynchronous abort failures. */
|
|
3
|
-
export declare function pauseAndAbortInteractiveSession(mode: InteractiveModeBase
|
|
3
|
+
export declare function pauseAndAbortInteractiveSession(mode: InteractiveModeBase, options?: {
|
|
4
|
+
restoreQueuedMessages?: boolean;
|
|
5
|
+
}): void;
|
|
4
6
|
//# sourceMappingURL=interactive-pause.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-pause.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,wFAAwF;AACxF,wBAAgB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"interactive-pause.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,wFAAwF;AACxF,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,mBAAmB,EACzB,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,IAAI,CASN"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/** Establish the queue hold before aborting and surface asynchronous abort failures. */
|
|
2
|
-
export function pauseAndAbortInteractiveSession(mode) {
|
|
2
|
+
export function pauseAndAbortInteractiveSession(mode, options) {
|
|
3
|
+
// Establish the pause hold before draining it so messages admitted during abort settlement remain held.
|
|
3
4
|
mode.session.pauseQueuedMessages();
|
|
5
|
+
if (options?.restoreQueuedMessages) {
|
|
6
|
+
mode.restoreQueuedMessagesToEditor({ preserveUnprotectedCustomMessages: true });
|
|
7
|
+
}
|
|
4
8
|
void mode.session.abort().catch((error) => {
|
|
5
9
|
mode.showError(error instanceof Error ? error.message : String(error));
|
|
6
10
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-pause.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-pause.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,MAAM,UAAU,+BAA+B,
|
|
1
|
+
{"version":3,"file":"interactive-pause.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-pause.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,MAAM,UAAU,+BAA+B,CAC9C,IAAyB,EACzB,OAA6C;IAE7C,wGAAwG;IACxG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;IACnC,IAAI,OAAO,EAAE,qBAAqB,EAAE,CAAC;QACpC,IAAI,CAAC,6BAA6B,CAAC,EAAE,iCAAiC,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACzC,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { InteractiveModeBase } from \"./interactive-mode-base.ts\";\n\n/** Establish the queue hold before aborting and surface asynchronous abort failures. */\nexport function pauseAndAbortInteractiveSession(\n\tmode: InteractiveModeBase,\n\toptions?: { restoreQueuedMessages?: boolean },\n): void {\n\t// Establish the pause hold before draining it so messages admitted during abort settlement remain held.\n\tmode.session.pauseQueuedMessages();\n\tif (options?.restoreQueuedMessages) {\n\t\tmode.restoreQueuedMessagesToEditor({ preserveUnprotectedCustomMessages: true });\n\t}\n\tvoid mode.session.abort().catch((error) => {\n\t\tmode.showError(error instanceof Error ? error.message : String(error));\n\t});\n}\n"]}
|
|
@@ -12,8 +12,8 @@ InteractiveModeBase.prototype.getAllQueuedMessages = function () {
|
|
|
12
12
|
],
|
|
13
13
|
};
|
|
14
14
|
};
|
|
15
|
-
InteractiveModeBase.prototype.clearAllQueues = function () {
|
|
16
|
-
const { steering, followUp } = this.session.clearQueue();
|
|
15
|
+
InteractiveModeBase.prototype.clearAllQueues = function (options) {
|
|
16
|
+
const { steering, followUp } = this.session.clearQueue(options);
|
|
17
17
|
const compactionSteering = this.compactionQueuedMessages
|
|
18
18
|
.filter((msg) => msg.mode === "steer")
|
|
19
19
|
.map((msg) => msg.text);
|
|
@@ -45,7 +45,7 @@ InteractiveModeBase.prototype.updatePendingMessagesDisplay = function () {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
InteractiveModeBase.prototype.restoreQueuedMessagesToEditor = function (options) {
|
|
48
|
-
const { steering, followUp } = this.clearAllQueues();
|
|
48
|
+
const { steering, followUp } = this.clearAllQueues(options);
|
|
49
49
|
const allQueued = [...steering, ...followUp];
|
|
50
50
|
if (allQueued.length === 0) {
|
|
51
51
|
this.updatePendingMessagesDisplay();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-queueing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-queueing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { combineQueuedMessagesForEditor, Spacer, TruncatedText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAllQueuedMessages = function (this: InteractiveModeBase): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\treturn {\n\t\tsteering: [\n\t\t\t...this.session.getSteeringMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"steer\").map((msg) => msg.text),\n\t\t],\n\t\tfollowUp: [\n\t\t\t...this.session.getFollowUpMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"followUp\").map((msg) => msg.text),\n\t\t],\n\t};\n};\n\nInteractiveModeBase.prototype.clearAllQueues = function (this: InteractiveModeBase): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\tconst { steering, followUp } = this.session.clearQueue();\n\tconst compactionSteering = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"steer\")\n\t\t.map((msg) => msg.text);\n\tconst compactionFollowUp = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"followUp\")\n\t\t.map((msg) => msg.text);\n\tthis.compactionQueuedMessages = [];\n\treturn {\n\t\tsteering: [...steering, ...compactionSteering],\n\t\tfollowUp: [...followUp, ...compactionFollowUp],\n\t};\n};\n\nInteractiveModeBase.prototype.updatePendingMessagesDisplay = function (this: InteractiveModeBase): void {\n\tthis.pendingMessagesContainer.clear();\n\tconst { steering: steeringMessages, followUp: followUpMessages } = this.getAllQueuedMessages();\n\tif (steeringMessages.length > 0 || followUpMessages.length > 0) {\n\t\tthis.pendingMessagesContainer.addChild(new Spacer(1));\n\t\tfor (const message of steeringMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Steering: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tfor (const message of followUpMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Follow-up: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tconst dequeueHint = this.getAppKeyDisplay(\"app.message.dequeue\");\n\t\tconst hintText = theme.fg(\"dim\", `↳ ${dequeueHint} to edit all queued messages`);\n\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(hintText, 1, 0));\n\t}\n};\n\nInteractiveModeBase.prototype.restoreQueuedMessagesToEditor = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\tabort?: boolean;\n\t\tcurrentText?: string;\n\t},\n): number {\n\tconst { steering, followUp } = this.clearAllQueues();\n\tconst allQueued = [...steering, ...followUp];\n\tif (allQueued.length === 0) {\n\t\tthis.updatePendingMessagesDisplay();\n\t\tif (options?.abort) {\n\t\t\tvoid this.session.abort();\n\t\t}\n\t\treturn 0;\n\t}\n\tconst currentText = options?.currentText ?? this.editor.getText();\n\tconst combinedText = combineQueuedMessagesForEditor(allQueued, currentText);\n\tthis.editor.setText(combinedText);\n\tthis.updatePendingMessagesDisplay();\n\tif (options?.abort) {\n\t\tvoid this.session.abort();\n\t}\n\treturn allQueued.length;\n};\n\nInteractiveModeBase.prototype.queueCompactionMessage = function (\n\tthis: InteractiveModeBase,\n\ttext: string,\n\tmode: \"steer\" | \"followUp\",\n): void {\n\tthis.compactionQueuedMessages.push({ text, mode });\n\tthis.editor.addToHistory?.(text);\n\tthis.editor.setText(\"\");\n\tthis.updatePendingMessagesDisplay();\n\tthis.showStatus(\"Queued message for after compaction\");\n};\n\nInteractiveModeBase.prototype.isExtensionCommand = function (this: InteractiveModeBase, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\n\tconst extensionRunner = this.session.extensionRunner;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn !!extensionRunner.getCommand(commandName);\n};\n\nInteractiveModeBase.prototype.flushCompactionQueue = async function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\twillRetry?: boolean;\n\t},\n): Promise<void> {\n\tif (this.compactionQueuedMessages.length === 0) {\n\t\treturn;\n\t}\n\n\tconst queuedMessages = [...this.compactionQueuedMessages];\n\tthis.compactionQueuedMessages = [];\n\tthis.updatePendingMessagesDisplay();\n\n\tconst restoreQueue = (error: unknown) => {\n\t\tthis.session.clearQueue();\n\t\tthis.compactionQueuedMessages = queuedMessages;\n\t\tthis.updatePendingMessagesDisplay();\n\t\tthis.showError(\n\t\t\t`Failed to send queued message${queuedMessages.length > 1 ? \"s\" : \"\"}: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`,\n\t\t);\n\t};\n\n\ttry {\n\t\tif (options?.willRetry) {\n\t\t\t// When retry is pending, queue messages for the retry turn\n\t\t\tfor (const message of queuedMessages) {\n\t\t\t\tif (this.isExtensionCommand(message.text)) {\n\t\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t\t} else if (message.mode === \"followUp\") {\n\t\t\t\t\tawait this.session.followUp(message.text);\n\t\t\t\t} else {\n\t\t\t\t\tawait this.session.steer(message.text);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updatePendingMessagesDisplay();\n\t\t\treturn;\n\t\t}\n\n\t\t// Find first non-extension-command message to use as prompt\n\t\tconst firstPromptIndex = queuedMessages.findIndex((message) => !this.isExtensionCommand(message.text));\n\t\tif (firstPromptIndex === -1) {\n\t\t\t// All extension commands - execute them all\n\t\t\tfor (const message of queuedMessages) {\n\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Execute any extension commands before the first prompt\n\t\tconst preCommands = queuedMessages.slice(0, firstPromptIndex);\n\t\tconst firstPrompt = queuedMessages[firstPromptIndex];\n\t\tconst rest = queuedMessages.slice(firstPromptIndex + 1);\n\n\t\tfor (const message of preCommands) {\n\t\t\tawait this.session.prompt(message.text);\n\t\t}\n\n\t\t// Start a prompt when idle, or preserve its delivery mode if a run is\n\t\t// still winding down after compaction.\n\t\tconst promptPromise = this.session\n\t\t\t.prompt(firstPrompt.text, { streamingBehavior: firstPrompt.mode })\n\t\t\t.catch((error) => {\n\t\t\t\trestoreQueue(error);\n\t\t\t});\n\n\t\t// Queue remaining messages\n\t\tfor (const message of rest) {\n\t\t\tif (this.isExtensionCommand(message.text)) {\n\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t} else if (message.mode === \"followUp\") {\n\t\t\t\tawait this.session.followUp(message.text);\n\t\t\t} else {\n\t\t\t\tawait this.session.steer(message.text);\n\t\t\t}\n\t\t}\n\t\tthis.updatePendingMessagesDisplay();\n\t\tvoid promptPromise;\n\t} catch (error) {\n\t\trestoreQueue(error);\n\t}\n};\n\nInteractiveModeBase.prototype.flushPendingBashComponents = function (this: InteractiveModeBase): void {\n\tfor (const component of this.pendingBashComponents) {\n\t\tthis.pendingMessagesContainer.removeChild(component);\n\t\tthis.chatContainer.addChild(component);\n\t}\n\tthis.pendingBashComponents = [];\n};\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-queueing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-queueing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { combineQueuedMessagesForEditor, Spacer, TruncatedText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAllQueuedMessages = function (this: InteractiveModeBase): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\treturn {\n\t\tsteering: [\n\t\t\t...this.session.getSteeringMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"steer\").map((msg) => msg.text),\n\t\t],\n\t\tfollowUp: [\n\t\t\t...this.session.getFollowUpMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"followUp\").map((msg) => msg.text),\n\t\t],\n\t};\n};\n\nInteractiveModeBase.prototype.clearAllQueues = function (\n\tthis: InteractiveModeBase,\n\toptions?: { preserveUnprotectedCustomMessages?: boolean },\n): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\tconst { steering, followUp } = this.session.clearQueue(options);\n\tconst compactionSteering = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"steer\")\n\t\t.map((msg) => msg.text);\n\tconst compactionFollowUp = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"followUp\")\n\t\t.map((msg) => msg.text);\n\tthis.compactionQueuedMessages = [];\n\treturn {\n\t\tsteering: [...steering, ...compactionSteering],\n\t\tfollowUp: [...followUp, ...compactionFollowUp],\n\t};\n};\n\nInteractiveModeBase.prototype.updatePendingMessagesDisplay = function (this: InteractiveModeBase): void {\n\tthis.pendingMessagesContainer.clear();\n\tconst { steering: steeringMessages, followUp: followUpMessages } = this.getAllQueuedMessages();\n\tif (steeringMessages.length > 0 || followUpMessages.length > 0) {\n\t\tthis.pendingMessagesContainer.addChild(new Spacer(1));\n\t\tfor (const message of steeringMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Steering: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tfor (const message of followUpMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Follow-up: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tconst dequeueHint = this.getAppKeyDisplay(\"app.message.dequeue\");\n\t\tconst hintText = theme.fg(\"dim\", `↳ ${dequeueHint} to edit all queued messages`);\n\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(hintText, 1, 0));\n\t}\n};\n\nInteractiveModeBase.prototype.restoreQueuedMessagesToEditor = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\tabort?: boolean;\n\t\tcurrentText?: string;\n\t\tpreserveUnprotectedCustomMessages?: boolean;\n\t},\n): number {\n\tconst { steering, followUp } = this.clearAllQueues(options);\n\tconst allQueued = [...steering, ...followUp];\n\tif (allQueued.length === 0) {\n\t\tthis.updatePendingMessagesDisplay();\n\t\tif (options?.abort) {\n\t\t\tvoid this.session.abort();\n\t\t}\n\t\treturn 0;\n\t}\n\tconst currentText = options?.currentText ?? this.editor.getText();\n\tconst combinedText = combineQueuedMessagesForEditor(allQueued, currentText);\n\tthis.editor.setText(combinedText);\n\tthis.updatePendingMessagesDisplay();\n\tif (options?.abort) {\n\t\tvoid this.session.abort();\n\t}\n\treturn allQueued.length;\n};\n\nInteractiveModeBase.prototype.queueCompactionMessage = function (\n\tthis: InteractiveModeBase,\n\ttext: string,\n\tmode: \"steer\" | \"followUp\",\n): void {\n\tthis.compactionQueuedMessages.push({ text, mode });\n\tthis.editor.addToHistory?.(text);\n\tthis.editor.setText(\"\");\n\tthis.updatePendingMessagesDisplay();\n\tthis.showStatus(\"Queued message for after compaction\");\n};\n\nInteractiveModeBase.prototype.isExtensionCommand = function (this: InteractiveModeBase, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\n\tconst extensionRunner = this.session.extensionRunner;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn !!extensionRunner.getCommand(commandName);\n};\n\nInteractiveModeBase.prototype.flushCompactionQueue = async function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\twillRetry?: boolean;\n\t},\n): Promise<void> {\n\tif (this.compactionQueuedMessages.length === 0) {\n\t\treturn;\n\t}\n\n\tconst queuedMessages = [...this.compactionQueuedMessages];\n\tthis.compactionQueuedMessages = [];\n\tthis.updatePendingMessagesDisplay();\n\n\tconst restoreQueue = (error: unknown) => {\n\t\tthis.session.clearQueue();\n\t\tthis.compactionQueuedMessages = queuedMessages;\n\t\tthis.updatePendingMessagesDisplay();\n\t\tthis.showError(\n\t\t\t`Failed to send queued message${queuedMessages.length > 1 ? \"s\" : \"\"}: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`,\n\t\t);\n\t};\n\n\ttry {\n\t\tif (options?.willRetry) {\n\t\t\t// When retry is pending, queue messages for the retry turn\n\t\t\tfor (const message of queuedMessages) {\n\t\t\t\tif (this.isExtensionCommand(message.text)) {\n\t\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t\t} else if (message.mode === \"followUp\") {\n\t\t\t\t\tawait this.session.followUp(message.text);\n\t\t\t\t} else {\n\t\t\t\t\tawait this.session.steer(message.text);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updatePendingMessagesDisplay();\n\t\t\treturn;\n\t\t}\n\n\t\t// Find first non-extension-command message to use as prompt\n\t\tconst firstPromptIndex = queuedMessages.findIndex((message) => !this.isExtensionCommand(message.text));\n\t\tif (firstPromptIndex === -1) {\n\t\t\t// All extension commands - execute them all\n\t\t\tfor (const message of queuedMessages) {\n\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Execute any extension commands before the first prompt\n\t\tconst preCommands = queuedMessages.slice(0, firstPromptIndex);\n\t\tconst firstPrompt = queuedMessages[firstPromptIndex];\n\t\tconst rest = queuedMessages.slice(firstPromptIndex + 1);\n\n\t\tfor (const message of preCommands) {\n\t\t\tawait this.session.prompt(message.text);\n\t\t}\n\n\t\t// Start a prompt when idle, or preserve its delivery mode if a run is\n\t\t// still winding down after compaction.\n\t\tconst promptPromise = this.session\n\t\t\t.prompt(firstPrompt.text, { streamingBehavior: firstPrompt.mode })\n\t\t\t.catch((error) => {\n\t\t\t\trestoreQueue(error);\n\t\t\t});\n\n\t\t// Queue remaining messages\n\t\tfor (const message of rest) {\n\t\t\tif (this.isExtensionCommand(message.text)) {\n\t\t\t\tawait this.session.prompt(message.text);\n\t\t\t} else if (message.mode === \"followUp\") {\n\t\t\t\tawait this.session.followUp(message.text);\n\t\t\t} else {\n\t\t\t\tawait this.session.steer(message.text);\n\t\t\t}\n\t\t}\n\t\tthis.updatePendingMessagesDisplay();\n\t\tvoid promptPromise;\n\t} catch (error) {\n\t\trestoreQueue(error);\n\t}\n};\n\nInteractiveModeBase.prototype.flushPendingBashComponents = function (this: InteractiveModeBase): void {\n\tfor (const component of this.pendingBashComponents) {\n\t\tthis.pendingMessagesContainer.removeChild(component);\n\t\tthis.chatContainer.addChild(component);\n\t}\n\tthis.pendingBashComponents = [];\n};\n"]}
|
|
@@ -11,6 +11,12 @@ export interface EngineHealthDeps {
|
|
|
11
11
|
}
|
|
12
12
|
export declare const UNEXPECTED_ENGINE_LOSS_NOTICE = "Interactive engine stopped unexpectedly; restarting.";
|
|
13
13
|
export declare const UNRESPONSIVE_ENGINE_NOTICE = "Interactive engine is not responding; restarting.";
|
|
14
|
+
/**
|
|
15
|
+
* Keep the actionable transport cause in the recovery notice. Child stderr can
|
|
16
|
+
* contain provider output or secrets, so only the bounded summary before the
|
|
17
|
+
* RpcClient's `. Stderr:` suffix is safe to render.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatUnexpectedEngineLossNotice(event: InteractiveEngineGenerationEnded): string;
|
|
14
20
|
export interface EngineHealthOptions {
|
|
15
21
|
/** Injectable clock so tests can cross the unresponsive threshold instantly. */
|
|
16
22
|
now?: () => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-health.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAA0B,MAAM,wBAAwB,CAAC;AACjG,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAExF,MAAM,WAAW,gBAAgB;IAChC,gEAAgE;IAChE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,8DAA8D;IAC9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,gFAAgF;IAChF,aAAa,IAAI,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,6BAA6B,yDAAyD,CAAC;AACpG,eAAO,MAAM,0BAA0B,sDAAsD,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IACnC,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAC3C,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAA4B;IAC/C,6EAA6E;IAC7E,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,EAGhE;IAED,YAAY,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI,CAI3D;IAED,6EAA6E;IAC7E,OAAO,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAGpD;IAED,kFAAkF;IAClF,iBAAiB,IAAI,IAAI,CAExB;IAED,2BAA2B,IAAI,IAAI,CAElC;IAED,2BAA2B,IAAI,IAAI,CAElC;IAED;;;;;;;;;;;;;;OAcG;IACH,wBAAwB,IAAI,OAAO,CAGlC;IAED,OAAO,CAAC,SAAS;IAIjB,YAAY,IAAI,OAAO,CAEtB;IAED;;;;;;;OAOG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAWxB;IAED,qBAAqB,CAAC,KAAK,EAAE,gCAAgC,GAAG,IAAI,CAYnE;IAED,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCzB;IAED,mEAAmE;IACnE,OAAO,CAAC,oBAAoB;YASd,WAAW;IASzB,OAAO,CAAC,OAAO;IA6Cf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;CAIf"}
|
|
1
|
+
{"version":3,"file":"engine-health.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAA0B,MAAM,wBAAwB,CAAC;AACjG,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAExF,MAAM,WAAW,gBAAgB;IAChC,gEAAgE;IAChE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,8DAA8D;IAC9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,gFAAgF;IAChF,aAAa,IAAI,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,6BAA6B,yDAAyD,CAAC;AACpG,eAAO,MAAM,0BAA0B,sDAAsD,CAAC;AAE9F;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,gCAAgC,GAAG,MAAM,CAQhG;AAED,MAAM,WAAW,mBAAmB;IACnC,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAC3C,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAA4B;IAC/C,6EAA6E;IAC7E,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,EAGhE;IAED,YAAY,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI,CAI3D;IAED,6EAA6E;IAC7E,OAAO,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAGpD;IAED,kFAAkF;IAClF,iBAAiB,IAAI,IAAI,CAExB;IAED,2BAA2B,IAAI,IAAI,CAElC;IAED,2BAA2B,IAAI,IAAI,CAElC;IAED;;;;;;;;;;;;;;OAcG;IACH,wBAAwB,IAAI,OAAO,CAGlC;IAED,OAAO,CAAC,SAAS;IAIjB,YAAY,IAAI,OAAO,CAEtB;IAED;;;;;;;OAOG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAWxB;IAED,qBAAqB,CAAC,KAAK,EAAE,gCAAgC,GAAG,IAAI,CAYnE;IAED,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCzB;IAED,mEAAmE;IACnE,OAAO,CAAC,oBAAoB;YASd,WAAW;IASzB,OAAO,CAAC,OAAO;IA6Cf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;CAIf"}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { ENGINE_UNRESPONSIVE_MS } from "./activity-watchdog.js";
|
|
2
2
|
export const UNEXPECTED_ENGINE_LOSS_NOTICE = "Interactive engine stopped unexpectedly; restarting.";
|
|
3
3
|
export const UNRESPONSIVE_ENGINE_NOTICE = "Interactive engine is not responding; restarting.";
|
|
4
|
+
/**
|
|
5
|
+
* Keep the actionable transport cause in the recovery notice. Child stderr can
|
|
6
|
+
* contain provider output or secrets, so only the bounded summary before the
|
|
7
|
+
* RpcClient's `. Stderr:` suffix is safe to render.
|
|
8
|
+
*/
|
|
9
|
+
export function formatUnexpectedEngineLossNotice(event) {
|
|
10
|
+
const firstLine = event.error.message.split(/\r?\n/u, 1)[0]?.trim() ?? "";
|
|
11
|
+
const stderrIndex = firstLine.indexOf(". Stderr:");
|
|
12
|
+
const withoutStderr = (stderrIndex === -1 ? firstLine : firstLine.slice(0, stderrIndex)).trim();
|
|
13
|
+
const summary = withoutStderr.slice(0, 240).replace(/[.!?]+$/u, "");
|
|
14
|
+
return summary
|
|
15
|
+
? `${UNEXPECTED_ENGINE_LOSS_NOTICE} Cause (${event.kind}): ${summary}.`
|
|
16
|
+
: `${UNEXPECTED_ENGINE_LOSS_NOTICE} Cause: ${event.kind}.`;
|
|
17
|
+
}
|
|
4
18
|
/**
|
|
5
19
|
* Engine health surface: diagnostic fan-out plus single-flight recovery.
|
|
6
20
|
*
|
|
@@ -115,7 +129,7 @@ export class EngineHealthController {
|
|
|
115
129
|
this.replacementNeeded = true;
|
|
116
130
|
return;
|
|
117
131
|
}
|
|
118
|
-
void this.recover(
|
|
132
|
+
void this.recover(formatUnexpectedEngineLossNotice(event)).catch(() => { });
|
|
119
133
|
}
|
|
120
134
|
terminate() {
|
|
121
135
|
// A repeat Ctrl+C must be able to rescue a replacement that is itself
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-health.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-health.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ActivityWatchdogDiagnostic, ENGINE_UNRESPONSIVE_MS } from \"./activity-watchdog.ts\";\nimport type { InteractiveEngineGenerationEnded } from \"./engine-generation.ts\";\n\nexport type EngineDiagnosticListener = (diagnostic: ActivityWatchdogDiagnostic) => void;\n\nexport interface EngineHealthDeps {\n\t/** Terminate the current (or hung replacement) engine child. */\n\tstop(): Promise<void>;\n\t/** Replace the engine child and reload host state from it. */\n\trestart(): Promise<void>;\n\t/** Drop streaming/compaction/callback activity owned by the dead generation. */\n\tclearActivity(): void;\n}\n\nexport const UNEXPECTED_ENGINE_LOSS_NOTICE = \"Interactive engine stopped unexpectedly; restarting.\";\nexport const UNRESPONSIVE_ENGINE_NOTICE = \"Interactive engine is not responding; restarting.\";\n\nexport interface EngineHealthOptions {\n\t/** Injectable clock so tests can cross the unresponsive threshold instantly. */\n\tnow?: () => number;\n}\n\n/**\n * Engine health surface: diagnostic fan-out plus single-flight recovery.\n *\n * Recovery has exactly two entry points, deliberately separate:\n *\n * - {@link handleGenerationEnded} runs ONE automatic replacement attempt after\n * an unexpected loss of a generation. Expected losses (explicit stop,\n * deliberate generation replacement, host shutdown) never restart.\n * - {@link terminate} is the explicit user escape hatch (Ctrl+C). It force-stops\n * first, so it can rescue a replacement child that is hung waiting for\n * readiness instead of joining that pending promise.\n *\n * Neither path is reachable from an interrupt: pressing Escape only requests the\n * engine's own cooperative abort and waits for it.\n */\nexport class EngineHealthController {\n\tprivate readonly deps: EngineHealthDeps;\n\tprivate readonly now: () => number;\n\tprivate readonly listeners = new Set<EngineDiagnosticListener>();\n\tprivate pending: ActivityWatchdogDiagnostic[] = [];\n\tprivate unresponsive = false;\n\tprivate abortStartedAt: number | undefined;\n\tprivate attempt: Promise<void> | undefined;\n\t/** When the current replacement attempt began; undefined once it settles. */\n\tprivate attemptStartedAt: number | undefined;\n\tprivate attemptId = 0;\n\tprivate forceStoppedAttemptId: number | undefined;\n\tprivate rescueRequested = false;\n\t/**\n\t * Latched when a replacement failed on its own. Automatic recovery stays\n\t * single-shot, but the user's Ctrl+C must remain able to try again: without\n\t * this the host would be left with no engine, no pending attempt, no overdue\n\t * abort, and no watchdog flag, so nothing could arm the escape hatch.\n\t */\n\tprivate replacementNeeded = false;\n\tprivate termination: Promise<void> | undefined;\n\t/** Set once disposal begins; joins the in-flight attempt and termination. */\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate stopped = false;\n\n\tconstructor(deps: EngineHealthDeps, options?: EngineHealthOptions) {\n\t\tthis.deps = deps;\n\t\tthis.now = options?.now ?? (() => performance.now());\n\t}\n\n\tonDiagnostic(listener: EngineDiagnosticListener): () => void {\n\t\tfor (const diagnostic of this.pending.splice(0)) listener(diagnostic);\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/** Publish a diagnostic produced elsewhere (watchdog, transport, bridge). */\n\tpublish(diagnostic: ActivityWatchdogDiagnostic): void {\n\t\tif (diagnostic.level === \"unresponsive\" && diagnostic.source === \"watchdog\") this.unresponsive = true;\n\t\tthis.deliver(diagnostic);\n\t}\n\n\t/** A heartbeat proves the child's loop turns again, so clear a reported stall. */\n\tclearUnresponsive(): void {\n\t\tthis.unresponsive = false;\n\t}\n\n\tmarkCooperativeAbortStarted(): void {\n\t\tthis.abortStartedAt ??= this.now();\n\t}\n\n\tmarkCooperativeAbortSettled(): void {\n\t\tthis.abortStartedAt = undefined;\n\t}\n\n\t/**\n\t * True only when the engine is provably not answering:\n\t *\n\t * - the heartbeat watchdog declared it unresponsive;\n\t * - a replacement failed on its own and the host has no engine;\n\t * - a cooperative abort has been outstanding past the unresponsive threshold\n\t * (a child whose loop still turns but is deadlocked);\n\t * - a replacement has been waiting for `engine_ready` past that threshold.\n\t *\n\t * The readiness case has no watchdog coverage at all: a child stopped before\n\t * readiness emits no heartbeat and no diagnostic, and `start()` waits without\n\t * a deadline by design. Crossing a threshold arms nothing on its own — it\n\t * only decides whether a deliberate Ctrl+C escalates — and all of this stays\n\t * false for a healthy engine so a stray second Ctrl+C cannot replace one.\n\t */\n\tneedsExplicitTermination(): boolean {\n\t\tif (this.unresponsive || this.replacementNeeded) return true;\n\t\treturn this.isOverdue(this.abortStartedAt) || this.isOverdue(this.attemptStartedAt);\n\t}\n\n\tprivate isOverdue(startedAt: number | undefined): boolean {\n\t\treturn startedAt !== undefined && this.now() - startedAt >= ENGINE_UNRESPONSIVE_MS;\n\t}\n\n\tisRecovering(): boolean {\n\t\treturn this.attempt !== undefined || this.termination !== undefined;\n\t}\n\n\t/**\n\t * Stop accepting recovery work and join whatever is still running.\n\t *\n\t * Disposal must not return while a replacement is between its own stop and\n\t * its spawn: the client's restart permit is voided by `deps.stop()`, and the\n\t * attempt is then awaited so no child, and no host initialization, outlives\n\t * teardown. Idempotent, and bounded by the client's own stop deadlines.\n\t */\n\tshutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.stopped = true;\n\t\tthis.rescueRequested = false;\n\t\tthis.replacementNeeded = false;\n\t\tthis.shutdownPromise = (async () => {\n\t\t\tawait this.stopQuietly();\n\t\t\tawait this.attempt?.catch(() => {});\n\t\t\tawait this.termination?.catch(() => {});\n\t\t})();\n\t\treturn this.shutdownPromise;\n\t}\n\n\thandleGenerationEnded(event: InteractiveEngineGenerationEnded): void {\n\t\tthis.deps.clearActivity();\n\t\tif (event.expected || this.stopped) return;\n\t\tif (this.attempt) {\n\t\t\t// A newer child died while the replacement attempt was still running, so\n\t\t\t// that attempt cannot leave a viable generation behind. Latch instead of\n\t\t\t// restarting again: automatic recovery stays single-shot, and Ctrl+C is\n\t\t\t// armed once the in-flight attempt settles.\n\t\t\tthis.replacementNeeded = true;\n\t\t\treturn;\n\t\t}\n\t\tvoid this.recover(UNEXPECTED_ENGINE_LOSS_NOTICE).catch(() => {});\n\t}\n\n\tterminate(): Promise<void> {\n\t\t// A repeat Ctrl+C must be able to rescue a replacement that is itself\n\t\t// overdue, instead of joining the in-flight termination forever. The stop\n\t\t// is fenced by attempt id so repeated presses cannot stack restarts onto a\n\t\t// healthy replacement.\n\t\tif (this.termination) {\n\t\t\tthis.rescueOverdueAttempt();\n\t\t\treturn this.termination;\n\t\t}\n\t\tconst inFlight = this.attempt;\n\t\t// The attempt this press supersedes fails by our own hand, so its failure is\n\t\t// expected rather than something to report to the user.\n\t\tif (inFlight) this.forceStoppedAttemptId = this.attemptId;\n\t\tconst run = (async () => {\n\t\t\tthis.deps.clearActivity();\n\t\t\tthis.notice(UNRESPONSIVE_ENGINE_NOTICE);\n\t\t\tawait this.stopQuietly();\n\t\t\t// An automatic attempt swallows its own errors, so this only waits for it\n\t\t\t// to release the single-flight slot.\n\t\t\tif (inFlight) await inFlight;\n\t\t\tawait this.recover(undefined);\n\t\t\t// Each user-forced stop of an overdue replacement earns exactly one more\n\t\t\t// replacement attempt, so the escape hatch stays usable indefinitely.\n\t\t\twhile (this.rescueRequested && !this.stopped) {\n\t\t\t\tthis.rescueRequested = false;\n\t\t\t\tthis.notice(UNRESPONSIVE_ENGINE_NOTICE);\n\t\t\t\tawait this.recover(undefined);\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tif (this.termination === run) this.termination = undefined;\n\t\t});\n\t\tthis.termination = run;\n\t\treturn run;\n\t}\n\n\t/** Force-stop an overdue replacement, at most once per attempt. */\n\tprivate rescueOverdueAttempt(): boolean {\n\t\tif (!this.isOverdue(this.attemptStartedAt)) return false;\n\t\tif (this.forceStoppedAttemptId === this.attemptId) return false;\n\t\tthis.forceStoppedAttemptId = this.attemptId;\n\t\tthis.rescueRequested = true;\n\t\tvoid this.stopQuietly();\n\t\treturn true;\n\t}\n\n\tprivate async stopQuietly(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.deps.stop();\n\t\t} catch {\n\t\t\t// A stop failure must not strand the escape hatch: the restart still\n\t\t\t// replaces the child and reports any real failure.\n\t\t}\n\t}\n\n\tprivate recover(notice: string | undefined): Promise<void> {\n\t\t// Order matters: after shutdown no caller may join, or revive, an attempt\n\t\t// that still happens to occupy the slot.\n\t\tif (this.stopped) return Promise.resolve();\n\t\tif (this.attempt) return this.attempt;\n\t\tif (notice) this.notice(notice);\n\t\tthis.attemptId += 1;\n\t\tconst id = this.attemptId;\n\t\tthis.attemptStartedAt = this.now();\n\t\tthis.rescueRequested = false;\n\t\t// A new attempt is under way, so the previous failure is no longer the\n\t\t// reason to arm Ctrl+C. It re-arms below only if this attempt fails too.\n\t\tthis.replacementNeeded = false;\n\t\t// The watchdog verdict belonged to the generation being replaced. A fresh\n\t\t// child emits no heartbeat until it is ready, so leaving the latch set\n\t\t// would keep `needsExplicitTermination()` true through the whole pre-ready\n\t\t// window and let the first Ctrl+C stop a replacement that never misbehaved.\n\t\t// Only this child's own heartbeat, or its own stall, may set it again.\n\t\tthis.unresponsive = false;\n\t\tconst run = this.deps\n\t\t\t.restart()\n\t\t\t.catch((error: Error) => {\n\t\t\t\t// An attempt the user deliberately stopped, or one cancelled by\n\t\t\t\t// disposal, did not fail on its own.\n\t\t\t\tif (this.forceStoppedAttemptId === id || this.stopped) return;\n\t\t\t\t// Keep Ctrl+C armed: automatic recovery is single-shot, but the user\n\t\t\t\t// must be able to ask for another attempt after a real failure.\n\t\t\t\tthis.replacementNeeded = true;\n\t\t\t\t// A concrete failure, so no operational source: this one surfaces.\n\t\t\t\tthis.deliver({\n\t\t\t\t\tactivity: undefined,\n\t\t\t\t\telapsedMs: 0,\n\t\t\t\t\tlevel: \"unresponsive\",\n\t\t\t\t\tmessage: `Interactive engine restart failed: ${error.message}`,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (this.attempt !== run) return;\n\t\t\t\tthis.attempt = undefined;\n\t\t\t\tthis.attemptStartedAt = undefined;\n\t\t\t});\n\t\tthis.attempt = run;\n\t\treturn run;\n\t}\n\n\tprivate notice(message: string): void {\n\t\tthis.deliver({ activity: undefined, elapsedMs: 0, level: \"blocking\", message, source: \"recovery\" });\n\t}\n\n\tprivate deliver(diagnostic: ActivityWatchdogDiagnostic): void {\n\t\tif (this.listeners.size === 0) this.pending.push(diagnostic);\n\t\tfor (const listener of this.listeners) listener(diagnostic);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engine-health.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-health.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ActivityWatchdogDiagnostic, ENGINE_UNRESPONSIVE_MS } from \"./activity-watchdog.ts\";\nimport type { InteractiveEngineGenerationEnded } from \"./engine-generation.ts\";\n\nexport type EngineDiagnosticListener = (diagnostic: ActivityWatchdogDiagnostic) => void;\n\nexport interface EngineHealthDeps {\n\t/** Terminate the current (or hung replacement) engine child. */\n\tstop(): Promise<void>;\n\t/** Replace the engine child and reload host state from it. */\n\trestart(): Promise<void>;\n\t/** Drop streaming/compaction/callback activity owned by the dead generation. */\n\tclearActivity(): void;\n}\n\nexport const UNEXPECTED_ENGINE_LOSS_NOTICE = \"Interactive engine stopped unexpectedly; restarting.\";\nexport const UNRESPONSIVE_ENGINE_NOTICE = \"Interactive engine is not responding; restarting.\";\n\n/**\n * Keep the actionable transport cause in the recovery notice. Child stderr can\n * contain provider output or secrets, so only the bounded summary before the\n * RpcClient's `. Stderr:` suffix is safe to render.\n */\nexport function formatUnexpectedEngineLossNotice(event: InteractiveEngineGenerationEnded): string {\n\tconst firstLine = event.error.message.split(/\\r?\\n/u, 1)[0]?.trim() ?? \"\";\n\tconst stderrIndex = firstLine.indexOf(\". Stderr:\");\n\tconst withoutStderr = (stderrIndex === -1 ? firstLine : firstLine.slice(0, stderrIndex)).trim();\n\tconst summary = withoutStderr.slice(0, 240).replace(/[.!?]+$/u, \"\");\n\treturn summary\n\t\t? `${UNEXPECTED_ENGINE_LOSS_NOTICE} Cause (${event.kind}): ${summary}.`\n\t\t: `${UNEXPECTED_ENGINE_LOSS_NOTICE} Cause: ${event.kind}.`;\n}\n\nexport interface EngineHealthOptions {\n\t/** Injectable clock so tests can cross the unresponsive threshold instantly. */\n\tnow?: () => number;\n}\n\n/**\n * Engine health surface: diagnostic fan-out plus single-flight recovery.\n *\n * Recovery has exactly two entry points, deliberately separate:\n *\n * - {@link handleGenerationEnded} runs ONE automatic replacement attempt after\n * an unexpected loss of a generation. Expected losses (explicit stop,\n * deliberate generation replacement, host shutdown) never restart.\n * - {@link terminate} is the explicit user escape hatch (Ctrl+C). It force-stops\n * first, so it can rescue a replacement child that is hung waiting for\n * readiness instead of joining that pending promise.\n *\n * Neither path is reachable from an interrupt: pressing Escape only requests the\n * engine's own cooperative abort and waits for it.\n */\nexport class EngineHealthController {\n\tprivate readonly deps: EngineHealthDeps;\n\tprivate readonly now: () => number;\n\tprivate readonly listeners = new Set<EngineDiagnosticListener>();\n\tprivate pending: ActivityWatchdogDiagnostic[] = [];\n\tprivate unresponsive = false;\n\tprivate abortStartedAt: number | undefined;\n\tprivate attempt: Promise<void> | undefined;\n\t/** When the current replacement attempt began; undefined once it settles. */\n\tprivate attemptStartedAt: number | undefined;\n\tprivate attemptId = 0;\n\tprivate forceStoppedAttemptId: number | undefined;\n\tprivate rescueRequested = false;\n\t/**\n\t * Latched when a replacement failed on its own. Automatic recovery stays\n\t * single-shot, but the user's Ctrl+C must remain able to try again: without\n\t * this the host would be left with no engine, no pending attempt, no overdue\n\t * abort, and no watchdog flag, so nothing could arm the escape hatch.\n\t */\n\tprivate replacementNeeded = false;\n\tprivate termination: Promise<void> | undefined;\n\t/** Set once disposal begins; joins the in-flight attempt and termination. */\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate stopped = false;\n\n\tconstructor(deps: EngineHealthDeps, options?: EngineHealthOptions) {\n\t\tthis.deps = deps;\n\t\tthis.now = options?.now ?? (() => performance.now());\n\t}\n\n\tonDiagnostic(listener: EngineDiagnosticListener): () => void {\n\t\tfor (const diagnostic of this.pending.splice(0)) listener(diagnostic);\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/** Publish a diagnostic produced elsewhere (watchdog, transport, bridge). */\n\tpublish(diagnostic: ActivityWatchdogDiagnostic): void {\n\t\tif (diagnostic.level === \"unresponsive\" && diagnostic.source === \"watchdog\") this.unresponsive = true;\n\t\tthis.deliver(diagnostic);\n\t}\n\n\t/** A heartbeat proves the child's loop turns again, so clear a reported stall. */\n\tclearUnresponsive(): void {\n\t\tthis.unresponsive = false;\n\t}\n\n\tmarkCooperativeAbortStarted(): void {\n\t\tthis.abortStartedAt ??= this.now();\n\t}\n\n\tmarkCooperativeAbortSettled(): void {\n\t\tthis.abortStartedAt = undefined;\n\t}\n\n\t/**\n\t * True only when the engine is provably not answering:\n\t *\n\t * - the heartbeat watchdog declared it unresponsive;\n\t * - a replacement failed on its own and the host has no engine;\n\t * - a cooperative abort has been outstanding past the unresponsive threshold\n\t * (a child whose loop still turns but is deadlocked);\n\t * - a replacement has been waiting for `engine_ready` past that threshold.\n\t *\n\t * The readiness case has no watchdog coverage at all: a child stopped before\n\t * readiness emits no heartbeat and no diagnostic, and `start()` waits without\n\t * a deadline by design. Crossing a threshold arms nothing on its own — it\n\t * only decides whether a deliberate Ctrl+C escalates — and all of this stays\n\t * false for a healthy engine so a stray second Ctrl+C cannot replace one.\n\t */\n\tneedsExplicitTermination(): boolean {\n\t\tif (this.unresponsive || this.replacementNeeded) return true;\n\t\treturn this.isOverdue(this.abortStartedAt) || this.isOverdue(this.attemptStartedAt);\n\t}\n\n\tprivate isOverdue(startedAt: number | undefined): boolean {\n\t\treturn startedAt !== undefined && this.now() - startedAt >= ENGINE_UNRESPONSIVE_MS;\n\t}\n\n\tisRecovering(): boolean {\n\t\treturn this.attempt !== undefined || this.termination !== undefined;\n\t}\n\n\t/**\n\t * Stop accepting recovery work and join whatever is still running.\n\t *\n\t * Disposal must not return while a replacement is between its own stop and\n\t * its spawn: the client's restart permit is voided by `deps.stop()`, and the\n\t * attempt is then awaited so no child, and no host initialization, outlives\n\t * teardown. Idempotent, and bounded by the client's own stop deadlines.\n\t */\n\tshutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.stopped = true;\n\t\tthis.rescueRequested = false;\n\t\tthis.replacementNeeded = false;\n\t\tthis.shutdownPromise = (async () => {\n\t\t\tawait this.stopQuietly();\n\t\t\tawait this.attempt?.catch(() => {});\n\t\t\tawait this.termination?.catch(() => {});\n\t\t})();\n\t\treturn this.shutdownPromise;\n\t}\n\n\thandleGenerationEnded(event: InteractiveEngineGenerationEnded): void {\n\t\tthis.deps.clearActivity();\n\t\tif (event.expected || this.stopped) return;\n\t\tif (this.attempt) {\n\t\t\t// A newer child died while the replacement attempt was still running, so\n\t\t\t// that attempt cannot leave a viable generation behind. Latch instead of\n\t\t\t// restarting again: automatic recovery stays single-shot, and Ctrl+C is\n\t\t\t// armed once the in-flight attempt settles.\n\t\t\tthis.replacementNeeded = true;\n\t\t\treturn;\n\t\t}\n\t\tvoid this.recover(formatUnexpectedEngineLossNotice(event)).catch(() => {});\n\t}\n\n\tterminate(): Promise<void> {\n\t\t// A repeat Ctrl+C must be able to rescue a replacement that is itself\n\t\t// overdue, instead of joining the in-flight termination forever. The stop\n\t\t// is fenced by attempt id so repeated presses cannot stack restarts onto a\n\t\t// healthy replacement.\n\t\tif (this.termination) {\n\t\t\tthis.rescueOverdueAttempt();\n\t\t\treturn this.termination;\n\t\t}\n\t\tconst inFlight = this.attempt;\n\t\t// The attempt this press supersedes fails by our own hand, so its failure is\n\t\t// expected rather than something to report to the user.\n\t\tif (inFlight) this.forceStoppedAttemptId = this.attemptId;\n\t\tconst run = (async () => {\n\t\t\tthis.deps.clearActivity();\n\t\t\tthis.notice(UNRESPONSIVE_ENGINE_NOTICE);\n\t\t\tawait this.stopQuietly();\n\t\t\t// An automatic attempt swallows its own errors, so this only waits for it\n\t\t\t// to release the single-flight slot.\n\t\t\tif (inFlight) await inFlight;\n\t\t\tawait this.recover(undefined);\n\t\t\t// Each user-forced stop of an overdue replacement earns exactly one more\n\t\t\t// replacement attempt, so the escape hatch stays usable indefinitely.\n\t\t\twhile (this.rescueRequested && !this.stopped) {\n\t\t\t\tthis.rescueRequested = false;\n\t\t\t\tthis.notice(UNRESPONSIVE_ENGINE_NOTICE);\n\t\t\t\tawait this.recover(undefined);\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tif (this.termination === run) this.termination = undefined;\n\t\t});\n\t\tthis.termination = run;\n\t\treturn run;\n\t}\n\n\t/** Force-stop an overdue replacement, at most once per attempt. */\n\tprivate rescueOverdueAttempt(): boolean {\n\t\tif (!this.isOverdue(this.attemptStartedAt)) return false;\n\t\tif (this.forceStoppedAttemptId === this.attemptId) return false;\n\t\tthis.forceStoppedAttemptId = this.attemptId;\n\t\tthis.rescueRequested = true;\n\t\tvoid this.stopQuietly();\n\t\treturn true;\n\t}\n\n\tprivate async stopQuietly(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.deps.stop();\n\t\t} catch {\n\t\t\t// A stop failure must not strand the escape hatch: the restart still\n\t\t\t// replaces the child and reports any real failure.\n\t\t}\n\t}\n\n\tprivate recover(notice: string | undefined): Promise<void> {\n\t\t// Order matters: after shutdown no caller may join, or revive, an attempt\n\t\t// that still happens to occupy the slot.\n\t\tif (this.stopped) return Promise.resolve();\n\t\tif (this.attempt) return this.attempt;\n\t\tif (notice) this.notice(notice);\n\t\tthis.attemptId += 1;\n\t\tconst id = this.attemptId;\n\t\tthis.attemptStartedAt = this.now();\n\t\tthis.rescueRequested = false;\n\t\t// A new attempt is under way, so the previous failure is no longer the\n\t\t// reason to arm Ctrl+C. It re-arms below only if this attempt fails too.\n\t\tthis.replacementNeeded = false;\n\t\t// The watchdog verdict belonged to the generation being replaced. A fresh\n\t\t// child emits no heartbeat until it is ready, so leaving the latch set\n\t\t// would keep `needsExplicitTermination()` true through the whole pre-ready\n\t\t// window and let the first Ctrl+C stop a replacement that never misbehaved.\n\t\t// Only this child's own heartbeat, or its own stall, may set it again.\n\t\tthis.unresponsive = false;\n\t\tconst run = this.deps\n\t\t\t.restart()\n\t\t\t.catch((error: Error) => {\n\t\t\t\t// An attempt the user deliberately stopped, or one cancelled by\n\t\t\t\t// disposal, did not fail on its own.\n\t\t\t\tif (this.forceStoppedAttemptId === id || this.stopped) return;\n\t\t\t\t// Keep Ctrl+C armed: automatic recovery is single-shot, but the user\n\t\t\t\t// must be able to ask for another attempt after a real failure.\n\t\t\t\tthis.replacementNeeded = true;\n\t\t\t\t// A concrete failure, so no operational source: this one surfaces.\n\t\t\t\tthis.deliver({\n\t\t\t\t\tactivity: undefined,\n\t\t\t\t\telapsedMs: 0,\n\t\t\t\t\tlevel: \"unresponsive\",\n\t\t\t\t\tmessage: `Interactive engine restart failed: ${error.message}`,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (this.attempt !== run) return;\n\t\t\t\tthis.attempt = undefined;\n\t\t\t\tthis.attemptStartedAt = undefined;\n\t\t\t});\n\t\tthis.attempt = run;\n\t\treturn run;\n\t}\n\n\tprivate notice(message: string): void {\n\t\tthis.deliver({ activity: undefined, elapsedMs: 0, level: \"blocking\", message, source: \"recovery\" });\n\t}\n\n\tprivate deliver(diagnostic: ActivityWatchdogDiagnostic): void {\n\t\tif (this.listeners.size === 0) this.pending.push(diagnostic);\n\t\tfor (const listener of this.listeners) listener(diagnostic);\n\t}\n}\n"]}
|
|
@@ -9,7 +9,7 @@ export async function loginIsolatedOAuthProvider(session, client, catalog, provi
|
|
|
9
9
|
catalog.apply(remoteCatalog);
|
|
10
10
|
// The engine owns persistence. Refresh the frontend snapshot only after its
|
|
11
11
|
// credential transaction and catalog refresh both complete successfully.
|
|
12
|
-
await session.modelRuntime.reloadCredentials();
|
|
12
|
+
await session.modelRuntime.reloadCredentials({ refreshAvailability: false });
|
|
13
13
|
return { modelsRefreshed: true };
|
|
14
14
|
}
|
|
15
15
|
//# sourceMappingURL=isolated-auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolated-auth.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/isolated-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,6GAA6G;AAC7G,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,OAAqB,EACrB,MAAiB,EACjB,OAA2B,EAC3B,QAAgB,EAChB,SAAoC;IAEpC,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/E,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,wBAAwB,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"isolated-auth.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/isolated-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,6GAA6G;AAC7G,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,OAAqB,EACrB,MAAiB,EACjB,OAA2B,EAC3B,QAAgB,EAChB,SAAoC;IAEpC,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/E,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,wBAAwB,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC","sourcesContent":["import type { AgentSession } from \"../../core/agent-session.ts\";\nimport { type AtomicOAuthLoginCallbacks, normalizeOAuthLoginError } from \"../../core/oauth-login.ts\";\nimport type { RpcClient } from \"../rpc/rpc-client.ts\";\nimport { loginRpcOAuthProvider } from \"../rpc/rpc-oauth-client.ts\";\nimport type { RemoteModelCatalog } from \"./remote-model-catalog.ts\";\n\nexport type { AtomicOAuthLoginCallbacks } from \"../../core/oauth-login.ts\";\n\n/** Acquire and persist OAuth entirely in the engine, transporting only UI callbacks and catalog metadata. */\nexport async function loginIsolatedOAuthProvider(\n\tsession: AgentSession,\n\tclient: RpcClient,\n\tcatalog: RemoteModelCatalog,\n\tprovider: string,\n\tcallbacks: AtomicOAuthLoginCallbacks,\n): Promise<{ modelsRefreshed: true }> {\n\tconst remoteCatalog = await loginRpcOAuthProvider(client, provider, callbacks);\n\tif (remoteCatalog.cancelled) {\n\t\tthrow normalizeOAuthLoginError(callbacks.signal?.reason ?? new Error(\"Login cancelled\"), callbacks.signal);\n\t}\n\tcatalog.apply(remoteCatalog);\n\t// The engine owns persistence. Refresh the frontend snapshot only after its\n\t// credential transaction and catalog refresh both complete successfully.\n\tawait session.modelRuntime.reloadCredentials({ refreshAvailability: false });\n\treturn { modelsRefreshed: true };\n}\n"]}
|
|
@@ -14,6 +14,7 @@ export declare class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
14
14
|
private readonly patchedSessions;
|
|
15
15
|
private streaming;
|
|
16
16
|
private compacting;
|
|
17
|
+
private compactionReason;
|
|
17
18
|
private readonly activeBashRequestIds;
|
|
18
19
|
private steeringMessages;
|
|
19
20
|
private followUpMessages;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolated-runtime.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/isolated-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"isolated-runtime.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/isolated-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
31
31
|
clearActivity: () => {
|
|
32
32
|
this.streaming = false;
|
|
33
33
|
this.compacting = false;
|
|
34
|
+
this.compactionReason = undefined;
|
|
34
35
|
this.engineCallbackActive = false;
|
|
35
36
|
this.health.markCooperativeAbortSettled();
|
|
36
37
|
},
|
|
@@ -62,6 +63,7 @@ export class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
62
63
|
this.remoteSessionFile = state.sessionFile;
|
|
63
64
|
this.streaming = state.isStreaming;
|
|
64
65
|
this.compacting = state.isCompacting;
|
|
66
|
+
this.compactionReason = state.isCompacting ? state.compactionReason : undefined;
|
|
65
67
|
this.queuePause.synchronize(state.queuedMessagesPaused === true);
|
|
66
68
|
this.replaceModelFallback(state.modelFallbackMessage, state.modelFallbackReason);
|
|
67
69
|
this.refreshSessionView();
|
|
@@ -78,7 +80,8 @@ export class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
78
80
|
async logoutProvider(provider) {
|
|
79
81
|
const result = await this.client.logoutProvider(provider);
|
|
80
82
|
this.remoteModelCatalog.applyModels({ models: result.models, scopedModels: result.scopedModels ?? [] });
|
|
81
|
-
await super.session.modelRuntime.reloadCredentials();
|
|
83
|
+
await super.session.modelRuntime.reloadCredentials({ refreshAvailability: false });
|
|
84
|
+
super.session.modelRuntime.applyExternalProviderAuthStatus(provider, result.authStatus);
|
|
82
85
|
super.session.refreshCurrentModelFromRegistry();
|
|
83
86
|
return result;
|
|
84
87
|
}
|
|
@@ -254,6 +257,7 @@ export class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
254
257
|
Object.defineProperties(session, {
|
|
255
258
|
isStreaming: { configurable: true, get: () => this.streaming },
|
|
256
259
|
isCompacting: { configurable: true, get: () => this.compacting },
|
|
260
|
+
compactionReason: { configurable: true, get: () => this.compactionReason },
|
|
257
261
|
isBashRunning: { configurable: true, get: () => this.activeBashRequestIds.size > 0 },
|
|
258
262
|
sessionName: { configurable: true, get: () => this.remoteSessionName },
|
|
259
263
|
sessionFile: { configurable: true, get: () => this.remoteSessionFile },
|
|
@@ -491,9 +495,11 @@ export class IsolatedInteractiveRuntime extends AgentSessionRuntime {
|
|
|
491
495
|
break;
|
|
492
496
|
case "compaction_start":
|
|
493
497
|
this.compacting = true;
|
|
498
|
+
this.compactionReason = event.reason;
|
|
494
499
|
break;
|
|
495
500
|
case "compaction_end":
|
|
496
501
|
this.compacting = false;
|
|
502
|
+
this.compactionReason = undefined;
|
|
497
503
|
break;
|
|
498
504
|
case "queue_update":
|
|
499
505
|
this.steeringMessages = [...event.steering];
|