fast-agent-mcp 0.3.10__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.

Files changed (300) hide show
  1. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/config.py +2 -2
  4. fast_agent_mcp-0.3.11/src/fast_agent/human_input/elicitation_handler.py +123 -0
  5. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_factory.py +2 -2
  6. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_aggregator.py +9 -16
  7. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/sampling.py +21 -0
  8. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console_display.py +27 -22
  9. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/enhanced_prompt.py +19 -3
  10. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_display.py +28 -11
  11. fast_agent_mcp-0.3.11/src/fast_agent/ui/notification_tracker.py +167 -0
  12. fast_agent_mcp-0.3.10/src/fast_agent/human_input/elicitation_handler.py +0 -106
  13. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/.gitignore +0 -0
  14. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/LICENSE +0 -0
  15. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/README.md +0 -0
  16. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/a2a/agent_executor.py +0 -0
  17. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/a2a/server.py +0 -0
  18. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/azure-openai/fastagent.config.yaml +0 -0
  19. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/bedrock/fast-agent.config.yaml +0 -0
  20. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/custom-agents/agent.py +0 -0
  21. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/custom-agents/fastagent.config.yaml +0 -0
  22. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis-campaign.py +0 -0
  23. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis.py +0 -0
  24. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/data-analysis/fastagent.config.yaml +0 -0
  25. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  26. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-advanced.py +0 -0
  27. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-simple.py +0 -0
  28. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/fastapi/pyproject.toml +0 -0
  29. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/fastapi/readme.md +0 -0
  30. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  31. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  32. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  33. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  34. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  35. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/forms_demo.py +0 -0
  36. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character.py +0 -0
  37. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character_handler.py +0 -0
  38. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/tool_call.py +0 -0
  39. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  40. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  41. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  42. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  43. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_one.py +0 -0
  44. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_two.py +0 -0
  45. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  46. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  47. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/cat.png +0 -0
  48. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example1.py +0 -0
  49. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example2.py +0 -0
  50. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example3.py +0 -0
  51. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/new-api/display_check.py +0 -0
  53. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm.py +0 -0
  54. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm_advanced.py +0 -0
  55. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/new-api/simple_mcp.py +0 -0
  56. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/agent.py +0 -0
  57. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/fastagent.config.yaml +0 -0
  58. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/openapi_mcp_server.py +0 -0
  59. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/petstore.yaml +0 -0
  60. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/pyproject.toml +0 -0
  61. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/openapi/run-as-server.sh +0 -0
  62. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/otel/agent.py +0 -0
  63. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/otel/agent2.py +0 -0
  64. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/otel/docker-compose.yaml +0 -0
  65. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/otel/fastagent.config.yaml +0 -0
  66. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/researcher/fastagent.config.yaml +0 -0
  67. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-eval.py +0 -0
  68. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-imp.py +0 -0
  69. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/researcher/researcher.py +0 -0
  70. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/setup/.gitignore +0 -0
  71. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/setup/agent.py +0 -0
  72. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.config.yaml +0 -0
  73. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.secrets.yaml.example +0 -0
  74. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/setup/pyproject.toml.tmpl +0 -0
  75. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/.env.sample +0 -0
  76. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/Makefile +0 -0
  77. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/README.md +0 -0
  78. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/agent.py +0 -0
  79. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/clam.jpg +0 -0
  80. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/crab.png +0 -0
  81. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/shrimp.png +0 -0
  82. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/docker-compose.yml +0 -0
  83. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/fastagent.config.yaml +0 -0
  84. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/image_demo.py +0 -0
  85. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  86. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  87. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  88. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  89. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/simple_agent.py +0 -0
  90. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  91. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  92. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  93. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/chaining.py +0 -0
  94. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/evaluator.py +0 -0
  95. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/fastagent.config.yaml +0 -0
  96. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/graded_report.md +0 -0
  97. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/human_input.py +0 -0
  98. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/orchestrator.py +0 -0
  99. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/parallel.py +0 -0
  100. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/router.py +0 -0
  101. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.md +0 -0
  102. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.txt +0 -0
  103. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/hatch_build.py +0 -0
  104. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/__init__.py +0 -0
  105. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/__init__.py +0 -0
  106. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/agent_types.py +0 -0
  107. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_agent.py +0 -0
  108. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_decorator.py +0 -0
  109. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/mcp_agent.py +0 -0
  110. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/tool_agent.py +0 -0
  111. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  112. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  113. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  114. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  115. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  116. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  117. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  118. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__init__.py +0 -0
  119. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__main__.py +0 -0
  120. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/auth.py +0 -0
  121. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/check_config.py +0 -0
  122. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/go.py +0 -0
  123. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/quickstart.py +0 -0
  124. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  125. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/setup.py +0 -0
  126. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/url_parser.py +0 -0
  127. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/constants.py +0 -0
  128. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/main.py +0 -0
  129. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/terminal.py +0 -0
  130. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/constants.py +0 -0
  131. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/context.py +0 -0
  132. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/context_dependent.py +0 -0
  133. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/__init__.py +0 -0
  134. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/agent_app.py +0 -0
  135. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/core_app.py +0 -0
  136. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_decorators.py +0 -0
  137. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_factory.py +0 -0
  138. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/error_handling.py +0 -0
  139. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/exceptions.py +0 -0
  140. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/__init__.py +0 -0
  141. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/executor.py +0 -0
  142. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/task_registry.py +0 -0
  143. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  144. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/fastagent.py +0 -0
  145. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/__init__.py +0 -0
  146. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/events.py +0 -0
  147. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/json_serializer.py +0 -0
  148. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/listeners.py +0 -0
  149. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/logger.py +0 -0
  150. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/transport.py +0 -0
  151. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/prompt.py +0 -0
  152. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/core/validation.py +0 -0
  153. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/event_progress.py +0 -0
  154. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/history/history_exporter.py +0 -0
  155. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/__init__.py +0 -0
  156. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/elicitation_state.py +0 -0
  157. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/form_fields.py +0 -0
  158. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/simple_form.py +0 -0
  159. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/types.py +0 -0
  160. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/interfaces.py +0 -0
  161. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/__init__.py +0 -0
  162. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/fastagent_llm.py +0 -0
  163. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/passthrough.py +0 -0
  164. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/playback.py +0 -0
  165. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/silent.py +0 -0
  166. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/slow.py +0 -0
  167. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/memory.py +0 -0
  168. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_database.py +0 -0
  169. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_factory.py +0 -0
  170. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_info.py +0 -0
  171. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/prompt_utils.py +0 -0
  172. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  173. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  174. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  175. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  176. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  177. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  178. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  179. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  180. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  181. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  182. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  183. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  184. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  185. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  186. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  187. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  188. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  189. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  190. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  191. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  192. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_key_manager.py +0 -0
  193. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_types.py +0 -0
  194. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/request_params.py +0 -0
  195. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/sampling_converter.py +0 -0
  196. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/usage_tracking.py +0 -0
  197. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/__init__.py +0 -0
  198. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/common.py +0 -0
  199. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  200. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/gen_client.py +0 -0
  201. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  202. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  203. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  204. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/hf_auth.py +0 -0
  205. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/interfaces.py +0 -0
  206. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/logger_textio.py +0 -0
  207. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  208. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
  209. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_content.py +0 -0
  210. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mime_utils.py +0 -0
  211. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/oauth_client.py +0 -0
  212. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt.py +0 -0
  213. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  214. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_render.py +0 -0
  215. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  216. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  217. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  218. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  219. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  220. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  221. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  222. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  223. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/resource_utils.py +0 -0
  224. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/__init__.py +0 -0
  225. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/agent_server.py +0 -0
  226. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  227. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  228. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/transport_tracking.py +0 -0
  229. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_agent.py +0 -0
  230. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_mixin.py +0 -0
  231. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp_server_registry.py +0 -0
  232. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/py.typed +0 -0
  233. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  234. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  235. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  236. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  237. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  238. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  239. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  240. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  241. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  242. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  243. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  244. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  245. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  246. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  247. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  248. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  249. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  250. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  251. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  252. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  253. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  254. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  255. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  256. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  257. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  258. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  259. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  260. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  261. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  262. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  263. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  264. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  265. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  266. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  267. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  268. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  269. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  270. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  271. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  272. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  273. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  274. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  275. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  276. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  277. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  278. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  279. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  280. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  281. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  282. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  283. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/.gitignore +0 -0
  284. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/agent.py +0 -0
  285. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
  286. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  287. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  288. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/tools/elicitation.py +0 -0
  289. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/types/__init__.py +0 -0
  290. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/types/llm_stop_reason.py +0 -0
  291. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/__init__.py +0 -0
  292. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console.py +0 -0
  293. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_form.py +0 -0
  294. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_style.py +0 -0
  295. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/interactive_prompt.py +0 -0
  296. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  297. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mermaid_utils.py +0 -0
  298. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/progress_display.py +0 -0
  299. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/rich_progress.py +0 -0
  300. {fast_agent_mcp-0.3.10 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/usage_display.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.3.10
3
+ Version: 0.3.11
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.10"
3
+ version = "0.3.11"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -43,8 +43,8 @@ class MCPSamplingSettings(BaseModel):
43
43
 
44
44
 
45
45
  class MCPElicitationSettings(BaseModel):
46
- mode: Literal["forms", "auto_cancel", "none"] = "none"
47
- """Elicitation mode: 'forms' (default UI), 'auto_cancel', 'none' (no capability)"""
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 == "auto_cancel":
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 == "auto_cancel":
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
  )
