@evalops/maestro 0.10.23 → 0.10.25
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/README.md +4 -4
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/keys.d.ts +2 -5
- package/dist/agent/keys.d.ts.map +1 -1
- package/dist/agent/keys.js +4 -5
- package/dist/agent/keys.js.map +1 -1
- package/dist/agent/modes.d.ts +2 -2
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +6 -7
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +4 -4
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/google.js +1 -1
- package/dist/agent/swarm/executor.d.ts +2 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +208 -35
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +2 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/tool-capability-types.d.ts +36 -0
- package/dist/agent/tool-capability-types.d.ts.map +1 -0
- package/dist/agent/tool-capability-types.js +2 -0
- package/dist/agent/tool-capability-types.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +28 -15
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/agent/transport/transport-utils.d.ts.map +1 -1
- package/dist/agent/transport/transport-utils.js +2 -3
- package/dist/agent/transport/transport-utils.js.map +1 -1
- package/dist/agent/transport.js +1 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/type-guards.d.ts +1 -1
- package/dist/agent/type-guards.js +1 -1
- package/dist/agent/type-guards.js.map +1 -1
- package/dist/agent/types.d.ts +5 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -2
- package/dist/agent/types.js.map +1 -1
- package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
- package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
- package/dist/app-server/daemon-lifecycle-api.js +259 -0
- package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
- package/dist/app-server/external-agent-import-api.d.ts +30 -0
- package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
- package/dist/app-server/external-agent-import-api.js +553 -0
- package/dist/app-server/external-agent-import-api.js.map +1 -0
- package/dist/app-server/host-control-api.d.ts +30 -0
- package/dist/app-server/host-control-api.d.ts.map +1 -0
- package/dist/app-server/host-control-api.js +343 -0
- package/dist/app-server/host-control-api.js.map +1 -0
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.d.ts.map +1 -1
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/network-governance-api.d.ts +26 -0
- package/dist/app-server/network-governance-api.d.ts.map +1 -0
- package/dist/app-server/network-governance-api.js +476 -0
- package/dist/app-server/network-governance-api.js.map +1 -0
- package/dist/app-server/plugin-bundle-api.d.ts +17 -0
- package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
- package/dist/app-server/plugin-bundle-api.js +219 -0
- package/dist/app-server/plugin-bundle-api.js.map +1 -0
- package/dist/app-server/policy-control-api.d.ts +14 -0
- package/dist/app-server/policy-control-api.d.ts.map +1 -0
- package/dist/app-server/policy-control-api.js +200 -0
- package/dist/app-server/policy-control-api.js.map +1 -0
- package/dist/app-server/protocol-modes-api.d.ts +22 -0
- package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
- package/dist/app-server/protocol-modes-api.js +124 -0
- package/dist/app-server/protocol-modes-api.js.map +1 -0
- package/dist/app-server/sandbox-proof-api.d.ts +21 -0
- package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
- package/dist/app-server/sandbox-proof-api.js +127 -0
- package/dist/app-server/sandbox-proof-api.js.map +1 -0
- package/dist/app-server/session-api.d.ts +93 -3
- package/dist/app-server/session-api.d.ts.map +1 -1
- package/dist/app-server/session-api.js +706 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/auth-setup.d.ts.map +1 -1
- package/dist/bootstrap/auth-setup.js +17 -2
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
- package/dist/bootstrap/model-resolution-setup.js +19 -4
- package/dist/bootstrap/model-resolution-setup.js.map +1 -1
- package/dist/cli/args.d.ts +2 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +226 -14
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/anthropic.d.ts +1 -1
- package/dist/cli/commands/anthropic.d.ts.map +1 -1
- package/dist/cli/commands/anthropic.js +3 -68
- package/dist/cli/commands/anthropic.js.map +1 -1
- package/dist/cli/commands/modes.js +1 -1
- package/dist/cli/commands/modes.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -7
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/rpc-mode.d.ts +1 -1
- package/dist/cli/rpc-mode.js +1 -1
- package/dist/cli/rpc-mode.js.map +1 -1
- package/dist/cli/session.js +1 -1
- package/dist/cli/session.js.map +1 -1
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +7 -12
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/custom-editor.d.ts +1 -1
- package/dist/cli-tui/custom-editor.js +2 -2
- package/dist/cli-tui/custom-editor.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +0 -1
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +3 -4
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
- package/dist/cli-tui/tui-renderer.js +2 -2
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
- package/dist/cli-tui/utils/footer-utils.js +1 -1
- package/dist/cli-tui/utils/footer-utils.js.map +1 -1
- package/dist/cli.js +15156 -14232
- package/dist/commands/prompts.d.ts +1 -1
- package/dist/commands/prompts.js +1 -1
- package/dist/commands/prompts.js.map +1 -1
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/toml-config.js +3 -3
- package/dist/config/toml-config.js.map +1 -1
- package/dist/db/client.d.ts +2 -2
- package/dist/db/client.js +2 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +1 -1
- package/dist/db/migrate.js +1 -1
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +2 -2
- package/dist/db/schema.js +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/errors/index.d.ts +2 -2
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/main.d.ts +4 -5
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -14
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +15 -2
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +50 -26
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts.map +1 -1
- package/dist/mcp/fathom-cua.js +10 -0
- package/dist/mcp/fathom-cua.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +32 -1
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +12 -3
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/mcp/tool-capabilities.d.ts +5 -0
- package/dist/mcp/tool-capabilities.d.ts.map +1 -0
- package/dist/mcp/tool-capabilities.js +271 -0
- package/dist/mcp/tool-capabilities.js.map +1 -0
- package/dist/mcp/types.d.ts +6 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/models/config-loader.d.ts +1 -1
- package/dist/models/factory-integration.d.ts +1 -1
- package/dist/models/factory-integration.js +1 -1
- package/dist/models/factory-integration.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/dist/index.js +2 -2
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/connectors.d.ts +2 -2
- package/dist/oauth/connectors.d.ts.map +1 -1
- package/dist/oauth/connectors.js +3 -5
- package/dist/oauth/connectors.js.map +1 -1
- package/dist/oauth/github-copilot.d.ts +1 -1
- package/dist/oauth/github-copilot.js +1 -1
- package/dist/oauth/github-copilot.js.map +1 -1
- package/dist/oauth/index.d.ts +10 -8
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +54 -31
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/openai.d.ts +1 -1
- package/dist/oauth/openai.js +2 -2
- package/dist/oauth/openai.js.map +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +41 -0
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
- package/dist/platform/a2a-completion-audit.js +177 -0
- package/dist/platform/a2a-completion-audit.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +17 -0
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
- package/dist/platform/a2a-telemetry-inspect.js +224 -0
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
- package/dist/platform/agent-registry-client.d.ts +8 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -1
- package/dist/platform/agent-registry-client.js +9 -1
- package/dist/platform/agent-registry-client.js.map +1 -1
- package/dist/providers/api-keys.d.ts +2 -2
- package/dist/providers/api-keys.js +2 -2
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts +3 -6
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +1 -40
- package/dist/providers/auth.js.map +1 -1
- package/dist/rpc/index.d.ts +2 -2
- package/dist/rpc/index.js +2 -2
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/rpc-types.d.ts +1 -1
- package/dist/rpc/rpc-types.js +1 -1
- package/dist/rpc/rpc-types.js.map +1 -1
- package/dist/safety/nested-agent-guard.js +1 -1
- package/dist/safety/nested-agent-guard.js.map +1 -1
- package/dist/safety/policy.d.ts +2 -2
- package/dist/safety/policy.js +2 -2
- package/dist/safety/policy.js.map +1 -1
- package/dist/safety/validators/network-policy-validator.d.ts +8 -0
- package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
- package/dist/safety/validators/network-policy-validator.js +29 -4
- package/dist/safety/validators/network-policy-validator.js.map +1 -1
- package/dist/sandbox/local-sandbox.d.ts +1 -1
- package/dist/sandbox/local-sandbox.js +1 -1
- package/dist/sandbox/local-sandbox.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/attachments.d.ts.map +1 -1
- package/dist/server/handlers/attachments.js +1 -0
- package/dist/server/handlers/attachments.js.map +1 -1
- package/dist/server/handlers/models.d.ts.map +1 -1
- package/dist/server/handlers/models.js +3 -1
- package/dist/server/handlers/models.js.map +1 -1
- package/dist/server/handlers/session-attachments.d.ts.map +1 -1
- package/dist/server/handlers/session-attachments.js +2 -0
- package/dist/server/handlers/session-attachments.js.map +1 -1
- package/dist/server/handlers/sessions.js +1 -1
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/handlers/status.d.ts +2 -0
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +3 -2
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +32 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-session-manager.d.ts +2 -0
- package/dist/server/hosted-session-manager.d.ts.map +1 -1
- package/dist/server/hosted-session-manager.js +9 -0
- package/dist/server/hosted-session-manager.js.map +1 -1
- package/dist/server/model-selection.d.ts.map +1 -1
- package/dist/server/model-selection.js +9 -1
- package/dist/server/model-selection.js.map +1 -1
- package/dist/server/rate-limiter.d.ts +1 -1
- package/dist/server/rate-limiter.js +1 -1
- package/dist/server/rate-limiter.js.map +1 -1
- package/dist/server/router.d.ts +2 -2
- package/dist/server/router.js.map +1 -1
- package/dist/server/session-serialization.d.ts +9 -9
- package/dist/server/session-serialization.js +15 -15
- package/dist/server/session-serialization.js.map +1 -1
- package/dist/session/manager.d.ts +5 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +56 -8
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-catalog.d.ts +2 -0
- package/dist/session/session-catalog.d.ts.map +1 -1
- package/dist/session/session-catalog.js +6 -0
- package/dist/session/session-catalog.js.map +1 -1
- package/dist/session/session-context.d.ts +2 -0
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +15 -0
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.generated.d.ts +1 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -1
- package/dist/session/wire-format.generated.js +1 -0
- package/dist/session/wire-format.generated.js.map +1 -1
- package/dist/shared-memory/contract.d.ts +4 -4
- package/dist/shared-memory/contract.js +2 -2
- package/dist/shared-memory/contract.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +57 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +59 -1
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +24 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/telemetry/mcp-beacon.d.ts +2 -0
- package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
- package/dist/telemetry/mcp-beacon.js +15 -0
- package/dist/telemetry/mcp-beacon.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +62 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +84 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry.d.ts +44 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +84 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/theme/theme-loader.js +2 -2
- package/dist/theme/theme-loader.js.map +1 -1
- package/dist/theme/theme-schema.json +2 -2
- package/dist/theme/theme.d.ts +1 -1
- package/dist/theme/theme.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/tools/extract-document.d.ts +1 -0
- package/dist/tools/extract-document.d.ts.map +1 -1
- package/dist/tools/extract-document.js +2 -1
- package/dist/tools/extract-document.js.map +1 -1
- package/dist/tools/index.d.ts +55 -55
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tool-dsl.d.ts +1 -1
- package/dist/tools/tool-dsl.js +1 -1
- package/dist/tools/tool-dsl.js.map +1 -1
- package/dist/utils/document-extractor.d.ts +1 -0
- package/dist/utils/document-extractor.d.ts.map +1 -1
- package/dist/utils/document-extractor.js +320 -40
- package/dist/utils/document-extractor.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +12 -8
- package/dist/web-server.js.map +1 -1
- package/package.json +4 -2
- package/dist/oauth/anthropic.d.ts +0 -17
- package/dist/oauth/anthropic.d.ts.map +0 -1
- package/dist/oauth/anthropic.js +0 -81
- package/dist/oauth/anthropic.js.map +0 -1
- package/dist/providers/anthropic-auth.d.ts +0 -75
- package/dist/providers/anthropic-auth.d.ts.map +0 -1
- package/dist/providers/anthropic-auth.js +0 -221
- package/dist/providers/anthropic-auth.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { Spacer, type TUI, Text } from \"@evalops/tui\";\nimport type { Container } from \"@evalops/tui\";\nimport type { SupportedOAuthProvider } from \"../../oauth/index.js\";\nimport { theme } from \"../../theme/theme.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport { OAuthSelectorView } from \"../selectors/oauth-selector-view.js\";\nimport { formatLink } from \"../utils/links.js\";\n\nconst OSC52_PREFIX = \"\\u001b]52;c;\";\nconst OSC52_SUFFIX = \"\\u0007\";\n\nfunction copyToOsc52(value: string): boolean {\n\tif (!process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\tconst base64 = Buffer.from(value).toString(\"base64\");\n\tprocess.stdout.write(`${OSC52_PREFIX}${base64}${OSC52_SUFFIX}`);\n\treturn true;\n}\n\n/**\n * Callback interface for editor interactions during OAuth flow.\n */\nexport interface OAuthEditorCallbacks {\n\tclearEditor(): void;\n\tgetText(): string;\n\tsetText(text: string): void;\n\tonSubmit: ((text: string) => void) | undefined;\n}\n\n/**\n * Context for rendering OAuth UI elements.\n */\nexport interface OAuthRenderContext {\n\tchatContainer: Container;\n\tui: TUI;\n\trequestRender(): void;\n}\n\n/**\n * Options for the OAuth flow controller.\n */\nexport interface OAuthFlowControllerOptions {\n\tmodalManager: ModalManager;\n\tnotificationView: NotificationView;\n\trenderContext: OAuthRenderContext;\n\teditorCallbacks: OAuthEditorCallbacks;\n}\n\n/**\n * Controller for handling OAuth login and logout flows.\n *\n * Extracts OAuth flow logic from TuiRenderer to provide a cohesive unit\n * for authentication operations.\n */\nexport class OAuthFlowController {\n\tprivate readonly modalManager: ModalManager;\n\tprivate readonly notificationView: NotificationView;\n\tprivate readonly renderContext: OAuthRenderContext;\n\tprivate readonly editorCallbacks: OAuthEditorCallbacks;\n\tprivate isOAuthFlowActive = false;\n\tprivate oauthLoginView?: OAuthSelectorView;\n\tprivate oauthLogoutView?: OAuthSelectorView;\n\n\tconstructor(options: OAuthFlowControllerOptions) {\n\t\tthis.modalManager = options.modalManager;\n\t\tthis.notificationView = options.notificationView;\n\t\tthis.renderContext = options.renderContext;\n\t\tthis.editorCallbacks = options.editorCallbacks;\n\t}\n\n\t/**\n\t * Check if an OAuth flow is currently active.\n\t */\n\tisActive(): boolean {\n\t\treturn this.isOAuthFlowActive;\n\t}\n\n\t/**\n\t * Handle the /login command.\n\t */\n\tasync handleLoginCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\n\t\t// Parse argument: can be either \"mode\" or \"provider:mode\"\n\t\tlet requestedProvider: string | undefined;\n\t\tlet selectedMode = \"pro\";\n\t\tconst validModes = [\"pro\", \"console\"];\n\n\t\tif (args) {\n\t\t\tif (args.includes(\":\")) {\n\t\t\t\tconst parts = args.split(\":\").map((s) => s.trim());\n\t\t\t\trequestedProvider = parts[0];\n\t\t\t\tconst mode = parts[1];\n\t\t\t\tif (mode && !validModes.includes(mode)) {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t\tshowError(\n\t\t\t\t\t\t`Invalid mode: ${mode}. Valid modes: ${validModes.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tselectedMode = mode && validModes.includes(mode) ? mode : \"pro\";\n\t\t\t} else {\n\t\t\t\tif (validModes.includes(args)) {\n\t\t\t\t\tselectedMode = args;\n\t\t\t\t} else {\n\t\t\t\t\trequestedProvider = args;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Import OAuth system\n\t\tconst { getOAuthProviders, migrateOAuthCredentials } = await import(\n\t\t\t\"../../oauth/index.js\"\n\t\t);\n\n\t\t// Migrate old credentials if needed\n\t\tawait migrateOAuthCredentials();\n\n\t\t// Get available providers\n\t\tconst providers = getOAuthProviders().filter((p) => p.available);\n\n\t\tif (providers.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowError(\"No OAuth providers available\");\n\t\t\treturn;\n\t\t}\n\n\t\t// If only one provider or specific provider requested, use it directly\n\t\tif (providers.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? providers.find(\n\t\t\t\t\t\t(p) =>\n\t\t\t\t\t\t\tp.id === requestedProvider || p.id.includes(requestedProvider),\n\t\t\t\t\t)\n\t\t\t\t: providers[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Unknown provider: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogin(provider.id, selectedMode, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLoginView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"login\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogin(providerId, selectedMode, showError);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Login cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLoginView.show();\n\t}\n\n\t/**\n\t * Handle the /logout command.\n\t */\n\tasync handleLogoutCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\t\tconst requestedProvider = args || null;\n\n\t\t// Import OAuth system\n\t\tconst { listOAuthProviders } = await import(\"../../oauth/index.js\");\n\n\t\t// Get logged-in providers\n\t\tconst loggedInProviders = listOAuthProviders();\n\n\t\tif (loggedInProviders.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowInfo(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// If specific provider requested or only one logged in, use it directly\n\t\tif (loggedInProviders.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? loggedInProviders.find(\n\t\t\t\t\t\t(p) => p === requestedProvider || p.includes(requestedProvider),\n\t\t\t\t\t)\n\t\t\t\t: loggedInProviders[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Not logged in to: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogout(\n\t\t\t\tprovider as SupportedOAuthProvider,\n\t\t\t\tshowError,\n\t\t\t);\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLogoutView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"logout\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogout(providerId, showError);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Logout cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLogoutView.show();\n\t}\n\n\t/**\n\t * Handle the /auth source-of-truth command.\n\t */\n\tasync handleSourceOfTruthPolicyCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst args = argumentText.trim().split(/\\s+/).filter(Boolean);\n\t\tconst usage =\n\t\t\t\"Usage: /auth source-of-truth <provider> <area> [fallbackConnectionId]\\n\" +\n\t\t\t\" /auth source-of-truth clear <provider>\\n\" +\n\t\t\t\"Areas: analytics, billing, crm, hris, support\";\n\t\tif (\n\t\t\targs.length === 0 ||\n\t\t\t[\"help\", \"?\", \"-h\", \"--help\"].includes(args[0]?.toLowerCase() ?? \"\")\n\t\t) {\n\t\t\tshowInfo(usage);\n\t\t\treturn;\n\t\t}\n\n\t\tconst subcommand = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tif ([\"clear\", \"unset\", \"remove\"].includes(subcommand ?? \"\")) {\n\t\t\t\tconst provider = args[1];\n\t\t\t\tif (!provider || args.length > 2) {\n\t\t\t\t\tshowError(usage);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { clearOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t\t);\n\t\t\t\tconst cleared = clearOAuthProviderSourceOfTruthPolicy(provider);\n\t\t\t\tshowInfo(\n\t\t\t\t\tcleared\n\t\t\t\t\t\t? `Source-of-truth policy metadata cleared for ${provider}.`\n\t\t\t\t\t\t: `No source-of-truth policy metadata was set for ${provider}.`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst provider = args[0];\n\t\t\tconst area = args[1];\n\t\t\tconst fallbackConnectionId = args[2];\n\t\t\tif (!provider || !area || args.length > 3) {\n\t\t\t\tshowError(usage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { configureOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t);\n\t\t\tconst configured = await configureOAuthProviderSourceOfTruthPolicy(\n\t\t\t\tprovider,\n\t\t\t\t{ area, fallbackConnectionId },\n\t\t\t);\n\t\t\tconst details = [\n\t\t\t\t`Source-of-truth policy configured for ${configured.provider}.`,\n\t\t\t\t`Area: ${configured.area}`,\n\t\t\t\t...(configured.fallbackConnectionId\n\t\t\t\t\t? [`Fallback connection: ${configured.fallbackConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.connectorConnectionId\n\t\t\t\t\t? [`Connector connection: ${configured.connectorConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.primaryConnectionId\n\t\t\t\t\t? [`Platform primary connection: ${configured.primaryConnectionId}`]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"Platform policy will sync when the connector service is configured and reachable.\",\n\t\t\t\t\t\t]),\n\t\t\t\t...(configured.workspaceId\n\t\t\t\t\t? [`Workspace: ${configured.workspaceId}`]\n\t\t\t\t\t: []),\n\t\t\t];\n\t\t\tshowInfo(details.join(\"\\n\"));\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\n\tprivate async performOAuthLogin(\n\t\tproviderId: SupportedOAuthProvider,\n\t\tmode: string,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { login } = await import(\"../../oauth/index.js\");\n\n\t\tconst { chatContainer, ui, requestRender } = this.renderContext;\n\t\tconst requiresPromptCode =\n\t\t\tproviderId === \"anthropic\" || providerId === \"openai-codex\";\n\n\t\tchatContainer.addChild(new Spacer(1));\n\t\tchatContainer.addChild(new Text(`Logging in to ${providerId}...`, 1, 0));\n\t\trequestRender();\n\n\t\ttry {\n\t\t\tawait login(providerId, {\n\t\t\t\tmode: mode as \"pro\" | \"console\" | undefined,\n\t\t\t\tonStatus: (status: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(status, 1, 0));\n\t\t\t\t\trequestRender();\n\t\t\t\t},\n\t\t\t\tonAuthUrl: (url: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Opening browser to:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"accent\", formatLink(url, \"Open login URL\")),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(url, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(url)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tif (requiresPromptCode) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? \"Complete authentication in the browser. If asked, paste the redirect URL or authorization code below.\"\n\t\t\t\t\t\t\t\t\t: \"Paste the authorization code below (or type 'cancel' to abort):\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser, then return here.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\t// Auto-open browser using execFile for security\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonDeviceCode: (code: string, verificationUri: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Authenticate by visiting:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\t\t\tformatLink(verificationUri, \"Open verification URL\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(verificationUri, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(verificationUri)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(`Enter code: ${code}`, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\tnew Text(\"Waiting for authorization...\", 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\"\n\t\t\t\t\t\t\t? [\"/c\", \"start\", \"\", verificationUri]\n\t\t\t\t\t\t\t: [verificationUri];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonPromptCode: async () => {\n\t\t\t\t\tconst originalOnSubmit = this.editorCallbacks.onSubmit;\n\t\t\t\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\t\t\tconst timeout = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow timed out after 5 minutes\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = (text) => {\n\t\t\t\t\t\t\tconst trimmedText = text.trim();\n\n\t\t\t\t\t\t\tif (trimmedText.toLowerCase() === \"cancel\") {\n\t\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow cancelled by user\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Basic authorization code validation. OpenAI Codex also accepts\n\t\t\t\t\t\t\t// a full redirect URL for the manual fallback path.\n\t\t\t\t\t\t\tconst looksLikeOAuthValue =\n\t\t\t\t\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? trimmedText.length >= 10 &&\n\t\t\t\t\t\t\t\t\t\t(trimmedText.startsWith(\"http://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.startsWith(\"https://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.includes(\"code=\") ||\n\t\t\t\t\t\t\t\t\t\t\t/^[a-zA-Z0-9_#-]+$/.test(trimmedText))\n\t\t\t\t\t\t\t\t\t: trimmedText.length >= 10 &&\n\t\t\t\t\t\t\t\t\t\t/^[a-zA-Z0-9_#-]+$/.test(trimmedText);\n\t\t\t\t\t\t\tif (!looksLikeOAuthValue) {\n\t\t\t\t\t\t\t\tthis.notificationView.showError(\n\t\t\t\t\t\t\t\t\t\"Invalid authorization code format. Please try again or type 'cancel'.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\tresolve(trimmedText);\n\t\t\t\t\t\t};\n\t\t\t\t\t}).finally(() => {\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = originalOnSubmit;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`Successfully authenticated with ${providerId}!`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Authentication complete. ${providerId} OAuth credentials saved.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Login failed\";\n\n\t\t\tlet errorDetail = message;\n\t\t\tif (message.includes(\"timeout\")) {\n\t\t\t\terrorDetail = \"OAuth flow timed out after 5 minutes. Please try again.\";\n\t\t\t} else if (message.includes(\"cancel\")) {\n\t\t\t\terrorDetail = \"OAuth flow cancelled by user.\";\n\t\t\t} else if (message.includes(\"Invalid\") || message.includes(\"failed\")) {\n\t\t\t\terrorDetail = `${message}. The authorization code may be expired or invalid.`;\n\t\t\t}\n\n\t\t\tshowError(errorDetail);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(`Login failed: ${errorDetail}`, 1, 0));\n\t\t\trequestRender();\n\t\t} finally {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t}\n\t}\n\n\tprivate async performOAuthLogout(\n\t\tproviderId: SupportedOAuthProvider,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { chatContainer, requestRender } = this.renderContext;\n\n\t\ttry {\n\t\t\tconst { logout } = await import(\"../../oauth/index.js\");\n\t\t\tawait logout(providerId);\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`${providerId} OAuth credentials removed`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Logged out from ${providerId}. OAuth credentials removed.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Logout failed\";\n\t\t\tshowError(message);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oauth-flow-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { Spacer, type TUI, Text } from \"@evalops/tui\";\nimport type { Container } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport { theme } from \"../../theme/theme.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport { OAuthSelectorView } from \"../selectors/oauth-selector-view.js\";\nimport { formatLink } from \"../utils/links.js\";\n\nconst OSC52_PREFIX = \"\\u001b]52;c;\";\nconst OSC52_SUFFIX = \"\\u0007\";\n\nfunction copyToOsc52(value: string): boolean {\n\tif (!process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\tconst base64 = Buffer.from(value).toString(\"base64\");\n\tprocess.stdout.write(`${OSC52_PREFIX}${base64}${OSC52_SUFFIX}`);\n\treturn true;\n}\n\n/**\n * Callback interface for editor interactions during OAuth flow.\n */\nexport interface OAuthEditorCallbacks {\n\tclearEditor(): void;\n\tgetText(): string;\n\tsetText(text: string): void;\n\tonSubmit: ((text: string) => void) | undefined;\n}\n\n/**\n * Context for rendering OAuth UI elements.\n */\nexport interface OAuthRenderContext {\n\tchatContainer: Container;\n\tui: TUI;\n\trequestRender(): void;\n}\n\n/**\n * Options for the OAuth flow controller.\n */\nexport interface OAuthFlowControllerOptions {\n\tmodalManager: ModalManager;\n\tnotificationView: NotificationView;\n\trenderContext: OAuthRenderContext;\n\teditorCallbacks: OAuthEditorCallbacks;\n}\n\n/**\n * Controller for handling OAuth login and logout flows.\n *\n * Extracts OAuth flow logic from TuiRenderer to provide a cohesive unit\n * for authentication operations.\n */\nexport class OAuthFlowController {\n\tprivate readonly modalManager: ModalManager;\n\tprivate readonly notificationView: NotificationView;\n\tprivate readonly renderContext: OAuthRenderContext;\n\tprivate readonly editorCallbacks: OAuthEditorCallbacks;\n\tprivate isOAuthFlowActive = false;\n\tprivate oauthLoginView?: OAuthSelectorView;\n\tprivate oauthLogoutView?: OAuthSelectorView;\n\n\tconstructor(options: OAuthFlowControllerOptions) {\n\t\tthis.modalManager = options.modalManager;\n\t\tthis.notificationView = options.notificationView;\n\t\tthis.renderContext = options.renderContext;\n\t\tthis.editorCallbacks = options.editorCallbacks;\n\t}\n\n\t/**\n\t * Check if an OAuth flow is currently active.\n\t */\n\tisActive(): boolean {\n\t\treturn this.isOAuthFlowActive;\n\t}\n\n\t/**\n\t * Handle the /login command.\n\t */\n\tasync handleLoginCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\n\t\t// Parse argument as a provider. Anthropic-specific mode arguments were\n\t\t// retired with Anthropic OAuth login support.\n\t\tlet requestedProvider: string | undefined;\n\n\t\tif (args) {\n\t\t\tif (args.includes(\":\")) {\n\t\t\t\tconst parts = args.split(\":\").map((s) => s.trim());\n\t\t\t\trequestedProvider = parts[0];\n\t\t\t\tconst mode = parts[1];\n\t\t\t\tif (mode) {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t\tshowError(\n\t\t\t\t\t\t\"Provider login modes are no longer supported. Use /login openai-codex for Codex auth or /login openai for OpenAI Platform auth.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequestedProvider = args;\n\t\t\t}\n\t\t}\n\n\t\t// Import OAuth system\n\t\tconst { getOAuthProviders, migrateOAuthCredentials } = await import(\n\t\t\t\"../../oauth/index.js\"\n\t\t);\n\n\t\t// Migrate old credentials if needed\n\t\tawait migrateOAuthCredentials();\n\n\t\t// Get available providers\n\t\tconst providers = getOAuthProviders().filter((p) => p.available);\n\n\t\tif (providers.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowError(\"No OAuth providers available\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst defaultProvider = providers.find(\n\t\t\t(provider) => provider.id === \"openai-codex\",\n\t\t);\n\t\tif (!requestedProvider && defaultProvider) {\n\t\t\tawait this.performOAuthLogin(defaultProvider.id, undefined, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// If only one provider or specific provider requested, use it directly\n\t\tif (providers.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? (providers.find((p) => p.id === requestedProvider) ??\n\t\t\t\t\tproviders.find((p) => p.id.includes(requestedProvider)))\n\t\t\t\t: providers[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Unknown provider: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogin(provider.id, undefined, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLoginView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"login\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogin(\n\t\t\t\t\t\tproviderId as SupportedOAuthProvider,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tshowError,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Login cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLoginView.show();\n\t}\n\n\t/**\n\t * Handle the /logout command.\n\t */\n\tasync handleLogoutCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\t\tconst requestedProvider = args || null;\n\n\t\t// Import OAuth system\n\t\tconst { listOAuthLogoutProviders } = await import(\"../../oauth/index.js\");\n\n\t\t// Get logged-in providers\n\t\tconst loggedInProviders = listOAuthLogoutProviders();\n\n\t\tif (loggedInProviders.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowInfo(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// If specific provider requested or only one logged in, use it directly\n\t\tif (loggedInProviders.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? loggedInProviders.find(\n\t\t\t\t\t\t(p) => p === requestedProvider || p.includes(requestedProvider),\n\t\t\t\t\t)\n\t\t\t\t: loggedInProviders[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Not logged in to: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogout(provider, showError);\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLogoutView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"logout\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogout(providerId, showError);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Logout cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLogoutView.show();\n\t}\n\n\t/**\n\t * Handle the /auth source-of-truth command.\n\t */\n\tasync handleSourceOfTruthPolicyCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst args = argumentText.trim().split(/\\s+/).filter(Boolean);\n\t\tconst usage =\n\t\t\t\"Usage: /auth source-of-truth <provider> <area> [fallbackConnectionId]\\n\" +\n\t\t\t\" /auth source-of-truth clear <provider>\\n\" +\n\t\t\t\"Areas: analytics, billing, crm, hris, support\";\n\t\tif (\n\t\t\targs.length === 0 ||\n\t\t\t[\"help\", \"?\", \"-h\", \"--help\"].includes(args[0]?.toLowerCase() ?? \"\")\n\t\t) {\n\t\t\tshowInfo(usage);\n\t\t\treturn;\n\t\t}\n\n\t\tconst subcommand = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tif ([\"clear\", \"unset\", \"remove\"].includes(subcommand ?? \"\")) {\n\t\t\t\tconst provider = args[1];\n\t\t\t\tif (!provider || args.length > 2) {\n\t\t\t\t\tshowError(usage);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { clearOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t\t);\n\t\t\t\tconst cleared = clearOAuthProviderSourceOfTruthPolicy(provider);\n\t\t\t\tshowInfo(\n\t\t\t\t\tcleared\n\t\t\t\t\t\t? `Source-of-truth policy metadata cleared for ${provider}.`\n\t\t\t\t\t\t: `No source-of-truth policy metadata was set for ${provider}.`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst provider = args[0];\n\t\t\tconst area = args[1];\n\t\t\tconst fallbackConnectionId = args[2];\n\t\t\tif (!provider || !area || args.length > 3) {\n\t\t\t\tshowError(usage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { configureOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t);\n\t\t\tconst configured = await configureOAuthProviderSourceOfTruthPolicy(\n\t\t\t\tprovider,\n\t\t\t\t{ area, fallbackConnectionId },\n\t\t\t);\n\t\t\tconst details = [\n\t\t\t\t`Source-of-truth policy configured for ${configured.provider}.`,\n\t\t\t\t`Area: ${configured.area}`,\n\t\t\t\t...(configured.fallbackConnectionId\n\t\t\t\t\t? [`Fallback connection: ${configured.fallbackConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.connectorConnectionId\n\t\t\t\t\t? [`Connector connection: ${configured.connectorConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.primaryConnectionId\n\t\t\t\t\t? [`Platform primary connection: ${configured.primaryConnectionId}`]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"Platform policy will sync when the connector service is configured and reachable.\",\n\t\t\t\t\t\t]),\n\t\t\t\t...(configured.workspaceId\n\t\t\t\t\t? [`Workspace: ${configured.workspaceId}`]\n\t\t\t\t\t: []),\n\t\t\t];\n\t\t\tshowInfo(details.join(\"\\n\"));\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\n\tprivate async performOAuthLogin(\n\t\tproviderId: SupportedOAuthProvider,\n\t\tmode: string | undefined,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { login } = await import(\"../../oauth/index.js\");\n\n\t\tconst { chatContainer, ui, requestRender } = this.renderContext;\n\t\tconst requiresPromptCode = providerId === \"openai-codex\";\n\n\t\tchatContainer.addChild(new Spacer(1));\n\t\tchatContainer.addChild(new Text(`Logging in to ${providerId}...`, 1, 0));\n\t\trequestRender();\n\n\t\ttry {\n\t\t\tawait login(providerId, {\n\t\t\t\tmode: mode as \"pro\" | \"console\" | undefined,\n\t\t\t\tonStatus: (status: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(status, 1, 0));\n\t\t\t\t\trequestRender();\n\t\t\t\t},\n\t\t\t\tonAuthUrl: (url: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Opening browser to:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"accent\", formatLink(url, \"Open login URL\")),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(url, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(url)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tif (requiresPromptCode) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser. If asked, paste the redirect URL or authorization code below.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser, then return here.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\t// Auto-open browser using execFile for security\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonDeviceCode: (code: string, verificationUri: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Authenticate by visiting:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\t\t\tformatLink(verificationUri, \"Open verification URL\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(verificationUri, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(verificationUri)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(`Enter code: ${code}`, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\tnew Text(\"Waiting for authorization...\", 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\"\n\t\t\t\t\t\t\t? [\"/c\", \"start\", \"\", verificationUri]\n\t\t\t\t\t\t\t: [verificationUri];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonPromptCode: async () => {\n\t\t\t\t\tconst originalOnSubmit = this.editorCallbacks.onSubmit;\n\t\t\t\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\t\t\tconst timeout = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow timed out after 5 minutes\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = (text) => {\n\t\t\t\t\t\t\tconst trimmedText = text.trim();\n\n\t\t\t\t\t\t\tif (trimmedText.toLowerCase() === \"cancel\") {\n\t\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow cancelled by user\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Basic authorization code validation. OpenAI Codex also accepts\n\t\t\t\t\t\t\t// a full redirect URL for the manual fallback path.\n\t\t\t\t\t\t\tconst looksLikeOAuthValue =\n\t\t\t\t\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? trimmedText.length >= 10 &&\n\t\t\t\t\t\t\t\t\t\t(trimmedText.startsWith(\"http://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.startsWith(\"https://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.includes(\"code=\") ||\n\t\t\t\t\t\t\t\t\t\t\t/^[a-zA-Z0-9_#-]+$/.test(trimmedText))\n\t\t\t\t\t\t\t\t\t: false;\n\t\t\t\t\t\t\tif (!looksLikeOAuthValue) {\n\t\t\t\t\t\t\t\tthis.notificationView.showError(\n\t\t\t\t\t\t\t\t\t\"Invalid authorization code format. Please try again or type 'cancel'.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\tresolve(trimmedText);\n\t\t\t\t\t\t};\n\t\t\t\t\t}).finally(() => {\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = originalOnSubmit;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`Successfully authenticated with ${providerId}!`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Authentication complete. ${providerId} OAuth credentials saved.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Login failed\";\n\n\t\t\tlet errorDetail = message;\n\t\t\tif (message.includes(\"timeout\")) {\n\t\t\t\terrorDetail = \"OAuth flow timed out after 5 minutes. Please try again.\";\n\t\t\t} else if (message.includes(\"cancel\")) {\n\t\t\t\terrorDetail = \"OAuth flow cancelled by user.\";\n\t\t\t} else if (message.includes(\"Invalid\") || message.includes(\"failed\")) {\n\t\t\t\terrorDetail = `${message}. The authorization code may be expired or invalid.`;\n\t\t\t}\n\n\t\t\tshowError(errorDetail);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(`Login failed: ${errorDetail}`, 1, 0));\n\t\t\trequestRender();\n\t\t} finally {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t}\n\t}\n\n\tprivate async performOAuthLogout(\n\t\tproviderId: OAuthLogoutProvider,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { chatContainer, requestRender } = this.renderContext;\n\n\t\ttry {\n\t\t\tconst { logout } = await import(\"../../oauth/index.js\");\n\t\t\tawait logout(providerId);\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`${providerId} OAuth credentials removed`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Logged out from ${providerId}. OAuth credentials removed.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Logout failed\";\n\t\t\tshowError(message);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/model-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAgB,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhE;;GAEG;AACH,eAAO,MAAM,mCAAmC,GAC/C,OAAO,eAAe,KACpB,OAGuC,CAAC;AAE3C,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAS;gBAGxB,YAAY,EAAE,eAAe,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAC1C,QAAQ,EAAE,MAAM,IAAI,EACpB,UAAU,GAAE,eAAe,EAAO;IA0CnC,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,UAAU;IA2ElB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkClC,OAAO,CAAC,YAAY;IAIpB,cAAc,IAAI,KAAK;IAIvB,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/model-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAgB,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhE;;GAEG;AACH,eAAO,MAAM,mCAAmC,GAC/C,OAAO,eAAe,KACpB,OAGuC,CAAC;AAE3C,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAS;gBAGxB,YAAY,EAAE,eAAe,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAC1C,QAAQ,EAAE,MAAM,IAAI,EACpB,UAAU,GAAE,eAAe,EAAO;IA0CnC,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,UAAU;IA2ElB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkClC,OAAO,CAAC,YAAY;IAIpB,cAAc,IAAI,KAAK;IAIvB,OAAO,CAAC,aAAa;CAkCrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/model-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, Input, Spacer, Text } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport {\n\tgetRegisteredModels,\n\treloadModelConfig,\n} from \"../../models/registry.js\";\nimport {\n\ttype SupportedOAuthProvider,\n\thasOAuthCredentials,\n} from \"../../oauth/index.js\";\nimport { lookupApiKey } from \"../../providers/api-keys.js\";\n\n/**\n * Component that renders a model selector with search\n */\nexport const isSelectableWithoutStoredCredential = (\n\tmodel: RegisteredModel,\n): boolean =>\n\tmodel.isLocal ||\n\t(model.provider === \"openai-codex\" &&\n\t\tmodel.api === \"openai-codex-app-server\");\n\nexport class ModelSelectorComponent extends Container {\n\tprivate searchInput: Input;\n\tprivate listContainer: Container;\n\tprivate allModels: RegisteredModel[] = [];\n\tprivate filteredModels: RegisteredModel[] = [];\n\tprivate selectedIndex = 0;\n\tprivate currentModel: RegisteredModel;\n\tprivate onSelectCallback: (model: RegisteredModel) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate filteredForCredentials = false;\n\tprivate credentialHints: string[] = [];\n\tprivate modelScope: RegisteredModel[] = [];\n\tprivate isScoped = false;\n\n\tconstructor(\n\t\tcurrentModel: RegisteredModel,\n\t\tonSelect: (model: RegisteredModel) => void,\n\t\tonCancel: () => void,\n\t\tmodelScope: RegisteredModel[] = [],\n\t) {\n\t\tsuper();\n\n\t\tthis.currentModel = currentModel;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.modelScope = modelScope;\n\t\tthis.isScoped = modelScope.length > 0;\n\n\t\t// Load all models\n\t\tthis.loadModels();\n\n\t\t// Add top border\n\t\tthis.addChild(new Text(chalk.blue(\"─\".repeat(80)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create search input\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selected = this.filteredModels[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.handleSelect(selected);\n\t\t\t}\n\t\t};\n\t\tthis.addChild(this.searchInput);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new Text(chalk.blue(\"─\".repeat(80)), 0, 0));\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadModels(): void {\n\t\t// Always reload config so edits to models.json are visible\n\t\treloadModelConfig();\n\t\tconst models = getRegisteredModels();\n\t\tconst scopedModels = this.isScoped\n\t\t\t? this.applyModelScope(models, this.modelScope)\n\t\t\t: models;\n\t\tconst hints = new Set<string>();\n\t\tconst filtered = scopedModels.filter((model) => {\n\t\t\tconst result = this.isModelUsable(model);\n\t\t\tif (!result.usable && result.hint) {\n\t\t\t\thints.add(result.hint);\n\t\t\t}\n\t\t\treturn result.usable;\n\t\t});\n\t\tthis.filteredForCredentials = filtered.length !== scopedModels.length;\n\t\tthis.credentialHints = Array.from(hints);\n\t\tfiltered.sort((a, b) => {\n\t\t\tconst aIsCurrent = this.currentModel?.id === a.id;\n\t\t\tconst bIsCurrent = this.currentModel?.id === b.id;\n\t\t\tif (aIsCurrent && !bIsCurrent) return -1;\n\t\t\tif (!aIsCurrent && bIsCurrent) return 1;\n\t\t\treturn a.providerName.localeCompare(b.providerName);\n\t\t});\n\t\tthis.allModels = filtered;\n\t\tthis.filteredModels = filtered;\n\t}\n\n\tprivate applyModelScope(\n\t\tmodels: RegisteredModel[],\n\t\tscope: RegisteredModel[],\n\t): RegisteredModel[] {\n\t\tif (scope.length === 0) return models;\n\t\tconst scopeKeys = new Set(\n\t\t\tscope.map((model) => `${model.provider}/${model.id}`),\n\t\t);\n\t\treturn models.filter((model) =>\n\t\t\tscopeKeys.has(`${model.provider}/${model.id}`),\n\t\t);\n\t}\n\n\tprivate filterModels(query: string): void {\n\t\tif (!query.trim()) {\n\t\t\tthis.filteredModels = this.allModels;\n\t\t} else {\n\t\t\tconst searchTokens = query\n\t\t\t\t.toLowerCase()\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((t) => t);\n\t\t\tthis.filteredModels = this.allModels.filter(\n\t\t\t\t({ providerName, id, name, source }) => {\n\t\t\t\t\tconst searchText =\n\t\t\t\t\t\t`${providerName} ${id} ${name ?? \"\"} ${source}`.toLowerCase();\n\t\t\t\t\treturn searchTokens.every((token) => searchText.includes(token));\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tthis.selectedIndex = Math.min(\n\t\t\tthis.selectedIndex,\n\t\t\tMath.max(0, this.filteredModels.length - 1),\n\t\t);\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredForCredentials && this.credentialHints.length > 0) {\n\t\t\tconst hintText = this.credentialHints\n\t\t\t\t.map((hint) => `• ${hint}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(chalk.yellow(`Missing credentials:\\n${hintText}`), 0, 0),\n\t\t\t);\n\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst maxVisible = 10;\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(\n\t\t\t\tthis.selectedIndex - Math.floor(maxVisible / 2),\n\t\t\t\tthis.filteredModels.length - maxVisible,\n\t\t\t),\n\t\t);\n\t\tconst endIndex = Math.min(\n\t\t\tstartIndex + maxVisible,\n\t\t\tthis.filteredModels.length,\n\t\t);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredModels[i];\n\t\t\tif (!item) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isCurrent = this.currentModel?.id === item.id;\n\n\t\t\tconst providerLabels = [chalk.gray(`[${item.providerName}]`)];\n\t\t\tif (item.isLocal) {\n\t\t\t\tproviderLabels.push(chalk.hex(\"#fbbf24\")(\"[local]\"));\n\t\t\t}\n\t\t\tconst providerBadge = providerLabels.join(\" \");\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = chalk.blue(\"→ \");\n\t\t\t\tconst modelText = `${item.id}`;\n\t\t\t\tconst checkmark = isCurrent ? chalk.green(\" ✓\") : \"\";\n\t\t\t\tline = `${prefix}${chalk.blue(modelText)} ${providerBadge}${checkmark}`;\n\t\t\t} else {\n\t\t\t\tconst modelText = ` ${item.id}`;\n\t\t\t\tconst checkmark = isCurrent ? chalk.green(\" ✓\") : \"\";\n\t\t\t\tline = `${modelText} ${providerBadge}${checkmark}`;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new Text(line, 0, 0));\n\t\t}\n\n\t\tif (startIndex > 0 || endIndex < this.filteredModels.length) {\n\t\t\tconst scrollInfo = chalk.gray(\n\t\t\t\t` (${this.selectedIndex + 1}/${this.filteredModels.length})`,\n\t\t\t);\n\t\t\tthis.listContainer.addChild(new Text(scrollInfo, 0, 0));\n\t\t}\n\n\t\tif (this.filteredModels.length === 0) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\tthis.filteredForCredentials\n\t\t\t\t\t\t\t? \" No models with configured credentials\"\n\t\t\t\t\t\t\t: \" No matching models\",\n\t\t\t\t\t),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\t// Up arrow\n\t\tif (keyData === \"\\x1b[A\") {\n\t\t\tif (this.filteredModels.length === 0) return;\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (keyData === \"\\x1b[B\") {\n\t\t\tif (this.filteredModels.length === 0) return;\n\t\t\tthis.selectedIndex = Math.min(\n\t\t\t\tthis.filteredModels.length - 1,\n\t\t\t\tthis.selectedIndex + 1,\n\t\t\t);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (keyData === \"\\r\") {\n\t\t\tconst selectedModel = this.filteredModels[this.selectedIndex];\n\t\t\tif (selectedModel) {\n\t\t\t\tthis.handleSelect(selectedModel);\n\t\t\t}\n\t\t}\n\t\t// Escape\n\t\telse if (keyData === \"\\x1b\") {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterModels(this.searchInput.getValue());\n\t\t}\n\t}\n\n\tprivate handleSelect(model: RegisteredModel): void {\n\t\tthis.onSelectCallback(model);\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n\n\tprivate isModelUsable(model: RegisteredModel): {\n\t\tusable: boolean;\n\t\thint?: string;\n\t} {\n\t\t// Local endpoints and Codex app-server models validate at runtime instead\n\t\t// of relying on Maestro's OAuth/API-key credential store.\n\t\tif (isSelectableWithoutStoredCredential(model)) return { usable: true };\n\t\tconst oauthProviders = new Set<SupportedOAuthProvider>([\n\t\t\t\"anthropic\",\n\t\t\t\"evalops\",\n\t\t\t\"openai\",\n\t\t\t\"openai-codex\",\n\t\t\t\"github-copilot\",\n\t\t\t\"google-gemini-cli\",\n\t\t\t\"google-antigravity\",\n\t\t]);\n\t\tif (\n\t\t\toauthProviders.has(model.provider as SupportedOAuthProvider) &&\n\t\t\thasOAuthCredentials(model.provider as SupportedOAuthProvider)\n\t\t) {\n\t\t\treturn { usable: true };\n\t\t}\n\t\tconst apiKey = lookupApiKey(model.provider);\n\t\tif (apiKey.source !== \"missing\") {\n\t\t\treturn { usable: true };\n\t\t}\n\t\tconst envOptions =\n\t\t\tapiKey.envVar && apiKey.envVar.length > 0\n\t\t\t\t? [apiKey.envVar]\n\t\t\t\t: apiKey.checkedEnvVars;\n\t\tconst envHint = envOptions?.length\n\t\t\t? `Set ${envOptions.join(\" or \")} for ${model.providerName ?? model.provider}`\n\t\t\t: `Configure credentials for ${model.providerName ?? model.provider}`;\n\t\treturn { usable: false, hint: envHint };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/model-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACN,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEN,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAClD,KAAsB,EACZ,EAAE,CACZ,KAAK,CAAC,OAAO;IACb,CAAC,KAAK,CAAC,QAAQ,KAAK,cAAc;QACjC,KAAK,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;AAE3C,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAcpD,YACC,YAA6B,EAC7B,QAA0C,EAC1C,QAAoB,EACpB,aAAgC,EAAE;QAElC,KAAK,EAAE,CAAC;QAjBD,cAAS,GAAsB,EAAE,CAAC;QAClC,mBAAc,GAAsB,EAAE,CAAC;QACvC,kBAAa,GAAG,CAAC,CAAC;QAIlB,2BAAsB,GAAG,KAAK,CAAC;QAC/B,oBAAe,GAAa,EAAE,CAAC;QAC/B,eAAU,GAAsB,EAAE,CAAC;QACnC,aAAQ,GAAG,KAAK,CAAC;QAUxB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,kBAAkB;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,sBAAsB;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,GAAG,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzD,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,wBAAwB;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1D,iBAAiB;QACjB,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU;QACjB,2DAA2D;QAC3D,iBAAiB,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ;YACjC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC;QACV,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACnC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;QACtE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAClD,IAAI,UAAU,IAAI,CAAC,UAAU;gBAAE,OAAO,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,IAAI,UAAU;gBAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IAChC,CAAC;IAEO,eAAe,CACtB,MAAyB,EACzB,KAAwB;QAExB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,GAAG,CACxB,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CACrD,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9B,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAC9C,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,KAAa;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,KAAK;iBACxB,WAAW,EAAE;iBACb,KAAK,CAAC,KAAK,CAAC;iBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAC1C,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;gBACtC,MAAM,UAAU,GACf,GAAG,YAAY,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC/D,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAClE,CAAC,CACD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAC3C,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;iBACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACjE,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CACP,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAC/C,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,UAAU,CACvC,CACD,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACxB,UAAU,GAAG,UAAU,EACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC1B,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAEpD,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YAC9D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,IAAI,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,aAAa,GAAG,SAAS,EAAE,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACP,MAAM,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,IAAI,GAAG,GAAG,SAAS,IAAI,aAAa,GAAG,SAAS,EAAE,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC5B,MAAM,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAC7D,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC1B,IAAI,IAAI,CACP,KAAK,CAAC,IAAI,CACT,IAAI,CAAC,sBAAsB;gBAC1B,CAAC,CAAC,yCAAyC;gBAC3C,CAAC,CAAC,sBAAsB,CACzB,EACD,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAED,WAAW,CAAC,OAAe;QAC1B,WAAW;QACX,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;QACD,aAAa;aACR,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAC9B,IAAI,CAAC,aAAa,GAAG,CAAC,CACtB,CAAC;YACF,IAAI,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;QACD,QAAQ;aACH,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9D,IAAI,aAAa,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;QACD,SAAS;aACJ,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzB,CAAC;QACD,uCAAuC;aAClC,CAAC;YACL,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAEO,YAAY,CAAC,KAAsB;QAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,cAAc;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEO,aAAa,CAAC,KAAsB;QAI3C,0EAA0E;QAC1E,0DAA0D;QAC1D,IAAI,mCAAmC,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAyB;YACtD,SAAS;YACT,QAAQ;YACR,cAAc;YACd,gBAAgB;YAChB,mBAAmB;YACnB,oBAAoB;SACpB,CAAC,CAAC;QACH,IACC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAkC,CAAC;YAC5D,mBAAmB,CAAC,KAAK,CAAC,QAAkC,CAAC,EAC5D,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,UAAU,GACf,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACjB,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QAC1B,MAAM,OAAO,GAAG,UAAU,EAAE,MAAM;YACjC,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE;YAC9E,CAAC,CAAC,6BAA6B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC;CACD","sourcesContent":["import { Container, Input, Spacer, Text } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport {\n\tgetRegisteredModels,\n\treloadModelConfig,\n} from \"../../models/registry.js\";\nimport {\n\ttype SupportedOAuthProvider,\n\thasOAuthCredentials,\n} from \"../../oauth/index.js\";\nimport { lookupApiKey } from \"../../providers/api-keys.js\";\n\n/**\n * Component that renders a model selector with search\n */\nexport const isSelectableWithoutStoredCredential = (\n\tmodel: RegisteredModel,\n): boolean =>\n\tmodel.isLocal ||\n\t(model.provider === \"openai-codex\" &&\n\t\tmodel.api === \"openai-codex-app-server\");\n\nexport class ModelSelectorComponent extends Container {\n\tprivate searchInput: Input;\n\tprivate listContainer: Container;\n\tprivate allModels: RegisteredModel[] = [];\n\tprivate filteredModels: RegisteredModel[] = [];\n\tprivate selectedIndex = 0;\n\tprivate currentModel: RegisteredModel;\n\tprivate onSelectCallback: (model: RegisteredModel) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate filteredForCredentials = false;\n\tprivate credentialHints: string[] = [];\n\tprivate modelScope: RegisteredModel[] = [];\n\tprivate isScoped = false;\n\n\tconstructor(\n\t\tcurrentModel: RegisteredModel,\n\t\tonSelect: (model: RegisteredModel) => void,\n\t\tonCancel: () => void,\n\t\tmodelScope: RegisteredModel[] = [],\n\t) {\n\t\tsuper();\n\n\t\tthis.currentModel = currentModel;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.modelScope = modelScope;\n\t\tthis.isScoped = modelScope.length > 0;\n\n\t\t// Load all models\n\t\tthis.loadModels();\n\n\t\t// Add top border\n\t\tthis.addChild(new Text(chalk.blue(\"─\".repeat(80)), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create search input\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selected = this.filteredModels[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.handleSelect(selected);\n\t\t\t}\n\t\t};\n\t\tthis.addChild(this.searchInput);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new Text(chalk.blue(\"─\".repeat(80)), 0, 0));\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadModels(): void {\n\t\t// Always reload config so edits to models.json are visible\n\t\treloadModelConfig();\n\t\tconst models = getRegisteredModels();\n\t\tconst scopedModels = this.isScoped\n\t\t\t? this.applyModelScope(models, this.modelScope)\n\t\t\t: models;\n\t\tconst hints = new Set<string>();\n\t\tconst filtered = scopedModels.filter((model) => {\n\t\t\tconst result = this.isModelUsable(model);\n\t\t\tif (!result.usable && result.hint) {\n\t\t\t\thints.add(result.hint);\n\t\t\t}\n\t\t\treturn result.usable;\n\t\t});\n\t\tthis.filteredForCredentials = filtered.length !== scopedModels.length;\n\t\tthis.credentialHints = Array.from(hints);\n\t\tfiltered.sort((a, b) => {\n\t\t\tconst aIsCurrent = this.currentModel?.id === a.id;\n\t\t\tconst bIsCurrent = this.currentModel?.id === b.id;\n\t\t\tif (aIsCurrent && !bIsCurrent) return -1;\n\t\t\tif (!aIsCurrent && bIsCurrent) return 1;\n\t\t\treturn a.providerName.localeCompare(b.providerName);\n\t\t});\n\t\tthis.allModels = filtered;\n\t\tthis.filteredModels = filtered;\n\t}\n\n\tprivate applyModelScope(\n\t\tmodels: RegisteredModel[],\n\t\tscope: RegisteredModel[],\n\t): RegisteredModel[] {\n\t\tif (scope.length === 0) return models;\n\t\tconst scopeKeys = new Set(\n\t\t\tscope.map((model) => `${model.provider}/${model.id}`),\n\t\t);\n\t\treturn models.filter((model) =>\n\t\t\tscopeKeys.has(`${model.provider}/${model.id}`),\n\t\t);\n\t}\n\n\tprivate filterModels(query: string): void {\n\t\tif (!query.trim()) {\n\t\t\tthis.filteredModels = this.allModels;\n\t\t} else {\n\t\t\tconst searchTokens = query\n\t\t\t\t.toLowerCase()\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((t) => t);\n\t\t\tthis.filteredModels = this.allModels.filter(\n\t\t\t\t({ providerName, id, name, source }) => {\n\t\t\t\t\tconst searchText =\n\t\t\t\t\t\t`${providerName} ${id} ${name ?? \"\"} ${source}`.toLowerCase();\n\t\t\t\t\treturn searchTokens.every((token) => searchText.includes(token));\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tthis.selectedIndex = Math.min(\n\t\t\tthis.selectedIndex,\n\t\t\tMath.max(0, this.filteredModels.length - 1),\n\t\t);\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredForCredentials && this.credentialHints.length > 0) {\n\t\t\tconst hintText = this.credentialHints\n\t\t\t\t.map((hint) => `• ${hint}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(chalk.yellow(`Missing credentials:\\n${hintText}`), 0, 0),\n\t\t\t);\n\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst maxVisible = 10;\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(\n\t\t\t\tthis.selectedIndex - Math.floor(maxVisible / 2),\n\t\t\t\tthis.filteredModels.length - maxVisible,\n\t\t\t),\n\t\t);\n\t\tconst endIndex = Math.min(\n\t\t\tstartIndex + maxVisible,\n\t\t\tthis.filteredModels.length,\n\t\t);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredModels[i];\n\t\t\tif (!item) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isCurrent = this.currentModel?.id === item.id;\n\n\t\t\tconst providerLabels = [chalk.gray(`[${item.providerName}]`)];\n\t\t\tif (item.isLocal) {\n\t\t\t\tproviderLabels.push(chalk.hex(\"#fbbf24\")(\"[local]\"));\n\t\t\t}\n\t\t\tconst providerBadge = providerLabels.join(\" \");\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = chalk.blue(\"→ \");\n\t\t\t\tconst modelText = `${item.id}`;\n\t\t\t\tconst checkmark = isCurrent ? chalk.green(\" ✓\") : \"\";\n\t\t\t\tline = `${prefix}${chalk.blue(modelText)} ${providerBadge}${checkmark}`;\n\t\t\t} else {\n\t\t\t\tconst modelText = ` ${item.id}`;\n\t\t\t\tconst checkmark = isCurrent ? chalk.green(\" ✓\") : \"\";\n\t\t\t\tline = `${modelText} ${providerBadge}${checkmark}`;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new Text(line, 0, 0));\n\t\t}\n\n\t\tif (startIndex > 0 || endIndex < this.filteredModels.length) {\n\t\t\tconst scrollInfo = chalk.gray(\n\t\t\t\t` (${this.selectedIndex + 1}/${this.filteredModels.length})`,\n\t\t\t);\n\t\t\tthis.listContainer.addChild(new Text(scrollInfo, 0, 0));\n\t\t}\n\n\t\tif (this.filteredModels.length === 0) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\tthis.filteredForCredentials\n\t\t\t\t\t\t\t? \" No models with configured credentials\"\n\t\t\t\t\t\t\t: \" No matching models\",\n\t\t\t\t\t),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\t// Up arrow\n\t\tif (keyData === \"\\x1b[A\") {\n\t\t\tif (this.filteredModels.length === 0) return;\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (keyData === \"\\x1b[B\") {\n\t\t\tif (this.filteredModels.length === 0) return;\n\t\t\tthis.selectedIndex = Math.min(\n\t\t\t\tthis.filteredModels.length - 1,\n\t\t\t\tthis.selectedIndex + 1,\n\t\t\t);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (keyData === \"\\r\") {\n\t\t\tconst selectedModel = this.filteredModels[this.selectedIndex];\n\t\t\tif (selectedModel) {\n\t\t\t\tthis.handleSelect(selectedModel);\n\t\t\t}\n\t\t}\n\t\t// Escape\n\t\telse if (keyData === \"\\x1b\") {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterModels(this.searchInput.getValue());\n\t\t}\n\t}\n\n\tprivate handleSelect(model: RegisteredModel): void {\n\t\tthis.onSelectCallback(model);\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n\n\tprivate isModelUsable(model: RegisteredModel): {\n\t\tusable: boolean;\n\t\thint?: string;\n\t} {\n\t\t// Local endpoints and Codex app-server models validate at runtime instead\n\t\t// of relying on Maestro's OAuth/API-key credential store.\n\t\tif (isSelectableWithoutStoredCredential(model)) return { usable: true };\n\t\tconst oauthProviders = new Set<SupportedOAuthProvider>([\n\t\t\t\"evalops\",\n\t\t\t\"openai\",\n\t\t\t\"openai-codex\",\n\t\t\t\"github-copilot\",\n\t\t\t\"google-gemini-cli\",\n\t\t\t\"google-antigravity\",\n\t\t]);\n\t\tif (\n\t\t\toauthProviders.has(model.provider as SupportedOAuthProvider) &&\n\t\t\thasOAuthCredentials(model.provider as SupportedOAuthProvider)\n\t\t) {\n\t\t\treturn { usable: true };\n\t\t}\n\t\tconst apiKey = lookupApiKey(model.provider);\n\t\tif (apiKey.source !== \"missing\") {\n\t\t\treturn { usable: true };\n\t\t}\n\t\tconst envOptions =\n\t\t\tapiKey.envVar && apiKey.envVar.length > 0\n\t\t\t\t? [apiKey.envVar]\n\t\t\t\t: apiKey.checkedEnvVars;\n\t\tconst envHint = envOptions?.length\n\t\t\t? `Set ${envOptions.join(\" or \")} for ${model.providerName ?? model.provider}`\n\t\t\t: `Configure credentials for ${model.providerName ?? model.provider}`;\n\t\treturn { usable: false, hint: envHint };\n\t}\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { TUI } from "@evalops/tui";
|
|
2
|
-
import type { SupportedOAuthProvider } from "../../oauth/index.js";
|
|
2
|
+
import type { OAuthLogoutProvider, SupportedOAuthProvider } from "../../oauth/index.js";
|
|
3
3
|
import type { ModalManager } from "../modal-manager.js";
|
|
4
4
|
interface OAuthSelectorViewOptions {
|
|
5
5
|
modalManager: ModalManager;
|
|
6
6
|
ui: TUI;
|
|
7
7
|
mode: "login" | "logout";
|
|
8
|
-
onProviderSelected: (providerId: SupportedOAuthProvider) => Promise<void>;
|
|
8
|
+
onProviderSelected: (providerId: SupportedOAuthProvider | OAuthLogoutProvider) => Promise<void>;
|
|
9
9
|
onCancel: () => void;
|
|
10
10
|
}
|
|
11
11
|
export declare class OAuthSelectorView {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector-view.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"oauth-selector-view.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EACX,mBAAmB,EACnB,sBAAsB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,UAAU,wBAAwB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,kBAAkB,EAAE,CACnB,UAAU,EAAE,sBAAsB,GAAG,mBAAmB,KACpD,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAGjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,OAAO,EAAE,wBAAwB;IAE9D,IAAI,IAAI,IAAI;IAoBZ,OAAO,CAAC,IAAI;CAOZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector-view.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"oauth-selector-view.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAY7D,MAAM,OAAO,iBAAiB;IAG7B,YAA6B,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;QAFtD,aAAQ,GAAkC,IAAI,CAAC;IAEU,CAAC;IAElE,IAAI;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,KAAK,EAAE,UAAU,EAAE,EAAE;YACpB,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,EACD,GAAG,EAAE;YACJ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,CACD,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,IAAI;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,CAAC;CACD","sourcesContent":["import type { TUI } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport { OAuthSelectorComponent } from \"./oauth-selector.js\";\n\ninterface OAuthSelectorViewOptions {\n\tmodalManager: ModalManager;\n\tui: TUI;\n\tmode: \"login\" | \"logout\";\n\tonProviderSelected: (\n\t\tproviderId: SupportedOAuthProvider | OAuthLogoutProvider,\n\t) => Promise<void>;\n\tonCancel: () => void;\n}\n\nexport class OAuthSelectorView {\n\tprivate selector: OAuthSelectorComponent | null = null;\n\n\tconstructor(private readonly options: OAuthSelectorViewOptions) {}\n\n\tshow(): void {\n\t\tif (this.selector) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selector = new OAuthSelectorComponent(\n\t\t\tthis.options.mode,\n\t\t\tasync (providerId) => {\n\t\t\t\tawait this.options.onProviderSelected(providerId);\n\t\t\t\tthis.hide();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.options.onCancel();\n\t\t\t\tthis.hide();\n\t\t\t},\n\t\t);\n\n\t\tthis.options.modalManager.push(this.selector);\n\t}\n\n\tprivate hide(): void {\n\t\tif (!this.selector) {\n\t\t\treturn;\n\t\t}\n\t\tthis.options.modalManager.pop();\n\t\tthis.selector = null;\n\t}\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Container } from "@evalops/tui";
|
|
2
|
-
import type {
|
|
2
|
+
import type { OAuthLogoutProvider } from "../../oauth/index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Component that renders an OAuth provider selector
|
|
5
5
|
*/
|
|
@@ -10,7 +10,7 @@ export declare class OAuthSelectorComponent extends Container {
|
|
|
10
10
|
private allProviders;
|
|
11
11
|
private selectedIndex;
|
|
12
12
|
private mode;
|
|
13
|
-
constructor(mode: "login" | "logout", onSelectCallback: (providerId:
|
|
13
|
+
constructor(mode: "login" | "logout", onSelectCallback: (providerId: OAuthLogoutProvider) => void, onCancelCallback: () => void);
|
|
14
14
|
private loadProviders;
|
|
15
15
|
private updateList;
|
|
16
16
|
handleInput(keyData: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IAQnD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,gBAAgB;IARzB,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,IAAI,CAAqB;gBAGhC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAChB,gBAAgB,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,EAC3D,gBAAgB,EAAE,MAAM,IAAI;IA6BrC,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,UAAU;IAwClB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA8BlC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Container, Spacer, Text } from "@evalops/tui";
|
|
2
|
-
import { getOAuthProviders,
|
|
2
|
+
import { getOAuthLogoutProviders, getOAuthProviders, } from "../../oauth/index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Component that renders an OAuth provider selector
|
|
5
5
|
*/
|
|
@@ -28,14 +28,13 @@ export class OAuthSelectorComponent extends Container {
|
|
|
28
28
|
this.updateList();
|
|
29
29
|
}
|
|
30
30
|
loadProviders() {
|
|
31
|
-
this.allProviders = getOAuthProviders();
|
|
32
31
|
// For logout mode, only show providers with credentials
|
|
33
32
|
if (this.mode === "logout") {
|
|
34
|
-
this.allProviders =
|
|
33
|
+
this.allProviders = getOAuthLogoutProviders();
|
|
35
34
|
}
|
|
36
35
|
else {
|
|
37
36
|
// For login mode, only show available providers
|
|
38
|
-
this.allProviders =
|
|
37
|
+
this.allProviders = getOAuthProviders().filter((p) => p.available);
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
40
|
updateList() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, Spacer, Text } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tOAuthProviderInfo,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport {\n\tgetOAuthLogoutProviders,\n\tgetOAuthProviders,\n} from \"../../oauth/index.js\";\n\n/**\n * Component that renders an OAuth provider selector\n */\nexport class OAuthSelectorComponent extends Container {\n\tprivate listContainer: Container;\n\tprivate allProviders: OAuthProviderInfo<OAuthLogoutProvider>[] = [];\n\tprivate selectedIndex = 0;\n\tprivate mode: \"login\" | \"logout\";\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tprivate onSelectCallback: (providerId: OAuthLogoutProvider) => void,\n\t\tprivate onCancelCallback: () => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\n\t\t// Load providers\n\t\tthis.loadProviders();\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title =\n\t\t\tmode === \"login\"\n\t\t\t\t? \"Select provider to login:\"\n\t\t\t\t: \"Select provider to logout:\";\n\t\tthis.addChild(new Text(title, 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\t// For logout mode, only show providers with credentials\n\t\tif (this.mode === \"logout\") {\n\t\t\tthis.allProviders = getOAuthLogoutProviders();\n\t\t} else {\n\t\t\t// For login mode, only show available providers\n\t\t\tthis.allProviders = getOAuthProviders().filter(\n\t\t\t\t(p): p is OAuthProviderInfo<SupportedOAuthProvider> => p.available,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.allProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.mode === \"login\"\n\t\t\t\t\t? \"No OAuth providers available\"\n\t\t\t\t\t: \"No OAuth providers logged in. Use /login first.\";\n\t\t\tthis.listContainer.addChild(new Text(` ${message}`, 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < this.allProviders.length; i++) {\n\t\t\tconst provider = this.allProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isAvailable = provider.available;\n\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tline = `→ ${provider.name} - ${provider.description}`;\n\t\t\t} else {\n\t\t\t\tline = ` ${provider.name} - ${provider.description}`;\n\t\t\t}\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tline = ` ${provider.name} - ${provider.description} (coming soon)`;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new Text(line, 0, 0));\n\t\t}\n\n\t\t// Add help text\n\t\tthis.listContainer.addChild(new Spacer(1));\n\t\tthis.listContainer.addChild(\n\t\t\tnew Text(\"Use ↑↓ to navigate, Enter to select, Esc to cancel\", 0, 0),\n\t\t);\n\t}\n\n\thandleInput(keyData: string): void {\n\t\t// Up arrow\n\t\tif (keyData === \"\\x1b[A\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (keyData === \"\\x1b[B\") {\n\t\t\tthis.selectedIndex = Math.min(\n\t\t\t\tthis.allProviders.length - 1,\n\t\t\t\tthis.selectedIndex + 1,\n\t\t\t);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (keyData === \"\\r\") {\n\t\t\tconst selectedProvider = this.allProviders[this.selectedIndex];\n\t\t\t// Guard against undefined provider (e.g., empty array)\n\t\t\tif (\n\t\t\t\tselectedProvider &&\n\t\t\t\t(selectedProvider.available || this.mode === \"logout\")\n\t\t\t) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape\n\t\telse if (keyData === \"\\x1b\") {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
|
|
@@ -87,7 +87,7 @@ export function createMcpEventsController(params) {
|
|
|
87
87
|
notificationView.showToast(`[${name}] ${msg}`, level === "error" ? "warn" : "info");
|
|
88
88
|
}
|
|
89
89
|
};
|
|
90
|
-
//
|
|
90
|
+
// Agent profile activation handlers
|
|
91
91
|
handlers.composerActivated = (composer) => {
|
|
92
92
|
notificationView.showToast(`Maestro "${composer.name}" activated`, "success");
|
|
93
93
|
refreshFooterHint();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-events-setup.js","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/mcp-events-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Events Setup - Event handlers for MCP server notifications\n *\n * This module sets up event listeners for MCP server lifecycle events:\n * - Server connections/disconnections\n * - Server errors\n * - Tool list changes (debounced)\n * - Progress notifications\n * - Log messages (warnings/errors only)\n */\n\nimport { composerManager } from \"../../composers/index.js\";\nimport { mcpManager } from \"../../mcp/index.js\";\nimport type { NotificationView } from \"../notification-view.js\";\n\nexport interface McpEventHandlers {\n\tconnected?: (data: { name: string; tools: number }) => void;\n\tdisconnected?: (data: { name: string }) => void;\n\terror?: (data: { name: string; error: string }) => void;\n\ttoolsChanged?: (data: { name: string }) => void;\n\tprogress?: (data: {\n\t\tname: string;\n\t\tprogress: number;\n\t\ttotal?: number;\n\t\tmessage?: string;\n\t}) => void;\n\tlog?: (data: { name: string; level: string; data: unknown }) => void;\n\tcomposerActivated?: (composer: { name: string }) => void;\n\tcomposerDeactivated?: (composer: { name: string }) => void;\n}\n\nexport interface McpEventsController {\n\t/**\n\t * Stop listening to MCP events and clean up handlers\n\t */\n\tstop(): void;\n}\n\nexport function createMcpEventsController(params: {\n\tnotificationView: NotificationView;\n\trefreshFooterHint: () => void;\n}): McpEventsController {\n\tconst { notificationView, refreshFooterHint } = params;\n\n\t// Track timeout for debounced tools_changed notifications\n\tlet toolsChangedTimeout: ReturnType<typeof setTimeout> | undefined;\n\tconst pendingToolsChangedServers = new Set<string>();\n\n\t// Event handlers stored for cleanup\n\tconst handlers: McpEventHandlers = {};\n\n\t// Connection handler\n\thandlers.connected = ({ name, tools }) => {\n\t\tnotificationView.showToast(\n\t\t\t`MCP server \"${name}\" connected (${tools} tools)`,\n\t\t\t\"success\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Disconnection handler\n\thandlers.disconnected = ({ name }) => {\n\t\tnotificationView.showToast(`MCP server \"${name}\" disconnected`, \"warn\");\n\t\trefreshFooterHint();\n\t};\n\n\t// Error handler\n\thandlers.error = ({ name, error }) => {\n\t\tconst errorLabel = error.trim() || \"Connection failed.\";\n\t\tnotificationView.showToast(\n\t\t\t`MCP server \"${name}\" error: ${errorLabel}`,\n\t\t\t\"warn\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Tools changed handler (debounced)\n\thandlers.toolsChanged = ({ name }) => {\n\t\tpendingToolsChangedServers.add(name);\n\t\trefreshFooterHint();\n\t\tif (toolsChangedTimeout) clearTimeout(toolsChangedTimeout);\n\t\ttoolsChangedTimeout = setTimeout(() => {\n\t\t\tconst servers = Array.from(pendingToolsChangedServers);\n\t\t\tpendingToolsChangedServers.clear();\n\t\t\tconst msg =\n\t\t\t\tservers.length === 1\n\t\t\t\t\t? `MCP server \"${servers[0]}\" tools updated`\n\t\t\t\t\t: `MCP servers updated: ${servers.join(\", \")}`;\n\t\t\tnotificationView.showToast(msg, \"info\");\n\t\t}, 500);\n\t};\n\n\t// Progress handler\n\thandlers.progress = ({ name, progress, total, message }) => {\n\t\tlet msg: string;\n\t\tif (total && total > 0) {\n\t\t\t// Determinate progress - show percentage\n\t\t\tconst percent = Math.min(\n\t\t\t\t100,\n\t\t\t\tMath.max(0, Math.round((progress / total) * 100)),\n\t\t\t);\n\t\t\tmsg = message\n\t\t\t\t? `${name}: ${message} (${percent}%)`\n\t\t\t\t: `${name}: ${percent}%`;\n\t\t} else {\n\t\t\t// Indeterminate progress - skip percentage, show message only\n\t\t\tmsg = message ? `${name}: ${message}` : `${name}: in progress`;\n\t\t}\n\t\tnotificationView.showToast(msg, \"info\");\n\t};\n\n\t// Log handler (warnings and errors only)\n\thandlers.log = ({ name, level, data }) => {\n\t\tif (level === \"warning\" || level === \"error\") {\n\t\t\tlet msg: string;\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\tmsg = data;\n\t\t\t} else if (data === undefined || data === null) {\n\t\t\t\tmsg = String(data);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.stringify(data);\n\t\t\t\t} catch {\n\t\t\t\t\tmsg = \"[Unserializable data]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Use substring to avoid breaking multi-byte characters\n\t\t\tmsg = msg.substring(0, 100);\n\t\t\tnotificationView.showToast(\n\t\t\t\t`[${name}] ${msg}`,\n\t\t\t\tlevel === \"error\" ? \"warn\" : \"info\",\n\t\t\t);\n\t\t}\n\t};\n\n\t// Composer activation handlers\n\thandlers.composerActivated = (composer) => {\n\t\tnotificationView.showToast(\n\t\t\t`Maestro \"${composer.name}\" activated`,\n\t\t\t\"success\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\thandlers.composerDeactivated = (composer) => {\n\t\tnotificationView.showToast(\n\t\t\t`Maestro \"${composer.name}\" deactivated`,\n\t\t\t\"info\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Register event handlers\n\tmcpManager.on(\"connected\", handlers.connected);\n\tmcpManager.on(\"disconnected\", handlers.disconnected);\n\tmcpManager.on(\"error\", handlers.error);\n\tmcpManager.on(\"tools_changed\", handlers.toolsChanged);\n\tmcpManager.on(\"progress\", handlers.progress);\n\tmcpManager.on(\"log\", handlers.log);\n\tcomposerManager.on(\"activated\", handlers.composerActivated);\n\tcomposerManager.on(\"deactivated\", handlers.composerDeactivated);\n\n\treturn {\n\t\tstop() {\n\t\t\t// Clean up timeout\n\t\t\tif (toolsChangedTimeout) {\n\t\t\t\tclearTimeout(toolsChangedTimeout);\n\t\t\t\ttoolsChangedTimeout = undefined;\n\t\t\t}\n\n\t\t\t// Remove event listeners\n\t\t\tif (handlers.connected) {\n\t\t\t\tmcpManager.off(\"connected\", handlers.connected);\n\t\t\t}\n\t\t\tif (handlers.disconnected) {\n\t\t\t\tmcpManager.off(\"disconnected\", handlers.disconnected);\n\t\t\t}\n\t\t\tif (handlers.error) {\n\t\t\t\tmcpManager.off(\"error\", handlers.error);\n\t\t\t}\n\t\t\tif (handlers.toolsChanged) {\n\t\t\t\tmcpManager.off(\"tools_changed\", handlers.toolsChanged);\n\t\t\t}\n\t\t\tif (handlers.progress) {\n\t\t\t\tmcpManager.off(\"progress\", handlers.progress);\n\t\t\t}\n\t\t\tif (handlers.log) {\n\t\t\t\tmcpManager.off(\"log\", handlers.log);\n\t\t\t}\n\t\t\tif (handlers.composerActivated) {\n\t\t\t\tcomposerManager.off(\"activated\", handlers.composerActivated);\n\t\t\t}\n\t\t\tif (handlers.composerDeactivated) {\n\t\t\t\tcomposerManager.off(\"deactivated\", handlers.composerDeactivated);\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-events-setup.js","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/mcp-events-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Events Setup - Event handlers for MCP server notifications\n *\n * This module sets up event listeners for MCP server lifecycle events:\n * - Server connections/disconnections\n * - Server errors\n * - Tool list changes (debounced)\n * - Progress notifications\n * - Log messages (warnings/errors only)\n */\n\nimport { composerManager } from \"../../composers/index.js\";\nimport { mcpManager } from \"../../mcp/index.js\";\nimport type { NotificationView } from \"../notification-view.js\";\n\nexport interface McpEventHandlers {\n\tconnected?: (data: { name: string; tools: number }) => void;\n\tdisconnected?: (data: { name: string }) => void;\n\terror?: (data: { name: string; error: string }) => void;\n\ttoolsChanged?: (data: { name: string }) => void;\n\tprogress?: (data: {\n\t\tname: string;\n\t\tprogress: number;\n\t\ttotal?: number;\n\t\tmessage?: string;\n\t}) => void;\n\tlog?: (data: { name: string; level: string; data: unknown }) => void;\n\tcomposerActivated?: (composer: { name: string }) => void;\n\tcomposerDeactivated?: (composer: { name: string }) => void;\n}\n\nexport interface McpEventsController {\n\t/**\n\t * Stop listening to MCP events and clean up handlers\n\t */\n\tstop(): void;\n}\n\nexport function createMcpEventsController(params: {\n\tnotificationView: NotificationView;\n\trefreshFooterHint: () => void;\n}): McpEventsController {\n\tconst { notificationView, refreshFooterHint } = params;\n\n\t// Track timeout for debounced tools_changed notifications\n\tlet toolsChangedTimeout: ReturnType<typeof setTimeout> | undefined;\n\tconst pendingToolsChangedServers = new Set<string>();\n\n\t// Event handlers stored for cleanup\n\tconst handlers: McpEventHandlers = {};\n\n\t// Connection handler\n\thandlers.connected = ({ name, tools }) => {\n\t\tnotificationView.showToast(\n\t\t\t`MCP server \"${name}\" connected (${tools} tools)`,\n\t\t\t\"success\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Disconnection handler\n\thandlers.disconnected = ({ name }) => {\n\t\tnotificationView.showToast(`MCP server \"${name}\" disconnected`, \"warn\");\n\t\trefreshFooterHint();\n\t};\n\n\t// Error handler\n\thandlers.error = ({ name, error }) => {\n\t\tconst errorLabel = error.trim() || \"Connection failed.\";\n\t\tnotificationView.showToast(\n\t\t\t`MCP server \"${name}\" error: ${errorLabel}`,\n\t\t\t\"warn\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Tools changed handler (debounced)\n\thandlers.toolsChanged = ({ name }) => {\n\t\tpendingToolsChangedServers.add(name);\n\t\trefreshFooterHint();\n\t\tif (toolsChangedTimeout) clearTimeout(toolsChangedTimeout);\n\t\ttoolsChangedTimeout = setTimeout(() => {\n\t\t\tconst servers = Array.from(pendingToolsChangedServers);\n\t\t\tpendingToolsChangedServers.clear();\n\t\t\tconst msg =\n\t\t\t\tservers.length === 1\n\t\t\t\t\t? `MCP server \"${servers[0]}\" tools updated`\n\t\t\t\t\t: `MCP servers updated: ${servers.join(\", \")}`;\n\t\t\tnotificationView.showToast(msg, \"info\");\n\t\t}, 500);\n\t};\n\n\t// Progress handler\n\thandlers.progress = ({ name, progress, total, message }) => {\n\t\tlet msg: string;\n\t\tif (total && total > 0) {\n\t\t\t// Determinate progress - show percentage\n\t\t\tconst percent = Math.min(\n\t\t\t\t100,\n\t\t\t\tMath.max(0, Math.round((progress / total) * 100)),\n\t\t\t);\n\t\t\tmsg = message\n\t\t\t\t? `${name}: ${message} (${percent}%)`\n\t\t\t\t: `${name}: ${percent}%`;\n\t\t} else {\n\t\t\t// Indeterminate progress - skip percentage, show message only\n\t\t\tmsg = message ? `${name}: ${message}` : `${name}: in progress`;\n\t\t}\n\t\tnotificationView.showToast(msg, \"info\");\n\t};\n\n\t// Log handler (warnings and errors only)\n\thandlers.log = ({ name, level, data }) => {\n\t\tif (level === \"warning\" || level === \"error\") {\n\t\t\tlet msg: string;\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\tmsg = data;\n\t\t\t} else if (data === undefined || data === null) {\n\t\t\t\tmsg = String(data);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.stringify(data);\n\t\t\t\t} catch {\n\t\t\t\t\tmsg = \"[Unserializable data]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Use substring to avoid breaking multi-byte characters\n\t\t\tmsg = msg.substring(0, 100);\n\t\t\tnotificationView.showToast(\n\t\t\t\t`[${name}] ${msg}`,\n\t\t\t\tlevel === \"error\" ? \"warn\" : \"info\",\n\t\t\t);\n\t\t}\n\t};\n\n\t// Agent profile activation handlers\n\thandlers.composerActivated = (composer) => {\n\t\tnotificationView.showToast(\n\t\t\t`Maestro \"${composer.name}\" activated`,\n\t\t\t\"success\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\thandlers.composerDeactivated = (composer) => {\n\t\tnotificationView.showToast(\n\t\t\t`Maestro \"${composer.name}\" deactivated`,\n\t\t\t\"info\",\n\t\t);\n\t\trefreshFooterHint();\n\t};\n\n\t// Register event handlers\n\tmcpManager.on(\"connected\", handlers.connected);\n\tmcpManager.on(\"disconnected\", handlers.disconnected);\n\tmcpManager.on(\"error\", handlers.error);\n\tmcpManager.on(\"tools_changed\", handlers.toolsChanged);\n\tmcpManager.on(\"progress\", handlers.progress);\n\tmcpManager.on(\"log\", handlers.log);\n\tcomposerManager.on(\"activated\", handlers.composerActivated);\n\tcomposerManager.on(\"deactivated\", handlers.composerDeactivated);\n\n\treturn {\n\t\tstop() {\n\t\t\t// Clean up timeout\n\t\t\tif (toolsChangedTimeout) {\n\t\t\t\tclearTimeout(toolsChangedTimeout);\n\t\t\t\ttoolsChangedTimeout = undefined;\n\t\t\t}\n\n\t\t\t// Remove event listeners\n\t\t\tif (handlers.connected) {\n\t\t\t\tmcpManager.off(\"connected\", handlers.connected);\n\t\t\t}\n\t\t\tif (handlers.disconnected) {\n\t\t\t\tmcpManager.off(\"disconnected\", handlers.disconnected);\n\t\t\t}\n\t\t\tif (handlers.error) {\n\t\t\t\tmcpManager.off(\"error\", handlers.error);\n\t\t\t}\n\t\t\tif (handlers.toolsChanged) {\n\t\t\t\tmcpManager.off(\"tools_changed\", handlers.toolsChanged);\n\t\t\t}\n\t\t\tif (handlers.progress) {\n\t\t\t\tmcpManager.off(\"progress\", handlers.progress);\n\t\t\t}\n\t\t\tif (handlers.log) {\n\t\t\t\tmcpManager.off(\"log\", handlers.log);\n\t\t\t}\n\t\t\tif (handlers.composerActivated) {\n\t\t\t\tcomposerManager.off(\"activated\", handlers.composerActivated);\n\t\t\t}\n\t\t\tif (handlers.composerDeactivated) {\n\t\t\t\tcomposerManager.off(\"deactivated\", handlers.composerDeactivated);\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
@@ -120,7 +120,7 @@ function formatLoadedSessionToast(sessionInfo) {
|
|
|
120
120
|
return `${prefix} ${sessionInfo.resumeSummary.trim()}`;
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
|
-
* Main TUI (Terminal User Interface) renderer for the
|
|
123
|
+
* Main TUI (Terminal User Interface) renderer for the Maestro coding agent.
|
|
124
124
|
*
|
|
125
125
|
* This class orchestrates all UI components, event handling, and user interactions.
|
|
126
126
|
* It manages:
|
|
@@ -943,7 +943,7 @@ export class TuiRenderer {
|
|
|
943
943
|
showFileSearch: () => this.getFileSearchView().showFileSearch(),
|
|
944
944
|
onEditLastQueuedFollowUp: () => this.editLastQueuedFollowUp(),
|
|
945
945
|
});
|
|
946
|
-
// Set up MCP and
|
|
946
|
+
// Set up MCP and agent profile event handlers for notifications
|
|
947
947
|
this.mcpEventsController = createMcpEventsController({
|
|
948
948
|
notificationView: this.notificationView,
|
|
949
949
|
refreshFooterHint: () => this.refreshFooterHint(),
|