@ai-agent-forge/agent-forge 0.86.7 → 0.88.0
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 +45 -0
- package/README.md +10 -11
- package/dist/artifacts/artifact-store.d.ts.map +1 -1
- package/dist/artifacts/artifact-store.js +9 -5
- package/dist/artifacts/artifact-store.js.map +1 -1
- package/dist/bundle/.build-manifest.json +430 -413
- package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
- package/dist/bundle/chunks/chunk-HLJEVRWP.js +13 -0
- package/dist/bundle/chunks/chunk-YGHQME4V.js +1456 -0
- package/dist/bundle/chunks/image-resize-worker.js +12 -1
- package/dist/bundle/chunks/{virtual-modules-3IZ4MYSQ.js → virtual-modules-KZ5DRH7Q.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +2 -2
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +231 -185
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js +17 -4
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +15 -9
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +14 -7
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/experimental/command.js +6 -5
- package/dist/cli/experimental/command.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +9 -8
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/plugin-manager-controller.d.ts.map +1 -1
- package/dist/cli/plugin-manager-controller.js +2 -1
- package/dist/cli/plugin-manager-controller.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +8 -5
- package/dist/cli/serve.js.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js +16 -9
- package/dist/client/remote-session.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-capability-contract.d.ts +0 -7
- package/dist/core/agent-capability-contract.d.ts.map +1 -1
- package/dist/core/agent-capability-contract.js +72 -68
- package/dist/core/agent-capability-contract.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +5 -4
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +6 -10
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +35 -133
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-context.d.ts.map +1 -1
- package/dist/core/agent-session-context.js +18 -13
- package/dist/core/agent-session-context.js.map +1 -1
- package/dist/core/agent-session-internal.d.ts +0 -6
- package/dist/core/agent-session-internal.d.ts.map +1 -1
- package/dist/core/agent-session-internal.js.map +1 -1
- package/dist/core/agent-session-model.d.ts.map +1 -1
- package/dist/core/agent-session-model.js +2 -1
- package/dist/core/agent-session-model.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +3 -3
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +7 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-tools.d.ts.map +1 -1
- package/dist/core/agent-session-tools.js +3 -2
- package/dist/core/agent-session-tools.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -22
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +147 -67
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +11 -5
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +9 -6
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +2 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/embedded-sdk.d.ts.map +1 -1
- package/dist/core/embedded-sdk.js +10 -6
- package/dist/core/embedded-sdk.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +9 -4
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/extensions/agent-composition.d.ts.map +1 -1
- package/dist/core/extensions/agent-composition.js +26 -19
- package/dist/core/extensions/agent-composition.js.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
- package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-compaction-policy.js +0 -34
- package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
- package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.js +4 -3
- package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-skills.js +7 -6
- package/dist/core/extensions/bootstrap-skills.js.map +1 -1
- package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-tools.js +2 -1
- package/dist/core/extensions/bootstrap-tools.js.map +1 -1
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
- package/dist/core/extensions/capability-plugin.js +37 -13
- package/dist/core/extensions/capability-plugin.js.map +1 -1
- package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-events.js +17 -13
- package/dist/core/extensions/capability-runtime-events.js.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.js +16 -15
- package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.js +52 -30
- package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.js +66 -65
- package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime.js +147 -127
- package/dist/core/extensions/capability-runtime.js.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
- package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
- package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
- package/dist/core/extensions/context-strategy-binding.js +7 -4
- package/dist/core/extensions/context-strategy-binding.js.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.js +290 -279
- package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
- package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
- package/dist/core/extensions/provider-failover.d.ts +7 -3
- package/dist/core/extensions/provider-failover.d.ts.map +1 -1
- package/dist/core/extensions/provider-failover.js +9 -8
- package/dist/core/extensions/provider-failover.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +6 -6
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +2 -3
- package/dist/core/facade/coding-agent-facade.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/i18n/index.d.ts +14 -0
- package/dist/core/i18n/index.d.ts.map +1 -0
- package/dist/core/i18n/index.js +67 -0
- package/dist/core/i18n/index.js.map +1 -0
- package/dist/core/i18n/locales/en/example.d.ts +7 -0
- package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/en/example.js +7 -0
- package/dist/core/i18n/locales/en/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.js +229 -0
- package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.js +6 -0
- package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.js +10 -0
- package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.js +41 -0
- package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js +267 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +286 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
- package/dist/core/keybindings.d.ts +15 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +18 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +5 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-config.d.ts +0 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +9 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +11 -7
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-install-host.d.ts.map +1 -1
- package/dist/core/package-install-host.js +4 -3
- package/dist/core/package-install-host.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +15 -10
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-resource-collection.d.ts.map +1 -1
- package/dist/core/package-resource-collection.js +2 -1
- package/dist/core/package-resource-collection.js.map +1 -1
- package/dist/core/package-source.d.ts.map +1 -1
- package/dist/core/package-source.js +3 -2
- package/dist/core/package-source.js.map +1 -1
- package/dist/core/provider-composer.d.ts +2 -2
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +29 -21
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +6 -2
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +15 -5
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/sdk.d.ts +27 -5
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +80 -55
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +5 -2
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js +2 -1
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +39 -29
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +3 -3
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/settings-manager.d.ts +20 -20
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +47 -59
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +53 -32
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +25 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -4
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +3 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +2 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +6 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/durable/durable-service.d.ts.map +1 -1
- package/dist/durable/durable-service.js +25 -18
- package/dist/durable/durable-service.js.map +1 -1
- package/dist/host/checkpoint-commit.d.ts.map +1 -1
- package/dist/host/checkpoint-commit.js +2 -1
- package/dist/host/checkpoint-commit.js.map +1 -1
- package/dist/host/manual-compaction.d.ts.map +1 -1
- package/dist/host/manual-compaction.js +2 -1
- package/dist/host/manual-compaction.js.map +1 -1
- package/dist/host/output-projection.d.ts +0 -13
- package/dist/host/output-projection.d.ts.map +1 -1
- package/dist/host/output-projection.js +16 -2
- package/dist/host/output-projection.js.map +1 -1
- package/dist/host/summary-retry.d.ts.map +1 -1
- package/dist/host/summary-retry.js +3 -2
- package/dist/host/summary-retry.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +97 -60
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/agents-view.js +18 -15
- package/dist/modes/interactive/components/agents-view.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -5
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +12 -7
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +2 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +6 -5
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +18 -15
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +2 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.js +5 -4
- package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
- package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-input.js +2 -1
- package/dist/modes/interactive/components/dialog-input.js.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.js +4 -3
- package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +11 -10
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +0 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -10
- package/dist/modes/interactive/components/footer.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 +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +3 -2
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +12 -11
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js +6 -2
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +28 -16
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +10 -9
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
- package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
- package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
- package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
- package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +43 -31
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -6
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +115 -120
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +5 -4
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +3 -2
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +14 -5
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +2 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +11 -4
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +8 -3
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-list.js +7 -6
- package/dist/modes/interactive/components/tree-list.js.map +1 -1
- package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-render.js +28 -23
- package/dist/modes/interactive/components/tree-render.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +9 -7
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +5 -4
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/workflow-view.js +36 -21
- package/dist/modes/interactive/components/workflow-view.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth.js +71 -40
- package/dist/modes/interactive/interactive-auth.js.map +1 -1
- package/dist/modes/interactive/interactive-commands.d.ts +1 -0
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-commands.js +3 -0
- package/dist/modes/interactive/interactive-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
- package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-format.js +34 -18
- package/dist/modes/interactive/interactive-format.js.map +1 -1
- package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-helpers.js +7 -2
- package/dist/modes/interactive/interactive-helpers.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +350 -279
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +79 -25
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +26 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +3 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +0 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -14
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +0 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +0 -19
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +28 -13
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
- package/dist/plugins/ecosystem/catalog.js +3 -2
- package/dist/plugins/ecosystem/catalog.js.map +1 -1
- package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
- package/dist/plugins/ecosystem/cli.js +2 -1
- package/dist/plugins/ecosystem/cli.js.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
- package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
- package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
- package/dist/plugins/ecosystem/distribution.js +2 -1
- package/dist/plugins/ecosystem/distribution.js.map +1 -1
- package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/installer.js +3 -2
- package/dist/plugins/ecosystem/installer.js.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
- package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
- package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
- package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
- package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts +9 -2
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +44 -5
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
- package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.js +31 -30
- package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
- package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
- package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
- package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
- package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts +9 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.js +5 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
- package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry.js +35 -32
- package/dist/plugins/ecosystem/registry.js.map +1 -1
- package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
- package/dist/plugins/ecosystem/resolver.js +3 -2
- package/dist/plugins/ecosystem/resolver.js.map +1 -1
- package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection-store.js +11 -10
- package/dist/plugins/ecosystem/selection-store.js.map +1 -1
- package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection.js +8 -7
- package/dist/plugins/ecosystem/selection.js.map +1 -1
- package/dist/plugins/ecosystem/state.d.ts.map +1 -1
- package/dist/plugins/ecosystem/state.js +24 -23
- package/dist/plugins/ecosystem/state.js.map +1 -1
- package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
- package/dist/plugins/ecosystem/updates.js +5 -4
- package/dist/plugins/ecosystem/updates.js.map +1 -1
- package/dist/plugins/mcp-http.d.ts +0 -17
- package/dist/plugins/mcp-http.d.ts.map +1 -1
- package/dist/plugins/mcp-http.js +30 -7
- package/dist/plugins/mcp-http.js.map +1 -1
- package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
- package/dist/plugins/plugin-supervisor.js +19 -1
- package/dist/plugins/plugin-supervisor.js.map +1 -1
- package/dist/profile/first-roles.d.ts.map +1 -1
- package/dist/profile/first-roles.js +10 -1
- package/dist/profile/first-roles.js.map +1 -1
- package/dist/profile/goal-plugin.d.ts.map +1 -1
- package/dist/profile/goal-plugin.js +24 -5
- package/dist/profile/goal-plugin.js.map +1 -1
- package/dist/profile/identity.d.ts.map +1 -1
- package/dist/profile/identity.js +7 -6
- package/dist/profile/identity.js.map +1 -1
- package/dist/profile/lock.d.ts.map +1 -1
- package/dist/profile/lock.js +15 -1
- package/dist/profile/lock.js.map +1 -1
- package/dist/profile/plan-plugin.d.ts.map +1 -1
- package/dist/profile/plan-plugin.js +26 -13
- package/dist/profile/plan-plugin.js.map +1 -1
- package/dist/profile/plugin-profiles.d.ts.map +1 -1
- package/dist/profile/plugin-profiles.js +2 -1
- package/dist/profile/plugin-profiles.js.map +1 -1
- package/dist/profile/policy-manifest.d.ts.map +1 -1
- package/dist/profile/policy-manifest.js +5 -4
- package/dist/profile/policy-manifest.js.map +1 -1
- package/dist/profile/profile-registry.d.ts +0 -12
- package/dist/profile/profile-registry.d.ts.map +1 -1
- package/dist/profile/profile-registry.js +14 -1
- package/dist/profile/profile-registry.js.map +1 -1
- package/dist/profile/role-catalog.d.ts +0 -1
- package/dist/profile/role-catalog.d.ts.map +1 -1
- package/dist/profile/role-catalog.js +17 -15
- package/dist/profile/role-catalog.js.map +1 -1
- package/dist/profile/role-orchestrator.d.ts.map +1 -1
- package/dist/profile/role-orchestrator.js +8 -7
- package/dist/profile/role-orchestrator.js.map +1 -1
- package/dist/profile/role-runner.d.ts.map +1 -1
- package/dist/profile/role-runner.js +3 -2
- package/dist/profile/role-runner.js.map +1 -1
- package/dist/profile/root-facade.d.ts.map +1 -1
- package/dist/profile/root-facade.js +2 -1
- package/dist/profile/root-facade.js.map +1 -1
- package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
- package/dist/profile/skill-discovery-wiring.js +7 -2
- package/dist/profile/skill-discovery-wiring.js.map +1 -1
- package/dist/profile/state-store.d.ts.map +1 -1
- package/dist/profile/state-store.js +13 -9
- package/dist/profile/state-store.js.map +1 -1
- package/dist/profile/todo-plugin.d.ts.map +1 -1
- package/dist/profile/todo-plugin.js +9 -4
- package/dist/profile/todo-plugin.js.map +1 -1
- package/dist/profiles/builtin-suites.d.ts +13 -6
- package/dist/profiles/builtin-suites.d.ts.map +1 -1
- package/dist/profiles/builtin-suites.js +15 -6
- package/dist/profiles/builtin-suites.js.map +1 -1
- package/dist/profiles/suite-loader.d.ts +25 -1
- package/dist/profiles/suite-loader.d.ts.map +1 -1
- package/dist/profiles/suite-loader.js +34 -9
- package/dist/profiles/suite-loader.js.map +1 -1
- package/dist/remote/server-entry.d.ts.map +1 -1
- package/dist/remote/server-entry.js +3 -2
- package/dist/remote/server-entry.js.map +1 -1
- package/dist/remote/session-source.d.ts.map +1 -1
- package/dist/remote/session-source.js +8 -4
- package/dist/remote/session-source.js.map +1 -1
- package/dist/share/session-share.d.ts.map +1 -1
- package/dist/share/session-share.js +14 -2
- package/dist/share/session-share.js.map +1 -1
- package/dist/testing/plugin-testkit.d.ts.map +1 -1
- package/dist/testing/plugin-testkit.js +4 -3
- package/dist/testing/plugin-testkit.js.map +1 -1
- package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
- package/dist/testing/runtime-delivery-queue.js +2 -1
- package/dist/testing/runtime-delivery-queue.js.map +1 -1
- package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
- package/dist/testing/session-plugin-testkit.js +10 -7
- package/dist/testing/session-plugin-testkit.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +2 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +7 -6
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/photon.d.ts +2 -2
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +2 -2
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +9 -8
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +23 -13
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +5 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +1 -3
- package/docs/docs.json +4 -0
- package/docs/index.md +1 -0
- package/docs/keybindings.md +3 -0
- package/docs/mcp.md +103 -0
- package/docs/models.md +14 -22
- package/docs/providers.md +0 -1
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +1 -26
- package/docs/sdk.md +4 -6
- package/docs/settings.md +10 -12
- package/docs/skills.md +1 -9
- package/docs/terminal-setup.md +2 -3
- package/docs/usage.md +7 -6
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/examples/sdk/10-settings.ts +2 -4
- package/examples/sdk/12-full-control.ts +1 -2
- package/package.json +1 -3
- package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
- package/dist/core/extensions/microcompact.d.ts +0 -80
- package/dist/core/extensions/microcompact.d.ts.map +0 -1
- package/dist/core/extensions/microcompact.js +0 -134
- package/dist/core/extensions/microcompact.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
|
@@ -56,6 +56,8 @@ export interface SelectorsHost {
|
|
|
56
56
|
getUserMessagesForForking(): ForkableUserMessage[];
|
|
57
57
|
/** Selector surface; the implementation stays in the mode's selector area. */
|
|
58
58
|
showSelector(create: (done: () => void) => SelectorMount): void;
|
|
59
|
+
/** Refresh the pending (queued) messages area under the editor. */
|
|
60
|
+
updatePendingMessagesDisplay(): void;
|
|
59
61
|
showStatus(message: string): void;
|
|
60
62
|
showError(message: string): void;
|
|
61
63
|
showWarning(message: string): void;
|
|
@@ -88,6 +90,13 @@ export declare function findExactModelMatch(host: SelectorsHost, searchTerm: str
|
|
|
88
90
|
export declare function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void;
|
|
89
91
|
export declare function showModelsSelector(host: SelectorsHost): void;
|
|
90
92
|
export declare function showUserMessageSelector(host: SelectorsHost): void;
|
|
93
|
+
/**
|
|
94
|
+
* Queued-message manager (/queue-list): grouped steering/follow-up entries
|
|
95
|
+
* with in-place reorder, remove, and restore-to-editor. Mutations go through
|
|
96
|
+
* the facade's queue operations; indices follow the facade's queue read view
|
|
97
|
+
* (getSteeringMessages/getFollowUpMessages order).
|
|
98
|
+
*/
|
|
99
|
+
export declare function showQueueManagerSelector(host: SelectorsHost): void;
|
|
91
100
|
export declare function handleCloneCommand(host: SelectorsHost): Promise<void>;
|
|
92
101
|
export {};
|
|
93
102
|
//# sourceMappingURL=interactive-selectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAElG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9D,OAAO,EAAE,KAAK,mBAAmB,EAAwB,MAAM,4BAA4B,CAAC;AAG5F,iEAAiE;AACjE,UAAU,aAAa;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,wCAAoC;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+FAA2F;IAC3F,aAAa,EAAE,0BAA0B,CAAC;IAE1C,2EAA2E;IAC3E,eAAe,IAAI,mBAAmB,CAAC;IACvC,kEAAkE;IAClE,kBAAkB,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5C,gFAAgF;IAChF,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAAC;IAC/C,wDAAwD;IACxD,0BAA0B,IAAI,aAAa,EAAE,CAAC;IAC9C,8CAA8C;IAC9C,yBAAyB,IAAI,mBAAmB,EAAE,CAAC;IAEnD,8EAA8E;IAC9E,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,aAAa,GAAG,IAAI,CAAC;IAChE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,uBAAuB,IAAI,IAAI,CAAC;IAChC,4BAA4B,IAAI,IAAI,CAAC;IACrC,uCAAuC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,qBAAqB,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAoB9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAM/F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE;IACV,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB,GACC,IAAI,CA4CN;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAepF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CASrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAmB9D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAgClH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAyCxF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAwH5D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CA6CjE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3E","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(`Unknown suite \"${suiteId}\". Available suites: ${availableSuites.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\t`Suite set to ${suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it`,\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(\"Select Suite\"), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\t\"The next new session (/new) uses the selected suite; this session keeps its current suite\",\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: \"current session\" } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(`Unknown thinking level \"${searchTerm}\". Available levels: ${availableLevels.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(persist ? `Default thinking level: ${level}` : `Thinking level: ${level}`);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(\"Refreshing model catalogs…\");\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(\"Model refresh timed out; searching cached models.\");\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(`Could not refresh ${[...result.errors.keys()].join(\", \")}; searching cached models.`);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? \"Model refresh timed out; searching cached models.\"\n\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: \"Refreshing model catalogs…\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(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 === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.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\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(\"Model refresh timed out; showing cached models.\", \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\t`Could not refresh ${[...result.errors.keys()].join(\", \")}; showing cached models.`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(\"Model catalogs refreshed.\", \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? \"Model refresh timed out; showing cached models.\"\n\t\t\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.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\thost.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\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(\"Nothing to clone yet\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(\"Cloned to new session\");\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { QueueManagerSelectorComponent } from \"./components/queue-manager-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\t/** Refresh the pending (queued) messages area under the editor. */\n\tupdatePendingMessagesDisplay(): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(\n\t\t\tt('Unknown suite \"{suiteId}\". Available suites: {suites}.', {\n\t\t\t\tsuiteId,\n\t\t\t\tsuites: availableSuites.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\tt(\n\t\t\t\"Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it\",\n\t\t\t{ suiteId },\n\t\t),\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(t(\"Select Suite\")), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\tt(\"The next new session (/new) uses the selected suite; this session keeps its current suite\"),\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: t(\"current session\") } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(\n\t\t\tt('Unknown thinking level \"{level}\". Available levels: {levels}.', {\n\t\t\t\tlevel: searchTerm,\n\t\t\t\tlevels: availableLevels.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(\n\t\t\tpersist ? t(\"Default thinking level: {level}\", { level }) : t(\"Thinking level: {level}\", { level }),\n\t\t);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(t(\"Model: {id}\", { id: model.id }));\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(t(\"Refreshing model catalogs…\"));\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(t(\"Model refresh timed out; searching cached models.\"));\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(\n\t\t\t\tt(\"Could not refresh {providers}; searching cached models.\", {\n\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? t(\"Model refresh timed out; searching cached models.\")\n\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t}),\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(\n\t\t\t\t\tpersist\n\t\t\t\t\t\t? t(\"Default model: {provider}/{id}\", { provider: model.provider, id: model.id })\n\t\t\t\t\t\t: t(\"Model: {id}\", { id: model.id }),\n\t\t\t\t);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: t(\"Refreshing model catalogs…\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(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 === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(t(\"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\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model refresh timed out; showing cached models.\"), \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\tt(\"Could not refresh {providers}; showing cached models.\", {\n\t\t\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model catalogs refreshed.\"), \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? t(\"Model refresh timed out; showing cached models.\")\n\t\t\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(t(\"No messages to fork from\"));\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(t(\"Forked to new session\"));\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.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\thost.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\n/**\n * Queued-message manager (/queue-list): grouped steering/follow-up entries\n * with in-place reorder, remove, and restore-to-editor. Mutations go through\n * the facade's queue operations; indices follow the facade's queue read view\n * (getSteeringMessages/getFollowUpMessages order).\n */\nexport function showQueueManagerSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst readQueues = (): { steering: string[]; followUp: string[] } => ({\n\t\t\tsteering: [...host.facade.getSteeringMessages()],\n\t\t\tfollowUp: [...host.facade.getFollowUpMessages()],\n\t\t});\n\t\tconst selector = new QueueManagerSelectorComponent(readQueues(), {\n\t\t\trefresh: readQueues,\n\t\t\tonReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),\n\t\t\tonRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),\n\t\t\t// Restore mirrors /dequeue's editor merge order: the restored text\n\t\t\t// first, the surviving editor draft second, joined with a blank line.\n\t\t\tonRestore: (queue, index) => {\n\t\t\t\tconst text = host.facade.removeQueuedMessageAt(queue, index);\n\t\t\t\tif (text === null) return false;\n\t\t\t\tconst currentText = host.editor.getText();\n\t\t\t\tconst combinedText = [text, currentText].filter((part) => part.trim()).join(\"\\n\\n\");\n\t\t\t\thost.editor.setText(combinedText);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tdone();\n\t\t\t\thost.updatePendingMessagesDisplay();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t});\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(t(\"Nothing to clone yet\"));\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(t(\"Cloned to new session\"));\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Container, SelectList, Spacer, Text } from "@agent-forge/tui";
|
|
2
2
|
import { getAgentDir } from "../../config.js";
|
|
3
3
|
import { DEFAULT_THINKING_LEVEL } from "../../core/defaults.js";
|
|
4
|
+
import { t } from "../../core/i18n/index.js";
|
|
4
5
|
import { findExactModelReferenceMatch, resolveModelScopeFromModels } from "../../core/model-resolver.js";
|
|
5
6
|
import { listSuiteIds } from "../../profiles/suite-loader.js";
|
|
6
7
|
import { DynamicBorder } from "./components/dynamic-border.js";
|
|
7
8
|
import { ModelSelectorComponent } from "./components/model-selector.js";
|
|
9
|
+
import { QueueManagerSelectorComponent } from "./components/queue-manager-selector.js";
|
|
8
10
|
import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
|
|
9
11
|
import { ThinkingSelectorComponent } from "./components/thinking-selector.js";
|
|
10
12
|
import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
|
|
@@ -17,7 +19,10 @@ export function handleSuiteCommand(host, suiteId) {
|
|
|
17
19
|
return;
|
|
18
20
|
}
|
|
19
21
|
if (!availableSuites.includes(suiteId)) {
|
|
20
|
-
host.showError(
|
|
22
|
+
host.showError(t('Unknown suite "{suiteId}". Available suites: {suites}.', {
|
|
23
|
+
suiteId,
|
|
24
|
+
suites: availableSuites.join(", "),
|
|
25
|
+
}));
|
|
21
26
|
return;
|
|
22
27
|
}
|
|
23
28
|
host.settingsManager.setProjectSuite(suiteId);
|
|
@@ -25,7 +30,7 @@ export function handleSuiteCommand(host, suiteId) {
|
|
|
25
30
|
// rebuilds services per session), so the pick applies to the very next
|
|
26
31
|
// new session — unless the process was started with an explicit suite
|
|
27
32
|
// source, which keeps winning for the whole process (设计 §9 precedence).
|
|
28
|
-
host.showStatus(
|
|
33
|
+
host.showStatus(t("Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it", { suiteId }));
|
|
29
34
|
}
|
|
30
35
|
export function showSuiteSelector(host, availableSuites) {
|
|
31
36
|
openSuiteListSelector(host, {
|
|
@@ -43,15 +48,15 @@ export function openSuiteListSelector(host, callbacks) {
|
|
|
43
48
|
const currentSuiteId = host.getCurrentSessionSuiteId();
|
|
44
49
|
const container = new Container();
|
|
45
50
|
container.addChild(new Spacer(1));
|
|
46
|
-
container.addChild(new Text(theme.bold("Select Suite"), 1, 0));
|
|
51
|
+
container.addChild(new Text(theme.bold(t("Select Suite")), 1, 0));
|
|
47
52
|
container.addChild(new Text(theme.fg("muted", callbacks.note ??
|
|
48
|
-
"The next new session (/new) uses the selected suite; this session keeps its current suite"), 1, 0));
|
|
53
|
+
t("The next new session (/new) uses the selected suite; this session keeps its current suite")), 1, 0));
|
|
49
54
|
container.addChild(new Spacer(1));
|
|
50
55
|
container.addChild(new DynamicBorder());
|
|
51
56
|
const list = new SelectList(callbacks.availableSuites.map((id) => ({
|
|
52
57
|
value: id,
|
|
53
58
|
label: id,
|
|
54
|
-
...(id === currentSuiteId ? { description: "current session" } : {}),
|
|
59
|
+
...(id === currentSuiteId ? { description: t("current session") } : {}),
|
|
55
60
|
})), 10, getSelectListTheme());
|
|
56
61
|
if (currentSuiteId !== undefined) {
|
|
57
62
|
const currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);
|
|
@@ -80,7 +85,10 @@ export function handleThinkingCommand(host, searchTerm) {
|
|
|
80
85
|
const normalized = searchTerm.trim().toLowerCase();
|
|
81
86
|
const level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);
|
|
82
87
|
if (!level) {
|
|
83
|
-
host.showError(
|
|
88
|
+
host.showError(t('Unknown thinking level "{level}". Available levels: {levels}.', {
|
|
89
|
+
level: searchTerm,
|
|
90
|
+
levels: availableLevels.join(", "),
|
|
91
|
+
}));
|
|
84
92
|
return;
|
|
85
93
|
}
|
|
86
94
|
selectThinkingLevel(host, level, false);
|
|
@@ -90,7 +98,7 @@ export function selectThinkingLevel(host, level, persist) {
|
|
|
90
98
|
host.facade.setThinkingLevel(level, { persist });
|
|
91
99
|
host.footer.invalidate();
|
|
92
100
|
host.updateEditorBorderColor();
|
|
93
|
-
host.showStatus(persist ?
|
|
101
|
+
host.showStatus(persist ? t("Default thinking level: {level}", { level }) : t("Thinking level: {level}", { level }));
|
|
94
102
|
}
|
|
95
103
|
catch (error) {
|
|
96
104
|
host.showError(error instanceof Error ? error.message : String(error));
|
|
@@ -120,7 +128,7 @@ export async function handleModelCommand(host, searchTerm) {
|
|
|
120
128
|
await host.facade.setModel(model, { persist: false });
|
|
121
129
|
host.footer.invalidate();
|
|
122
130
|
host.updateEditorBorderColor();
|
|
123
|
-
host.showStatus(
|
|
131
|
+
host.showStatus(t("Model: {id}", { id: model.id }));
|
|
124
132
|
void host.maybeWarnAboutAnthropicSubscriptionAuth(model);
|
|
125
133
|
host.checkDaxnutsEasterEgg(model);
|
|
126
134
|
}
|
|
@@ -138,7 +146,7 @@ export async function findExactModelMatch(host, searchTerm) {
|
|
|
138
146
|
const cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);
|
|
139
147
|
if (cachedMatch || host.facade.getScopedModels().length > 0)
|
|
140
148
|
return cachedMatch;
|
|
141
|
-
host.showStatus("Refreshing model catalogs…");
|
|
149
|
+
host.showStatus(t("Refreshing model catalogs…"));
|
|
142
150
|
const controller = new AbortController();
|
|
143
151
|
let timedOut = false;
|
|
144
152
|
const timeout = setTimeout(() => {
|
|
@@ -148,16 +156,20 @@ export async function findExactModelMatch(host, searchTerm) {
|
|
|
148
156
|
try {
|
|
149
157
|
const result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);
|
|
150
158
|
if (result.aborted && timedOut) {
|
|
151
|
-
host.showWarning("Model refresh timed out; searching cached models.");
|
|
159
|
+
host.showWarning(t("Model refresh timed out; searching cached models."));
|
|
152
160
|
}
|
|
153
161
|
else if (result.errors.size > 0) {
|
|
154
|
-
host.showWarning(
|
|
162
|
+
host.showWarning(t("Could not refresh {providers}; searching cached models.", {
|
|
163
|
+
providers: [...result.errors.keys()].join(", "),
|
|
164
|
+
}));
|
|
155
165
|
}
|
|
156
166
|
}
|
|
157
167
|
catch (error) {
|
|
158
168
|
host.showWarning(timedOut
|
|
159
|
-
? "Model refresh timed out; searching cached models."
|
|
160
|
-
:
|
|
169
|
+
? t("Model refresh timed out; searching cached models.")
|
|
170
|
+
: t("Could not refresh model catalogs: {message}", {
|
|
171
|
+
message: error instanceof Error ? error.message : String(error),
|
|
172
|
+
}));
|
|
161
173
|
}
|
|
162
174
|
finally {
|
|
163
175
|
clearTimeout(timeout);
|
|
@@ -173,7 +185,9 @@ export function showModelSelector(host, initialSearchInput) {
|
|
|
173
185
|
host.footer.invalidate();
|
|
174
186
|
host.updateEditorBorderColor();
|
|
175
187
|
done();
|
|
176
|
-
host.showStatus(persist
|
|
188
|
+
host.showStatus(persist
|
|
189
|
+
? t("Default model: {provider}/{id}", { provider: model.provider, id: model.id })
|
|
190
|
+
: t("Model: {id}", { id: model.id }));
|
|
177
191
|
void host.maybeWarnAboutAnthropicSubscriptionAuth(model);
|
|
178
192
|
host.checkDaxnutsEasterEgg(model);
|
|
179
193
|
}
|
|
@@ -245,7 +259,7 @@ export function showModelsSelector(host) {
|
|
|
245
259
|
const selector = new ScopedModelsSelectorComponent({
|
|
246
260
|
allModels: availableModels,
|
|
247
261
|
enabledModelIds: currentEnabledIds,
|
|
248
|
-
refreshStatus: "Refreshing model catalogs…",
|
|
262
|
+
refreshStatus: t("Refreshing model catalogs…"),
|
|
249
263
|
}, {
|
|
250
264
|
onChange: (enabledIds) => {
|
|
251
265
|
selectionChanged = true;
|
|
@@ -257,7 +271,7 @@ export function showModelsSelector(host) {
|
|
|
257
271
|
enabledIds.every((id) => availableModelIds.has(id));
|
|
258
272
|
const newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;
|
|
259
273
|
host.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);
|
|
260
|
-
host.showStatus("Model selection saved to settings");
|
|
274
|
+
host.showStatus(t("Model selection saved to settings"));
|
|
261
275
|
},
|
|
262
276
|
onCancel: () => {
|
|
263
277
|
done();
|
|
@@ -280,13 +294,15 @@ export function showModelsSelector(host) {
|
|
|
280
294
|
if (currentEnabledIds !== null)
|
|
281
295
|
updateSessionModels(currentEnabledIds);
|
|
282
296
|
if (result.aborted && timedOut) {
|
|
283
|
-
selector.setRefreshStatus("Model refresh timed out; showing cached models.", "warning");
|
|
297
|
+
selector.setRefreshStatus(t("Model refresh timed out; showing cached models."), "warning");
|
|
284
298
|
}
|
|
285
299
|
else if (result.errors.size > 0) {
|
|
286
|
-
selector.setRefreshStatus(
|
|
300
|
+
selector.setRefreshStatus(t("Could not refresh {providers}; showing cached models.", {
|
|
301
|
+
providers: [...result.errors.keys()].join(", "),
|
|
302
|
+
}), "warning");
|
|
287
303
|
}
|
|
288
304
|
else {
|
|
289
|
-
selector.setRefreshStatus("Model catalogs refreshed.", "success");
|
|
305
|
+
selector.setRefreshStatus(t("Model catalogs refreshed."), "success");
|
|
290
306
|
}
|
|
291
307
|
host.ui.requestRender();
|
|
292
308
|
})
|
|
@@ -294,8 +310,10 @@ export function showModelsSelector(host) {
|
|
|
294
310
|
if (disposed)
|
|
295
311
|
return;
|
|
296
312
|
selector.setRefreshStatus(timedOut
|
|
297
|
-
? "Model refresh timed out; showing cached models."
|
|
298
|
-
:
|
|
313
|
+
? t("Model refresh timed out; showing cached models.")
|
|
314
|
+
: t("Could not refresh model catalogs: {message}", {
|
|
315
|
+
message: error instanceof Error ? error.message : String(error),
|
|
316
|
+
}), "warning");
|
|
299
317
|
host.ui.requestRender();
|
|
300
318
|
})
|
|
301
319
|
.finally(() => clearTimeout(timeout));
|
|
@@ -313,7 +331,7 @@ export function showModelsSelector(host) {
|
|
|
313
331
|
export function showUserMessageSelector(host) {
|
|
314
332
|
const userMessages = host.getUserMessagesForForking();
|
|
315
333
|
if (userMessages.length === 0) {
|
|
316
|
-
host.showStatus("No messages to fork from");
|
|
334
|
+
host.showStatus(t("No messages to fork from"));
|
|
317
335
|
return;
|
|
318
336
|
}
|
|
319
337
|
const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;
|
|
@@ -335,7 +353,7 @@ export function showUserMessageSelector(host) {
|
|
|
335
353
|
return;
|
|
336
354
|
}
|
|
337
355
|
host.editor.setText(result.selectedText ?? "");
|
|
338
|
-
host.showStatus("Forked to new session");
|
|
356
|
+
host.showStatus(t("Forked to new session"));
|
|
339
357
|
}
|
|
340
358
|
catch (error) {
|
|
341
359
|
host.editor.setText(fallbackText);
|
|
@@ -348,10 +366,46 @@ export function showUserMessageSelector(host) {
|
|
|
348
366
|
return { component: selector, focus: selector.getMessageList() };
|
|
349
367
|
});
|
|
350
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* Queued-message manager (/queue-list): grouped steering/follow-up entries
|
|
371
|
+
* with in-place reorder, remove, and restore-to-editor. Mutations go through
|
|
372
|
+
* the facade's queue operations; indices follow the facade's queue read view
|
|
373
|
+
* (getSteeringMessages/getFollowUpMessages order).
|
|
374
|
+
*/
|
|
375
|
+
export function showQueueManagerSelector(host) {
|
|
376
|
+
host.showSelector((done) => {
|
|
377
|
+
const readQueues = () => ({
|
|
378
|
+
steering: [...host.facade.getSteeringMessages()],
|
|
379
|
+
followUp: [...host.facade.getFollowUpMessages()],
|
|
380
|
+
});
|
|
381
|
+
const selector = new QueueManagerSelectorComponent(readQueues(), {
|
|
382
|
+
refresh: readQueues,
|
|
383
|
+
onReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),
|
|
384
|
+
onRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),
|
|
385
|
+
// Restore mirrors /dequeue's editor merge order: the restored text
|
|
386
|
+
// first, the surviving editor draft second, joined with a blank line.
|
|
387
|
+
onRestore: (queue, index) => {
|
|
388
|
+
const text = host.facade.removeQueuedMessageAt(queue, index);
|
|
389
|
+
if (text === null)
|
|
390
|
+
return false;
|
|
391
|
+
const currentText = host.editor.getText();
|
|
392
|
+
const combinedText = [text, currentText].filter((part) => part.trim()).join("\n\n");
|
|
393
|
+
host.editor.setText(combinedText);
|
|
394
|
+
return true;
|
|
395
|
+
},
|
|
396
|
+
onClose: () => {
|
|
397
|
+
done();
|
|
398
|
+
host.updatePendingMessagesDisplay();
|
|
399
|
+
host.ui.requestRender();
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
return { component: selector, focus: selector.getMessageList() };
|
|
403
|
+
});
|
|
404
|
+
}
|
|
351
405
|
export async function handleCloneCommand(host) {
|
|
352
406
|
const leafId = host.facade.getLeafId();
|
|
353
407
|
if (!leafId) {
|
|
354
|
-
host.showStatus("Nothing to clone yet");
|
|
408
|
+
host.showStatus(t("Nothing to clone yet"));
|
|
355
409
|
return;
|
|
356
410
|
}
|
|
357
411
|
try {
|
|
@@ -361,7 +415,7 @@ export async function handleCloneCommand(host) {
|
|
|
361
415
|
return;
|
|
362
416
|
}
|
|
363
417
|
host.editor.setText("");
|
|
364
|
-
host.showStatus("Cloned to new session");
|
|
418
|
+
host.showStatus(t("Cloned to new session"));
|
|
365
419
|
}
|
|
366
420
|
catch (error) {
|
|
367
421
|
host.showError(error instanceof Error ? error.message : String(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-selectors.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(`Unknown suite \"${suiteId}\". Available suites: ${availableSuites.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\t`Suite set to ${suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it`,\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(\"Select Suite\"), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\t\"The next new session (/new) uses the selected suite; this session keeps its current suite\",\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: \"current session\" } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(`Unknown thinking level \"${searchTerm}\". Available levels: ${availableLevels.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(persist ? `Default thinking level: ${level}` : `Thinking level: ${level}`);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(\"Refreshing model catalogs…\");\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(\"Model refresh timed out; searching cached models.\");\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(`Could not refresh ${[...result.errors.keys()].join(\", \")}; searching cached models.`);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? \"Model refresh timed out; searching cached models.\"\n\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: \"Refreshing model catalogs…\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(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 === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.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\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(\"Model refresh timed out; showing cached models.\", \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\t`Could not refresh ${[...result.errors.keys()].join(\", \")}; showing cached models.`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(\"Model catalogs refreshed.\", \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? \"Model refresh timed out; showing cached models.\"\n\t\t\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.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\thost.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\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(\"Nothing to clone yet\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(\"Cloned to new session\");\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-selectors.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,0BAA0B,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAA4B,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAmD7D,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,OAAgB,EAAQ;IAC/E,MAAM,eAAe,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACzC,OAAO;IACR,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,SAAS,CACb,CAAC,CAAC,wDAAwD,EAAE;YAC3D,OAAO;YACP,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;SAClC,CAAC,CACF,CAAC;QACF,OAAO;IACR,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,wEAAwE;IACxE,uEAAuE;IACvE,wEAAsE;IACtE,6EAAwE;IACxE,IAAI,CAAC,UAAU,CACd,CAAC,CACA,yIAAuI,EACvI,EAAE,OAAO,EAAE,CACX,CACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,eAAkC,EAAQ;IAChG,qBAAqB,CAAC,IAAI,EAAE;QAC3B,eAAe;QACf,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;KACvC,CAAC,CAAC;AAAA,CACH;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,IAAmB,EACnB,SAMC,EACM;IACP,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,SAAS,CAAC,QAAQ,CACjB,IAAI,IAAI,CACP,KAAK,CAAC,EAAE,CACP,OAAO,EACP,SAAS,CAAC,IAAI;YACb,CAAC,CAAC,2FAA2F,CAAC,CAC/F,EACD,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAC1B,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC,CAAC,EACH,EAAE,EACF,kBAAkB,EAAE,CACpB,CAAC;QACF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACvE,IAAI,YAAY,IAAI,CAAC;gBAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,IAAI,EAAE,CAAC;YACP,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAA,CAC/B,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,EAAE,CAAC;YACP,SAAS,CAAC,QAAQ,EAAE,CAAC;QAAA,CACrB,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAA,CAC7C,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAmB,EAAE,UAAmB,EAAQ;IACrF,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,CACb,CAAC,CAAC,+DAA+D,EAAE;YAClE,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;SAClC,CAAC,CACF,CAAC;QACF,OAAO;IACR,CAAC;IAED,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAmB,EAAE,KAAoB,EAAE,OAAgB,EAAQ;IACtG,IAAI,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CACd,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,CAAC,CACnG,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AAAA,CACD;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAmB,EAAQ;IAC/D,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,OAAgB,EAAE,EAAE,CAAC;YAC/D,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC;QAAA,CACP,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,aAAa,IAAI,sBAAsB,EAC9D,IAAI,CAAC,0BAA0B,EAAE,EACjC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EACnC,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CACxE,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAA,CAChD,CAAC,CAAC;AAAA,CACH;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAE,UAAmB,EAAiB;IACjG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpD,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,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAAA,CACpC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAmB,EAAE,UAAkB,EAAmC;IACnH,MAAM,YAAY,GACjB,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7D,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,4BAA4B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3E,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAEhF,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA4B,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QAChC,QAAQ,GAAG,IAAI,CAAC;QAChB,UAAU,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB,EAAE,MAAM,CAAC,CAAC;IACX,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CACf,CAAC,CAAC,yDAAyD,EAAE;gBAC5D,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/C,CAAC,CACF,CAAC;QACH,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,CACf,QAAQ;YACP,CAAC,CAAC,CAAC,CAAC,mDAAmD,CAAC;YACxD,CAAC,CAAC,CAAC,CAAC,6CAA6C,EAAE;gBACjD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/D,CAAC,CACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,4BAA4B,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AAAA,CAChF;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,kBAA2B,EAAQ;IACzF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,KAAK,EAAE,KAAiB,EAAE,OAAgB,EAAE,EAAE,CAAC;YAClE,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,CACd,OAAO;oBACN,CAAC,CAAC,CAAC,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;oBACjF,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACrC,CAAC;gBACF,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACnC,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;QAAA,CACD,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EACtB;YACC,mEAAmE;YACnE,yDAAyD;YACzD,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC5C,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAC7D,EACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EACnC,eAAe,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAC7F,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IAAA,CACnF,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAQ;IAC7D,IAAI,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrD,IAAI,iBAAiB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;IAC1D,MAAM,oBAAoB,GAAG,CAAC,MAA6B,EAAmB,EAAE,CAAC;QAChF,IAAI,CAAC,kBAAkB,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,QAAQ,GAAG,2BAA2B,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,QAAQ,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;QACjG,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACX,CAAC;IAEF,IAAI,iBAAiB,GACpB,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACpF,CAAC,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,mBAAmB,GAAG,CAAC,UAA2B,EAAQ,EAAE,CAAC;QAClE,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,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;QAC9F,MAAM,yBAAyB,GAC9B,UAAU,KAAK,IAAI,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,UAAU,IAAI,wBAAwB,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC1E,MAAM,eAAe,GAAG,2BAA2B,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,YAAY,CAAC;YAC9F,IAAI,CAAC,MAAM,CAAC,eAAe,CAC1B,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,aAAa,EAAE,MAAM,CAAC,aAAa;aACnC,CAAC,CAAC,CACH,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IAAA,CACxB,CAAC;IAEF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QAAA,CACnB,EAAE,MAAM,CAAC,CAAC;QACX,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CACjD;YACC,SAAS,EAAE,eAAe;YAC1B,eAAe,EAAE,iBAAiB;YAClC,aAAa,EAAE,CAAC,CAAC,8BAA4B,CAAC;SAC9C,EACD;YACC,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBACzB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAAA,CAChC;YACD,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC1B,MAAM,UAAU,GACf,UAAU,KAAK,IAAI;oBACnB,UAAU,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;oBAC5C,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrD,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,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAAA,CACxD;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAAA,CACxB;SACD,CACD,CAAC;QACF,KAAK,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;aAClE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,OAAO;YACrB,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACjD,iBAAiB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,gBAAgB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3D,iBAAiB,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;gBAC1D,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,iBAAiB,KAAK,IAAI;gBAAE,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YACvE,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,iDAAiD,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5F,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,gBAAgB,CACxB,CAAC,CAAC,uDAAuD,EAAE;oBAC1D,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC/C,CAAC,EACF,SAAS,CACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,2BAA2B,CAAC,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC;YAC1B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,CAAC,gBAAgB,CACxB,QAAQ;gBACP,CAAC,CAAC,CAAC,CAAC,iDAAiD,CAAC;gBACtD,CAAC,CAAC,CAAC,CAAC,6CAA6C,EAAE;oBACjD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC/D,CAAC,EACJ,SAAS,CACT,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,OAAO;YACN,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,UAAU,CAAC,KAAK,EAAE,CAAC;YAAA,CACnB;SACD,CAAC;IAAA,CACF,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAmB,EAAQ;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAEtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC/C,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,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,4BAA4B,CAChD,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,CAAC,CAAC,OAAO;YACb,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;SACzE,CAAC,CAAC,EACH,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;YACP,iEAAiE;YACjE,4DAA4D;YAC5D,qEAAqE;YACrE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YACjF,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;oBACxB,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAClC,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;QAAA,CACD,EACD,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,iBAAiB,CACjB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;IAAA,CACjE,CAAC,CAAC;AAAA,CACH;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAmB,EAAQ;IACnE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,GAA+C,EAAE,CAAC,CAAC;YACrE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC,UAAU,EAAE,EAAE;YAChE,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YAClF,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;YAC3E,mEAAmE;YACnE,sEAAsE;YACtE,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC7D,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO,KAAK,CAAC;gBAChC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAClC,OAAO,IAAI,CAAC;YAAA,CACZ;YACD,OAAO,EAAE,GAAG,EAAE,CAAC;gBACd,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAAA,CACxB;SACD,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;IAAA,CACjE,CAAC,CAAC;AAAA,CACH;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAiB;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC3C,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AAAA,CACD","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { QueueManagerSelectorComponent } from \"./components/queue-manager-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\t/** Refresh the pending (queued) messages area under the editor. */\n\tupdatePendingMessagesDisplay(): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(\n\t\t\tt('Unknown suite \"{suiteId}\". Available suites: {suites}.', {\n\t\t\t\tsuiteId,\n\t\t\t\tsuites: availableSuites.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\tt(\n\t\t\t\"Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it\",\n\t\t\t{ suiteId },\n\t\t),\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(t(\"Select Suite\")), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\tt(\"The next new session (/new) uses the selected suite; this session keeps its current suite\"),\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: t(\"current session\") } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(\n\t\t\tt('Unknown thinking level \"{level}\". Available levels: {levels}.', {\n\t\t\t\tlevel: searchTerm,\n\t\t\t\tlevels: availableLevels.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(\n\t\t\tpersist ? t(\"Default thinking level: {level}\", { level }) : t(\"Thinking level: {level}\", { level }),\n\t\t);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(t(\"Model: {id}\", { id: model.id }));\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(t(\"Refreshing model catalogs…\"));\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(t(\"Model refresh timed out; searching cached models.\"));\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(\n\t\t\t\tt(\"Could not refresh {providers}; searching cached models.\", {\n\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? t(\"Model refresh timed out; searching cached models.\")\n\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t}),\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(\n\t\t\t\t\tpersist\n\t\t\t\t\t\t? t(\"Default model: {provider}/{id}\", { provider: model.provider, id: model.id })\n\t\t\t\t\t\t: t(\"Model: {id}\", { id: model.id }),\n\t\t\t\t);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: t(\"Refreshing model catalogs…\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(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 === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(t(\"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\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model refresh timed out; showing cached models.\"), \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\tt(\"Could not refresh {providers}; showing cached models.\", {\n\t\t\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model catalogs refreshed.\"), \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? t(\"Model refresh timed out; showing cached models.\")\n\t\t\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(t(\"No messages to fork from\"));\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(t(\"Forked to new session\"));\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.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\thost.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\n/**\n * Queued-message manager (/queue-list): grouped steering/follow-up entries\n * with in-place reorder, remove, and restore-to-editor. Mutations go through\n * the facade's queue operations; indices follow the facade's queue read view\n * (getSteeringMessages/getFollowUpMessages order).\n */\nexport function showQueueManagerSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst readQueues = (): { steering: string[]; followUp: string[] } => ({\n\t\t\tsteering: [...host.facade.getSteeringMessages()],\n\t\t\tfollowUp: [...host.facade.getFollowUpMessages()],\n\t\t});\n\t\tconst selector = new QueueManagerSelectorComponent(readQueues(), {\n\t\t\trefresh: readQueues,\n\t\t\tonReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),\n\t\t\tonRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),\n\t\t\t// Restore mirrors /dequeue's editor merge order: the restored text\n\t\t\t// first, the surviving editor draft second, joined with a blank line.\n\t\t\tonRestore: (queue, index) => {\n\t\t\t\tconst text = host.facade.removeQueuedMessageAt(queue, index);\n\t\t\t\tif (text === null) return false;\n\t\t\t\tconst currentText = host.editor.getText();\n\t\t\t\tconst combinedText = [text, currentText].filter((part) => part.trim()).join(\"\\n\\n\");\n\t\t\t\thost.editor.setText(combinedText);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tdone();\n\t\t\t\thost.updatePendingMessagesDisplay();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t});\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(t(\"Nothing to clone yet\"));\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(t(\"Cloned to new session\"));\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"theme-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EASN,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,qBAAa,0BAA0B;IACtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,8BAA8B,CAA2B;IAEjE,YACC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE;QACR,kBAAkB,EAAE,MAAM,eAAe,CAAC;QAC1C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,SAAS,EAAE,MAAM,IAAI,CAAC;QACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAaD;IAED,SAAS,IAAI,IAAI,CAIhB;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBvC;IAED,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,WAAW,CAO9D;IAEK,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAED,gBAAgB,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,CAMlD;IAED,OAAO,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAOxC;IAED,eAAe,IAAI,IAAI,CAEtB;IAED,gBAAgB,IAAI,aAAa,CAEhC;IAED,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,+BAA+B;IAMvC,OAAO,CAAC,kBAAkB;CAc1B","sourcesContent":["import type { TUI } from \"@agent-forge/tui\";\nimport { t } from \"../../../core/i18n/index.ts\";\nimport type { SettingsManager } from \"../../../core/settings-manager.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalBackgroundTheme,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetTheme,\n\tsetThemeInstance,\n\ttype TerminalTheme,\n\ttype Theme,\n} from \"./theme.ts\";\n\ntype ThemeResult = { success: boolean; error?: string };\n\nexport class InteractiveThemeController {\n\tprivate readonly ui: TUI;\n\tprivate readonly getSettingsManager: () => SettingsManager;\n\tprivate readonly showError: (message: string) => void;\n\tprivate readonly onChanged: () => void;\n\tprivate currentThemeSetting: string | undefined;\n\tprivate terminalTheme: TerminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tprivate activeThemeName: string | undefined;\n\tprivate autoSyncEnabled = false;\n\tprivate terminalColorSchemeUnsubscribe: (() => void) | undefined;\n\n\tconstructor(\n\t\tui: TUI,\n\t\toptions: {\n\t\t\tgetSettingsManager: () => SettingsManager;\n\t\t\tshowError: (message: string) => void;\n\t\t\tonChanged: () => void;\n\t\t\tinitialThemeSetting?: string;\n\t\t},\n\t) {\n\t\tthis.ui = ui;\n\t\tthis.getSettingsManager = options.getSettingsManager;\n\t\tthis.showError = options.showError;\n\t\tthis.onChanged = options.onChanged;\n\t\tthis.currentThemeSetting = options.initialThemeSetting;\n\t\tthis.activeThemeName = resolveThemeSetting(\n\t\t\tthis.currentThemeSetting ?? this.getSettingsManager().getThemeSetting(),\n\t\t\tthis.terminalTheme,\n\t\t);\n\t\tinitTheme(this.activeThemeName, true);\n\t\tthis.bindTerminalColorSchemeListener();\n\t}\n\n\trebindTui(): void {\n\t\tthis.terminalColorSchemeUnsubscribe?.();\n\t\tthis.bindTerminalColorSchemeListener();\n\t\tthis.ui.setTerminalColorSchemeNotifications(this.autoSyncEnabled);\n\t}\n\n\tasync applyFromSettings(): Promise<void> {\n\t\tconst settingsManager = this.getSettingsManager();\n\t\tconst themeSetting = this.currentThemeSetting ?? settingsManager.getThemeSetting();\n\t\tconst autoTheme = parseAutoThemeSetting(themeSetting);\n\t\tif (autoTheme) {\n\t\t\tthis.terminalTheme = await detectTerminalThemeForAuto({ ui: this.ui, timeoutMs: 100 });\n\t\t\tthis.setAutoSync(true);\n\t\t\tthis.applyThemeName(this.terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme, true);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setAutoSync(false);\n\t\tif (themeSetting !== undefined) {\n\t\t\tthis.applyThemeName(themeSetting, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst detection = await detectTerminalBackgroundTheme({ ui: this.ui, timeoutMs: 100 });\n\t\tthis.terminalTheme = detection.theme;\n\t\tif (!this.applyThemeName(detection.theme).success) return;\n\t\tif (detection.confidence === \"high\") {\n\t\t\tsettingsManager.setTheme(detection.theme);\n\t\t\tawait settingsManager.flush();\n\t\t}\n\t}\n\n\tgetThemeSelection(): string | undefined {\n\t\treturn this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting() ?? this.activeThemeName;\n\t}\n\n\tsetThemeName(themeName: string, showError = false): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tconst result = this.applyThemeName(themeName, showError);\n\t\tif (result.success) {\n\t\t\tthis.currentThemeSetting = themeName;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setThemeSetting(themeSetting: string): Promise<void> {\n\t\tthis.currentThemeSetting = themeSetting;\n\t\tawait this.applyFromSettings();\n\t}\n\n\tsetThemeInstance(themeInstance: Theme): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tsetThemeInstance(themeInstance);\n\t\tthis.activeThemeName = \"<in-memory>\";\n\t\tthis.notifyChanged();\n\t\treturn { success: true };\n\t}\n\n\tpreview(themeSettingOrName: string): void {\n\t\tconst themeName = resolveThemeSetting(themeSettingOrName, this.terminalTheme) ?? this.activeThemeName;\n\t\tif (!themeName) return;\n\t\tif (setTheme(themeName, true).success) {\n\t\t\tthis.ui.invalidate();\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\n\n\tdisableAutoSync(): void {\n\t\tthis.setAutoSync(false);\n\t}\n\n\tgetTerminalTheme(): TerminalTheme {\n\t\treturn this.terminalTheme;\n\t}\n\n\tprivate applyThemeName(themeName: string, showError = false): ThemeResult {\n\t\tconst result = setTheme(themeName, true);\n\t\tthis.activeThemeName = result.success ? themeName : \"dark\";\n\t\tthis.notifyChanged();\n\t\tif (!result.success && showError) {\n\t\t\tthis.showError(\n\t\t\t\t`${t('Failed to load theme \"{name}\": {error}', {\n\t\t\t\t\tname: themeName,\n\t\t\t\t\terror: result.error ?? \"unknown\",\n\t\t\t\t})}\\n${t(\"Fell back to dark theme.\")}`,\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate notifyChanged(): void {\n\t\tthis.ui.invalidate();\n\t\tthis.onChanged();\n\t}\n\n\tprivate setAutoSync(enabled: boolean): void {\n\t\tif (this.autoSyncEnabled === enabled) return;\n\t\tthis.autoSyncEnabled = enabled;\n\t\tthis.ui.setTerminalColorSchemeNotifications(enabled);\n\t}\n\n\tprivate bindTerminalColorSchemeListener(): void {\n\t\tthis.terminalColorSchemeUnsubscribe = this.ui.onTerminalColorSchemeChange((terminalTheme) =>\n\t\t\tthis.applyTerminalTheme(terminalTheme),\n\t\t);\n\t}\n\n\tprivate applyTerminalTheme(terminalTheme: TerminalTheme): void {\n\t\tif (!this.autoSyncEnabled) return;\n\t\tthis.terminalTheme = terminalTheme;\n\t\tconst autoTheme = parseAutoThemeSetting(this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting());\n\t\t// v8 ignore next -- auto sync is only enabled for an auto theme setting, which always parses\n\t\tif (!autoTheme) {\n\t\t\tthis.setAutoSync(false);\n\t\t\treturn;\n\t\t}\n\t\tconst themeName = terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme;\n\t\tif (themeName !== this.activeThemeName) {\n\t\t\tthis.applyThemeName(themeName);\n\t\t}\n\t}\n}\n"]}
|