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.
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/PKG-INFO +1 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/pyproject.toml +1 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agent_server.py +1 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/__init__.py +4 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_middleware.py +25 -4
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_validator.py +60 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/index_builder.py +18 -2
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/LICENSE +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/setup.cfg +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/setup.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/build_search.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/capabilities.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/function_result.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security_config.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_function.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_service.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_request_options.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/document_processor.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_engine.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_service.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/tests/test_mcp_integration.py +0 -0
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py
RENAMED
|
@@ -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.
|
|
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
|
|
@@ -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
|
|
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
|
-
|
|
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``
|
|
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
|
|
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
|
-
|
|
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:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev111 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|