signalwire-sdk 3.4.1.dev111__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.dev111 → signalwire_sdk-3.4.1.dev113}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/pyproject.toml +1 -1
  3. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agent_server.py +1 -1
  5. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/__init__.py +4 -0
  6. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_middleware.py +25 -4
  7. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_validator.py +60 -1
  8. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/index_builder.py +18 -2
  9. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  10. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/LICENSE +0 -0
  11. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/README.md +0 -0
  12. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/sw-agent-init.1 +0 -0
  13. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/sw-search.1 +0 -0
  14. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/swaig-test.1 +0 -0
  15. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/setup.cfg +0 -0
  16. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/setup.py +0 -0
  17. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py +0 -0
  18. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py +0 -0
  19. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/__init__.py +0 -0
  20. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py +0 -0
  21. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py +0 -0
  22. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py +0 -0
  23. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py +0 -0
  24. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/build_search.py +0 -0
  25. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py +0 -0
  26. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/__init__.py +0 -0
  27. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  28. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  29. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  30. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  31. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py +0 -0
  32. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  33. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  34. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  35. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/init_project.py +0 -0
  36. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/__init__.py +0 -0
  37. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  38. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  39. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  40. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  41. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  42. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  43. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  44. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py +0 -0
  45. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py +0 -0
  46. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py +0 -0
  47. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/_agent_host.py +0 -0
  48. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/__init__.py +0 -0
  49. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  50. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  51. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  52. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  53. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  54. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  55. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  56. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  57. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  58. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  59. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  60. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  61. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py +0 -0
  62. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/auth_handler.py +0 -0
  63. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/capabilities.py +0 -0
  64. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/config_loader.py +0 -0
  65. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py +0 -0
  66. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py +0 -0
  67. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/function_result.py +0 -0
  68. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/logging_config.py +0 -0
  69. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  70. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  71. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  72. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  73. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  74. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  75. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  76. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  77. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  78. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  79. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  80. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/pom_builder.py +0 -0
  81. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt.py +0 -0
  82. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  83. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/security_utils.py +0 -0
  84. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/session_manager.py +0 -0
  85. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security_config.py +0 -0
  86. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py +0 -0
  87. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_manager.py +0 -0
  88. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  89. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_function.py +0 -0
  90. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  91. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_builder.py +0 -0
  92. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_handler.py +0 -0
  93. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_renderer.py +0 -0
  94. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_service.py +0 -0
  95. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  96. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py +0 -0
  97. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/__init__.py +0 -0
  98. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/plugins.py +0 -0
  99. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  100. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  101. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  102. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  103. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py +0 -0
  104. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py +0 -0
  105. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py +0 -0
  106. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/__init__.py +0 -0
  107. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/concierge.py +0 -0
  108. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  109. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  110. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  111. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py +0 -0
  112. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/py.typed +0 -0
  113. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py +0 -0
  114. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py +0 -0
  115. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py +0 -0
  116. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py +0 -0
  117. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py +0 -0
  118. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py +0 -0
  119. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  120. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py +0 -0
  121. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py +0 -0
  122. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_pagination.py +0 -0
  123. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_request_options.py +0 -0
  124. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/call_handler.py +0 -0
  125. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py +0 -0
  126. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  127. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  128. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  129. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  130. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  131. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  132. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  133. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  134. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  135. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  136. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  137. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  138. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  139. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  140. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  141. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  142. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  143. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  144. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  145. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  146. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  147. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  148. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  149. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  150. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  151. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  152. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  153. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  154. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  155. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  156. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  157. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  158. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  159. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  160. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  161. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  162. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  163. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  164. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  165. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  166. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  167. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  168. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  169. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  170. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  171. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  172. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  173. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  174. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  175. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  176. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  177. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/schema.json +0 -0
  178. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/__init__.py +0 -0
  179. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/document_processor.py +0 -0
  180. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/migration.py +0 -0
  181. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/models.py +0 -0
  182. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  183. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/query_processor.py +0 -0
  184. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_engine.py +0 -0
  185. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_service.py +0 -0
  186. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/README.md +0 -0
  187. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/__init__.py +0 -0
  188. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  189. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  190. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  191. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  192. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  193. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  194. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  195. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  196. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  197. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  198. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  199. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  200. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/README.md +0 -0
  201. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  202. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  203. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  204. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  205. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  206. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  207. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  208. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/README.md +0 -0
  209. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  210. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/skill.py +0 -0
  211. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/README.md +0 -0
  212. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/__init__.py +0 -0
  213. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/skill.py +0 -0
  214. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  215. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  216. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  217. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  218. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  219. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  220. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  221. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  222. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  223. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/registry.py +0 -0
  224. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/README.md +0 -0
  225. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  226. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/skill.py +0 -0
  227. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  228. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  229. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  230. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  231. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  232. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  233. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/README.md +0 -0
  234. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  235. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  236. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  237. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  238. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  239. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  240. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  241. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/__init__.py +0 -0
  242. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/pom_utils.py +0 -0
  243. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/schema_utils.py +0 -0
  244. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/token_generators.py +0 -0
  245. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/url_validator.py +0 -0
  246. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/validators.py +0 -0
  247. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/__init__.py +0 -0
  248. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/web_service.py +0 -0
  249. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  250. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  251. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  252. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  253. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  254. {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/tests/test_examples.py +0 -0
  255. {signalwire_sdk-3.4.1.dev111 → 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.dev111
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.dev111"
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.dev111"
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.dev111",
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
  ]
@@ -294,9 +294,18 @@ class IndexBuilder:
294
294
  # Use original content as fallback
295
295
  chunk["processed_content"] = chunk["content"]
296
296
  chunk["keywords"] = []
297
- # Create zero embedding as fallback
297
+ # Create zero embedding as fallback. Match the loaded model's
298
+ # true dimension -- a hardcoded 768 corrupts indexes built with
299
+ # a 384-dim model (e.g. the mini/all-MiniLM default), mixing
300
+ # vector widths that break cosine similarity at query time.
298
301
  if np:
299
- embedding = np.zeros(768, dtype=np.float32)
302
+ fallback_dim = 768
303
+ try:
304
+ if self.model is not None:
305
+ fallback_dim = self.model.get_sentence_embedding_dimension()
306
+ except Exception: # noqa: S110 # fall back to 768 if the model cannot report its dimension
307
+ pass
308
+ embedding = np.zeros(fallback_dim, dtype=np.float32)
300
309
  chunk["embedding"] = embedding.tobytes()
301
310
  else:
302
311
  chunk["embedding"] = b""
@@ -771,6 +780,13 @@ class IndexBuilder:
771
780
  ),
772
781
  )
773
782
 
783
+ # Populate the external-content FTS5 index from the chunks table.
784
+ # chunks_fts is declared with content='chunks', so writing to
785
+ # `chunks` does NOT fill the FTS index. Without this rebuild,
786
+ # `chunks_fts MATCH` returns nothing on a freshly built index and
787
+ # keyword search silently degrades to the LIKE fallback.
788
+ cursor.execute("INSERT INTO chunks_fts(chunks_fts) VALUES('rebuild')")
789
+
774
790
  conn.commit()
775
791
 
776
792
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.4.1.dev111
3
+ Version: 3.4.1.dev113
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT