signalwire-sdk 3.4.2.dev114__tar.gz → 3.4.3.dev115__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.2.dev114 → signalwire_sdk-3.4.3.dev115}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/pyproject.toml +1 -1
  3. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/agent_server.py +1 -1
  5. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/ai_chat/gateway.py +84 -1
  6. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  7. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/LICENSE +0 -0
  8. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/README.md +0 -0
  9. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/man/sw-agent-init.1 +0 -0
  10. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/man/sw-search.1 +0 -0
  11. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/man/swaig-test.1 +0 -0
  12. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/setup.cfg +0 -0
  13. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/setup.py +0 -0
  14. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/agents/__init__.py +0 -0
  15. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/agents/bedrock.py +0 -0
  16. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/ai_chat/__init__.py +0 -0
  17. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/ai_chat/client.py +0 -0
  18. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/ai_chat/handoff.py +0 -0
  19. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/__init__.py +0 -0
  20. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/build_search.py +0 -0
  21. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/config.py +0 -0
  22. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/core/__init__.py +0 -0
  23. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  24. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  25. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  26. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  27. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/dokku.py +0 -0
  28. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  29. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  30. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  31. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/init_project.py +0 -0
  32. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/output/__init__.py +0 -0
  33. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  34. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  35. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  36. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  37. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  38. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  39. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  40. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/test_swaig.py +0 -0
  41. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/cli/types.py +0 -0
  42. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/__init__.py +0 -0
  43. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/_agent_host.py +0 -0
  44. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/__init__.py +0 -0
  45. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  46. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  47. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  48. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  49. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  50. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  51. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  52. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  53. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  54. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  55. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  56. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  57. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/agent_base.py +0 -0
  58. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/auth_handler.py +0 -0
  59. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/capabilities.py +0 -0
  60. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/config_loader.py +0 -0
  61. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/contexts.py +0 -0
  62. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/data_map.py +0 -0
  63. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/function_result.py +0 -0
  64. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/logging_config.py +0 -0
  65. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  66. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  67. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  68. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  69. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  70. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  71. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  72. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  73. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  74. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  75. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  76. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/pom_builder.py +0 -0
  77. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/post_prompt.py +0 -0
  78. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  79. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security/__init__.py +0 -0
  80. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security/security_utils.py +0 -0
  81. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security/session_manager.py +0 -0
  82. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  83. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  84. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/security_config.py +0 -0
  85. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/skill_base.py +0 -0
  86. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/skill_manager.py +0 -0
  87. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  88. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swaig_function.py +0 -0
  89. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  90. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swml_builder.py +0 -0
  91. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swml_handler.py +0 -0
  92. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swml_renderer.py +0 -0
  93. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swml_service.py +0 -0
  94. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  95. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/core/web.py +0 -0
  96. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/livewire/__init__.py +0 -0
  97. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/livewire/plugins.py +0 -0
  98. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  99. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  100. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  101. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  102. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/pom/__init__.py +0 -0
  103. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/pom/pom.py +0 -0
  104. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/pom/pom_tool.py +0 -0
  105. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/__init__.py +0 -0
  106. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/concierge.py +0 -0
  107. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  108. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  109. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  110. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/prefabs/survey.py +0 -0
  111. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/py.typed +0 -0
  112. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/__init__.py +0 -0
  113. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/call.py +0 -0
  114. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/client.py +0 -0
  115. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/constants.py +0 -0
  116. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/event.py +0 -0
  117. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/message.py +0 -0
  118. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  119. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/__init__.py +0 -0
  120. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/_base.py +0 -0
  121. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/_pagination.py +0 -0
  122. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/_request_options.py +0 -0
  123. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/call_handler.py +0 -0
  124. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/client.py +0 -0
  125. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  126. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  127. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  128. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  129. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  130. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  131. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  132. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  133. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  134. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  135. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  136. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  137. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  138. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  139. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  140. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  141. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  142. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  143. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  144. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  145. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  146. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  147. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  148. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  149. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  150. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  151. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  152. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  153. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  154. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  155. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  156. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  157. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  158. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  159. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  160. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  161. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  162. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  163. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  164. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  165. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  166. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  167. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  168. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  169. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  170. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  171. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  172. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  173. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  174. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  175. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  176. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/schema.json +0 -0
  177. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/__init__.py +0 -0
  178. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/document_processor.py +0 -0
  179. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/index_builder.py +0 -0
  180. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/migration.py +0 -0
  181. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/models.py +0 -0
  182. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  183. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/query_processor.py +0 -0
  184. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/search_engine.py +0 -0
  185. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/search/search_service.py +0 -0
  186. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/README.md +0 -0
  187. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/__init__.py +0 -0
  188. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  189. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  190. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  191. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  192. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  193. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  194. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  195. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  196. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  197. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  198. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  199. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  200. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datetime/README.md +0 -0
  201. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  202. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  203. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  204. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  205. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  206. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  207. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  208. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/joke/README.md +0 -0
  209. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  210. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/joke/skill.py +0 -0
  211. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/math/README.md +0 -0
  212. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/math/__init__.py +0 -0
  213. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/math/skill.py +0 -0
  214. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  215. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  216. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  217. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  218. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  219. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  220. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  221. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  222. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  223. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/registry.py +0 -0
  224. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/spider/README.md +0 -0
  225. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  226. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/spider/skill.py +0 -0
  227. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  228. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  229. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  230. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  231. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  232. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  233. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/web_search/README.md +0 -0
  234. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  235. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  236. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  237. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  238. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  239. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  240. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  241. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/__init__.py +0 -0
  242. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/pom_utils.py +0 -0
  243. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/schema_utils.py +0 -0
  244. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/token_generators.py +0 -0
  245. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/url_validator.py +0 -0
  246. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/utils/validators.py +0 -0
  247. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/web/__init__.py +0 -0
  248. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire/web/web_service.py +0 -0
  249. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  250. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  251. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  252. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  253. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  254. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/tests/test_examples.py +0 -0
  255. {signalwire_sdk-3.4.2.dev114 → signalwire_sdk-3.4.3.dev115}/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.2.dev114
