signalwire-sdk 3.0.2.dev69__tar.gz → 3.0.2.dev71__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.dev69 → signalwire_sdk-3.0.2.dev71}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/pyproject.toml +1 -1
  3. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/agent_server.py +1 -1
  5. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/agents/bedrock.py +5 -5
  6. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/build_search.py +7 -7
  7. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/core/agent_loader.py +2 -2
  8. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/core/argparse_helpers.py +6 -6
  9. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/core/service_loader.py +17 -15
  10. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/dokku.py +23 -19
  11. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/execution/webhook_exec.py +4 -2
  12. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/init_project.py +15 -15
  13. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/output/swml_dump.py +2 -2
  14. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/simulation/mock_env.py +13 -12
  15. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/swaig_test_wrapper.py +1 -1
  16. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/test_swaig.py +4 -4
  17. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/prompt/manager.py +6 -4
  18. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent_base.py +9 -0
  19. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/ai_config_mixin.py +21 -0
  20. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/prompt_mixin.py +20 -11
  21. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/skill_mixin.py +6 -3
  22. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/state_mixin.py +11 -3
  23. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/skill_base.py +8 -4
  24. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/swml_renderer.py +5 -2
  25. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/swml_service.py +10 -6
  26. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/livewire/__init__.py +73 -53
  27. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/livewire/plugins.py +3 -3
  28. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/mcp_gateway/gateway_service.py +22 -19
  29. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/mcp_gateway/mcp_manager.py +15 -11
  30. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/mcp_gateway/session_manager.py +3 -3
  31. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/pom/pom.py +18 -11
  32. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/concierge.py +15 -6
  33. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/faq_bot.py +13 -7
  34. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/info_gatherer.py +28 -11
  35. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/receptionist.py +19 -9
  36. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/survey.py +15 -7
  37. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/call.py +50 -48
  38. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/client.py +17 -9
  39. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/message.py +2 -2
  40. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/phone_numbers.py +37 -23
  41. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/__init__.py +1 -1
  42. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/document_processor.py +16 -14
  43. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/index_builder.py +5 -5
  44. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/pgvector_backend.py +9 -9
  45. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/query_processor.py +8 -6
  46. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/search_engine.py +15 -14
  47. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/search_service.py +18 -13
  48. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +6 -3
  49. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/claude_skills/skill.py +11 -6
  50. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere/skill.py +3 -1
  51. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datetime/skill.py +6 -2
  52. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/google_maps/skill.py +24 -8
  53. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/info_gatherer/skill.py +7 -3
  54. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/math/skill.py +9 -5
  55. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/mcp_gateway/skill.py +3 -3
  56. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/native_vector_search/skill.py +11 -4
  57. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/play_background_file/skill.py +6 -3
  58. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/registry.py +1 -1
  59. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/spider/skill.py +5 -4
  60. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/weather_api/skill.py +6 -3
  61. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/web_search/skill.py +6 -4
  62. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/web_search/skill_improved.py +4 -2
  63. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/web_search/skill_original.py +4 -2
  64. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/wikipedia_search/skill.py +9 -4
  65. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/__init__.py +5 -1
  66. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/schema_utils.py +13 -5
  67. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/web/web_service.py +21 -14
  68. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  69. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/LICENSE +0 -0
  70. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/README.md +0 -0
  71. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/man/sw-agent-init.1 +0 -0
  72. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/man/sw-search.1 +0 -0
  73. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/man/swaig-test.1 +0 -0
  74. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/setup.cfg +0 -0
  75. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/setup.py +0 -0
  76. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/__init__.py +0 -0
  77. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/config.py +0 -0
  78. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/core/__init__.py +0 -0
  79. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  80. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  81. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  82. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/output/__init__.py +0 -0
  83. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  84. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  85. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  86. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  87. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/cli/types.py +0 -0
  88. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/__init__.py +0 -0
  89. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/_agent_host.py +0 -0
  90. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/__init__.py +0 -0
  91. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  92. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  93. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  94. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  95. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  96. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  97. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  98. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  99. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  100. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  101. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  102. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/auth_handler.py +0 -0
  103. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/config_loader.py +0 -0
  104. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/contexts.py +0 -0
  105. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/data_map.py +0 -0
  106. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/function_result.py +0 -0
  107. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/logging_config.py +0 -0
  108. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  109. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  110. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  111. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  112. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  113. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  114. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  115. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/pom_builder.py +0 -0
  116. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security/__init__.py +0 -0
  117. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security/security_utils.py +0 -0
  118. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security/session_manager.py +0 -0
  119. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  120. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  121. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/security_config.py +0 -0
  122. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/skill_manager.py +0 -0
  123. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/swaig_function.py +0 -0
  124. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/swml_builder.py +0 -0
  125. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/core/swml_handler.py +0 -0
  126. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  127. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/pom/__init__.py +0 -0
  128. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/pom/pom_tool.py +0 -0
  129. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/prefabs/__init__.py +0 -0
  130. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/__init__.py +0 -0
  131. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/constants.py +0 -0
  132. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/relay/event.py +0 -0
  133. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/__init__.py +0 -0
  134. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/_base.py +0 -0
  135. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/_pagination.py +0 -0
  136. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/call_handler.py +0 -0
  137. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/client.py +0 -0
  138. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  139. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  140. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  141. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  142. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
  143. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  144. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  145. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  146. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  147. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  148. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  149. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  150. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  151. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  152. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  153. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  154. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  155. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  156. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  157. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  158. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  159. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/schema.json +0 -0
  160. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/migration.py +0 -0
  161. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/search/models.py +0 -0
  162. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/README.md +0 -0
  163. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/__init__.py +0 -0
  164. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  165. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  166. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  167. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  168. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  169. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  170. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  171. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  172. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  173. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datetime/README.md +0 -0
  174. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  175. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  176. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  177. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  178. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/joke/README.md +0 -0
  179. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  180. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/joke/skill.py +0 -0
  181. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/math/README.md +0 -0
  182. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/math/__init__.py +0 -0
  183. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  184. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  185. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  186. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  187. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  188. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  189. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/spider/README.md +0 -0
  190. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  191. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  192. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  193. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  194. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  195. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  196. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/web_search/README.md +0 -0
  197. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  198. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  199. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  200. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/pom_utils.py +0 -0
  201. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/token_generators.py +0 -0
  202. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/url_validator.py +0 -0
  203. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/utils/validators.py +0 -0
  204. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire/web/__init__.py +0 -0
  205. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  206. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  207. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  208. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  209. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  210. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/tests/test_examples.py +0 -0
  211. {signalwire_sdk-3.0.2.dev69 → signalwire_sdk-3.0.2.dev71}/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.dev69
3
+ Version: 3.0.2.dev71
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.dev69"
7
+ version = "3.0.2.dev71"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -17,7 +17,7 @@ from .core.logging_config import configure_logging
17
17
 
18
18
  configure_logging()
19
19
 
20
- __version__ = "3.0.2.dev69"
20
+ __version__ = "3.0.2.dev71"
21
21
 
22
22
  # Import core classes for easier access.
23
23
  # These imports are intentionally placed after configure_logging() so the SDK's
@@ -67,7 +67,7 @@ class AgentServer:
67
67
  self.app = FastAPI(
68
68
  title="SignalWire AI Agents",
69
69
  description="Hosted SignalWire AI Agents",
70
- version="3.0.2.dev69",
70
+ version="3.0.2.dev71",
71
71
  redirect_slashes=False,
72
72
  docs_url=None,
73
73
  redoc_url=None,
@@ -46,8 +46,8 @@ class BedrockAgent(AgentBase):
46
46
  temperature: float = 0.7,
47
47
  top_p: float = 0.9,
48
48
  max_tokens: int = 1024,
49
- **kwargs,
50
- ):
49
+ **kwargs: Any,
50
+ ) -> None:
51
51
  """
52
52
  Initialize BedrockAgent
53
53
 
@@ -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 = None, modifications: dict | None = None
80
+ self, call_id: str | None = None, modifications: dict[str, Any] | None = None
81
81
  ) -> str:
82
82
  """
83
83
  Render SWML document with amazon_bedrock verb
