signalwire-agents 1.0.13__tar.gz → 1.0.15__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.
Files changed (154) hide show
  1. {signalwire_agents-1.0.13/signalwire_agents.egg-info → signalwire_agents-1.0.15}/PKG-INFO +1 -1
  2. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/pyproject.toml +1 -1
  3. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/__init__.py +1 -1
  4. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/agent_server.py +80 -61
  5. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/dokku.py +945 -151
  6. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15/signalwire_agents.egg-info}/PKG-INFO +1 -1
  7. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/LICENSE +0 -0
  8. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/README.md +0 -0
  9. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/man/sw-agent-init.1 +0 -0
  10. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/man/sw-search.1 +0 -0
  11. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/man/swaig-test.1 +0 -0
  12. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/setup.cfg +0 -0
  13. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/setup.py +0 -0
  14. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/agents/bedrock.py +0 -0
  15. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/__init__.py +0 -0
  16. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/build_search.py +0 -0
  17. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/config.py +0 -0
  18. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/core/__init__.py +0 -0
  19. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/core/agent_loader.py +0 -0
  20. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  21. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  22. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/core/service_loader.py +0 -0
  23. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/execution/__init__.py +0 -0
  24. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  25. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  26. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/init_project.py +0 -0
  27. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/output/__init__.py +0 -0
  28. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/output/output_formatter.py +0 -0
  29. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/output/swml_dump.py +0 -0
  30. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/simulation/__init__.py +0 -0
  31. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  32. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/simulation/data_overrides.py +0 -0
  33. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  34. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/swaig_test_wrapper.py +0 -0
  35. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/test_swaig.py +0 -0
  36. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/cli/types.py +0 -0
  37. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/__init__.py +0 -0
  38. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/__init__.py +0 -0
  39. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/config/__init__.py +0 -0
  40. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  41. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  42. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  43. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  44. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  45. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/security/__init__.py +0 -0
  46. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  47. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  48. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  49. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent/tools/registry.py +0 -0
  50. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/agent_base.py +0 -0
  51. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/auth_handler.py +0 -0
  52. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/config_loader.py +0 -0
  53. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/contexts.py +0 -0
  54. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/data_map.py +0 -0
  55. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/function_result.py +0 -0
  56. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/logging_config.py +0 -0
  57. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/__init__.py +0 -0
  58. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/ai_config_mixin.py +0 -0
  59. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  60. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  61. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  62. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  63. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/state_mixin.py +0 -0
  64. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/tool_mixin.py +0 -0
  65. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  66. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/pom_builder.py +0 -0
  67. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/security/__init__.py +0 -0
  68. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/security/session_manager.py +0 -0
  69. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/security_config.py +0 -0
  70. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/skill_base.py +0 -0
  71. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/skill_manager.py +0 -0
  72. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/swaig_function.py +0 -0
  73. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/swml_builder.py +0 -0
  74. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/swml_handler.py +0 -0
  75. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/swml_renderer.py +0 -0
  76. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/core/swml_service.py +0 -0
  77. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/mcp_gateway/__init__.py +0 -0
  78. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/mcp_gateway/gateway_service.py +0 -0
  79. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/mcp_gateway/mcp_manager.py +0 -0
  80. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/mcp_gateway/session_manager.py +0 -0
  81. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/__init__.py +0 -0
  82. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/concierge.py +0 -0
  83. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/faq_bot.py +0 -0
  84. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  85. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/receptionist.py +0 -0
  86. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/prefabs/survey.py +0 -0
  87. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/schema.json +0 -0
  88. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/__init__.py +0 -0
  89. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/document_processor.py +0 -0
  90. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/index_builder.py +0 -0
  91. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/migration.py +0 -0
  92. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/models.py +0 -0
  93. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/pgvector_backend.py +0 -0
  94. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/query_processor.py +0 -0
  95. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/search_engine.py +0 -0
  96. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/search/search_service.py +0 -0
  97. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/README.md +0 -0
  98. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/__init__.py +0 -0
  99. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  100. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  101. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  102. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere/README.md +0 -0
  103. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  104. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere/skill.py +0 -0
  105. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  106. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  107. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  108. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datetime/README.md +0 -0
  109. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datetime/__init__.py +0 -0
  110. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/datetime/skill.py +0 -0
  111. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/joke/README.md +0 -0
  112. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/joke/__init__.py +0 -0
  113. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/joke/skill.py +0 -0
  114. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/math/README.md +0 -0
  115. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/math/__init__.py +0 -0
  116. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/math/skill.py +0 -0
  117. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/mcp_gateway/README.md +0 -0
  118. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/mcp_gateway/__init__.py +0 -0
  119. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/mcp_gateway/skill.py +0 -0
  120. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/native_vector_search/README.md +0 -0
  121. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  122. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  123. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/play_background_file/README.md +0 -0
  124. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  125. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  126. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/registry.py +0 -0
  127. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/spider/README.md +0 -0
  128. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/spider/__init__.py +0 -0
  129. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/spider/skill.py +0 -0
  130. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  131. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  132. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
  133. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/weather_api/README.md +0 -0
  134. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  135. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/weather_api/skill.py +0 -0
  136. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/web_search/README.md +0 -0
  137. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/web_search/__init__.py +0 -0
  138. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/web_search/skill.py +0 -0
  139. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  140. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  141. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  142. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/utils/__init__.py +0 -0
  143. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/utils/pom_utils.py +0 -0
  144. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/utils/schema_utils.py +0 -0
  145. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/utils/token_generators.py +0 -0
  146. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/utils/validators.py +0 -0
  147. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/web/__init__.py +0 -0
  148. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents/web/web_service.py +0 -0
  149. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents.egg-info/SOURCES.txt +0 -0
  150. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  151. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents.egg-info/entry_points.txt +0 -0
  152. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents.egg-info/requires.txt +0 -0
  153. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/signalwire_agents.egg-info/top_level.txt +0 -0
  154. {signalwire_agents-1.0.13 → signalwire_agents-1.0.15}/tests/test_examples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 1.0.13