3
+ Version: 3.4.3.dev115
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.2.dev114"
7
+ version = "3.4.3.dev115"
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.2.dev114"
55
+ __version__ = "3.4.3.dev115"
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.2.dev114",
71
+ version="3.4.3.dev115",
72
72
  redirect_slashes=False,
73
73
  docs_url=None,
74
74
  redoc_url=None,
@@ -48,11 +48,35 @@ The origin allowlist is a second layer, and an honest description of it is:
48
48
  it stops a key pasted into someone else's page, because a browser will send
49
49
  their origin and we refuse it. It does not stop anyone using curl. Treat it
50
50
  as leak containment, not access control.
51
+
52
+ ## What the browser may volunteer
53
+
54
+ Exactly one field is forwarded rather than overwritten: ``user_meta_data``,
55
+ the page context a widget collects about itself (url, title, referrer,
56
+ locale, viewport). It exists so a chat agent can tailor its greeting the way
57
+ a voice agent already does from dial-time ``userVariables`` — same data, same
58
+ shape, different transport — and it reaches the agent's config request as
59
+ ``params.user_meta_data``.
60
+
61
+ The service reads it when it *creates* a conversation, which is the ``start``
62
+ call or whichever ``chat`` auto-creates. An already-open conversation does not
63
+ re-fetch its config, so metadata sent on later turns is accepted and goes
64
+ nowhere. Send it every turn regardless — that is what guarantees the creating
65
+ turn carries it — but do not design as though the agent sees a visitor move
66
+ between pages mid-conversation. It does not.
67
+
68
+ It is browser-authored, so treat it as a visitor's *claim* about themselves
69
+ and never as authority; a page can put anything in it, including text aimed
70
+ at your prompt. The gateway bounds it (``MAX_USER_METADATA_BYTES``) and keeps
71
+ it nested under its own key, so it cannot collide with the conversation id or
72
+ ``config_url`` the gateway owns — but it cannot vouch for the contents, and
73
+ neither can you.
51
74
  """
52
75
 
53
76
  import base64
54
77
  import hashlib
55
78
  import hmac
79
+ import json
56
80
  import os
57
81
  import secrets
58
82
  import time
@@ -82,6 +106,12 @@ _LOCAL_HOSTS = frozenset({"localhost", "127.0.0.1", "::1", "[::1]"})
82
106
 
83
107
  ALLOWED_METHODS = frozenset({"start", "chat", "log", "end"})
84
108
 
109
+ # Bound on the browser-volunteered `user_meta_data` bag, serialized. The real
110
+ # payload a widget sends is one to two KB, so this is invisible to anything
111
+ # honest; without it a page rides every turn with unbounded bytes into a
112
+ # metered service on the project's tab.
113
+ MAX_USER_METADATA_BYTES = 8 * 1024
114
+
85
115
  # Roles a browser may see. `chat_log` returns the WHOLE conversation as the
86
116
  # service holds it — the substituted system prompt, tool calls, tool results.
87
117
  # The system prompt is the developer's own content and the tool traffic is
@@ -399,6 +429,36 @@ class ChatGateway:
399
429
 
400
430
  # ── The proxied call ─────────────────────────────────────────────
401
431
 
432
+ def read_user_metadata(self, body: dict[str, Any]) -> dict[str, Any] | None:
433
+ """Validate the page context a browser volunteered, or None.
434
+
435
+ The only field the gateway forwards instead of overwriting, so it is
436
+ the only one that needs a shape and a size. Absent, null and empty all
437
+ collapse to None — an empty bag upstream is noise, not information.
438
+
439
+ Raises:
440
+ GatewayRejection: 400 if it is not a JSON object, 413 if it
441
+ exceeds :data:`MAX_USER_METADATA_BYTES` serialized.
442
+ """
443
+ raw = body.get("user_meta_data")
444
+ if raw is None:
445
+ return None
446
+ if not isinstance(raw, dict):
447
+ raise GatewayRejection(400, "user_meta_data must be an object")
448
+ if not raw:
449
+ return None
450
+ try:
451
+ encoded = json.dumps(raw, separators=(",", ":")).encode()
452
+ except (TypeError, ValueError):
453
+ # prepare() is public, so this can be reached with a dict that
454
+ # never went through request.json() and holds something unsendable.
455
+ raise GatewayRejection(
456
+ 400, "user_meta_data must be JSON-serializable"
457
+ ) from None
458
+ if len(encoded) > MAX_USER_METADATA_BYTES:
459
+ raise GatewayRejection(413, "user_meta_data too large")
460
+ return raw
461
+
402
462
  def prepare(
403
463
  self, body: dict[str, Any], *, origin: str | None, key: str | None
404
464
  ) -> tuple[str, dict[str, Any], str | None]:
@@ -411,6 +471,9 @@ class ChatGateway:
411
471
  Everything the browser could use to widen its own access is either
412
472
  rejected or overwritten here: the method must be one of two, the
413
473
  conversation comes from a signed handle, and ``config_url`` is ours.
474
+ The single exception is ``user_meta_data``, which is forwarded — see
475
+ :meth:`read_user_metadata` and the module docstring for why that is
476
+ narrow enough to be safe and what it still does not vouch for.
414
477
  """