@@ -264,7 +264,7 @@ class BedrockAgent(AgentBase):
264
264
  """
265
265
  self.set_inference_params(temperature=temperature)
266
266
 
267
- def set_post_prompt_llm_params(self, **params) -> None:
267
+ def set_post_prompt_llm_params(self, **params: Any) -> None:
268
268
  """
269
269
  Set post-prompt LLM parameters - not applicable for Bedrock
270
270
 
@@ -278,7 +278,7 @@ class BedrockAgent(AgentBase):
278
278
  "set_post_prompt_llm_params() called but Bedrock post-prompt uses OpenAI configured in C code"
279
279
  )
280
280
 
281
- def set_prompt_llm_params(self, **params) -> None:
281
+ def set_prompt_llm_params(self, **params: Any) -> None:
282
282
  """
283
283
  Set prompt LLM parameters - use set_inference_params instead
284
284
 
@@ -17,7 +17,7 @@ from urllib.parse import urlparse, urlunparse
17
17
  from signalwire.search.models import MODEL_ALIASES, DEFAULT_MODEL, resolve_model_alias
18
18
 
19
19
 
20
- def _mask_connection_string(conn_str):
20
+ def _mask_connection_string(conn_str: str) -> str:
21
21
  """Mask password in connection string for safe logging."""
22
22
  try:
23
23
  parsed = urlparse(conn_str)
@@ -32,7 +32,7 @@ def _mask_connection_string(conn_str):
32
32
  return "****"
33
33
 
34
34
 
35
- def main():
35
+ def main() -> None:
36
36
  """Main entry point for the build-search command"""
37
37
  parser = argparse.ArgumentParser(
38
38
  description="Build local search index from documents",
@@ -659,7 +659,7 @@ Examples:
659
659
  sys.exit(1)
660
660
 
661
661
 
662
- def validate_command():
662
+ def validate_command() -> None:
663
663
  """Validate an existing search index"""
664
664
  parser = argparse.ArgumentParser(description="Validate a search index file")
665
665
  parser.add_argument("index_file", help="Path to .swsearch file to validate")
@@ -702,7 +702,7 @@ def validate_command():
702
702
  sys.exit(1)
703
703
 
704
704
 
705
- def search_command():
705
+ def search_command() -> None:
706
706
  """Search within an existing search index"""
707
707
  parser = argparse.ArgumentParser(
708
708
  description="Search within a .swsearch index file or pgvector collection"
@@ -1091,7 +1091,7 @@ def search_command():
1091
1091
  sys.exit(1)
1092
1092
 
1093
1093
 
1094
- def migrate_command():
1094
+ def migrate_command() -> None:
1095
1095
  """Migrate search indexes between backends"""
1096
1096
  parser = argparse.ArgumentParser(
1097
1097
  description="Migrate search indexes between SQLite and pgvector backends",
@@ -1242,7 +1242,7 @@ Examples:
1242
1242
  sys.exit(1)
1243
1243
 
1244
1244
 
1245
- def remote_command():
1245
+ def remote_command() -> None:
1246
1246
  """Search via remote API endpoint"""
1247
1247
  parser = argparse.ArgumentParser(description="Search via remote API endpoint")
1248
1248
  parser.add_argument(
@@ -1413,7 +1413,7 @@ def remote_command():
1413
1413
  sys.exit(1)
1414
1414
 
1415
1415
 
1416
- def console_entry_point():
1416
+ def console_entry_point() -> None:
1417
1417
  """Console script entry point for pip installation"""
1418
1418
  import sys
1419
1419
 
@@ -511,12 +511,12 @@ def _load_service_impl(
511
511
  captured_services = []
512
512
  patches_applied = []
513
513
 
514
- def mock_serve(self, *args, **kwargs):
514
+ def mock_serve(self: Any, *args: Any, **kwargs: Any) -> Any:
515
515
  captured_services.append(self)
516
516
  print(" (Intercepted serve() call, service captured for testing)")
517
517
  return self
518
518
 
519
- def mock_run(self, *args, **kwargs):
519
+ def mock_run(self: Any, *args: Any, **kwargs: Any) -> Any:
520
520
  captured_services.append(self)
521
521
  print(" (Intercepted run() call, service captured for testing)")
522
522
  return self
@@ -12,23 +12,23 @@ Custom argument parsing and function argument parsing
12
12
 
13
13
  import sys
14
14
  import argparse
15
- from typing import Any
15
+ from typing import Any, NoReturn
16
16
 
17
17
 
18
18
  class CustomArgumentParser(argparse.ArgumentParser):
19
19
  """Custom ArgumentParser with better error handling"""
20
20
 
21
- def __init__(self, *args, **kwargs):
21
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
22
22
  super().__init__(*args, **kwargs)
23
23
  self._suppress_usage = False
24
24
 
25
- def _print_message(self, message, file=None):
25
+ def _print_message(self, message: str, file: Any = None) -> None:
26
26
  """Override to suppress usage output for specific errors"""
27
27
  if self._suppress_usage:
28
28
  return
29
29
  super()._print_message(message, file)
30
30
 
31
- def error(self, message):
31
+ def error(self, message: str) -> NoReturn:
32
32
  """Override error method to provide user-friendly error messages"""
33
33
  if "required" in message.lower() and "agent_path" in message:
34
34
  self._suppress_usage = True
@@ -49,13 +49,13 @@ class CustomArgumentParser(argparse.ArgumentParser):
49
49
  # For other errors, use the default behavior
50
50
  super().error(message)
51
51
 
52
- def print_usage(self, file=None):
52
+ def print_usage(self, file: Any = None) -> None:
53
53
  """Override print_usage to suppress output when we want custom error handling"""
54
54
  if self._suppress_usage:
55
55
  return
56
56
  super().print_usage(file)
57
57
 
58
- def parse_args(self, args=None, namespace=None):
58
+ def parse_args(self, args: Any = None, namespace: Any = None) -> Any:
59
59
  """Override parse_args to provide custom error handling for missing arguments"""
60
60
  # Check if no arguments provided (just the program name)
61
61
  if args is None:
@@ -44,9 +44,9 @@ else:
44
44
  class ServiceCapture:
45
45
  """Captures SWMLService instances when they try to run/serve"""
46
46
 
47
- def __init__(self):
47
+ def __init__(self) -> None:
48
48
  self.captured_services: list[SWMLService] = []
49
- self.original_methods = {}
49
+ self.original_methods: dict[Any, Any] = {}
50
50
 
51
51
  def capture(
52
52
  self, service_path: str, suppress_output: bool = False
@@ -115,20 +115,20 @@ class ServiceCapture:
115
115
 
116
116
  return self.captured_services
117
117
 
118
- def _apply_patches(self):
118
+ def _apply_patches(self) -> None:
119
119
  """Apply patches to capture services"""
120
120
 
121
121
  # Store reference to self for use in closures
122
122
  capture_self = self
123
123
 
124
- def mock_run(service_instance, *args, **kwargs):
124
+ def mock_run(service_instance: Any, *args: Any, **kwargs: Any) -> Any:
125
125
  """Capture service when run() is called"""
126
126
  capture_self.captured_services.append(service_instance)
127
127
  # Don't print during stdout suppression
128
128
  # Don't actually run - we're just capturing
129
129
  return service_instance
130
130
 
131
- def mock_serve(service_instance, *args, **kwargs):
131
+ def mock_serve(service_instance: Any, *args: Any, **kwargs: Any) -> Any:
132
132
  """Capture service when serve() is called"""
133
133
  capture_self.captured_services.append(service_instance)
134
134
  # Don't print during stdout suppression
@@ -146,7 +146,7 @@ class ServiceCapture:
146
146
  self.original_methods[(base_class, "serve")] = base_class.serve
147
147
  base_class.serve = mock_serve
148
148
 
149
- def _restore_patches(self):
149
+ def _restore_patches(self) -> None:
150
150
  """Restore original methods"""
151
151
  for (base_class, method_name), original_method in self.original_methods.items():
152
152
  setattr(base_class, method_name, original_method)
@@ -156,10 +156,10 @@ class ServiceCapture:
156
156
  async def simulate_request_to_service(
157
157
  service: SWMLService,
158
158
  method: str = "POST",
159
- body: dict | None = None,
160
- query_params: dict | None = None,
161
- headers: dict | None = None,
162
- ) -> dict:
159
+ body: dict[str, Any] | None = None,
160
+ query_params: dict[str, str] | None = None,
161
+ headers: dict[str, str] | None = None,
162
+ ) -> dict[str, Any]:
163
163
  """