3
+ Version: 1.0.15
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "1.0.13"
7
+ version = "1.0.15"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -18,7 +18,7 @@ A package for building AI agents using SignalWire's AI and SWML capabilities.
18
18
  from .core.logging_config import configure_logging
19
19
  configure_logging()
20
20
 
21
- __version__ = "1.0.13"
21
+ __version__ = "1.0.15"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -76,6 +76,13 @@ class AgentServer:
76
76
  # Register health endpoints immediately so they're available
77
77
  # whether using server.run() or server.app with gunicorn
78
78
  self._register_health_endpoints()
79
+
80
+ # Register catch-all handler on startup (not in __init__) so it runs AFTER
81
+ # all other routes are registered. This ensures custom routes like /get_token
82
+ # don't get overshadowed by the catch-all /{full_path:path} route.
83
+ @self.app.on_event("startup")
84
+ async def _setup_catch_all():
85
+ self._register_catch_all_handler()
79
86
 
80
87
  def register(self, agent: AgentBase, route: Optional[str] = None) -> None:
81
88
  """
@@ -104,12 +111,12 @@ class AgentServer:
104
111
 
105
112
  # Store the agent
106
113
  self.agents[route] = agent
107
-
114
+
108
115
  # Get the router and register it using the standard approach
109
116
  # The agent's router already handles both trailing slash versions properly
110
117
  router = agent.as_router()
111
118
  self.app.include_router(router, prefix=route)
112
-
119
+
113
120
  self.logger.info(f"Registered agent '{agent.get_name()}' at route '{route}'")
114
121
 
115
122
  # If SIP routing is enabled and auto-mapping is on, register SIP usernames for this agent
@@ -550,65 +557,6 @@ class AgentServer:
550
557
  if not self.agents:
551
558
  self.logger.warning("Starting server with no registered agents")
552
559
 
553
- # Add catch-all route handler to handle both trailing slash and non-trailing slash versions
554
- @self.app.get("/{full_path:path}")
555
- @self.app.post("/{full_path:path}")
556
- async def handle_all_routes(request: Request, full_path: str):
557
- """Handle requests that don't match registered routes (e.g. /matti instead of /matti/)"""
558
- # Check if this path maps to one of our registered agents
559
- for route, agent in self.agents.items():
560
- # Check for exact match with registered route
561
- if full_path == route.lstrip("/"):
562
- # This is a request to an agent's root without trailing slash
563
- return await agent._handle_root_request(request)
564
- elif full_path.startswith(route.lstrip("/") + "/"):
565
- # This is a request to an agent's sub-path
566
- relative_path = full_path[len(route.lstrip("/")):]
567
- relative_path = relative_path.lstrip("/")
568
-
569
- # Route to appropriate handler based on path
570
- if not relative_path or relative_path == "/":
571
- return await agent._handle_root_request(request)
572
-
573
- clean_path = relative_path.rstrip("/")
574
- if clean_path == "debug":
575
- return await agent._handle_debug_request(request)
576
- elif clean_path == "swaig":
577
- from fastapi import Response
578
- return await agent._handle_swaig_request(request, Response())
579
- elif clean_path == "post_prompt":
580
- return await agent._handle_post_prompt_request(request)
581
- elif clean_path == "check_for_input":
582
- return await agent._handle_check_for_input_request(request)
583
-
584
- # Check for custom routing callbacks
585
- if hasattr(agent, '_routing_callbacks'):
586
- for callback_path, callback_fn in agent._routing_callbacks.items():
587
- cb_path_clean = callback_path.strip("/")
588
- if clean_path == cb_path_clean:
589
- request.state.callback_path = callback_path
590
- return await agent._handle_root_request(request)
591
-
592
- # No matching agent - check for static files
593
- if hasattr(self, '_static_directories'):
594
- # Check each static directory route
595
- for static_route, static_dir in self._static_directories.items():
596
- # For root static route, serve any unmatched path
597
- if static_route == "" or static_route == "/":
598
- response = self._serve_static_file(full_path, "")
599
- if response:
600
- return response
601
- # For prefixed static routes, check if path matches
602
- elif full_path.startswith(static_route.lstrip("/") + "/") or full_path == static_route.lstrip("/"):
603
- relative_path = full_path[len(static_route.lstrip("/")):].lstrip("/")
604
- response = self._serve_static_file(relative_path, static_route)
605
- if response:
606
- return response
607
-
608
- # No matching agent or static file found
609
- from fastapi import HTTPException
610
- raise HTTPException(status_code=404, detail="Not Found")
611
-
612
560
  # Set host and port