@@ -1362,22 +1362,15 @@ class MCPAggregator(ContextDependent):
1362
1362
 
1363
1363
  async with self._refresh_lock:
1364
1364
  try:
1365
- # Fetch new tools from the server
1366
- if self.connection_persistence:
1367
- server_connection = await self._persistent_connection_manager.get_server(
1368
- server_name,
1369
- client_session_factory=self._create_session_factory(server_name),
1370
- )
1371
- tools_result = await server_connection.session.list_tools()
1372
- new_tools = tools_result.tools or []
1373
- else:
1374
- async with gen_client(
1375
- server_name,
1376
- server_registry=self.context.server_registry,
1377
- client_session_factory=self._create_session_factory(server_name),
1378
- ) as client:
1379
- tools_result = await client.list_tools()
1380
- 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 []
1381
1374
 
1382
1375
  # Update tool maps
1383
1376
  async with self._tool_map_lock:
@@ -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(
@@ -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
- # Combined separator and status line
627
- if agent_name:
628
- left = (
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
- right = f"[dim]{updated_server}[/dim]"
635
- self._create_combined_separator_status(left, right)
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
- # Display update message
638
- message = f"Updating tools for server {updated_server}"
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
- # Bottom separator
642
- console.console.print()
643
- console.console.print("─" * console.console.size.width, style="dim")
644
- console.console.print()
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
- # Force prompt_toolkit redraw if active
647
- try:
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
- get_app().invalidate() # Forces prompt_toolkit to redraw
651
- except: # noqa: E722
652
- pass # No active prompt_toolkit session
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
  """
@@ -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":
@@ -19,12 +19,12 @@ class Colours:
19
19
  """Color constants for MCP status display elements."""
20
20
 
21
21
  # Timeline activity colors (Option A: Mixed Intensity)
22
- ERROR = "bright_red" # Keep error bright
23
- DISABLED = "bright_blue" # Keep disabled bright
24
- RESPONSE = "blue" # Normal blue instead of bright
25
- REQUEST = "yellow" # Normal yellow instead of bright
26
- NOTIFICATION = "cyan" # Normal cyan instead of bright
27
- PING = "dim green" # Keep ping dim
22
+ ERROR = "bright_red" # Keep error bright
23
+ DISABLED = "bright_blue" # Keep disabled bright
24
+ RESPONSE = "blue" # Normal blue instead of bright
25
+ REQUEST = "yellow" # Normal yellow instead of bright
26
+ NOTIFICATION = "cyan" # Normal cyan instead of bright
27
+ PING = "dim green" # Keep ping dim
28
28
  IDLE = "white dim"
29
29
  NONE = "dim"
30
30
 
@@ -195,7 +195,7 @@ def _format_capability_shorthand(
195
195
  entries.append(("Ro", False, False))
196
196
 
197
197
  mode = (status.elicitation_mode or "").lower()
198
- if mode == "auto_cancel":
198
+ if mode == "auto-cancel":
199
199
  entries.append(("El", "red", False))
200
200
  elif mode and mode != "none":
201
201
  entries.append(("El", True, False))
@@ -405,7 +405,21 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
405
405
  else:
406
406
  display_arrow = arrow
407
407
  line.append(display_arrow, style=arrow_style)
408
- line.append(f" {label:<13}", style=Colours.TEXT_DEFAULT)
408
+
409
+ # Determine label style based on activity and special cases
410
+ if not channel:
411
+ # No channel = dim
412
+ label_style = Colours.TEXT_DIM
413
+ elif channel.last_status_code == 405 and "GET" in label:
414
+ # Special case: GET (SSE) with 405 = dim (hollow arrow already handled above)
415
+ label_style = Colours.TEXT_DIM
416
+ elif channel.request_count == 0 and channel.response_count == 0:
417
+ # No activity = dim
418
+ label_style = Colours.TEXT_DIM
419
+ else:
420
+ # Has activity = normal
421
+ label_style = Colours.TEXT_DEFAULT
422
+ line.append(f" {label:<13}", style=label_style)
409
423
 
410
424
  # Always show timeline (dim black dots if no data)
411
425
  line.append("10m ", style="dim")
@@ -415,6 +429,9 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
415
429
  color = timeline_color_map.get(bucket_state, "dim")
416
430
  if bucket_state in {"idle", "none"}:
417
431
  symbol = "·"
432
+ elif is_stdio:
433
+ # For STDIO, all activity shows as filled circles since types are combined
434
+ symbol = "●"
418
435
  elif bucket_state == "request":
419
436
  symbol = "◆" # Diamond for requests - rare and important
420
437
  else:
@@ -442,9 +459,9 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
442
459
  # Show "-" for shut/disabled channels (405, off, disabled states)
443
460
  channel_state = (channel.state or "open").lower()
444
461
  is_shut = (
445
- channel.last_status_code == 405 or
446
- channel_state in {"off", "disabled"} or
447
- (channel_state == "error" and channel.last_status_code == 405)
462
+ channel.last_status_code == 405
463
+ or channel_state in {"off", "disabled"}
464
+ or (channel_state == "error" and channel.last_status_code == 405)
448
465
  )
449
466
 
450
467
  if is_shut:
@@ -0,0 +1,167 @@
1
+ """
2
+ Enhanced notification tracker for prompt_toolkit toolbar display.
3
+ Tracks both active events (sampling/elicitation) and completed notifications.
4
+ """
5
+
6
+ from datetime import datetime
7
+ from typing import Dict, List, Optional
8
+
9
+ # Active events currently in progress
10
+ active_events: Dict[str, Dict[str, str]] = {}
11
+
12
+ # Completed notifications history
13
+ notifications: List[Dict[str, str]] = []
14
+
15
+
16
+ def add_tool_update(server_name: str) -> None:
17
+ """Add a tool update notification.
18
+
19
+ Args:
20
+ server_name: Name of the server that had tools updated
21
+ """
22
+ notifications.append({
23
+ 'type': 'tool_update',
24
+ 'server': server_name
25
+ })
26
+
27
+
28
+ def start_sampling(server_name: str) -> None:
29
+ """Start tracking a sampling operation.
30
+
31
+ Args:
32
+ server_name: Name of the server making the sampling request
33
+ """
34
+ active_events['sampling'] = {
35
+ 'server': server_name,
36
+ 'start_time': datetime.now().isoformat()
37
+ }
38
+
39
+ # Force prompt_toolkit to redraw if active
40
+ try:
41
+ from prompt_toolkit.application.current import get_app
42
+ get_app().invalidate()
43
+ except Exception:
44
+ pass
45
+
46
+
47
+ def end_sampling(server_name: str) -> None:
48
+ """End tracking a sampling operation and add to completed notifications.
49
+
50
+ Args:
51
+ server_name: Name of the server that made the sampling request
52
+ """
53
+ if 'sampling' in active_events:
54
+ del active_events['sampling']
55
+
56
+ notifications.append({
57
+ 'type': 'sampling',
58
+ 'server': server_name
59
+ })
60
+
61
+ # Force prompt_toolkit to redraw if active
62
+ try:
63
+ from prompt_toolkit.application.current import get_app
64
+ get_app().invalidate()
65
+ except Exception:
66
+ pass
67
+
68
+
69
+ def start_elicitation(server_name: str) -> None:
70
+ """Start tracking an elicitation operation.
71
+
72
+ Args:
73
+ server_name: Name of the server making the elicitation request
74
+ """
75
+ active_events['elicitation'] = {
76
+ 'server': server_name,
77
+ 'start_time': datetime.now().isoformat()
78
+ }
79
+
80
+ # Force prompt_toolkit to redraw if active
81
+ try:
82
+ from prompt_toolkit.application.current import get_app
83
+ get_app().invalidate()
84
+ except Exception:
85
+ pass
86
+
87
+
88
+ def end_elicitation(server_name: str) -> None:
89
+ """End tracking an elicitation operation and add to completed notifications.
90
+
91
+ Args:
92
+ server_name: Name of the server that made the elicitation request
93
+ """
94
+ if 'elicitation' in active_events:
95
+ del active_events['elicitation']
96
+
97
+ notifications.append({
98
+ 'type': 'elicitation',
99
+ 'server': server_name
100
+ })
101
+
102
+ # Force prompt_toolkit to redraw if active
103
+ try:
104
+ from prompt_toolkit.application.current import get_app
105
+ get_app().invalidate()
106
+ except Exception:
107
+ pass
108
+
109
+
110
+ def get_active_status() -> Optional[Dict[str, str]]:
111
+ """Get currently active operation, if any.
112
+
113
+ Returns:
114
+ Dict with 'type' and 'server' keys, or None if nothing active
115
+ """
116
+ if 'sampling' in active_events:
117
+ return {'type': 'sampling', 'server': active_events['sampling']['server']}
118
+ if 'elicitation' in active_events:
119
+ return {'type': 'elicitation', 'server': active_events['elicitation']['server']}
120
+ return None
121
+
122
+
123
+ def clear() -> None:
124
+ """Clear all notifications and active events."""
125
+ notifications.clear()
126
+ active_events.clear()
127
+
128
+
129
+ def get_count() -> int:
130
+ """Get the current completed notification count."""
131
+ return len(notifications)
132
+
133
+
134
+ def get_latest() -> Dict[str, str] | None:
135
+ """Get the most recent completed notification."""
136
+ return notifications[-1] if notifications else None
137
+
138
+
139
+ def get_summary() -> str:
140
+ """Get a summary of completed notifications by type.
141
+
142
+ Returns:
143
+ String like "3 tools, 1 sampling, 2 elicitations" or "1 tool update"
144
+ """
145
+ if not notifications:
146
+ return ""
147
+
148
+ counts = {}
149
+ for notification in notifications:
150
+ event_type = notification['type']
151
+ if event_type == 'tool_update':
152
+ counts['tools'] = counts.get('tools', 0) + 1
153
+ else:
154
+ # For sampling/elicitation, use the type directly
155
+ counts[event_type] = counts.get(event_type, 0) + 1
156
+
157
+ # Build summary string
158
+ parts = []
159
+ for event_type, count in sorted(counts.items()):
160
+ if event_type == 'tools':
161
+ parts.append(f"{count} tool{'s' if count != 1 else ''}")
162
+ elif event_type == 'sampling':
163
+ parts.append(f"{count} sample{'s' if count != 1 else ''}")
164
+ else:
165
+ parts.append(f"{count} {event_type}{'s' if count != 1 else ''}")
166
+
167
+ return ", ".join(parts)