164
164
  Simulate a request to a SWMLService instance
165
165
 
@@ -195,7 +195,9 @@ async def simulate_request_to_service(
195
195
  # FastAPI Response
196
196
  import json
197
197
 
198
- return json.loads(result.body.decode())
198
+ # json.loads() is typed -> Any; a FastAPI Response body is the rendered
199
+ # SWML JSON object, matching the declared dict return.
200
+ return cast(dict[str, Any], json.loads(result.body.decode()))
199
201
  if isinstance(result, dict):
200
202
  return result
201
203
  # Try to get content from response
@@ -206,11 +208,11 @@ def load_and_simulate_service(
206
208
  service_path: str,
207
209
  route: str | None = None,
208
210
  method: str = "POST",
209
- body: dict | None = None,
210
- query_params: dict | None = None,
211
- headers: dict | None = None,
211
+ body: dict[str, Any] | None = None,
212
+ query_params: dict[str, str] | None = None,
213
+ headers: dict[str, str] | None = None,
212
214
  suppress_output: bool = False,
213
- ) -> dict:
215
+ ) -> dict[str, Any]:
214
216
  """
215
217
  Load a service file and simulate a request to it
216
218
 
@@ -43,23 +43,23 @@ class Colors:
43
43
  NC = "\033[0m"
44
44
 
45
45
 
46
- def print_step(msg: str):
46
+ def print_step(msg: str) -> None:
47
47
  print(f"{Colors.BLUE}==>{Colors.NC} {msg}")
48
48
 
49
49
 
50
- def print_success(msg: str):
50
+ def print_success(msg: str) -> None:
51
51
  print(f"{Colors.GREEN}✓{Colors.NC} {msg}")
52
52
 
53
53
 
54
- def print_warning(msg: str):
54
+ def print_warning(msg: str) -> None:
55
55
  print(f"{Colors.YELLOW}!{Colors.NC} {msg}")
56
56
 
57
57
 
58
- def print_error(msg: str):
58
+ def print_error(msg: str) -> None:
59
59
  print(f"{Colors.RED}✗{Colors.NC} {msg}")
60
60
 
61
61
 
62
- def print_header(msg: str):
62
+ def print_header(msg: str) -> None:
63
63
  print(f"\n{Colors.BOLD}{Colors.CYAN}{msg}{Colors.NC}")
64
64
 
65
65
 
@@ -1849,7 +1849,7 @@ class DokkuProjectGenerator:
1849
1849
  print_error(f"Failed to generate project: {e}")
1850
1850
  return False
1851
1851
 
1852
- def _write_core_files(self):
1852
+ def _write_core_files(self) -> None:
1853
1853
  """Write files common to both modes."""
1854
1854
  # Procfile
1855
1855
  self._write_file("Procfile", PROCFILE_TEMPLATE)
@@ -1895,7 +1895,7 @@ class DokkuProjectGenerator:
1895
1895
  ),
1896
1896
  )
1897
1897
 
1898
- def _write_web_files(self):
1898
+ def _write_web_files(self) -> None:
1899
1899
  """Write web interface files."""
1900
1900
  # Create web directory
1901
1901
  web_dir = self.project_dir / "web"
@@ -1909,7 +1909,7 @@ class DokkuProjectGenerator:
1909
1909
  WEB_INDEX_TEMPLATE.format(agent_name=self.app_name, route=route),
1910
1910
  )
1911
1911
 
1912
- def _write_simple_files(self):
1912
+ def _write_simple_files(self) -> None:
1913
1913
  """Write files for simple deployment mode."""
1914
1914
  dokku_host = self.options.get("dokku_host", "dokku.yourdomain.com")
1915
1915
  route = self.options.get("route", "swaig")
@@ -1929,7 +1929,7 @@ class DokkuProjectGenerator:
1929
1929
  )
1930
1930
  self._write_file("README.md", readme)
1931
1931
 
1932
- def _write_cicd_files(self):
1932
+ def _write_cicd_files(self) -> None:
1933
1933
  """Write files for CI/CD deployment mode."""
1934
1934
  # Create .github/workflows directory
1935
1935
  workflows_dir = self.project_dir / ".github" / "workflows"
@@ -1957,7 +1957,7 @@ class DokkuProjectGenerator:
1957
1957
  readme = README_CICD_TEMPLATE.format(app_name=self.app_name)
1958
1958
  self._write_file("README.md", readme)
1959
1959
 
1960
- def _write_file(self, path: str, content: str, executable: bool = False):
1960
+ def _write_file(self, path: str, content: str, executable: bool = False) -> None:
1961
1961
  """Write a file to the project directory."""
1962
1962
  file_path = self.project_dir / path
1963
1963
  file_path.parent.mkdir(parents=True, exist_ok=True)
@@ -1974,7 +1974,7 @@ class DokkuProjectGenerator:
1974
1974
  # =============================================================================
1975
1975
 
1976
1976
 
1977
- def cmd_init(args):
1977
+ def cmd_init(args: argparse.Namespace) -> int:
1978
1978
  """Initialize a new Dokku project."""
1979
1979
  app_name = args.name
1980
1980
 
@@ -2031,7 +2031,9 @@ def cmd_init(args):
2031
2031
  return 1
2032
2032
 
2033
2033
 
2034
- def _print_simple_instructions(app_name: str, dokku_host: str, project_dir: Path):
2034
+ def _print_simple_instructions(
2035
+ app_name: str, dokku_host: str, project_dir: Path
2036
+ ) -> None:
2035
2037
  """Print instructions for simple mode."""
2036
2038
  print(f"""To deploy your agent:
