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.

Files changed (300) hide show
  1. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.3.9 → 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.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_factory.py +2 -2
  6. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_aggregator.py +41 -44
  7. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/sampling.py +21 -0
  8. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/transport_tracking.py +3 -1
  9. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console_display.py +27 -22
  10. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_style.py +7 -7
  11. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/enhanced_prompt.py +19 -3
  12. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_display.py +178 -89
  13. fast_agent_mcp-0.3.11/src/fast_agent/ui/notification_tracker.py +167 -0
  14. fast_agent_mcp-0.3.9/src/fast_agent/human_input/elicitation_handler.py +0 -106
  15. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/.gitignore +0 -0
  16. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/LICENSE +0 -0
  17. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/README.md +0 -0
  18. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/a2a/agent_executor.py +0 -0
  19. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/a2a/server.py +0 -0
  20. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/azure-openai/fastagent.config.yaml +0 -0
  21. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/bedrock/fast-agent.config.yaml +0 -0
  22. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/custom-agents/agent.py +0 -0
  23. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/custom-agents/fastagent.config.yaml +0 -0
  24. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis-campaign.py +0 -0
  25. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/analysis.py +0 -0
  26. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/data-analysis/fastagent.config.yaml +0 -0
  27. {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
  28. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-advanced.py +0 -0
  29. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/fastapi-simple.py +0 -0
  30. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/pyproject.toml +0 -0
  31. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/fastapi/readme.md +0 -0
  32. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  33. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  34. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  35. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  36. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  37. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/forms_demo.py +0 -0
  38. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character.py +0 -0
  39. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/game_character_handler.py +0 -0
  40. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/elicitations/tool_call.py +0 -0
  41. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  42. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  43. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  44. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  45. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_one.py +0 -0
  46. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/agent_two.py +0 -0
  47. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  48. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  49. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/cat.png +0 -0
  50. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example1.py +0 -0
  51. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example2.py +0 -0
  52. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/example3.py +0 -0
  53. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  54. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/display_check.py +0 -0
  55. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm.py +0 -0
  56. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_llm_advanced.py +0 -0
  57. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/new-api/simple_mcp.py +0 -0
  58. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/agent.py +0 -0
  59. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/fastagent.config.yaml +0 -0
  60. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/openapi_mcp_server.py +0 -0
  61. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/petstore.yaml +0 -0
  62. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/pyproject.toml +0 -0
  63. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/openapi/run-as-server.sh +0 -0
  64. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/agent.py +0 -0
  65. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/agent2.py +0 -0
  66. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/docker-compose.yaml +0 -0
  67. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/otel/fastagent.config.yaml +0 -0
  68. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/fastagent.config.yaml +0 -0
  69. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-eval.py +0 -0
  70. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher-imp.py +0 -0
  71. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/researcher/researcher.py +0 -0
  72. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/.gitignore +0 -0
  73. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/agent.py +0 -0
  74. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.config.yaml +0 -0
  75. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/fastagent.secrets.yaml.example +0 -0
  76. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/setup/pyproject.toml.tmpl +0 -0
  77. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/.env.sample +0 -0
  78. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/Makefile +0 -0
  79. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/README.md +0 -0
  80. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/agent.py +0 -0
  81. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/clam.jpg +0 -0
  82. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/crab.png +0 -0
  83. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/demo_images/shrimp.png +0 -0
  84. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/docker-compose.yml +0 -0
  85. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/fastagent.config.yaml +0 -0
  86. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/image_demo.py +0 -0
  87. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  88. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  89. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  90. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  91. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/simple_agent.py +0 -0
  92. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  93. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  94. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  95. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/chaining.py +0 -0
  96. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/evaluator.py +0 -0
  97. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/fastagent.config.yaml +0 -0
  98. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/graded_report.md +0 -0
  99. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/human_input.py +0 -0
  100. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/orchestrator.py +0 -0
  101. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/parallel.py +0 -0
  102. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/router.py +0 -0
  103. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.md +0 -0
  104. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/examples/workflows/short_story.txt +0 -0
  105. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/hatch_build.py +0 -0
  106. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/__init__.py +0 -0
  107. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/__init__.py +0 -0
  108. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/agent_types.py +0 -0
  109. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_agent.py +0 -0
  110. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/llm_decorator.py +0 -0
  111. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/mcp_agent.py +0 -0
  112. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/tool_agent.py +0 -0
  113. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  114. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  115. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  116. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  117. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  118. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  119. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  120. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__init__.py +0 -0
  121. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/__main__.py +0 -0
  122. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/auth.py +0 -0
  123. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/check_config.py +0 -0
  124. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/go.py +0 -0
  125. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/quickstart.py +0 -0
  126. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  127. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/setup.py +0 -0
  128. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/commands/url_parser.py +0 -0
  129. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/constants.py +0 -0
  130. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/main.py +0 -0
  131. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/cli/terminal.py +0 -0
  132. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/constants.py +0 -0
  133. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/context.py +0 -0
  134. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/context_dependent.py +0 -0
  135. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/__init__.py +0 -0
  136. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/agent_app.py +0 -0
  137. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/core_app.py +0 -0
  138. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_decorators.py +0 -0
  139. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/direct_factory.py +0 -0
  140. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/error_handling.py +0 -0
  141. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/exceptions.py +0 -0
  142. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/__init__.py +0 -0
  143. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/executor.py +0 -0
  144. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/task_registry.py +0 -0
  145. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  146. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/fastagent.py +0 -0
  147. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/__init__.py +0 -0
  148. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/events.py +0 -0
  149. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/json_serializer.py +0 -0
  150. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/listeners.py +0 -0
  151. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/logger.py +0 -0
  152. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/logging/transport.py +0 -0
  153. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/prompt.py +0 -0
  154. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/core/validation.py +0 -0
  155. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/event_progress.py +0 -0
  156. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/history/history_exporter.py +0 -0
  157. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/__init__.py +0 -0
  158. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/elicitation_state.py +0 -0
  159. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/form_fields.py +0 -0
  160. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/simple_form.py +0 -0
  161. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/human_input/types.py +0 -0
  162. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/interfaces.py +0 -0
  163. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/__init__.py +0 -0
  164. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/fastagent_llm.py +0 -0
  165. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/passthrough.py +0 -0
  166. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/playback.py +0 -0
  167. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/silent.py +0 -0
  168. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/internal/slow.py +0 -0
  169. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/memory.py +0 -0
  170. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_database.py +0 -0
  171. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_factory.py +0 -0
  172. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/model_info.py +0 -0
  173. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/prompt_utils.py +0 -0
  174. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  175. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  176. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  177. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  178. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  179. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  180. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  181. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  182. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  183. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  184. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  185. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  186. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  187. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  188. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  189. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  190. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  191. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  192. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  193. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  194. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_key_manager.py +0 -0
  195. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/provider_types.py +0 -0
  196. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/request_params.py +0 -0
  197. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/sampling_converter.py +0 -0
  198. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/llm/usage_tracking.py +0 -0
  199. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/__init__.py +0 -0
  200. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/common.py +0 -0
  201. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  202. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/gen_client.py +0 -0
  203. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  204. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  205. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  206. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/hf_auth.py +0 -0
  207. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/interfaces.py +0 -0
  208. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/logger_textio.py +0 -0
  209. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  210. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
  211. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mcp_content.py +0 -0
  212. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/mime_utils.py +0 -0
  213. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/oauth_client.py +0 -0
  214. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt.py +0 -0
  215. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  216. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_render.py +0 -0
  217. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  218. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  219. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  220. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  221. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  222. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  223. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  224. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  225. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/resource_utils.py +0 -0
  226. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/__init__.py +0 -0
  227. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/server/agent_server.py +0 -0
  228. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  229. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  230. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_agent.py +0 -0
  231. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp/ui_mixin.py +0 -0
  232. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/mcp_server_registry.py +0 -0
  233. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/py.typed +0 -0
  234. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  235. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  236. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  237. {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
  238. {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
  239. {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
  240. {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
  241. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  242. {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
  243. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  244. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  245. {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
  246. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  247. {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
  248. {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
  249. {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
  250. {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
  251. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  252. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  253. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  254. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  255. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  256. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  257. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  258. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  259. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  260. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  261. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  262. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  263. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  264. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  265. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  266. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  267. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  268. {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
  269. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  270. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  271. {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
  272. {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
  273. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  274. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  275. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  276. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  277. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  278. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  279. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  280. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  281. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  282. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  283. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  284. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/.gitignore +0 -0
  285. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/agent.py +0 -0
  286. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
  287. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  288. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  289. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/tools/elicitation.py +0 -0
  290. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/types/__init__.py +0 -0
  291. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/types/llm_stop_reason.py +0 -0
  292. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/__init__.py +0 -0
  293. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/console.py +0 -0
  294. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/elicitation_form.py +0 -0
  295. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/interactive_prompt.py +0 -0
  296. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  297. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/mermaid_utils.py +0 -0
  298. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/progress_display.py +0 -0
  299. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.11}/src/fast_agent/ui/rich_progress.py +0 -0
  300. {fast_agent_mcp-0.3.9 → 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.9
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.9"
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
  )
@@ -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(client: ClientSession, server_name: str) -> List[Tool]:
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 client.list_tools()
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(client: ClientSession, server_name: str) -> List[Prompt]:
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 client.list_prompts()
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
- if self.connection_persistence:
376
- server_connection = await self._persistent_connection_manager.get_server(
377
- server_name, client_session_factory=self._create_session_factory(server_name)
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="tool",
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="prompt",
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="prompt",
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="prompt",
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-list",
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-list",
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-list",
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
- if self.connection_persistence:
1363
- server_connection = await self._persistent_connection_manager.get_server(
1364
- server_name,
1365
- client_session_factory=self._create_session_factory(server_name),
1366
- )
1367
- tools_result = await server_connection.session.list_tools()
1368
- new_tools = tools_result.tools or []
1369
- else:
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="resource",
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-list",
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-list",
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
- self._record_history("get", "error", now)
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
- # 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
  """
@@ -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:ansiwhite", # True black dialog body
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:ansibrightmagenta bold", # Bright magenta text
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:ansiwhite bold", # White arrows for visibility
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 white for good visibility
38
- "label": "fg:ansiwhite", # White labels for good readability
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:ansiwhite bold",
45
- "validation-toolbar.text": "bg:ansibrightred fg:ansiwhite",
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":