signalwire-sdk 3.0.2.dev62__tar.gz → 3.0.2.dev64__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 (211) hide show
  1. {signalwire_sdk-3.0.2.dev62/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev64}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/pyproject.toml +49 -1
  3. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/__init__.py +15 -15
  4. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agent_server.py +36 -41
  5. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agents/bedrock.py +1 -1
  6. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py +27 -17
  7. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/agent_loader.py +73 -46
  8. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/argparse_helpers.py +7 -14
  9. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/dynamic_config.py +2 -2
  10. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/service_loader.py +48 -37
  11. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/dokku.py +16 -13
  12. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/datamap_exec.py +15 -17
  13. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/webhook_exec.py +3 -1
  14. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/init_project.py +17 -20
  15. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/output_formatter.py +8 -17
  16. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/swml_dump.py +23 -21
  17. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_generation.py +6 -8
  18. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_overrides.py +3 -4
  19. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/mock_env.py +7 -6
  20. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/swaig_test_wrapper.py +3 -2
  21. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/test_swaig.py +21 -10
  22. signalwire_sdk-3.0.2.dev64/signalwire/signalwire/core/_agent_host.py +24 -0
  23. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/manager.py +1 -1
  24. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/registry.py +65 -64
  25. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/type_inference.py +5 -7
  26. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent_base.py +115 -82
  27. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/auth_handler.py +30 -16
  28. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/config_loader.py +17 -16
  29. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/contexts.py +16 -17
  30. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/data_map.py +10 -15
  31. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/function_result.py +26 -28
  32. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/logging_config.py +8 -12
  33. signalwire_sdk-3.0.2.dev64/signalwire/signalwire/core/mixins/_mixin_host.py +42 -0
  34. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/ai_config_mixin.py +15 -11
  35. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/auth_mixin.py +9 -8
  36. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +3 -3
  37. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/prompt_mixin.py +58 -58
  38. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/serverless_mixin.py +77 -91
  39. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/skill_mixin.py +5 -2
  40. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/state_mixin.py +6 -9
  41. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/tool_mixin.py +7 -6
  42. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/web_mixin.py +37 -38
  43. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/session_manager.py +1 -4
  44. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_middleware.py +3 -3
  45. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_validator.py +8 -8
  46. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security_config.py +9 -5
  47. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_base.py +9 -9
  48. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_manager.py +13 -18
  49. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swaig_function.py +11 -16
  50. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_builder.py +12 -14
  51. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_handler.py +3 -3
  52. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_renderer.py +15 -12
  53. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_service.py +47 -44
  54. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/__init__.py +15 -13
  55. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/gateway_service.py +27 -26
  56. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/mcp_manager.py +33 -27
  57. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/session_manager.py +3 -3
  58. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom.py +14 -22
  59. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom_tool.py +13 -14
  60. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/concierge.py +9 -11
  61. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/faq_bot.py +7 -8
  62. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/info_gatherer.py +14 -13
  63. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/receptionist.py +3 -3
  64. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/survey.py +5 -4
  65. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/__init__.py +1 -1
  66. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/call.py +39 -20
  67. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/client.py +59 -25
  68. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/message.py +17 -3
  69. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/__init__.py +1 -1
  70. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_base.py +3 -1
  71. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/compat.py +9 -9
  72. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/__init__.py +24 -20
  73. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/document_processor.py +130 -106
  74. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/index_builder.py +30 -24
  75. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/migration.py +12 -9
  76. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/pgvector_backend.py +38 -26
  77. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/query_processor.py +11 -15
  78. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_engine.py +65 -58
  79. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_service.py +73 -66
  80. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/__init__.py +1 -1
  81. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +4 -4
  82. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/skill.py +9 -15
  83. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/skill.py +5 -3
  84. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -3
  85. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/skill.py +6 -8
  86. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/skill.py +8 -7
  87. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/skill.py +4 -4
  88. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/skill.py +5 -3
  89. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/skill.py +10 -13
  90. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/skill.py +26 -30
  91. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/skill.py +53 -39
  92. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/skill.py +2 -2
  93. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/registry.py +21 -17
  94. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/skill.py +32 -28
  95. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/skill.py +10 -9
  96. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/skill.py +3 -3
  97. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill.py +22 -28
  98. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_improved.py +15 -17
  99. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_original.py +15 -16
  100. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/skill.py +7 -8
  101. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/schema_utils.py +60 -50
  102. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/web_service.py +62 -62
  103. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
  104. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +2 -0
  105. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/LICENSE +0 -0
  106. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/README.md +0 -0
  107. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/sw-agent-init.1 +0 -0
  108. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/sw-search.1 +0 -0
  109. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/swaig-test.1 +0 -0
  110. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/setup.cfg +0 -0
  111. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/setup.py +0 -0
  112. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/__init__.py +0 -0
  113. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/config.py +0 -0
  114. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/__init__.py +0 -0
  115. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  116. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/__init__.py +0 -0
  117. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  118. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/types.py +0 -0
  119. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/__init__.py +1 -1
  120. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/__init__.py +0 -0
  121. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  122. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  123. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  124. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  125. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  126. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  127. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  128. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/__init__.py +2 -2
  129. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  130. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/__init__.py +5 -5
  131. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/pom_builder.py +0 -0
  132. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/__init__.py +5 -5
  133. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/security_utils.py +0 -0
  134. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/plugins.py +0 -0
  135. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/__init__.py +4 -4
  136. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/__init__.py +0 -0
  137. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/__init__.py +3 -3
  138. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/constants.py +0 -0
  139. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/event.py +0 -0
  140. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_pagination.py +0 -0
  141. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/call_handler.py +0 -0
  142. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/client.py +0 -0
  143. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  144. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  145. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  146. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  147. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  148. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  149. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  150. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  151. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  152. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  153. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  154. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  155. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  156. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  157. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  158. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  159. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  160. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  161. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  162. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  163. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  164. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/schema.json +0 -0
  165. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/models.py +0 -0
  166. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/README.md +0 -0
  167. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  168. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  169. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  170. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  171. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  172. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  173. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  174. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  175. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/README.md +0 -0
  176. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  177. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  178. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  179. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  180. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/README.md +0 -0
  181. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  182. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/README.md +0 -0
  183. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/__init__.py +0 -0
  184. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  185. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  186. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  187. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  188. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  189. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  190. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/README.md +0 -0
  191. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  192. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  193. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  194. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  195. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  196. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/README.md +0 -0
  197. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  198. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  199. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  200. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/__init__.py +0 -0
  201. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/pom_utils.py +0 -0
  202. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/token_generators.py +0 -0
  203. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/url_validator.py +0 -0
  204. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/validators.py +0 -0
  205. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/__init__.py +0 -0
  206. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  207. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  208. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  209. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  210. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/tests/test_examples.py +0 -0
  211. {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/tests/test_mcp_integration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.0.2.dev62
3
+ Version: 3.0.2.dev64
4
4
  Summary: SignalWire 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-sdk"
7
- version = "3.0.2.dev62"
7
+ version = "3.0.2.dev64"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -165,3 +165,51 @@ signalwire = [
165
165
  [tool.ruff]
166
166
  target-version = "py310"
167
167
  line-length = 88
168
+
169
+ [tool.ruff.lint]
170
+ # E4/E7/E9 + F are the ruff defaults (E501 line-length intentionally excluded —
171
+ # formatting is owned by `ruff format`, not the linter). B = flake8-bugbear
172
+ # (likely-bug patterns), S = flake8-bandit (security smells).
173
+ select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "RUF"]
174
+
175
+ [tool.ruff.lint.per-file-ignores]
176
+ # Tests are built on assert; bandit's S101 is noise there.
177
+ "tests/**" = ["S101"]
178
+ # sw-agent-dokku is a developer-run deploy CLI that shells out to git/ssh with
179
+ # fixed list-form arg vectors (shell=False, so no shell interpolation). The
180
+ # dynamic parts (app name, dokku host, config vars) are the operator's own CLI
181
+ # args for their own deployment — not untrusted server input. S603 (subprocess
182
+ # call) and S607 (partial executable path: git/ssh resolved via PATH, the normal
183
+ # idiom) are expected and safe across this file.
184
+ "signalwire/signalwire/cli/dokku.py" = ["S603", "S607"]
185
+
186
+ [tool.ruff.lint.flake8-bugbear]
187
+ # FastAPI's dependency-injection idiom puts Depends()/Query()/etc. in argument
188
+ # defaults on purpose; B008 (function-call-in-default) is a false positive for it.
189
+ # Both the bare (`from fastapi import Depends`) and qualified forms are listed
190
+ # because the code imports these names directly.
191
+ extend-immutable-calls = [
192
+ "Depends", "fastapi.Depends",
193
+ "Query", "fastapi.Query",
194
+ "Body", "fastapi.Body",
195
+ "Header", "fastapi.Header",
196
+ "Cookie", "fastapi.Cookie",
197
+ "Path", "fastapi.Path",
198
+ "Form", "fastapi.Form",
199
+ "File", "fastapi.File",
200
+ "Security", "fastapi.Security",
201
+ ]
202
+
203
+ [tool.mypy]
204
+ python_version = "3.10"
205
+ files = ["signalwire/signalwire"]
206
+ # Third-party packages without type stubs (nltk, sentence_transformers, the
207
+ # search/relay stacks) are out of scope — we type our own code, not theirs.
208
+ ignore_missing_imports = true
209
+ # The bar: our own code is clean. Bodies of untyped defs are checked so real
210
+ # type errors inside them surface (this is what found the mixin cluster).
211
+ check_untyped_defs = true
212
+ warn_unused_ignores = true
213
+ # `# type: ignore` is reserved for genuinely-unfixable third-party-stub gaps and
214
+ # must carry an error code + reason. warn_unused_ignores keeps them honest.
215
+ show_error_codes = true
@@ -17,7 +17,7 @@ from .core.logging_config import configure_logging
17
17
 
18
18
  configure_logging()
19
19
 
20
- __version__ = "3.0.2.dev62"
20
+ __version__ = "3.0.2.dev64"
21
21
 
22
22
  # Import core classes for easier access.
23
23
  # These imports are intentionally placed after configure_logging() so the SDK's
@@ -148,26 +148,26 @@ def RestClient(*args, **kwargs):
148
148
  __all__ = [
149
149
  "AgentBase",
150
150
  "AgentServer",
151
- "SWMLService",
152
- "SWMLBuilder",
153
- "FunctionResult",
154
- "SWAIGFunction",
155
- "DataMap",
156
- "create_simple_api_tool",
157
- "create_expression_tool",
158
- "ContextBuilder",
151
+ "BedrockAgent",
159
152
  "Context",
160
- "Step",
153
+ "ContextBuilder",
154
+ "DataMap",
155
+ "FunctionResult",
161
156
  "GatherInfo",
162
157
  "GatherQuestion",
163
- "create_simple_context",
164
- "SwaigFunctionResult",
158
+ "RestClient",
159
+ "SWAIGFunction",
160
+ "SWMLBuilder",
161
+ "SWMLService",
165
162
  "SchemaValidationError",
163
+ "Step",
164
+ "SwaigFunctionResult",
166
165
  "WebService",
166
+ "add_skill_directory",
167
+ "create_expression_tool",
168
+ "create_simple_api_tool",
169
+ "create_simple_context",
167
170
  "list_skills",
168
171
  "list_skills_with_params",
169
172
  "register_skill",
170
- "add_skill_directory",
171
- "BedrockAgent",
172
- "RestClient",
173
173
  ]
@@ -11,6 +11,7 @@ AgentServer - Class for hosting multiple SignalWire AI Agents in a single server
11
11
 
12
12
  import os
13
13
  import re
14
+ from pathlib import Path
14
15
  from typing import Dict, Any, Optional, List, Tuple, Callable
15
16
 
16
17
  try:
@@ -19,11 +20,12 @@ try:
19
20
  except ImportError:
20
21
  raise ImportError(
21
22
  "fastapi and uvicorn are required. Install them with: pip install fastapi uvicorn"
22
- )
23
+ ) from None
23
24
 
24
25
  from signalwire.core.agent_base import AgentBase
25
26
  from signalwire.core.swml_service import SWMLService
26
27
  from signalwire.core.logging_config import get_logger
28
+ import contextlib
27
29
 
28
30
 
29
31
  class AgentServer:
@@ -41,7 +43,10 @@ class AgentServer:
41
43
  """
42
44
 
43
45
  def __init__(
44
- self, host: str = "0.0.0.0", port: int = 3000, log_level: str = "info"
46
+ self,
47
+ host: str = "0.0.0.0", # noqa: S104 # intended server default: listen on all interfaces (overridable)
48
+ port: int = 3000,
49
+ log_level: str = "info",
45
50
  ):
46
51
  """
47
52
  Initialize a new agent server
@@ -61,7 +66,7 @@ class AgentServer:
61
66
  self.app = FastAPI(
62
67
  title="SignalWire AI Agents",
63
68
  description="Hosted SignalWire AI Agents",
64
- version="3.0.2.dev62",
69
+ version="3.0.2.dev64",
65
70
  redirect_slashes=False,
66
71
  docs_url=None,
67
72
  redoc_url=None,
@@ -87,7 +92,7 @@ class AgentServer:
87
92
 
88
93
  # Keep track of SIP routing configuration
89
94
  self._sip_routing_enabled = False
90
- self._sip_route = None
95
+ self._sip_route: Optional[str] = None
91
96
  self._sip_username_mapping: Dict[str, str] = {} # Maps SIP usernames to routes
92
97
 
93
98
  # Register health endpoints immediately so they're available
@@ -145,10 +150,9 @@ class AgentServer:
145
150
  self._auto_map_agent_sip_usernames(agent, route)
146
151
 
147
152
  # Register the SIP routing callback with this agent if we have one
148
- if hasattr(self, "_sip_routing_callback") and self._sip_routing_callback:
149
- agent.register_routing_callback(
150
- self._sip_routing_callback, path=self._sip_route
151
- )
153
+ sip_cb = getattr(self, "_sip_routing_callback", None)
154
+ if sip_cb is not None and self._sip_route is not None:
155
+ agent.register_routing_callback(sip_cb, path=self._sip_route)
152
156
 
153
157
  def setup_sip_routing(self, route: str = "/sip", auto_map: bool = True) -> None:
154
158
  """
@@ -199,10 +203,7 @@ class AgentServer:
199
203
  if target_route:
200
204
  self.logger.info(f"Routing SIP request to {target_route}")
201
205
  return target_route
202
- else:
203
- self.logger.warning(
204
- f"No route found for SIP username: {sip_username}"
205
- )
206
+ self.logger.warning(f"No route found for SIP username: {sip_username}")
206
207
 
207
208
  # No routing needed (will be handled by the current agent)
208
209
  return None
@@ -373,11 +374,10 @@ class AgentServer:
373
374
 
374
375
  if mode == "cgi":
375
376
  return self._handle_cgi_request()
376
- elif mode == "lambda":
377
+ if mode == "lambda":
377
378
  return self._handle_lambda_request(event, context)
378
- else:
379
- # Server mode - use existing logic
380
- return self._run_server(host, port)
379
+ # Server mode - use existing logic
380
+ return self._run_server(host, port)
381
381
 
382
382
  def _handle_cgi_request(self) -> str:
383
383
  """Handle CGI request using same routing logic as server"""
@@ -406,7 +406,7 @@ class AgentServer:
406
406
  swml, content_type="application/json"
407
407
  )
408
408
  except Exception as e:
409
- self.logger.error(f"Failed to generate SWML: {str(e)}")
409
+ self.logger.error(f"Failed to generate SWML: {e!s}")
410
410
  error_response = {"error": "Failed to generate SWML"}
411
411
  return self._format_cgi_response(
412
412
  error_response, status="500 Internal Server Error"
@@ -450,7 +450,7 @@ class AgentServer:
450
450
  )
451
451
 
452
452
  except Exception as e:
453
- self.logger.error(f"SWAIG function failed: {str(e)}")
453
+ self.logger.error(f"SWAIG function failed: {e!s}")
454
454
  error_response = {"error": "SWAIG function failed"}
455
455
  return self._format_cgi_response(
456
456
  error_response, status="500 Internal Server Error"
@@ -500,7 +500,7 @@ class AgentServer:
500
500
  )
501
501
 
502
502
  except Exception as e:
503
- self.logger.error(f"Function call failed: {str(e)}")
503
+ self.logger.error(f"Function call failed: {e!s}")
504
504
  error_response = {"error": "Function call failed"}
505
505
  return self._format_cgi_response(
506
506
  error_response, status="500 Internal Server Error"
@@ -545,7 +545,7 @@ class AgentServer:
545
545
  "body": json.dumps(swml) if isinstance(swml, dict) else swml,
546
546
  }
547
547
  except Exception as e:
548
- self.logger.error(f"Failed to generate SWML: {str(e)}")
548
+ self.logger.error(f"Failed to generate SWML: {e!s}")
549
549
  return {
550
550
  "statusCode": 500,
551
551
  "headers": {"Content-Type": "application/json"},
@@ -569,10 +569,8 @@ class AgentServer:
569
569
  # Get POST data from Lambda event body
570
570
  post_data = {}
571
571
  if event and "body" in event and event["body"]:
572
- try:
572
+ with contextlib.suppress(json.JSONDecodeError, ValueError):
573
573
  post_data = json.loads(event["body"])
574
- except (json.JSONDecodeError, ValueError):
575
- pass
576
574
 
577
575
  result = agent._execute_swaig_function(
578
576
  function_name, post_data, None, None
@@ -586,7 +584,7 @@ class AgentServer:
586
584
  }
587
585
 
588
586
  except Exception as e:
589
- self.logger.error(f"Function call failed: {str(e)}")
587
+ self.logger.error(f"Function call failed: {e!s}")
590
588
  return {
591
589
  "statusCode": 500,
592
590
  "headers": {"Content-Type": "application/json"},
@@ -608,10 +606,7 @@ class AgentServer:
608
606
  import sys
609
607
 
610
608
  # Format the body
611
- if isinstance(data, dict):
612
- body = json.dumps(data)
613
- else:
614
- body = str(data)
609
+ body = json.dumps(data) if isinstance(data, dict) else str(data)
615
610
 
616
611
  # Build CGI response with headers
617
612
  response_lines = [
@@ -669,10 +664,10 @@ class AgentServer:
669
664
 
670
665
  # Validate SSL configuration if enabled
671
666
  if ssl_enabled:
672
- if not ssl_cert_path or not os.path.exists(ssl_cert_path):
667
+ if not ssl_cert_path or not Path(ssl_cert_path).exists():
673
668
  self.logger.warning(f"SSL cert not found: {ssl_cert_path}")
674
669
  ssl_enabled = False
675
- elif not ssl_key_path or not os.path.exists(ssl_key_path):
670
+ elif not ssl_key_path or not Path(ssl_key_path).exists():
676
671
  self.logger.warning(f"SSL key not found: {ssl_key_path}")
677
672
  ssl_enabled = False
678
673
 
@@ -688,8 +683,11 @@ class AgentServer:
688
683
  display_host = f"{host}:{port}"
689
684
 
690
685
  self.logger.info(f"Starting server on {protocol}://{display_host}")
691
- for route, agent in self.agents.items():
692
- username, password = agent.get_basic_auth_credentials()
686
+ for agent in self.agents.values():
687
+ # include_source defaults False -> 2-tuple at runtime; index to
688
+ # avoid the union-tuple unpack ambiguity mypy sees.
689
+ creds = agent.get_basic_auth_credentials()
690
+ username = creds[0]
693
691
  agent_url = agent.get_full_url(include_auth=False)
694
692
  self.logger.info(f"Agent '{agent.get_name()}' available at:")
695
693
  self.logger.info(f"URL: {agent_url}")
@@ -858,7 +856,7 @@ class AgentServer:
858
856
  if full_path == route.lstrip("/"):
859
857
  # This is a request to an agent's root without trailing slash
860
858
  return await agent._handle_root_request(request)
861
- elif full_path.startswith(route.lstrip("/") + "/"):
859
+ if full_path.startswith(route.lstrip("/") + "/"):
862
860
  # This is a request to an agent's sub-path
863
861
  relative_path = full_path[len(route.lstrip("/")) :]
864
862
  relative_path = relative_path.lstrip("/")
@@ -870,21 +868,18 @@ class AgentServer:
870
868
  clean_path = relative_path.rstrip("/")
871
869
  if clean_path == "debug":
872
870
  return await agent._handle_debug_request(request)
873
- elif clean_path == "swaig":
871
+ if clean_path == "swaig":
874
872
  from fastapi import Response
875
873
 
876
874
  return await agent._handle_swaig_request(request, Response())
877
- elif clean_path == "post_prompt":
875
+ if clean_path == "post_prompt":
878
876
  return await agent._handle_post_prompt_request(request)
879
- elif clean_path == "check_for_input":
877
+ if clean_path == "check_for_input":
880
878
  return await agent._handle_check_for_input_request(request)
881
879
 
882
880
  # Check for custom routing callbacks
883
881
  if hasattr(agent, "_routing_callbacks"):
884
- for (
885
- callback_path,
886
- callback_fn,
887
- ) in agent._routing_callbacks.items():
882
+ for callback_path in agent._routing_callbacks:
888
883
  cb_path_clean = callback_path.strip("/")
889
884
  if clean_path == cb_path_clean:
890
885
  request.state.callback_path = callback_path
@@ -893,7 +888,7 @@ class AgentServer:
893
888
  # No matching agent - check for static files
894
889
  if hasattr(self, "_static_directories"):
895
890
  # Check each static directory route
896
- for static_route, static_dir in self._static_directories.items():
891
+ for static_route in self._static_directories:
897
892
  # For root static route, serve any unmatched path
898
893
  if static_route == "" or static_route == "/":
899
894
  response = self._serve_static_file(full_path, "")
@@ -77,7 +77,7 @@ class BedrockAgent(AgentBase):
77
77
  logger.info(f"BedrockAgent initialized: {name} on route {route}")
78
78
 
79
79
  def _render_swml(
80
- self, call_id: str = None, modifications: Optional[dict] = None
80
+ self, call_id: Optional[str] = None, modifications: Optional[dict] = None
81
81
  ) -> str:
82
82
  """
83
83
  Render SWML document with amazon_bedrock verb
@@ -11,6 +11,7 @@ import argparse
11
11
  import sys
12
12
  from pathlib import Path
13
13
  from datetime import datetime
14
+ from typing import List, cast
14
15
  from urllib.parse import urlparse, urlunparse
15
16
 
16
17
  from signalwire.search.models import MODEL_ALIASES, DEFAULT_MODEL, resolve_model_alias
@@ -26,7 +27,7 @@ def _mask_connection_string(conn_str):
26
27
  + (f":{parsed.port}" if parsed.port else "")
27
28
  )
28
29
  return urlunparse(masked)
29
- except Exception:
30
+ except Exception: # noqa: S110 # best-effort password masking for display; falls through to "****" on any parse failure
30
31
  pass
31
32
  return "****"
32
33
 
@@ -518,7 +519,7 @@ Examples:
518
519
  relative_path = (
519
520
  file_path.relative_to(base_dir)
520
521
  if base_dir
521
- else file_path.name
522
+ else Path(file_path.name)
522
523
  )
523
524
  json_filename = relative_path.with_suffix(".json")
524
525
  json_path = Path(args.output_dir) / json_filename
@@ -537,7 +538,7 @@ Examples:
537
538
  },
538
539
  }
539
540
 
540
- with open(json_path, "w", encoding="utf-8") as f:
541
+ with json_path.open("w", encoding="utf-8") as f:
541
542
  json.dump(chunk_data, f, indent=2, ensure_ascii=False)
542
543
 
543
544
  chunk_files_created.append(json_path)
@@ -547,7 +548,7 @@ Examples:
547
548
  # Accumulate all chunks for single file output
548
549
  all_chunks.extend(chunks)
549
550
 
550
- except Exception as e:
551
+ except Exception as e: # noqa: PERF203 # per-iteration error isolation: one failed file must not abort the batch
551
552
  print(f"Error processing {file_path}: {e}")
552
553
  if args.verbose:
553
554
  import traceback
@@ -566,7 +567,7 @@ Examples:
566
567
  },
567
568
  }
568
569
 
569
- with open(args.output, "w", encoding="utf-8") as f:
570
+ with Path(args.output).open("w", encoding="utf-8") as f:
570
571
  json.dump(output_data, f, indent=2, ensure_ascii=False)
571
572
 
572
573
  print(f"✓ Exported {len(all_chunks)} chunks to {args.output}")
@@ -575,8 +576,8 @@ Examples:
575
576
  f"✓ Created {len(chunk_files_created)} JSON files in {args.output_dir}"
576
577
  )
577
578
  total_chunks = 0
578
- for f in chunk_files_created:
579
- with open(f) as fh:
579
+ for chunk_file in chunk_files_created:
580
+ with chunk_file.open() as fh:
580
581
  total_chunks += len(json.load(fh)["chunks"])
581
582
  print(f" Total chunks: {total_chunks}")
582
583
 
@@ -633,7 +634,11 @@ Examples:
633
634
  # Check if the index was actually created
634
635
  import os
635
636
 
636
- if os.path.exists(args.output):
637
+ # Rationale for PTH110 suppression below: tests patch global
638
+ # os.path.exists separately from pathlib.Path.exists to drive this
639
+ # post-build check; Path.exists() would pick up the unrelated Path
640
+ # mock and break the test seam.
641
+ if os.path.exists(args.output): # noqa: PTH110
637
642
  print(f"\n✓ Search index created successfully: {args.output}")