2037
2039
 
@@ -2046,7 +2048,7 @@ Or manually:
2046
2048
  """)
2047
2049
 
2048
2050
 
2049
- def _print_cicd_instructions(app_name: str):
2051
+ def _print_cicd_instructions(app_name: str) -> None:
2050
2052
  """Print instructions for CI/CD mode."""
2051
2053
  print(f"""
2052
2054
  {Colors.BOLD}═══════════════════════════════════════════════════════════{Colors.NC}
@@ -2082,7 +2084,7 @@ def _print_cicd_instructions(app_name: str):
2082
2084
  """)
2083
2085
 
2084
2086
 
2085
- def cmd_deploy(args):
2087
+ def cmd_deploy(args: argparse.Namespace) -> int:
2086
2088
  """Deploy to Dokku."""
2087
2089
  # Check if we're in a Dokku project
2088
2090
  if not Path("Procfile").exists():
@@ -2150,7 +2152,7 @@ def cmd_deploy(args):
2150
2152
  return 0
2151
2153
 
2152
2154
 
2153
- def cmd_logs(args):
2155
+ def cmd_logs(args: argparse.Namespace) -> int:
2154
2156
  """Tail Dokku logs."""
2155
2157
  app_name = args.app
2156
2158
  dokku_host = args.host
@@ -2172,7 +2174,7 @@ def cmd_logs(args):
2172
2174
  return 0
2173
2175
 
2174
2176
 
2175
- def cmd_config(args):
2177
+ def cmd_config(args: argparse.Namespace) -> int:
2176
2178
  """Manage Dokku config."""
2177
2179
  app_name = args.app
2178
2180
  dokku_host = args.host
@@ -2202,7 +2204,7 @@ def cmd_config(args):
2202
2204
  return 0
2203
2205
 
2204
2206
 
2205
- def cmd_scale(args):
2207
+ def cmd_scale(args: argparse.Namespace) -> int:
2206
2208
  """Scale Dokku processes."""
2207
2209
  app_name = args.app
2208
2210
  dokku_host = args.host
@@ -2232,7 +2234,9 @@ def _get_app_name() -> str:
2232
2234
  with open( # noqa: PTH123 # tests patch builtins.open while mocking Path; Path.open() would bypass the mock seam
2233
2235
  "app.json"
2234
2236
  ) as f:
2235
- return json.load(f).get("name", "")
2237
+ # json.load() is typed -> Any; the "name" field is a string
2238
+ # (default "" when absent). Coerce to satisfy the str return.
2239
+ return str(json.load(f).get("name", ""))
2236
2240
  except Exception: # noqa: S110 # best-effort read of optional app.json; falls through to interactive prompt on failure
2237
2241
  pass
2238
2242
  return prompt("App name", Path.cwd().name)
@@ -2243,7 +2247,7 @@ def _get_app_name() -> str:
2243
2247
  # =============================================================================
2244
2248
 
2245
2249
 
2246
- def main():
2250
+ def main() -> int:
2247
2251
  parser = argparse.ArgumentParser(
2248
2252
  description="SignalWire Agent Dokku Deployment Tool",
2249
2253
  formatter_class=argparse.RawDescriptionHelpFormatter,
@@ -12,7 +12,7 @@ Webhook function execution (including external)
12
12
 
13
13
  import json
14
14
  import requests
15
- from typing import Any, TYPE_CHECKING
15
+ from typing import Any, TYPE_CHECKING, cast
16
16
  from ..config import HTTP_REQUEST_TIMEOUT
17
17
 
18
18
  if TYPE_CHECKING:
@@ -92,7 +92,9 @@ def execute_external_webhook_function(
92
92
 
93
93
  if response.status_code == 200:
94
94
  try:
95
- result = response.json()
95
+ # requests' .json() is typed -> Any; a successful webhook returns
96
+ # a JSON object, matching the declared dict return.
97
+ result = cast(dict[str, Any], response.json())
96
98
  if verbose:
97
99
  print("✓ External webhook succeeded")
98
100
  print(f"Response: {json.dumps(result, indent=2)}")
@@ -46,19 +46,19 @@ class Colors:
46
46
  NC = "\033[0m" # No Color
47
47
 
48
48
 
49
- def print_step(msg: str):
49
+ def print_step(msg: str) -> None:
50
50
  print(f"{Colors.BLUE}==>{Colors.NC} {msg}")
51
51
 
52
52
 
53
- def print_success(msg: str):
53
+ def print_success(msg: str) -> None:
54
54
  print(f"{Colors.GREEN}✓{Colors.NC} {msg}")
55
55
 
56
56
 
57
- def print_warning(msg: str):
57
+ def print_warning(msg: str) -> None:
58
58
  print(f"{Colors.YELLOW}!{Colors.NC} {msg}")
59
59
 
60
60
 
61
- def print_error(msg: str):
61
+ def print_error(msg: str) -> None:
62
62
  print(f"{Colors.RED}✗{Colors.NC} {msg}")
63
63
 
64
64
 
@@ -2066,7 +2066,7 @@ class ProjectGenerator:
2066
2066
  "auth_password": auth_password,
2067
2067
  }
2068
2068
 
2069
- def _create_cloud_env_example(self, platform: str):
2069
+ def _create_cloud_env_example(self, platform: str) -> None:
2070
2070
  """Create .env.example for cloud platforms."""
2071
2071
  env_content = """# Optional: Basic authentication credentials