613
561
  host = host or self.host
614
562
  port = port or self.port
@@ -738,6 +686,7 @@ class AgentServer:
738
686
 
739
687
  self.logger.info(f"Serving static files from '{directory}' at route '{route or '/'}'")
740
688
 
689
+
741
690
  def _serve_static_file(self, file_path: str, route: str = "/") -> Optional[Response]:
742
691
  """
743
692
  Internal method to serve a static file.
@@ -785,3 +734,73 @@ class AgentServer:
785
734
  return None
786
735
 
787
736
  return FileResponse(full_path)
737
+
738
+ def _register_catch_all_handler(self) -> None:
739
+ """
740
+ Register catch-all route handler for agent routing and static files.
741
+
742
+ This handler is needed for:
743
+ 1. Routing requests without trailing slashes to agents (e.g., /santa instead of /santa/)
744
+ 2. Serving static files from directories registered with serve_static_files()
745
+
746
+ Called via startup event (not __init__) to ensure it runs AFTER all other routes
747
+ are registered. This prevents the catch-all from overshadowing custom routes
748
+ like /get_token that users may add to server.app.
749
+ """
750
+ @self.app.get("/{full_path:path}")
751
+ @self.app.post("/{full_path:path}")
752
+ async def handle_all_routes(request: Request, full_path: str):
753
+ """Handle requests that don't match registered routes (e.g. /matti instead of /matti/)"""
754
+ # Check if this path maps to one of our registered agents
755
+ for route, agent in self.agents.items():
756
+ # Check for exact match with registered route
757
+ if full_path == route.lstrip("/"):
758
+ # This is a request to an agent's root without trailing slash
759
+ return await agent._handle_root_request(request)
760
+ elif full_path.startswith(route.lstrip("/") + "/"):
761
+ # This is a request to an agent's sub-path
762
+ relative_path = full_path[len(route.lstrip("/")):]
763
+ relative_path = relative_path.lstrip("/")
764
+
765
+ # Route to appropriate handler based on path
766
+ if not relative_path or relative_path == "/":
767
+ return await agent._handle_root_request(request)
768
+
769
+ clean_path = relative_path.rstrip("/")
770
+ if clean_path == "debug":
771
+ return await agent._handle_debug_request(request)
772
+ elif clean_path == "swaig":
773
+ from fastapi import Response
774
+ return await agent._handle_swaig_request(request, Response())
775
+ elif clean_path == "post_prompt":
776
+ return await agent._handle_post_prompt_request(request)
777
+ elif clean_path == "check_for_input":
778
+ return await agent._handle_check_for_input_request(request)
779
+
780
+ # Check for custom routing callbacks
781
+ if hasattr(agent, '_routing_callbacks'):
782
+ for callback_path, callback_fn in agent._routing_callbacks.items():
783
+ cb_path_clean = callback_path.strip("/")
784
+ if clean_path == cb_path_clean:
785
+ request.state.callback_path = callback_path
786
+ return await agent._handle_root_request(request)
787
+
788
+ # No matching agent - check for static files
789
+ if hasattr(self, '_static_directories'):
790
+ # Check each static directory route
791
+ for static_route, static_dir in self._static_directories.items():
792
+ # For root static route, serve any unmatched path
793
+ if static_route == "" or static_route == "/":
794
+ response = self._serve_static_file(full_path, "")
795
+ if response:
796
+ return response
797
+ # For prefixed static routes, check if path matches
798
+ elif full_path.startswith(static_route.lstrip("/") + "/") or full_path == static_route.lstrip("/"):
799
+ relative_path = full_path[len(static_route.lstrip("/")):].lstrip("/")
800
+ response = self._serve_static_file(relative_path, static_route)
801
+ if response:
802
+ return response
803
+
804
+ # No matching agent or static file found
805
+ from fastapi import HTTPException
806
+ raise HTTPException(status_code=404, detail="Not Found")