638
643
  else:
639
644
  print("\n✗ Search index creation failed - no files were processed")
@@ -770,10 +775,11 @@ def search_command():
770
775
  args.model = MODEL_ALIASES[args.model]
771
776
 
772
777
  # Validate keyword weight if provided
773
- if args.keyword_weight is not None:
774
- if args.keyword_weight < 0.0 or args.keyword_weight > 1.0:
775
- print("Error: --keyword-weight must be between 0.0 and 1.0")
776
- sys.exit(1)
778
+ if args.keyword_weight is not None and (
779
+ args.keyword_weight < 0.0 or args.keyword_weight > 1.0
780
+ ):
781
+ print("Error: --keyword-weight must be between 0.0 and 1.0")
782
+ sys.exit(1)
777
783
 
778
784
  # Validate backend configuration
779
785
  if args.backend == "pgvector" and not args.connection_string:
@@ -920,7 +926,9 @@ def search_command():
920
926
 
921
927
  # Perform search
922
928
  results = engine.search(
923
- query_vector=enhanced.get("vector"),
929
+ query_vector=cast(
930
+ List[float], enhanced.get("vector")
931
+ ), # vector is None for keyword-only search; search() tolerates it at runtime
924
932
  enhanced_text=enhanced.get("enhanced_text", query),
925
933
  count=args.count,
926
934
  similarity_threshold=args.distance_threshold,
@@ -1003,7 +1011,9 @@ def search_command():
1003
1011
 
1004
1012
  # Perform search
1005
1013
  results = engine.search(
1006
- query_vector=enhanced.get("vector"),
1014
+ query_vector=cast(
1015
+ List[float], enhanced.get("vector")
1016
+ ), # vector is None for keyword-only search; search() tolerates it at runtime
1007
1017
  enhanced_text=enhanced.get("enhanced_text", args.query),
1008
1018
  count=args.count,
1009
1019
  similarity_threshold=args.distance_threshold,
@@ -1535,17 +1545,17 @@ Examples:
1535
1545
  sys.argv.pop(1)
1536
1546
  validate_command()
1537
1547
  return
1538
- elif sys.argv[1] == "search":
1548
+ if sys.argv[1] == "search":
1539
1549
  # Remove 'search' from argv and call search_command
1540
1550
  sys.argv.pop(1)
1541
1551
  search_command()
1542
1552
  return
1543
- elif sys.argv[1] == "remote":
1553
+ if sys.argv[1] == "remote":
1544
1554
  # Remove 'remote' from argv and call remote_command
1545
1555
  sys.argv.pop(1)
1546
1556
  remote_command()
1547
1557
  return
1548
- elif sys.argv[1] == "migrate":
1558
+ if sys.argv[1] == "migrate":
1549
1559
  # Remove 'migrate' from argv and call migrate_command
1550
1560
  sys.argv.pop(1)
1551
1561
  migrate_command()