2072
2072
  # If not set, the SDK will auto-generate secure credentials
@@ -2076,7 +2076,7 @@ SWML_BASIC_AUTH_PASSWORD=your-secure-password
2076
2076
  (self.project_dir / ".env.example").write_text(env_content)
2077
2077
  print_success("Created .env.example")
2078
2078
 
2079
- def _create_cloud_readme(self, platform: str):
2079
+ def _create_cloud_readme(self, platform: str) -> None:
2080
2080
  """Create README.md for cloud platforms."""
2081
2081
  platform_names = {
2082
2082
  "aws": "AWS Lambda",
@@ -2272,7 +2272,7 @@ Set your phone number's SWML URL to the endpoint URL shown after deployment.
2272
2272
  (self.project_dir / "README.md").write_text(readme)
2273
2273
  print_success("Created README.md")
2274
2274
 
2275
- def _create_directories(self):
2275
+ def _create_directories(self) -> None:
2276
2276
  """Create project directory structure."""
2277
2277
  dirs = ["agents", "skills"]
2278
2278
  if self.features.get("tests"):
@@ -2286,7 +2286,7 @@ Set your phone number's SWML URL to the endpoint URL shown after deployment.
2286
2286
  for d in dirs:
2287
2287
  (self.project_dir / d).mkdir(exist_ok=True)
2288
2288
 
2289
- def _create_agent_files(self):
2289
+ def _create_agent_files(self) -> None:
2290
2290
  """Create agent module files."""
2291
2291
  agents_dir = self.project_dir / "agents"
2292
2292
 
@@ -2305,13 +2305,13 @@ Set your phone number's SWML URL to the endpoint URL shown after deployment.
2305
2305
  (self.project_dir / "skills" / "__init__.py").write_text(TEMPLATE_SKILLS_INIT)
2306
2306
  print_success("Created skills/__init__.py")
2307
2307
 
2308
- def _create_app_file(self):
2308
+ def _create_app_file(self) -> None:
2309
2309
  """Create main app.py entry point."""
2310
2310
  app_code = get_app_template(self.features)
2311
2311
  (self.project_dir / "app.py").write_text(app_code)
2312
2312
  print_success("Created app.py")
2313
2313
 
2314
- def _create_config_files(self):
2314
+ def _create_config_files(self) -> None:
2315
2315
  """Create configuration files."""
2316
2316
  # .env
2317
2317
  env_content = f"""# SignalWire Credentials
@@ -2357,7 +2357,7 @@ DEBUG_WEBHOOK_LEVEL=1
2357
2357
  (self.project_dir / "requirements.txt").write_text(TEMPLATE_REQUIREMENTS)
2358
2358
  print_success("Created requirements.txt")
2359
2359
 
2360
- def _create_test_files(self):
2360
+ def _create_test_files(self) -> None:
2361
2361
  """Create test files."""
2362
2362
  tests_dir = self.project_dir / "tests"
2363
2363
 
@@ -2368,20 +2368,20 @@ DEBUG_WEBHOOK_LEVEL=1
2368
2368
  (tests_dir / "test_agent.py").write_text(test_code)
2369
2369
  print_success("Created tests/test_agent.py")
2370
2370
 
2371
- def _create_web_files(self):
2371
+ def _create_web_files(self) -> None:
2372
2372
  """Create web UI files."""
2373
2373
  web_dir = self.project_dir / "web"
2374
2374
 
2375
2375
  (web_dir / "index.html").write_text(get_web_index_template())
2376
2376
  print_success("Created web/index.html")
2377
2377
 
2378
- def _create_readme(self):
2378
+ def _create_readme(self) -> None:
2379
2379
  """Create README.md."""
2380
2380
  readme = get_readme_template(self.project_name, self.features)
2381
2381
  (self.project_dir / "README.md").write_text(readme)
2382
2382
  print_success("Created README.md")
2383
2383
 
2384
- def _create_virtualenv(self):
2384
+ def _create_virtualenv(self) -> None:
2385
2385
  """Create and set up virtual environment."""
2386
2386
  venv_dir = self.project_dir / ".venv"
2387
2387
 
@@ -2627,7 +2627,7 @@ def run_quick(project_name: str, args: Any) -> dict[str, Any]:
2627
2627
  }
2628
2628
 
2629
2629
 
2630
- def main():
2630
+ def main() -> None:
2631
2631
  """Main entry point."""
2632
2632
  import argparse
2633
2633
 
@@ -28,14 +28,14 @@ if TYPE_CHECKING:
28
28
  original_print = print
29
29
 
30
30
 
31
- def setup_output_suppression():
31
+ def setup_output_suppression() -> None:
32
32
  """Set up output suppression for SWML dumping"""
33
33
  # The central logging system is already configured via environment variable
34
34
  # Just suppress any remaining warnings
35
35
  warnings.filterwarnings("ignore")
36
36
 
37
37
  # Capture and suppress print statements
38
- def suppressed_print(*args, **kwargs):
38
+ def suppressed_print(*args: Any, **kwargs: Any) -> None:
39
39
  # If file is specified (like stderr), allow it
40
40
  if "file" in kwargs and kwargs["file"] is not sys.stdout:
41
41
  original_print(*args, **kwargs)