signalwire-sdk 3.0.2.dev63__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.dev63 → signalwire_sdk-3.0.2.dev64}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/pyproject.toml +35 -1
  3. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/__init__.py +15 -15
  4. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agent_server.py +28 -35
  5. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py +18 -13
  6. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/agent_loader.py +15 -12
  7. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/argparse_helpers.py +5 -12
  8. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/service_loader.py +18 -22
  9. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/dokku.py +16 -13
  10. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/datamap_exec.py +10 -12
  11. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/init_project.py +17 -20
  12. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/output_formatter.py +8 -17
  13. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/swml_dump.py +18 -19
  14. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_generation.py +5 -7
  15. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_overrides.py +3 -4
  16. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/mock_env.py +5 -4
  17. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/swaig_test_wrapper.py +3 -2
  18. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/test_swaig.py +10 -6
  19. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/registry.py +65 -64
  20. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/type_inference.py +4 -6
  21. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent_base.py +65 -59
  22. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/auth_handler.py +3 -3
  23. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/config_loader.py +13 -14
  24. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/contexts.py +13 -14
  25. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/data_map.py +2 -7
  26. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/function_result.py +15 -21
  27. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/logging_config.py +6 -11
  28. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/ai_config_mixin.py +6 -5
  29. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/auth_mixin.py +5 -7
  30. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +1 -1
  31. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/prompt_mixin.py +49 -56
  32. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/serverless_mixin.py +75 -90
  33. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/state_mixin.py +3 -8
  34. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/tool_mixin.py +1 -1
  35. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/web_mixin.py +18 -22
  36. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/session_manager.py +1 -4
  37. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_validator.py +8 -8
  38. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security_config.py +9 -5
  39. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_base.py +5 -5
  40. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_manager.py +11 -16
  41. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swaig_function.py +9 -14
  42. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_builder.py +6 -8
  43. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_handler.py +1 -1
  44. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_renderer.py +8 -8
  45. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_service.py +34 -38
  46. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/__init__.py +12 -11
  47. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/gateway_service.py +24 -23
  48. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/mcp_manager.py +17 -16
  49. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom.py +7 -16
  50. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom_tool.py +13 -14
  51. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/concierge.py +9 -11
  52. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/faq_bot.py +4 -5
  53. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/info_gatherer.py +11 -12
  54. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/receptionist.py +3 -3
  55. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/survey.py +5 -4
  56. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/__init__.py +1 -1
  57. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/call.py +32 -17
  58. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/client.py +35 -14
  59. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/message.py +17 -3
  60. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/__init__.py +1 -1
  61. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/__init__.py +9 -8
  62. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/document_processor.py +47 -54
  63. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/index_builder.py +9 -14
  64. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/migration.py +2 -2
  65. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/pgvector_backend.py +21 -14
  66. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/query_processor.py +4 -8
  67. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_engine.py +38 -42
  68. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_service.py +28 -30
  69. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/__init__.py +1 -1
  70. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +3 -3
  71. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/skill.py +8 -14
  72. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/skill.py +5 -3
  73. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -3
  74. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/skill.py +6 -8
  75. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/skill.py +7 -6
  76. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/skill.py +4 -4
  77. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/skill.py +5 -3
  78. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/skill.py +9 -12
  79. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/skill.py +25 -29
  80. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/skill.py +37 -36
  81. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/registry.py +6 -6
  82. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/skill.py +18 -16
  83. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/skill.py +10 -9
  84. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/skill.py +2 -2
  85. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill.py +13 -20
  86. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_improved.py +11 -14
  87. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_original.py +13 -14
  88. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/skill.py +7 -8
  89. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/schema_utils.py +45 -40
  90. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/web_service.py +32 -36
  91. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  92. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/LICENSE +0 -0
  93. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/README.md +0 -0
  94. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/sw-agent-init.1 +0 -0
  95. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/sw-search.1 +0 -0
  96. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/swaig-test.1 +0 -0
  97. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/setup.cfg +0 -0
  98. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/setup.py +0 -0
  99. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agents/bedrock.py +0 -0
  100. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/__init__.py +0 -0
  101. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/config.py +0 -0
  102. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/__init__.py +0 -0
  103. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  104. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  105. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  106. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/__init__.py +0 -0
  107. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  108. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/types.py +0 -0
  109. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/__init__.py +1 -1
  110. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/_agent_host.py +0 -0
  111. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/__init__.py +0 -0
  112. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  113. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  114. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  115. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  116. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  117. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  118. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  119. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  120. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/__init__.py +2 -2
  121. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  122. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/__init__.py +5 -5
  123. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  124. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  125. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/pom_builder.py +0 -0
  126. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/__init__.py +5 -5
  127. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/security_utils.py +0 -0
  128. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_middleware.py +1 -1
  129. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/plugins.py +0 -0
  130. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/__init__.py +4 -4
  131. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  132. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/__init__.py +0 -0
  133. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/__init__.py +3 -3
  134. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/constants.py +0 -0
  135. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/event.py +0 -0
  136. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_base.py +0 -0
  137. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_pagination.py +0 -0
  138. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/call_handler.py +0 -0
  139. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/client.py +0 -0
  140. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  141. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  142. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  143. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  144. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
  145. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  146. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  147. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  148. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  149. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  150. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  151. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  152. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  153. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  154. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  155. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  156. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  157. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  158. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  159. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  160. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  161. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  162. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/schema.json +0 -0
  163. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/models.py +0 -0
  164. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/README.md +0 -0
  165. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  166. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  167. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  168. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  169. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  170. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  171. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  172. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  173. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/README.md +0 -0
  174. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  175. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  176. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  177. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  178. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/README.md +0 -0
  179. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  180. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/README.md +0 -0
  181. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/__init__.py +0 -0
  182. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  183. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  184. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  185. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  186. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  187. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  188. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  189. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/README.md +0 -0
  190. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  191. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  192. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  193. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  194. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  195. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/README.md +0 -0
  196. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  197. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  198. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  199. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/__init__.py +0 -0
  200. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/pom_utils.py +0 -0
  201. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/token_generators.py +0 -0
  202. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/url_validator.py +0 -0
  203. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/validators.py +0 -0
  204. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/__init__.py +0 -0
  205. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  206. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  207. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  208. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  209. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  210. {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/tests/test_examples.py +0 -0
  211. {signalwire_sdk-3.0.2.dev63 → 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.dev63
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.dev63"
7
+ version = "3.0.2.dev64"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -166,6 +166,40 @@ signalwire = [
166
166
  target-version = "py310"
167
167
  line-length = 88
168
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
+
169
203
  [tool.mypy]
170
204
  python_version = "3.10"
171
205
  files = ["signalwire/signalwire"]
@@ -17,7 +17,7 @@ from .core.logging_config import configure_logging
17
17
 
18
18
  configure_logging()
19
19
 
20
- __version__ = "3.0.2.dev63"
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.dev63",
69
+ version="3.0.2.dev64",
65
70
  redirect_slashes=False,
66
71
  docs_url=None,
67
72
  redoc_url=None,
@@ -198,10 +203,7 @@ class AgentServer:
198
203
  if target_route:
199
204
  self.logger.info(f"Routing SIP request to {target_route}")
200
205
  return target_route
201
- else:
202
- self.logger.warning(
203
- f"No route found for SIP username: {sip_username}"
204
- )
206
+ self.logger.warning(f"No route found for SIP username: {sip_username}")
205
207
 
206
208
  # No routing needed (will be handled by the current agent)
207
209
  return None
@@ -372,11 +374,10 @@ class AgentServer:
372
374
 
373
375
  if mode == "cgi":
374
376
  return self._handle_cgi_request()
375
- elif mode == "lambda":
377
+ if mode == "lambda":
376
378
  return self._handle_lambda_request(event, context)
377
- else:
378
- # Server mode - use existing logic
379
- return self._run_server(host, port)
379
+ # Server mode - use existing logic
380
+ return self._run_server(host, port)
380
381
 
381
382
  def _handle_cgi_request(self) -> str:
382
383
  """Handle CGI request using same routing logic as server"""
@@ -405,7 +406,7 @@ class AgentServer:
405
406
  swml, content_type="application/json"
406
407
  )
407
408
  except Exception as e:
408
- self.logger.error(f"Failed to generate SWML: {str(e)}")
409
+ self.logger.error(f"Failed to generate SWML: {e!s}")
409
410
  error_response = {"error": "Failed to generate SWML"}
410
411
  return self._format_cgi_response(
411
412
  error_response, status="500 Internal Server Error"
@@ -449,7 +450,7 @@ class AgentServer:
449
450
  )
450
451
 
451
452
  except Exception as e:
452
- self.logger.error(f"SWAIG function failed: {str(e)}")
453
+ self.logger.error(f"SWAIG function failed: {e!s}")
453
454
  error_response = {"error": "SWAIG function failed"}
454
455
  return self._format_cgi_response(
455
456
  error_response, status="500 Internal Server Error"
@@ -499,7 +500,7 @@ class AgentServer:
499
500
  )
500
501
 
501
502
  except Exception as e:
502
- self.logger.error(f"Function call failed: {str(e)}")
503
+ self.logger.error(f"Function call failed: {e!s}")
503
504
  error_response = {"error": "Function call failed"}
504
505
  return self._format_cgi_response(
505
506
  error_response, status="500 Internal Server Error"
@@ -544,7 +545,7 @@ class AgentServer:
544
545
  "body": json.dumps(swml) if isinstance(swml, dict) else swml,
545
546
  }
546
547
  except Exception as e:
547
- self.logger.error(f"Failed to generate SWML: {str(e)}")
548
+ self.logger.error(f"Failed to generate SWML: {e!s}")
548
549
  return {
549
550
  "statusCode": 500,
550
551
  "headers": {"Content-Type": "application/json"},
@@ -568,10 +569,8 @@ class AgentServer:
568
569
  # Get POST data from Lambda event body
569
570
  post_data = {}
570
571
  if event and "body" in event and event["body"]:
571
- try:
572
+ with contextlib.suppress(json.JSONDecodeError, ValueError):
572
573
  post_data = json.loads(event["body"])
573
- except (json.JSONDecodeError, ValueError):
574
- pass
575
574
 
576
575
  result = agent._execute_swaig_function(
577
576
  function_name, post_data, None, None
@@ -585,7 +584,7 @@ class AgentServer:
585
584
  }
586
585
 
587
586
  except Exception as e:
588
- self.logger.error(f"Function call failed: {str(e)}")
587
+ self.logger.error(f"Function call failed: {e!s}")
589
588
  return {
590
589
  "statusCode": 500,
591
590
  "headers": {"Content-Type": "application/json"},
@@ -607,10 +606,7 @@ class AgentServer:
607
606
  import sys
608
607
 
609
608
  # Format the body
610
- if isinstance(data, dict):
611
- body = json.dumps(data)
612
- else:
613
- body = str(data)
609
+ body = json.dumps(data) if isinstance(data, dict) else str(data)
614
610
 
615
611
  # Build CGI response with headers
616
612
  response_lines = [
@@ -668,10 +664,10 @@ class AgentServer:
668
664
 
669
665
  # Validate SSL configuration if enabled
670
666
  if ssl_enabled:
671
- 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():
672
668
  self.logger.warning(f"SSL cert not found: {ssl_cert_path}")
673
669
  ssl_enabled = False
674
- 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():
675
671
  self.logger.warning(f"SSL key not found: {ssl_key_path}")
676
672
  ssl_enabled = False
677
673
 
@@ -687,7 +683,7 @@ class AgentServer:
687
683
  display_host = f"{host}:{port}"
688
684
 
689
685
  self.logger.info(f"Starting server on {protocol}://{display_host}")
690
- for route, agent in self.agents.items():
686
+ for agent in self.agents.values():
691
687
  # include_source defaults False -> 2-tuple at runtime; index to
692
688
  # avoid the union-tuple unpack ambiguity mypy sees.
693
689
  creds = agent.get_basic_auth_credentials()
@@ -860,7 +856,7 @@ class AgentServer:
860
856
  if full_path == route.lstrip("/"):
861
857
  # This is a request to an agent's root without trailing slash
862
858
  return await agent._handle_root_request(request)
863
- elif full_path.startswith(route.lstrip("/") + "/"):
859
+ if full_path.startswith(route.lstrip("/") + "/"):
864
860
  # This is a request to an agent's sub-path
865
861
  relative_path = full_path[len(route.lstrip("/")) :]
866
862
  relative_path = relative_path.lstrip("/")
@@ -872,21 +868,18 @@ class AgentServer:
872
868
  clean_path = relative_path.rstrip("/")
873
869
  if clean_path == "debug":
874
870
  return await agent._handle_debug_request(request)
875
- elif clean_path == "swaig":
871
+ if clean_path == "swaig":
876
872
  from fastapi import Response
877
873
 
878
874
  return await agent._handle_swaig_request(request, Response())
879
- elif clean_path == "post_prompt":
875
+ if clean_path == "post_prompt":
880
876
  return await agent._handle_post_prompt_request(request)
881
- elif clean_path == "check_for_input":
877
+ if clean_path == "check_for_input":
882
878
  return await agent._handle_check_for_input_request(request)
883
879
 
884
880
  # Check for custom routing callbacks
885
881
  if hasattr(agent, "_routing_callbacks"):
886
- for (
887
- callback_path,
888
- callback_fn,
889
- ) in agent._routing_callbacks.items():
882
+ for callback_path in agent._routing_callbacks:
890
883
  cb_path_clean = callback_path.strip("/")
891
884
  if clean_path == cb_path_clean:
892
885
  request.state.callback_path = callback_path
@@ -895,7 +888,7 @@ class AgentServer:
895
888
  # No matching agent - check for static files
896
889
  if hasattr(self, "_static_directories"):
897
890
  # Check each static directory route
898
- for static_route, static_dir in self._static_directories.items():
891
+ for static_route in self._static_directories:
899
892
  # For root static route, serve any unmatched path
900
893
  if static_route == "" or static_route == "/":
901
894
  response = self._serve_static_file(full_path, "")
@@ -27,7 +27,7 @@ def _mask_connection_string(conn_str):
27
27
  + (f":{parsed.port}" if parsed.port else "")
28
28
  )
29
29
  return urlunparse(masked)
30
- except Exception:
30
+ except Exception: # noqa: S110 # best-effort password masking for display; falls through to "****" on any parse failure
31
31
  pass
32
32
  return "****"
33
33
 
@@ -538,7 +538,7 @@ Examples:
538
538
  },
539
539
  }
540
540
 
541
- with open(json_path, "w", encoding="utf-8") as f:
541
+ with json_path.open("w", encoding="utf-8") as f:
542
542
  json.dump(chunk_data, f, indent=2, ensure_ascii=False)
543
543
 
544
544
  chunk_files_created.append(json_path)
@@ -548,7 +548,7 @@ Examples:
548
548
  # Accumulate all chunks for single file output
549
549
  all_chunks.extend(chunks)
550
550
 
551
- except Exception as e:
551
+ except Exception as e: # noqa: PERF203 # per-iteration error isolation: one failed file must not abort the batch
552
552
  print(f"Error processing {file_path}: {e}")
553
553
  if args.verbose:
554
554
  import traceback
@@ -567,7 +567,7 @@ Examples:
567
567
  },
568
568
  }
569
569
 
570
- with open(args.output, "w", encoding="utf-8") as f:
570
+ with Path(args.output).open("w", encoding="utf-8") as f:
571
571
  json.dump(output_data, f, indent=2, ensure_ascii=False)
572
572
 
573
573
  print(f"✓ Exported {len(all_chunks)} chunks to {args.output}")
@@ -577,7 +577,7 @@ Examples:
577
577
  )
578
578
  total_chunks = 0
579
579
  for chunk_file in chunk_files_created:
580
- with open(chunk_file) as fh:
580
+ with chunk_file.open() as fh:
581
581
  total_chunks += len(json.load(fh)["chunks"])
582
582
  print(f" Total chunks: {total_chunks}")
583
583
 
@@ -634,7 +634,11 @@ Examples:
634
634
  # Check if the index was actually created
635
635
  import os
636
636
 
637
- 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
638
642
  print(f"\n✓ Search index created successfully: {args.output}")
639
643
  else:
640
644
  print("\n✗ Search index creation failed - no files were processed")
@@ -771,10 +775,11 @@ def search_command():
771
775
  args.model = MODEL_ALIASES[args.model]
772
776
 
773
777
  # Validate keyword weight if provided
774
- if args.keyword_weight is not None:
775
- if args.keyword_weight < 0.0 or args.keyword_weight > 1.0:
776
- print("Error: --keyword-weight must be between 0.0 and 1.0")
777
- 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)
778
783
 
779
784
  # Validate backend configuration
780
785
  if args.backend == "pgvector" and not args.connection_string:
@@ -1540,17 +1545,17 @@ Examples:
1540
1545
  sys.argv.pop(1)
1541
1546
  validate_command()
1542
1547
  return
1543
- elif sys.argv[1] == "search":
1548
+ if sys.argv[1] == "search":
1544
1549
  # Remove 'search' from argv and call search_command
1545
1550
  sys.argv.pop(1)
1546
1551
  search_command()
1547
1552
  return
1548
- elif sys.argv[1] == "remote":
1553
+ if sys.argv[1] == "remote":
1549
1554
  # Remove 'remote' from argv and call remote_command
1550
1555
  sys.argv.pop(1)
1551
1556
  remote_command()
1552
1557
  return
1553
- elif sys.argv[1] == "migrate":
1558
+ if sys.argv[1] == "migrate":
1554
1559
  # Remove 'migrate' from argv and call migrate_command
1555
1560
  sys.argv.pop(1)
1556
1561
  migrate_command()
@@ -124,7 +124,7 @@ def _discover_services_impl(service_path: str) -> List[Dict[str, Any]]:
124
124
  # Clean up sys.path if we added to it
125
125
  if sys_path_added:
126
126
  sys.path.remove(module_dir)
127
- raise ImportError(f"Failed to load service module: {e}")
127
+ raise ImportError(f"Failed to load service module: {e}") from e
128
128
  finally:
129
129
  # Clean up sys.path after successful load too
130
130
  if sys_path_added and module_dir in sys.path:
@@ -308,7 +308,7 @@ def _load_service_impl(
308
308
  # Clean up sys.path if we added to it
309
309
  if sys_path_added:
310
310
  sys.path.remove(module_dir)
311
- raise ImportError(f"Failed to load service module: {e}")
311
+ raise ImportError(f"Failed to load service module: {e}") from e
312
312
  finally:
313
313
  # Clean up sys.path after successful load too
314
314
  if sys_path_added and module_dir in sys.path:
@@ -320,15 +320,18 @@ def _load_service_impl(
320
320
  # If service_identifier is specified and prefer_route is True, try to find by route first
321
321
  if service_identifier and prefer_route:
322
322
  # First, try to find an existing instance with matching route
323
- for name, obj in vars(module).items():
324
- if isinstance(obj, SWMLService) and hasattr(obj, "route"):
325
- if obj.route == service_identifier:
326
- service = obj
327
- break
323
+ for obj in vars(module).values():
324
+ if (
325
+ isinstance(obj, SWMLService)
326
+ and hasattr(obj, "route")
327
+ and obj.route == service_identifier
328
+ ):
329
+ service = obj
330
+ break
328
331
 
329
332
  # If not found, try instantiating classes to check their routes
330
333
  if service is None:
331
- for name, obj in vars(module).items():
334
+ for obj in vars(module).values():
332
335
  if (
333
336
  isinstance(obj, type)
334
337
  and issubclass(obj, SWMLService)
@@ -344,7 +347,7 @@ def _load_service_impl(
344
347
  ):
345
348
  service = temp_instance
346
349
  break
347
- except Exception:
350
+ except Exception: # noqa: S110 # intentional: skip classes that can't be instantiated during discovery
348
351
  # Skip classes that can't be instantiated
349
352
  pass
350
353
 
@@ -357,7 +360,7 @@ def _load_service_impl(
357
360
  except Exception as e:
358
361
  raise ValueError(
359
362
  f"No service found with route '{service_identifier}' and failed to instantiate class '{service_identifier}': {e}"
360
- )
363
+ ) from e
361
364
  elif isinstance(obj, SWMLService):
362
365
  service = obj
363
366
 
@@ -382,7 +385,7 @@ def _load_service_impl(
382
385
  except Exception as e:
383
386
  raise ValueError(
384
387
  f"Failed to instantiate service class '{service_identifier}': {e}"
385
- )
388
+ ) from e
386
389
  elif isinstance(obj, SWMLService):
387
390
  # It's already an instance
388
391
  service = obj
@@ -461,7 +464,7 @@ def _load_service_impl(
461
464
  "service_name": service_name,
462
465
  }
463
466
  )
464
- except Exception:
467
+ except Exception: # noqa: PERF203 # per-iteration error isolation: one class that fails to instantiate must not abort discovery
465
468
  # If instantiation fails, still include the class
466
469
  service_info.append(
467
470
  {
@@ -104,20 +104,14 @@ def parse_function_arguments(
104
104
  # DataMap function
105
105
  if "parameters" in func_schema:
106
106
  params = func_schema["parameters"]
107
- if "properties" in params:
108
- parameters = params["properties"]
109
- else:
110
- parameters = params
107
+ parameters = params.get("properties", params)
111
108
  else:
112
109
  parameters = func_schema
113
110
  else:
114
111
  # Regular SWAIG function
115
112
  if hasattr(func_schema, "parameters") and func_schema.parameters:
116
113
  params = func_schema.parameters
117
- if "properties" in params:
118
- parameters = params["properties"]
119
- else:
120
- parameters = params
114
+ parameters = params.get("properties", params)
121
115
 
122
116
  # Parse arguments
123
117
  while i < len(function_args_list):
@@ -165,8 +159,7 @@ def parse_function_arguments(
165
159
  f"CLI flag --{param_name} must come BEFORE --exec, not after.\n"
166
160
  f"Example: swaig-test file.py --{param_name} --exec function_name"
167
161
  )
168
- else:
169
- raise ValueError(f"Parameter --{param_name} requires a value")
162
+ raise ValueError(f"Parameter --{param_name} requires a value")
170
163
 
171
164
  value = function_args_list[i + 1]
172
165
 
@@ -177,14 +170,14 @@ def parse_function_arguments(
177
170
  except ValueError:
178
171
  raise ValueError(
179
172
  f"Parameter --{param_name} must be an integer, got: {value}"
180
- )
173
+ ) from None
181
174
  elif param_type == "number":
182
175
  try:
183
176
  parsed_args[param_key] = float(value)
184
177
  except ValueError:
185
178
  raise ValueError(
186
179
  f"Parameter --{param_name} must be a number, got: {value}"
187
- )
180
+ ) from None
188
181
  elif param_type == "array":
189
182
  # Handle comma-separated arrays
190
183
  parsed_args[param_key] = [item.strip() for item in value.split(",")]
@@ -108,7 +108,7 @@ class ServiceCapture:
108
108
  # Module might have called run/serve which we intercepted
109
109
  if not self.captured_services:
110
110
  # If we didn't capture anything, the error is real
111
- raise ImportError(f"Failed to load service module: {e}")
111
+ raise ImportError(f"Failed to load service module: {e}") from e
112
112
  finally:
113
113
  # Always restore original methods
114
114
  self._restore_patches()
@@ -196,11 +196,10 @@ async def simulate_request_to_service(
196
196
  import json
197
197
 
198
198
  return json.loads(result.body.decode())
199
- elif isinstance(result, dict):
199
+ if isinstance(result, dict):
200
200
  return result
201
- else:
202
- # Try to get content from response
203
- return {"error": "Unable to parse response"}
201
+ # Try to get content from response
202
+ return {"error": "Unable to parse response"}
204
203
 
205
204
 
206
205
  def load_and_simulate_service(
@@ -263,7 +262,7 @@ def load_and_simulate_service(
263
262
  )
264
263
 
265
264
  # Simulate the request
266
- assert service is not None # guaranteed by the selection logic above
265
+ assert service is not None # noqa: S101 # type-narrowing invariant (not input validation): guaranteed by the selection logic above
267
266
  return asyncio.run(
268
267
  simulate_request_to_service(
269
268
  service,
@@ -317,19 +316,16 @@ def discover_agents_in_file(agent_path: str) -> List[Dict[str, Any]]:
317
316
  services = capturer.capture(agent_path)
318
317
 
319
318
  # Convert to old format
320
- agents_found = []
321
- for service in services:
322
- if isinstance(service, AgentBase):
323
- agents_found.append(
324
- {
325
- "name": service.name,
326
- "class_name": service.__class__.__name__,
327
- "type": "instance",
328
- "agent_name": service.name,
329
- "route": service.route,
330
- "description": service.__class__.__doc__,
331
- "object": service,
332
- }
333
- )
334
-
335
- return agents_found
319
+ return [
320
+ {
321
+ "name": service.name,
322
+ "class_name": service.__class__.__name__,
323
+ "type": "instance",
324
+ "agent_name": service.name,
325
+ "route": service.route,
326
+ "description": service.__class__.__doc__,
327
+ "object": service,
328
+ }
329
+ for service in services
330
+ if isinstance(service, AgentBase)
331
+ ]