415
478
  self.check_key(key)
416
479
  self.check_origin(origin)
@@ -419,6 +482,11 @@ class ChatGateway:
419
482
  if method not in ALLOWED_METHODS:
420
483
  raise GatewayRejection(400, "method not allowed")
421
484
 
485
+ # Read before minting so a malformed bag costs the caller nothing —
486
+ # rejecting after _charge_mint() would burn a conversation slot on a
487
+ # request that never reaches the service.
488
+ user_metadata = self.read_user_metadata(body)
489
+
422
490
  handle = body.get("handle")
423
491
  minted = None
424
492
  if handle:
@@ -450,6 +518,8 @@ class ChatGateway:
450
518
  }
451
519
  if self.conversation_timeout:
452
520
  params["conversation_timeout"] = self.conversation_timeout
521
+ if user_metadata:
522
+ params["user_meta_data"] = user_metadata
453
523
  return "create_conversation", params, minted
454
524
 
455
525
  message = body.get("message")
@@ -470,6 +540,17 @@ class ChatGateway:
470
540
  # by a first message would silently get the service default instead.
471
541
  if self.conversation_timeout:
472
542
  chat_params["conversation_timeout"] = self.conversation_timeout
543
+ # On every chat, because any chat may be the one that creates: the
544
+ # service auto-creates from this method when the conversation does not
545
+ # exist yet, and that is the only moment it reads the bag.
546
+ #
547
+ # Verified against the service, because the natural assumption is
548
+ # wrong: an existing conversation is NOT re-fetched, so metadata sent
549
+ # on later turns is accepted and discarded. Sending it anyway costs a
550
+ # bounded field and means the creating turn is never the one that
551
+ # missed — do not read it as the agent tracking a visitor's movement.
552
+ if user_metadata:
553
+ chat_params["user_meta_data"] = user_metadata
473
554
  return "chat", chat_params, minted
474
555
 
475
556
  # ── FastAPI surface ──────────────────────────────────────────────
@@ -477,7 +558,8 @@ class ChatGateway:
477
558
  def router(self) -> "APIRouter":
478
559
  """An ``APIRouter`` exposing this gateway.
479
560
 
480
- ``POST /`` takes ``{"method": "chat"|"end", "handle"?, "message"?}``
561
+ ``POST /`` takes
562
+ ``{"method": "chat"|"end", "handle"?, "message"?, "user_meta_data"?}``
481
563
  with the key in ``Authorization: Bearer``. A chat streams the
482
564
  service's JSON-RPC response body through **unbuffered** — the service
483
565
  pads slow turns with keepalive whitespace so proxies do not sever the
@@ -547,6 +629,7 @@ class ChatGateway:
547
629
  params["id"],
548
630
  config_url=params["config_url"],
549
631
  timeout=params.get("conversation_timeout"),
632
+ user_metadata=params.get("user_meta_data"),
550
633
  )
551
634
  if minted:
552
635
  cors["X-Chat-Handle"] = minted
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.4.2.dev114
3
+ Version: 3.4.3.dev115
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT