signalwire-sdk 3.4.1.dev112__tar.gz → 3.4.1.dev113__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 (255) hide show
  1. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/pyproject.toml +1 -1
  3. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agent_server.py +1 -1
  5. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/__init__.py +4 -0
  6. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_middleware.py +25 -4
  7. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_validator.py +60 -1
  8. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  9. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/LICENSE +0 -0
  10. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/README.md +0 -0
  11. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/sw-agent-init.1 +0 -0
  12. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/sw-search.1 +0 -0
  13. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/swaig-test.1 +0 -0
  14. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/setup.cfg +0 -0
  15. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/setup.py +0 -0
  16. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py +0 -0
  17. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py +0 -0
  18. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/__init__.py +0 -0
  19. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py +0 -0
  20. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py +0 -0
  21. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py +0 -0
  22. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py +0 -0
  23. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/build_search.py +0 -0
  24. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py +0 -0
  25. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/__init__.py +0 -0
  26. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  27. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  28. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  29. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  30. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py +0 -0
  31. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  32. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  33. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  34. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/init_project.py +0 -0
  35. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/__init__.py +0 -0
  36. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  37. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  38. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  39. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  40. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  41. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  42. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  43. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py +0 -0
  44. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py +0 -0
  45. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py +0 -0
  46. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/_agent_host.py +0 -0
  47. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/__init__.py +0 -0
  48. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  49. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  50. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  51. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  52. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  53. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  54. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  55. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  56. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  57. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  58. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  59. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  60. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py +0 -0
  61. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/auth_handler.py +0 -0
  62. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/capabilities.py +0 -0
  63. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/config_loader.py +0 -0
  64. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py +0 -0
  65. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py +0 -0
  66. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/function_result.py +0 -0
  67. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/logging_config.py +0 -0
  68. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  69. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  70. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  71. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  72. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  73. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  74. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  75. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  76. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  77. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  78. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  79. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/pom_builder.py +0 -0
  80. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt.py +0 -0
  81. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  82. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/security_utils.py +0 -0
  83. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/session_manager.py +0 -0
  84. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security_config.py +0 -0
  85. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py +0 -0
  86. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_manager.py +0 -0
  87. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  88. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_function.py +0 -0
  89. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  90. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_builder.py +0 -0
  91. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_handler.py +0 -0
  92. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_renderer.py +0 -0
  93. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_service.py +0 -0
  94. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  95. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py +0 -0
  96. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/__init__.py +0 -0
  97. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/plugins.py +0 -0
  98. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  99. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  100. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  101. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  102. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py +0 -0
  103. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py +0 -0
  104. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py +0 -0
  105. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/__init__.py +0 -0
  106. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/concierge.py +0 -0
  107. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  108. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  109. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  110. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py +0 -0
  111. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/py.typed +0 -0
  112. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py +0 -0
  113. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py +0 -0
  114. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py +0 -0
  115. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py +0 -0
  116. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py +0 -0
  117. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py +0 -0
  118. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  119. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py +0 -0
  120. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py +0 -0
  121. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_pagination.py +0 -0
  122. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_request_options.py +0 -0
  123. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/call_handler.py +0 -0
  124. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py +0 -0
  125. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  126. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  127. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  128. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  129. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  130. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  131. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  132. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  133. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  134. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  135. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  136. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  137. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  138. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  139. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  140. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  141. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  142. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  143. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  144. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  145. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  146. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  147. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  148. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  149. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  150. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  151. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  152. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  153. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  154. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  155. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  156. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  157. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  158. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  159. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  160. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  161. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  162. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  163. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  164. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  165. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  166. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  167. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  168. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  169. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  170. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  171. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  172. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  173. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  174. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  175. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  176. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/schema.json +0 -0
  177. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/__init__.py +0 -0
  178. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/document_processor.py +0 -0
  179. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/index_builder.py +0 -0
  180. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/migration.py +0 -0
  181. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/models.py +0 -0
  182. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  183. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/query_processor.py +0 -0
  184. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_engine.py +0 -0
  185. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_service.py +0 -0
  186. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/README.md +0 -0
  187. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/__init__.py +0 -0
  188. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  189. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  190. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  191. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  192. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  193. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  194. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  195. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  196. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  197. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  198. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  199. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  200. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/README.md +0 -0
  201. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  202. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  203. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  204. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  205. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  206. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  207. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  208. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/README.md +0 -0
  209. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  210. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/skill.py +0 -0
  211. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/README.md +0 -0
  212. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/__init__.py +0 -0
  213. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/skill.py +0 -0
  214. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  215. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  216. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  217. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  218. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  219. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  220. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  221. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  222. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  223. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/registry.py +0 -0
  224. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/README.md +0 -0
  225. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  226. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/skill.py +0 -0
  227. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  228. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  229. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  230. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  231. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  232. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  233. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/README.md +0 -0
  234. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  235. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  236. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  237. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  238. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  239. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  240. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  241. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/__init__.py +0 -0
  242. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/pom_utils.py +0 -0
  243. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/schema_utils.py +0 -0
  244. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/token_generators.py +0 -0
  245. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/url_validator.py +0 -0
  246. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/validators.py +0 -0
  247. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/__init__.py +0 -0
  248. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/web_service.py +0 -0
  249. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  250. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  251. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  252. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  253. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  254. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/tests/test_examples.py +0 -0
  255. {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/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.4.1.dev112
3
+ Version: 3.4.1.dev113
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.4.1.dev112"
7
+ version = "3.4.1.dev113"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -52,7 +52,7 @@ if TYPE_CHECKING:
52
52
  from signalwire.utils.schema_utils import SchemaValidationError
53
53
  from signalwire.web import WebService
54
54
 
55
- __version__ = "3.4.1.dev112"
55
+ __version__ = "3.4.1.dev113"
56
56
 
57
57
  # §6.2-python (owner decision: NO packaging split — one package, all deps required;
58
58
  # IMPORT-TIME behavior only): the agent/web symbols are lazy-imported via module
@@ -68,7 +68,7 @@ class AgentServer:
68
68
  self.app = FastAPI(
69
69
  title="SignalWire AI Agents",
70
70
  description="Hosted SignalWire AI Agents",
71
- version="3.4.1.dev112",
71
+ version="3.4.1.dev113",
72
72
  redirect_slashes=False,
73
73
  docs_url=None,
74
74
  redoc_url=None,
@@ -10,9 +10,11 @@ See LICENSE file in the project root for full license information.
10
10
  from signalwire.core.security.webhook_validator import (
11
11
  validate_request,
12
12
  validate_webhook_signature,
13
+ validate_webhook_signature_sha256,
13
14
  )
14
15
  from signalwire.core.security.webhook_middleware import (
15
16
  SIGNALWIRE_SIGNATURE_HEADER,
17
+ SIGNALWIRE_SHA256_SIGNATURE_HEADER,
16
18
  TWILIO_COMPAT_SIGNATURE_HEADER,
17
19
  make_webhook_validation_dependency,
18
20
  )
@@ -25,6 +27,7 @@ from signalwire.core.security.security_utils import (
25
27
 
26
28
  __all__ = [
27
29
  "SENSITIVE_HEADERS",
30
+ "SIGNALWIRE_SHA256_SIGNATURE_HEADER",
28
31
  "SIGNALWIRE_SIGNATURE_HEADER",
29
32
  "TWILIO_COMPAT_SIGNATURE_HEADER",
30
33
  "filter_sensitive_headers",
@@ -33,4 +36,5 @@ __all__ = [
33
36
  "redact_url",
34
37
  "validate_request",
35
38
  "validate_webhook_signature",
39
+ "validate_webhook_signature_sha256",
36
40
  ]
@@ -44,10 +44,14 @@ from collections.abc import Awaitable, Callable, Mapping
44
44
 
45
45
  from fastapi import HTTPException, Request, Response, status
46
46
 
47
- from signalwire.core.security.webhook_validator import validate_webhook_signature
47
+ from signalwire.core.security.webhook_validator import (
48
+ validate_webhook_signature,
49
+ validate_webhook_signature_sha256,
50
+ )
48
51
 
49
52
 
50
53
  SIGNALWIRE_SIGNATURE_HEADER = "x-signalwire-signature"
54
+ SIGNALWIRE_SHA256_SIGNATURE_HEADER = "x-signalwire-sha256-signature"
51
55
  TWILIO_COMPAT_SIGNATURE_HEADER = "x-twilio-signature"
52
56
 
53
57
 
@@ -69,8 +73,9 @@ def validate(
69
73
  wrapper (:func:`make_webhook_validation_dependency` here) is the only idiom
70
74
  on top of it.
71
75
 
72
- The ``headers`` map is consulted for the signature header
73
- (``X-SignalWire-Signature`` or the ``X-Twilio-Signature`` alias); ``method``
76
+ The ``headers`` map is consulted for the signature header: the stronger
77
+ ``X-SignalWire-Sha256-Signature`` is preferred when present, falling back to
78
+ ``X-SignalWire-Signature`` (or the ``X-Twilio-Signature`` alias); ``method``
74
79
  is accepted to keep a stable signature but is not part of the HMAC. Returns
75
80
  ``(403, {}, "")`` on any failure (missing/bad
76
81
  signature, non-UTF-8 body, validator error) — no body detail, to avoid
@@ -92,6 +97,20 @@ def validate(
92
97
  if not signing_key:
93
98
  raise ValueError("signing_key is required")
94
99
 
100
+ # Prefer the stronger SHA-256 signature when the platform sends it
101
+ # (X-SignalWire-Sha256-Signature): same Scheme A message, SHA-256 hash. Fall
102
+ # back to the SHA-1 header below so deployments on older platform builds --
103
+ # and the cXML/form Scheme B path -- keep validating.
104
+ sha256_signature = headers.get(SIGNALWIRE_SHA256_SIGNATURE_HEADER)
105
+ if sha256_signature:
106
+ try:
107
+ if validate_webhook_signature_sha256(
108
+ signing_key, sha256_signature, url, body
109
+ ):
110
+ return None
111
+ except (TypeError, ValueError):
112
+ pass # fall back to the SHA-1 header path below
113
+
95
114
  signature = headers.get(SIGNALWIRE_SIGNATURE_HEADER)
96
115
  if signature is None:
97
116
  signature = headers.get(TWILIO_COMPAT_SIGNATURE_HEADER)
@@ -146,7 +165,8 @@ def make_webhook_validation_dependency(
146
165
 
147
166
  1. Reads ``await request.body()`` and stashes the bytes on
148
167
  ``request.state.raw_body``.
149
- 2. Pulls the ``X-SignalWire-Signature`` header (or the Twilio alias).
168
+ 2. Pulls the signature header (``X-SignalWire-Sha256-Signature`` preferred,
169
+ then ``X-SignalWire-Signature`` or the Twilio alias).
150
170
  3. Reconstructs the public URL (proxy headers / env / fallback).
151
171
  4. Calls :func:`validate_webhook_signature`.
152
172
  5. On invalid signature: raises ``HTTPException(403)`` to short-circuit
@@ -205,6 +225,7 @@ def make_webhook_validation_dependency(
205
225
 
206
226
 
207
227
  __all__ = [
228
+ "SIGNALWIRE_SHA256_SIGNATURE_HEADER",
208
229
  "SIGNALWIRE_SIGNATURE_HEADER",
209
230
  "TWILIO_COMPAT_SIGNATURE_HEADER",
210
231
  "make_webhook_validation_dependency",
@@ -4,14 +4,18 @@ Webhook signature validation for SignalWire-signed HTTP requests.
4
4
  Copyright (c) 2025 SignalWire. Licensed under the MIT License.
5
5
  See LICENSE file in the project root for full license information.
6
6
 
7
- Implements both SignalWire webhook signature schemes:
7
+ Implements the SignalWire webhook signature schemes:
8
8
 
9
9
  - Scheme A (RELAY/SWML/JSON): hex(HMAC-SHA1(key, url + raw_body))
10
+ - Scheme A / SHA-256: hex(HMAC-SHA256(key, url + raw_body)) -- the platform also
11
+ sends this as the ``X-SignalWire-Sha256-Signature`` header. Identical message
12
+ construction to Scheme A with a stronger hash; prefer it when present.
10
13
  - Scheme B (Compat/cXML form): base64(HMAC-SHA1(key, url + sortedFormParams))
11
14
  with optional bodySHA256 query-param fallback for JSON-on-compat-surface.
12
15
 
13
16
  Public API:
14
17
  validate_webhook_signature(signing_key, signature, url, raw_body) -> bool
18
+ validate_webhook_signature_sha256(signing_key, signature, url, raw_body) -> bool
15
19
  validate_request(signing_key, signature, url, params_or_raw_body) -> bool
16
20
 
17
21
  All comparisons use ``hmac.compare_digest`` (constant-time) so the secret
@@ -42,6 +46,15 @@ def _hex_hmac_sha1(key: str, message: str) -> str:
42
46
  ).hexdigest()
43
47
 
44
48
 
49
+ def _hex_hmac_sha256(key: str, message: str) -> str:
50
+ """Scheme-A/SHA-256 digest: lowercase hex of HMAC-SHA256."""
51
+ return hmac.new(
52
+ key.encode("utf-8"),
53
+ message.encode("utf-8"),
54
+ hashlib.sha256,
55
+ ).hexdigest()
56
+
57
+
45
58
  def _b64_hmac_sha1(key: str, message: str) -> str:
46
59
  """Scheme-B digest: standard base64 of HMAC-SHA1."""
47
60
  return base64.b64encode(
@@ -266,6 +279,51 @@ def validate_webhook_signature(
266
279
  return False
267
280
 
268
281
 
282
+ def validate_webhook_signature_sha256(
283
+ signing_key: str,
284
+ signature: str,
285
+ url: str,
286
+ raw_body: str,
287
+ ) -> bool:
288
+ """Validate the SHA-256 webhook signature (Scheme A with a stronger hash).
289
+
290
+ SignalWire sends ``X-SignalWire-Sha256-Signature`` alongside the SHA-1
291
+ ``X-SignalWire-Signature`` on signed webhooks. Its construction is the same
292
+ Scheme A message with SHA-256::
293
+
294
+ hex(HMAC-SHA256(signing_key, url + raw_body))
295
+
296
+ Only Scheme A (RELAY/SWML/JSON) is defined for this header; the legacy
297
+ cXML/form Scheme B stays on SHA-1 -- see :func:`validate_webhook_signature`.
298
+
299
+ Args:
300
+ signing_key: Customer's Signing Key. ``None`` / empty raises
301
+ ``ValueError`` (a programming error, not a validation failure).
302
+ signature: The ``X-SignalWire-Sha256-Signature`` header value (64-char
303
+ lowercase hex). Missing / empty returns False without raising.
304
+ url: The full public URL SignalWire POSTed to, exactly as the platform
305
+ saw it when it computed the signature.
306
+ raw_body: The raw request body as a UTF-8 string, BEFORE any parsing.
307
+ Must be a ``str`` -- passing a parsed dict raises ``TypeError``.
308
+
309
+ Returns:
310
+ True if the SHA-256 signature matches, False otherwise.
311
+
312
+ Raises:
313
+ ValueError: when ``signing_key`` is missing.
314
+ TypeError: when ``raw_body`` is not a string.
315
+ """
316
+ if not signing_key:
317
+ raise ValueError("signing_key is required")
318
+ if not isinstance(raw_body, str):
319
+ raise TypeError("raw_body must be a str — did you pass parsed JSON by mistake?")
320
+ if signature is None or signature == "":
321
+ return False
322
+
323
+ expected = _hex_hmac_sha256(signing_key, url + raw_body)
324
+ return _safe_eq(expected, signature)
325
+
326
+
269
327
  def validate_request(
270
328
  signing_key: str,
271
329
  signature: str,
@@ -326,4 +384,5 @@ def validate_request(
326
384
  __all__ = [
327
385
  "validate_request",
328
386
  "validate_webhook_signature",
387
+ "validate_webhook_signature_sha256",
329
388
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.4.1.dev112
3
+ Version: 3.4.1.dev113
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT