fast-agent-mcp 0.3.9__tar.gz → 0.3.11__tar.gz
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.
Potentially problematic release.
This version of fast-agent-mcp might be problematic. Click here for more details.
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/PKG-INFO +1 -1
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/pyproject.toml +1 -1
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/config.py +2 -2
- fast_agent_mcp-0.3.11/src/fast_agent/human_input/elicitation_handler.py +123 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_factory.py +2 -2
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_aggregator.py +41 -44
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/sampling.py +21 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/transport_tracking.py +3 -1
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console_display.py +27 -22
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_style.py +7 -7
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/enhanced_prompt.py +19 -3
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_display.py +178 -89
- fast_agent_mcp-0.3.11/src/fast_agent/ui/notification_tracker.py +167 -0
- fast_agent_mcp-0.3.9/src/fast_agent/human_input/elicitation_handler.py +0 -106
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/.gitignore +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/LICENSE +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/README.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/a2a/agent_executor.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/a2a/server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-advanced.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-simple.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/readme.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/display_check.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm_advanced.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_mcp.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/openapi_mcp_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/petstore.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/run-as-server.sh +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/hatch_build.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/agent_types.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_decorator.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/mcp_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/tool_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/router_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__main__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/auth.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/check_config.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/go.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/constants.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/main.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/constants.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/context.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/agent_app.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/core_app.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_decorators.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/executor.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/fastagent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/events.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/listeners.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/logger.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/transport.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/event_progress.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/history/history_exporter.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/form_fields.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/simple_form.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/interfaces.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/fastagent_llm.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/passthrough.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/playback.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/silent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/slow.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/memory.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_database.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_factory.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_info.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_key_manager.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_types.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/request_params.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/interfaces.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_content.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/oauth_client.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/agent_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_mixin.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/py.typed +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/tools/elicitation.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/types/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/types/llm_stop_reason.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/__init__.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_form.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/interactive_prompt.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mermaid_utils.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/progress_display.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/rich_progress.py +0 -0
- {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/usage_display.py +0 -0
|
@@ -43,8 +43,8 @@ class MCPSamplingSettings(BaseModel):
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
class MCPElicitationSettings(BaseModel):
|
|
46
|
-
mode: Literal["forms", "
|
|
47
|
-
"""Elicitation mode: 'forms' (default UI), '
|
|
46
|
+
mode: Literal["forms", "auto-cancel", "none"] = "none"
|
|
47
|
+
"""Elicitation mode: 'forms' (default UI), 'auto-cancel', 'none' (no capability)"""
|
|
48
48
|
|
|
49
49
|
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
50
50
|
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional
|
|
2
|
+
|
|
3
|
+
from fast_agent.human_input.elicitation_state import elicitation_state
|
|
4
|
+
from fast_agent.human_input.types import (
|
|
5
|
+
HumanInputRequest,
|
|
6
|
+
HumanInputResponse,
|
|
7
|
+
)
|
|
8
|
+
from fast_agent.tools.elicitation import set_elicitation_input_callback
|
|
9
|
+
from fast_agent.ui.elicitation_form import (
|
|
10
|
+
show_simple_elicitation_form,
|
|
11
|
+
)
|
|
12
|
+
from fast_agent.ui.elicitation_style import (
|
|
13
|
+
ELICITATION_STYLE,
|
|
14
|
+
)
|
|
15
|
+
from fast_agent.ui.progress_display import progress_display
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
async def elicitation_input_callback(
|
|
19
|
+
request: HumanInputRequest,
|
|
20
|
+
agent_name: str | None = None,
|
|
21
|
+
server_name: str | None = None,
|
|
22
|
+
server_info: dict[str, Any] | None = None,
|
|
23
|
+
) -> HumanInputResponse:
|
|
24
|
+
"""Request input from a human user for MCP server elicitation requests."""
|
|
25
|
+
|
|
26
|
+
# Extract effective names
|
|
27
|
+
effective_agent_name = agent_name or (
|
|
28
|
+
request.metadata.get("agent_name", "Unknown Agent") if request.metadata else "Unknown Agent"
|
|
29
|
+
)
|
|
30
|
+
effective_server_name = server_name or "Unknown Server"
|
|
31
|
+
|
|
32
|
+
# Start tracking elicitation operation
|
|
33
|
+
try:
|
|
34
|
+
from fast_agent.ui import notification_tracker
|
|
35
|
+
notification_tracker.start_elicitation(effective_server_name)
|
|
36
|
+
except Exception:
|
|
37
|
+
# Don't let notification tracking break elicitation
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
# Check if elicitation is disabled for this server
|
|
42
|
+
if elicitation_state.is_disabled(effective_server_name):
|
|
43
|
+
return HumanInputResponse(
|
|
44
|
+
request_id=request.request_id,
|
|
45
|
+
response="__CANCELLED__",
|
|
46
|
+
metadata={"auto_cancelled": True, "reason": "Server elicitation disabled by user"},
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Get the elicitation schema from metadata
|
|
50
|
+
schema: Optional[Dict[str, Any]] = None
|
|
51
|
+
if request.metadata and "requested_schema" in request.metadata:
|
|
52
|
+
schema = request.metadata["requested_schema"]
|
|
53
|
+
|
|
54
|
+
# Use the context manager to pause the progress display while getting input
|
|
55
|
+
with progress_display.paused():
|
|
56
|
+
try:
|
|
57
|
+
if schema:
|
|
58
|
+
form_action, form_data = await show_simple_elicitation_form(
|
|
59
|
+
schema=schema,
|
|
60
|
+
message=request.prompt,
|
|
61
|
+
agent_name=effective_agent_name,
|
|
62
|
+
server_name=effective_server_name,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
if form_action == "accept" and form_data is not None:
|
|
66
|
+
# Convert form data to JSON string
|
|
67
|
+
import json
|
|
68
|
+
|
|
69
|
+
response = json.dumps(form_data)
|
|
70
|
+
elif form_action == "decline":
|
|
71
|
+
response = "__DECLINED__"
|
|
72
|
+
elif form_action == "disable":
|
|
73
|
+
response = "__DISABLE_SERVER__"
|
|
74
|
+
else: # cancel
|
|
75
|
+
response = "__CANCELLED__"
|
|
76
|
+
else:
|
|
77
|
+
# No schema, fall back to text input using prompt_toolkit only
|
|
78
|
+
from prompt_toolkit.shortcuts import input_dialog
|
|
79
|
+
|
|
80
|
+
response = await input_dialog(
|
|
81
|
+
title="Input Requested",
|
|
82
|
+
text=f"Agent: {effective_agent_name}\nServer: {effective_server_name}\n\n{request.prompt}",
|
|
83
|
+
style=ELICITATION_STYLE,
|
|
84
|
+
).run_async()
|
|
85
|
+
|
|
86
|
+
if response is None:
|
|
87
|
+
response = "__CANCELLED__"
|
|
88
|
+
|
|
89
|
+
except KeyboardInterrupt:
|
|
90
|
+
response = "__CANCELLED__"
|
|
91
|
+
except EOFError:
|
|
92
|
+
response = "__CANCELLED__"
|
|
93
|
+
|
|
94
|
+
return HumanInputResponse(
|
|
95
|
+
request_id=request.request_id,
|
|
96
|
+
response=response.strip() if isinstance(response, str) else response,
|
|
97
|
+
metadata={"has_schema": schema is not None},
|
|
98
|
+
)
|
|
99
|
+
finally:
|
|
100
|
+
# End tracking elicitation operation
|
|
101
|
+
try:
|
|
102
|
+
from fast_agent.ui import notification_tracker
|
|
103
|
+
notification_tracker.end_elicitation(effective_server_name)
|
|
104
|
+
except Exception:
|
|
105
|
+
# Don't let notification tracking break elicitation
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# Register adapter with fast_agent tools so they can invoke this UI handler without importing types
|
|
110
|
+
async def _elicitation_adapter(
|
|
111
|
+
request_payload: dict,
|
|
112
|
+
agent_name: str | None = None,
|
|
113
|
+
server_name: str | None = None,
|
|
114
|
+
server_info: dict[str, Any] | None = None,
|
|
115
|
+
) -> str:
|
|
116
|
+
req = HumanInputRequest(**request_payload)
|
|
117
|
+
resp = await elicitation_input_callback(
|
|
118
|
+
request=req, agent_name=agent_name, server_name=server_name, server_info=server_info
|
|
119
|
+
)
|
|
120
|
+
return resp.response if isinstance(resp.response, str) else str(resp.response)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
set_elicitation_input_callback(_elicitation_adapter)
|
|
@@ -53,7 +53,7 @@ def resolve_elicitation_handler(
|
|
|
53
53
|
if mode == "none":
|
|
54
54
|
logger.debug(f"Elicitation disabled by server config for agent {agent_config.name}")
|
|
55
55
|
return None # Don't advertise elicitation capability
|
|
56
|
-
elif mode == "
|
|
56
|
+
elif mode == "auto-cancel":
|
|
57
57
|
logger.debug(
|
|
58
58
|
f"Using auto-cancel elicitation handler (server config) for agent {agent_config.name}"
|
|
59
59
|
)
|
|
@@ -74,7 +74,7 @@ def resolve_elicitation_handler(
|
|
|
74
74
|
if mode == "none":
|
|
75
75
|
logger.debug(f"Elicitation disabled by global config for agent {agent_config.name}")
|
|
76
76
|
return None # Don't advertise elicitation capability
|
|
77
|
-
elif mode == "
|
|
77
|
+
elif mode == "auto-cancel":
|
|
78
78
|
logger.debug(
|
|
79
79
|
f"Using auto-cancel elicitation handler (global config) for agent {agent_config.name}"
|
|
80
80
|
)
|
|
@@ -334,6 +334,9 @@ class MCPAggregator(ContextDependent):
|
|
|
334
334
|
server_name, client_session_factory=self._create_session_factory(server_name)
|
|
335
335
|
)
|
|
336
336
|
|
|
337
|
+
# Record the initialize call that happened during connection setup
|
|
338
|
+
await self._record_server_call(server_name, "initialize", True)
|
|
339
|
+
|
|
337
340
|
logger.info(
|
|
338
341
|
f"MCP Servers initialized for agent '{self.agent_name}'",
|
|
339
342
|
data={
|
|
@@ -342,27 +345,39 @@ class MCPAggregator(ContextDependent):
|
|
|
342
345
|
},
|
|
343
346
|
)
|
|
344
347
|
|
|
345
|
-
async def fetch_tools(
|
|
348
|
+
async def fetch_tools(server_name: str) -> List[Tool]:
|
|
346
349
|
# Only fetch tools if the server supports them
|
|
347
350
|
if not await self.server_supports_feature(server_name, "tools"):
|
|
348
351
|
logger.debug(f"Server '{server_name}' does not support tools")
|
|
349
352
|
return []
|
|
350
353
|
|
|
351
354
|
try:
|
|
352
|
-
result: ListToolsResult = await
|
|
355
|
+
result: ListToolsResult = await self._execute_on_server(
|
|
356
|
+
server_name=server_name,
|
|
357
|
+
operation_type="tools/list",
|
|
358
|
+
operation_name="",
|
|
359
|
+
method_name="list_tools",
|
|
360
|
+
method_args={},
|
|
361
|
+
)
|
|
353
362
|
return result.tools or []
|
|
354
363
|
except Exception as e:
|
|
355
364
|
logger.error(f"Error loading tools from server '{server_name}'", data=e)
|
|
356
365
|
return []
|
|
357
366
|
|
|
358
|
-
async def fetch_prompts(
|
|
367
|
+
async def fetch_prompts(server_name: str) -> List[Prompt]:
|
|
359
368
|
# Only fetch prompts if the server supports them
|
|
360
369
|
if not await self.server_supports_feature(server_name, "prompts"):
|
|
361
370
|
logger.debug(f"Server '{server_name}' does not support prompts")
|
|
362
371
|
return []
|
|
363
372
|
|
|
364
373
|
try:
|
|
365
|
-
result = await
|
|
374
|
+
result = await self._execute_on_server(
|
|
375
|
+
server_name=server_name,
|
|
376
|
+
operation_type="prompts/list",
|
|
377
|
+
operation_name="",
|
|
378
|
+
method_name="list_prompts",
|
|
379
|
+
method_args={},
|
|
380
|
+
)
|
|
366
381
|
return getattr(result, "prompts", [])
|
|
367
382
|
except Exception as e:
|
|
368
383
|
logger.debug(f"Error loading prompts from server '{server_name}': {e}")
|
|
@@ -372,20 +387,9 @@ class MCPAggregator(ContextDependent):
|
|
|
372
387
|
tools: List[Tool] = []
|
|
373
388
|
prompts: List[Prompt] = []
|
|
374
389
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
)
|
|
379
|
-
tools = await fetch_tools(server_connection.session, server_name)
|
|
380
|
-
prompts = await fetch_prompts(server_connection.session, server_name)
|
|
381
|
-
else:
|
|
382
|
-
async with gen_client(
|
|
383
|
-
server_name,
|
|
384
|
-
server_registry=self.context.server_registry,
|
|
385
|
-
client_session_factory=self._create_session_factory(server_name),
|
|
386
|
-
) as client:
|
|
387
|
-
tools = await fetch_tools(client, server_name)
|
|
388
|
-
prompts = await fetch_prompts(client, server_name)
|
|
390
|
+
# Use _execute_on_server for consistent tracking regardless of connection mode
|
|
391
|
+
tools = await fetch_tools(server_name)
|
|
392
|
+
prompts = await fetch_prompts(server_name)
|
|
389
393
|
|
|
390
394
|
return server_name, tools, prompts
|
|
391
395
|
|
|
@@ -978,7 +982,7 @@ class MCPAggregator(ContextDependent):
|
|
|
978
982
|
|
|
979
983
|
return await self._execute_on_server(
|
|
980
984
|
server_name=server_name,
|
|
981
|
-
operation_type="
|
|
985
|
+
operation_type="tools/call",
|
|
982
986
|
operation_name=local_tool_name,
|
|
983
987
|
method_name="call_tool",
|
|
984
988
|
method_args={
|
|
@@ -1071,7 +1075,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1071
1075
|
|
|
1072
1076
|
result = await self._execute_on_server(
|
|
1073
1077
|
server_name=server_name,
|
|
1074
|
-
operation_type="
|
|
1078
|
+
operation_type="prompts/get",
|
|
1075
1079
|
operation_name=local_prompt_name or "default",
|
|
1076
1080
|
method_name="get_prompt",
|
|
1077
1081
|
method_args=method_args,
|
|
@@ -1119,7 +1123,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1119
1123
|
|
|
1120
1124
|
result = await self._execute_on_server(
|
|
1121
1125
|
server_name=s_name,
|
|
1122
|
-
operation_type="
|
|
1126
|
+
operation_type="prompts/get",
|
|
1123
1127
|
operation_name=local_prompt_name,
|
|
1124
1128
|
method_name="get_prompt",
|
|
1125
1129
|
method_args=method_args,
|
|
@@ -1167,7 +1171,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1167
1171
|
|
|
1168
1172
|
result = await self._execute_on_server(
|
|
1169
1173
|
server_name=s_name,
|
|
1170
|
-
operation_type="
|
|
1174
|
+
operation_type="prompts/get",
|
|
1171
1175
|
operation_name=local_prompt_name,
|
|
1172
1176
|
method_name="get_prompt",
|
|
1173
1177
|
method_args=method_args,
|
|
@@ -1190,7 +1194,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1190
1194
|
try:
|
|
1191
1195
|
prompt_list_result = await self._execute_on_server(
|
|
1192
1196
|
server_name=s_name,
|
|
1193
|
-
operation_type="prompts
|
|
1197
|
+
operation_type="prompts/list",
|
|
1194
1198
|
operation_name="",
|
|
1195
1199
|
method_name="list_prompts",
|
|
1196
1200
|
error_factory=lambda _: None,
|
|
@@ -1264,7 +1268,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1264
1268
|
# Fetch from server
|
|
1265
1269
|
result = await self._execute_on_server(
|
|
1266
1270
|
server_name=server_name,
|
|
1267
|
-
operation_type="prompts
|
|
1271
|
+
operation_type="prompts/list",
|
|
1268
1272
|
operation_name="",
|
|
1269
1273
|
method_name="list_prompts",
|
|
1270
1274
|
error_factory=lambda _: None,
|
|
@@ -1303,7 +1307,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1303
1307
|
try:
|
|
1304
1308
|
result = await self._execute_on_server(
|
|
1305
1309
|
server_name=s_name,
|
|
1306
|
-
operation_type="prompts
|
|
1310
|
+
operation_type="prompts/list",
|
|
1307
1311
|
operation_name="",
|
|
1308
1312
|
method_name="list_prompts",
|
|
1309
1313
|
error_factory=lambda _: None,
|
|
@@ -1358,22 +1362,15 @@ class MCPAggregator(ContextDependent):
|
|
|
1358
1362
|
|
|
1359
1363
|
async with self._refresh_lock:
|
|
1360
1364
|
try:
|
|
1361
|
-
# Fetch new tools from the server
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
async with gen_client(
|
|
1371
|
-
server_name,
|
|
1372
|
-
server_registry=self.context.server_registry,
|
|
1373
|
-
client_session_factory=self._create_session_factory(server_name),
|
|
1374
|
-
) as client:
|
|
1375
|
-
tools_result = await client.list_tools()
|
|
1376
|
-
new_tools = tools_result.tools or []
|
|
1365
|
+
# Fetch new tools from the server using _execute_on_server to properly record stats
|
|
1366
|
+
tools_result = await self._execute_on_server(
|
|
1367
|
+
server_name=server_name,
|
|
1368
|
+
operation_type="tools/list",
|
|
1369
|
+
operation_name="",
|
|
1370
|
+
method_name="list_tools",
|
|
1371
|
+
method_args={},
|
|
1372
|
+
)
|
|
1373
|
+
new_tools = tools_result.tools or []
|
|
1377
1374
|
|
|
1378
1375
|
# Update tool maps
|
|
1379
1376
|
async with self._tool_map_lock:
|
|
@@ -1489,7 +1486,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1489
1486
|
# Use the _execute_on_server method to call read_resource on the server
|
|
1490
1487
|
result = await self._execute_on_server(
|
|
1491
1488
|
server_name=server_name,
|
|
1492
|
-
operation_type="
|
|
1489
|
+
operation_type="resources/read",
|
|
1493
1490
|
operation_name=resource_uri,
|
|
1494
1491
|
method_name="read_resource",
|
|
1495
1492
|
method_args={"uri": uri},
|
|
@@ -1540,7 +1537,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1540
1537
|
# Use the _execute_on_server method to call list_resources on the server
|
|
1541
1538
|
result = await self._execute_on_server(
|
|
1542
1539
|
server_name=s_name,
|
|
1543
|
-
operation_type="resources
|
|
1540
|
+
operation_type="resources/list",
|
|
1544
1541
|
operation_name="",
|
|
1545
1542
|
method_name="list_resources",
|
|
1546
1543
|
method_args={}, # Empty dictionary instead of None
|
|
@@ -1593,7 +1590,7 @@ class MCPAggregator(ContextDependent):
|
|
|
1593
1590
|
# Use the _execute_on_server method to call list_tools on the server
|
|
1594
1591
|
result = await self._execute_on_server(
|
|
1595
1592
|
server_name=s_name,
|
|
1596
|
-
operation_type="tools
|
|
1593
|
+
operation_type="tools/list",
|
|
1597
1594
|
operation_name="",
|
|
1598
1595
|
method_name="list_tools",
|
|
1599
1596
|
method_args={},
|
|
@@ -77,6 +77,19 @@ async def sample(mcp_ctx: ClientSession, params: CreateMessageRequestParams) ->
|
|
|
77
77
|
Returns:
|
|
78
78
|
A CreateMessageResult containing the LLM's response
|
|
79
79
|
"""
|
|
80
|
+
# Get server name for notification tracking
|
|
81
|
+
server_name = "unknown"
|
|
82
|
+
if hasattr(mcp_ctx, "session") and hasattr(mcp_ctx.session, "session_server_name"):
|
|
83
|
+
server_name = mcp_ctx.session.session_server_name or "unknown"
|
|
84
|
+
|
|
85
|
+
# Start tracking sampling operation
|
|
86
|
+
try:
|
|
87
|
+
from fast_agent.ui import notification_tracker
|
|
88
|
+
notification_tracker.start_sampling(server_name)
|
|
89
|
+
except Exception:
|
|
90
|
+
# Don't let notification tracking break sampling
|
|
91
|
+
pass
|
|
92
|
+
|
|
80
93
|
model: str | None = None
|
|
81
94
|
api_key: str | None = None
|
|
82
95
|
try:
|
|
@@ -157,6 +170,14 @@ async def sample(mcp_ctx: ClientSession, params: CreateMessageRequestParams) ->
|
|
|
157
170
|
return SamplingConverter.error_result(
|
|
158
171
|
error_message=f"Error in sampling: {str(e)}", model=model
|
|
159
172
|
)
|
|
173
|
+
finally:
|
|
174
|
+
# End tracking sampling operation
|
|
175
|
+
try:
|
|
176
|
+
from fast_agent.ui import notification_tracker
|
|
177
|
+
notification_tracker.end_sampling(server_name)
|
|
178
|
+
except Exception:
|
|
179
|
+
# Don't let notification tracking break sampling
|
|
180
|
+
pass
|
|
160
181
|
|
|
161
182
|
|
|
162
183
|
def sampling_agent_config(
|
|
@@ -243,7 +243,9 @@ class TransportChannelMetrics:
|
|
|
243
243
|
self._get_last_error = event.detail
|
|
244
244
|
self._get_last_event = "error"
|
|
245
245
|
self._get_last_event_at = now
|
|
246
|
-
|
|
246
|
+
# Record 405 as "disabled" in timeline, not "error"
|
|
247
|
+
timeline_state = "disabled" if event.status_code == 405 else "error"
|
|
248
|
+
self._record_history("get", timeline_state, now)
|
|
247
249
|
|
|
248
250
|
def _handle_resumption_event(self, event: ChannelEvent, now: datetime) -> None:
|
|
249
251
|
if event.event_type == "message" and event.message is not None:
|
|
@@ -623,33 +623,38 @@ class ConsoleDisplay:
|
|
|
623
623
|
if not self.config or not self.config.logger.show_tools:
|
|
624
624
|
return
|
|
625
625
|
|
|
626
|
-
#
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
f"[magenta]▎[/magenta][dim magenta]▶[/dim magenta] [magenta]{agent_name}[/magenta]"
|
|
630
|
-
)
|
|
631
|
-
else:
|
|
632
|
-
left = "[magenta]▎[/magenta][dim magenta]▶[/dim magenta]"
|
|
626
|
+
# Check if prompt_toolkit is active
|
|
627
|
+
try:
|
|
628
|
+
from prompt_toolkit.application.current import get_app
|
|
633
629
|
|
|
634
|
-
|
|
635
|
-
|
|
630
|
+
app = get_app()
|
|
631
|
+
# We're in interactive mode - add to notification tracker
|
|
632
|
+
from fast_agent.ui import notification_tracker
|
|
636
633
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
console.console.print(message, style="dim", markup=self._markup)
|
|
634
|
+
notification_tracker.add_tool_update(updated_server)
|
|
635
|
+
app.invalidate() # Force toolbar redraw
|
|
640
636
|
|
|
641
|
-
#
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
637
|
+
except: # noqa: E722
|
|
638
|
+
# No active prompt_toolkit session - display with rich as before
|
|
639
|
+
# Combined separator and status line
|
|
640
|
+
if agent_name:
|
|
641
|
+
left = (
|
|
642
|
+
f"[magenta]▎[/magenta][dim magenta]▶[/dim magenta] [magenta]{agent_name}[/magenta]"
|
|
643
|
+
)
|
|
644
|
+
else:
|
|
645
|
+
left = "[magenta]▎[/magenta][dim magenta]▶[/dim magenta]"
|
|
645
646
|
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
from prompt_toolkit.application.current import get_app
|
|
647
|
+
right = f"[dim]{updated_server}[/dim]"
|
|
648
|
+
self._create_combined_separator_status(left, right)
|
|
649
649
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
650
|
+
# Display update message
|
|
651
|
+
message = f"Updating tools for server {updated_server}"
|
|
652
|
+
console.console.print(message, style="dim", markup=self._markup)
|
|
653
|
+
|
|
654
|
+
# Bottom separator
|
|
655
|
+
console.console.print()
|
|
656
|
+
console.console.print("─" * console.console.size.width, style="dim")
|
|
657
|
+
console.console.print()
|
|
653
658
|
|
|
654
659
|
def _create_combined_separator_status(self, left_content: str, right_info: str = "") -> None:
|
|
655
660
|
"""
|
|
@@ -7,16 +7,16 @@ ELICITATION_STYLE = Style.from_dict(
|
|
|
7
7
|
{
|
|
8
8
|
# Dialog structure - use ansidefault for true black, remove problematic shadow
|
|
9
9
|
"dialog": "bg:ansidefault", # True black dialog using ansidefault
|
|
10
|
-
"dialog.body": "bg:ansidefault fg:
|
|
10
|
+
"dialog.body": "bg:ansidefault fg:ansidefault", # True black dialog body with default text color
|
|
11
11
|
"dialog shadow": "bg:ansidefault", # Set shadow background to match application
|
|
12
12
|
"dialog.border": "bg:ansidefault", # True black border background
|
|
13
13
|
# Set application background to true black
|
|
14
14
|
"application": "bg:ansidefault", # True black application background
|
|
15
15
|
# Title styling with better contrast
|
|
16
|
-
"title": "fg:
|
|
16
|
+
"title": "fg:ansidefault bold", # Default color title for terminal compatibility
|
|
17
17
|
# Buttons - only define focused state to preserve focus highlighting
|
|
18
18
|
"button.focused": "bg:ansibrightgreen fg:ansiblack bold", # Bright green with black text for contrast
|
|
19
|
-
"button.arrow": "fg:
|
|
19
|
+
"button.arrow": "fg:ansidefault bold", # Default color arrows for terminal compatibility
|
|
20
20
|
# Form elements with consistent green/yellow theme
|
|
21
21
|
# Checkboxes - green when checked, yellow when focused
|
|
22
22
|
"checkbox": "fg:ansidefault", # Default color unchecked checkbox (dimmer)
|
|
@@ -34,15 +34,15 @@ ELICITATION_STYLE = Style.from_dict(
|
|
|
34
34
|
# Frame styling with ANSI colors - make borders visible
|
|
35
35
|
"frame.border": "fg:ansibrightblack", # Bright black borders for subtlety
|
|
36
36
|
"frame.label": "fg:ansigray", # Gray frame labels (less prominent)
|
|
37
|
-
# Labels and text - use
|
|
38
|
-
"label": "fg:
|
|
37
|
+
# Labels and text - use default color for terminal compatibility
|
|
38
|
+
"label": "fg:ansidefault", # Default color labels for terminal compatibility
|
|
39
39
|
"message": "fg:ansibrightcyan", # Bright cyan messages (no bold)
|
|
40
40
|
# Agent and server names - make them match
|
|
41
41
|
"agent-name": "fg:ansibrightblue bold",
|
|
42
42
|
"server-name": "fg:ansibrightblue bold", # Same color as agent
|
|
43
43
|
# Validation errors - better contrast
|
|
44
|
-
"validation-toolbar": "bg:ansibrightred fg:
|
|
45
|
-
"validation-toolbar.text": "bg:ansibrightred fg:
|
|
44
|
+
"validation-toolbar": "bg:ansibrightred fg:ansidefault bold",
|
|
45
|
+
"validation-toolbar.text": "bg:ansibrightred fg:ansidefault",
|
|
46
46
|
"validation.border": "fg:ansibrightred",
|
|
47
47
|
"validation-error": "fg:ansibrightred bold", # For status line errors
|
|
48
48
|
# Separator styling
|
|
@@ -717,17 +717,33 @@ async def get_enhanced_input(
|
|
|
717
717
|
# Version/app label in green (dynamic version)
|
|
718
718
|
version_segment = f"fast-agent {app_version}"
|
|
719
719
|
|
|
720
|
+
# Add notifications - prioritize active events over completed ones
|
|
721
|
+
from fast_agent.ui import notification_tracker
|
|
722
|
+
|
|
723
|
+
notification_segment = ""
|
|
724
|
+
|
|
725
|
+
# Check for active events first (highest priority)
|
|
726
|
+
active_status = notification_tracker.get_active_status()
|
|
727
|
+
if active_status:
|
|
728
|
+
event_type = active_status['type'].upper()
|
|
729
|
+
server = active_status['server']
|
|
730
|
+
notification_segment = f" | <style fg='ansired' bg='ansiblack'>◀ {event_type} ({server})</style>"
|
|
731
|
+
elif notification_tracker.get_count() > 0:
|
|
732
|
+
# Show completed events summary when no active events
|
|
733
|
+
summary = notification_tracker.get_summary()
|
|
734
|
+
notification_segment = f" | ◀ {notification_tracker.get_count()} updates ({summary})"
|
|
735
|
+
|
|
720
736
|
if middle:
|
|
721
737
|
return HTML(
|
|
722
738
|
f" <style fg='{toolbar_color}' bg='ansiblack'> {agent_name} </style> "
|
|
723
739
|
f" {middle} | <style fg='{mode_style}' bg='ansiblack'> {mode_text} </style> | "
|
|
724
|
-
f"{version_segment}"
|
|
740
|
+
f"{version_segment}{notification_segment}"
|
|
725
741
|
)
|
|
726
742
|
else:
|
|
727
743
|
return HTML(
|
|
728
744
|
f" <style fg='{toolbar_color}' bg='ansiblack'> {agent_name} </style> "
|
|
729
745
|
f"Mode: <style fg='{mode_style}' bg='ansiblack'> {mode_text} </style> | "
|
|
730
|
-
f"{version_segment}"
|
|
746
|
+
f"{version_segment}{notification_segment}"
|
|
731
747
|
)
|
|
732
748
|
|
|
733
749
|
# A more terminal-agnostic style that should work across themes
|
|
@@ -766,7 +782,7 @@ async def get_enhanced_input(
|
|
|
766
782
|
session.app.key_bindings = bindings
|
|
767
783
|
|
|
768
784
|
# Create formatted prompt text
|
|
769
|
-
prompt_text = f"<ansibrightblue>{agent_name}</ansibrightblue>
|
|
785
|
+
prompt_text = f"<ansibrightblue>{agent_name}</ansibrightblue> ❯ "
|
|
770
786
|
|
|
771
787
|
# Add default value display if requested
|
|
772
788
|
if show_default and default and default != "STOP":
|