signalwire-sdk 3.2.0.dev95__tar.gz → 3.2.0.dev97__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 (249) hide show
  1. {signalwire_sdk-3.2.0.dev95/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.2.0.dev97}/PKG-INFO +9 -2
  2. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/README.md +8 -1
  3. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/pyproject.toml +14 -1
  4. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/__init__.py +1 -1
  5. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/agent_server.py +1 -1
  6. signalwire_sdk-3.2.0.dev97/signalwire/signalwire/agents/__init__.py +16 -0
  7. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/contexts.py +32 -0
  8. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swml_renderer.py +6 -2
  9. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swml_service.py +24 -0
  10. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/schema_utils.py +58 -0
  11. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97/signalwire/signalwire_sdk.egg-info}/PKG-INFO +9 -2
  12. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +1 -0
  13. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/LICENSE +0 -0
  14. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/man/sw-agent-init.1 +0 -0
  15. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/man/sw-search.1 +0 -0
  16. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/man/swaig-test.1 +0 -0
  17. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/setup.cfg +0 -0
  18. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/setup.py +0 -0
  19. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/agents/bedrock.py +0 -0
  20. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/__init__.py +0 -0
  21. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/build_search.py +0 -0
  22. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/config.py +0 -0
  23. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/core/__init__.py +0 -0
  24. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  25. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  26. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  27. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  28. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/dokku.py +0 -0
  29. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  30. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  31. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  32. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/init_project.py +0 -0
  33. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/output/__init__.py +0 -0
  34. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  35. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  36. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  37. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  38. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  39. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  40. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  41. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/test_swaig.py +0 -0
  42. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/cli/types.py +0 -0
  43. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/__init__.py +0 -0
  44. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/_agent_host.py +0 -0
  45. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/__init__.py +0 -0
  46. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  47. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  48. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  49. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  50. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  51. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  52. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  53. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  54. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  55. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  56. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  57. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  58. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/agent_base.py +0 -0
  59. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/auth_handler.py +0 -0
  60. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/config_loader.py +0 -0
  61. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/data_map.py +0 -0
  62. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/function_result.py +0 -0
  63. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/logging_config.py +0 -0
  64. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  65. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  66. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  67. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  68. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  69. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  70. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  71. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  72. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  73. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  74. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  75. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/pom_builder.py +0 -0
  76. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  77. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security/__init__.py +0 -0
  78. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security/security_utils.py +0 -0
  79. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security/session_manager.py +0 -0
  80. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  81. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  82. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/security_config.py +0 -0
  83. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/skill_base.py +0 -0
  84. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/skill_manager.py +0 -0
  85. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  86. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swaig_function.py +0 -0
  87. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  88. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swml_builder.py +0 -0
  89. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swml_handler.py +0 -0
  90. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  91. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/core/web.py +0 -0
  92. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/livewire/__init__.py +0 -0
  93. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/livewire/plugins.py +0 -0
  94. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  95. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  96. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  97. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  98. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/pom/__init__.py +0 -0
  99. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/pom/pom.py +0 -0
  100. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/pom/pom_tool.py +0 -0
  101. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/__init__.py +0 -0
  102. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/concierge.py +0 -0
  103. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  104. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  105. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  106. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/prefabs/survey.py +0 -0
  107. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/py.typed +0 -0
  108. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/__init__.py +0 -0
  109. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/call.py +0 -0
  110. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/client.py +0 -0
  111. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/constants.py +0 -0
  112. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/event.py +0 -0
  113. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/message.py +0 -0
  114. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  115. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/__init__.py +0 -0
  116. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/_base.py +0 -0
  117. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/_pagination.py +0 -0
  118. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/_request_options.py +0 -0
  119. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/call_handler.py +0 -0
  120. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/client.py +0 -0
  121. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  122. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  123. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  124. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  125. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  126. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  127. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  128. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  129. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  130. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  131. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  132. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  133. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  134. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  135. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  136. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  137. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  138. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  139. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  140. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  141. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  142. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  143. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  144. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  145. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  146. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  147. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  148. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  149. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  150. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  151. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  152. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  153. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  154. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  155. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  156. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  157. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  158. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  159. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  160. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  161. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  162. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  163. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  164. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  165. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  166. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  167. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  168. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  169. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  170. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  171. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  172. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/schema.json +0 -0
  173. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/__init__.py +0 -0
  174. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/document_processor.py +0 -0
  175. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/index_builder.py +0 -0
  176. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/migration.py +0 -0
  177. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/models.py +0 -0
  178. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  179. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/query_processor.py +0 -0
  180. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/search_engine.py +0 -0
  181. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/search/search_service.py +0 -0
  182. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/README.md +0 -0
  183. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/__init__.py +0 -0
  184. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  185. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  186. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  187. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  188. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  189. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  190. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  191. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  192. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  193. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  194. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  195. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  196. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datetime/README.md +0 -0
  197. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  198. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  199. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  200. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  201. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  202. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  203. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  204. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/joke/README.md +0 -0
  205. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  206. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/joke/skill.py +0 -0
  207. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/math/README.md +0 -0
  208. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/math/__init__.py +0 -0
  209. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/math/skill.py +0 -0
  210. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  211. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  212. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  213. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  214. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  215. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  216. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  217. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  218. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  219. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/registry.py +0 -0
  220. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/spider/README.md +0 -0
  221. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  222. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/spider/skill.py +0 -0
  223. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  224. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  225. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  226. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  227. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  228. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  229. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/web_search/README.md +0 -0
  230. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  231. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  232. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  233. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  234. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  235. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  236. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  237. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/__init__.py +0 -0
  238. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/pom_utils.py +0 -0
  239. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/token_generators.py +0 -0
  240. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/url_validator.py +0 -0
  241. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/utils/validators.py +0 -0
  242. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/web/__init__.py +0 -0
  243. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire/web/web_service.py +0 -0
  244. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  245. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  246. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  247. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  248. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/tests/test_examples.py +0 -0
  249. {signalwire_sdk-3.2.0.dev95 → signalwire_sdk-3.2.0.dev97}/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.2.0.dev95
3
+ Version: 3.2.0.dev97
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -142,6 +142,7 @@ Each agent is a self-contained microservice that generates [SWML](docs/swml_serv
142
142
  from signalwire import AgentBase
143
143
  from signalwire.core.function_result import FunctionResult
144
144
 
145
+
145
146
  class MyAgent(AgentBase):
146
147
  def __init__(self):
147
148
  super().__init__(name="my-agent", route="/agent")
@@ -153,8 +154,10 @@ class MyAgent(AgentBase):
153
154
  def get_time(self):
154
155
  """Get the current time"""
155
156
  from datetime import datetime
157
+
156
158
  return FunctionResult(f"The time is {datetime.now().strftime('%H:%M:%S')}")
157
159
 
160
+
158
161
  if __name__ == "__main__":
159
162
  agent = MyAgent()
160
163
  agent.run()
@@ -213,7 +216,10 @@ Real-time call control and messaging over WebSocket. The RELAY client connects t
213
216
  ```python
214
217
  from signalwire.relay import RelayClient
215
218
 
216
- client = RelayClient(project="...", token="...", host="example.signalwire.com", contexts=["default"])
219
+ client = RelayClient(
220
+ project="...", token="...", host="example.signalwire.com", contexts=["default"]
221
+ )
222
+
217
223
 
218
224
  @client.on_call
219
225
  async def handle(call):
@@ -222,6 +228,7 @@ async def handle(call):
222
228
  await action.wait()
223
229
  await call.hangup()
224
230
 
231
+
225
232
  client.run()
226
233
  ```
227
234
 
@@ -45,6 +45,7 @@ Each agent is a self-contained microservice that generates [SWML](docs/swml_serv
45
45
  from signalwire import AgentBase
46
46
  from signalwire.core.function_result import FunctionResult
47
47
 
48
+
48
49
  class MyAgent(AgentBase):
49
50
  def __init__(self):
50
51
  super().__init__(name="my-agent", route="/agent")
@@ -56,8 +57,10 @@ class MyAgent(AgentBase):
56
57
  def get_time(self):
57
58
  """Get the current time"""
58
59
  from datetime import datetime
60
+
59
61
  return FunctionResult(f"The time is {datetime.now().strftime('%H:%M:%S')}")
60
62
 
63
+
61
64
  if __name__ == "__main__":
62
65
  agent = MyAgent()
63
66
  agent.run()
@@ -116,7 +119,10 @@ Real-time call control and messaging over WebSocket. The RELAY client connects t
116
119
  ```python
117
120
  from signalwire.relay import RelayClient
118
121
 
119
- client = RelayClient(project="...", token="...", host="example.signalwire.com", contexts=["default"])
122
+ client = RelayClient(
123
+ project="...", token="...", host="example.signalwire.com", contexts=["default"]
124
+ )
125
+
120
126
 
121
127
  @client.on_call
122
128
  async def handle(call):
@@ -125,6 +131,7 @@ async def handle(call):
125
131
  await action.wait()
126
132
  await call.hangup()
127
133
 
134
+
128
135
  client.run()
129
136
  ```
130
137
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire-sdk"
7
- version = "3.2.0.dev95"
7
+ version = "3.2.0.dev97"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -201,6 +201,19 @@ select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "R
201
201
  # subscript is a runtime NameError under TYPE_CHECKING). Exempt F401 here; mypy +
202
202
  # the SIGNATURES/DRIFT gate prove these imports are real and correct.
203
203
  "signalwire/signalwire/rest/namespaces/*.py" = ["F401"]
204
+ # Runnable docs — examples/, rest/examples/, relay/examples/. These are teaching
205
+ # programs, not shipped SDK surface, so a few production-lint rules are demo-idiomatic
206
+ # noise here (and are the ONLY findings that survive after autofix):
207
+ # E402 — a leading module docstring / "set your creds here" preamble before imports
208
+ # is the natural example shape (imports-not-at-top).
209
+ # S104 — binding 0.0.0.0 is how a demo server example says "listen on all interfaces".
210
+ # S106 — literal "password"/"token" kwargs are obvious placeholder creds in a snippet.
211
+ # S311 — non-crypto random (sample data / demo ids), never used for security here.
212
+ # Everything else (F401 unused imports, F541 empty f-strings, C4/B/RET/SIM/…) is a real
213
+ # smell and stays enforced so `examples/**` is gate-cleanable to zero.
214
+ "examples/**" = ["E402", "S104", "S106", "S311"]
215
+ "rest/examples/**" = ["E402", "S104", "S106", "S311"]
216
+ "relay/examples/**" = ["E402", "S104", "S106", "S311"]
204
217
 
205
218
  [tool.ruff.lint.flake8-bugbear]
206
219
  # FastAPI's dependency-injection idiom puts Depends()/Query()/etc. in argument
@@ -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.2.0.dev95"
55
+ __version__ = "3.2.0.dev97"
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.2.0.dev95",
71
+ version="3.2.0.dev97",
72
72
  redirect_slashes=False,
73
73
  docs_url=None,
74
74
  redoc_url=None,
@@ -0,0 +1,16 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+
9
+ Specialized agent implementations backed by specific inference providers.
10
+ """
11
+
12
+ from signalwire.agents.bedrock import BedrockAgent
13
+
14
+ __all__ = [
15
+ "BedrockAgent",
16
+ ]
@@ -1493,6 +1493,38 @@ class ContextBuilder:
1493
1493
  f"avoid the collision."
1494
1494
  )
1495
1495
 
1496
+ # Validate step set_functions([...]) whitelists against the known
1497
+ # tool universe. A step that whitelists a function which is neither
1498
+ # a registered SWAIG tool nor a reserved native tool is a DANGLING
1499
+ # reference: it renders a step whose active-function set silently
1500
+ # points at nothing (r5 F3 — get_datetime vs get_current_time).
1501
+ # Only enforce when a real registry is present; a contexts builder
1502
+ # with no agent (or a mock registry) cannot know the tool universe,
1503
+ # so we must not red a valid document there.
1504
+ if isinstance(registered, dict):
1505
+ known_functions = set(registered.keys()) | RESERVED_NATIVE_TOOL_NAMES
1506
+ for context_name, context in self._contexts.items():
1507
+ for step_name, step in context._steps.items():
1508
+ funcs = step._functions
1509
+ # "none" and [] are explicit disable-all — not lists of
1510
+ # references to resolve.
1511
+ if not isinstance(funcs, list):
1512
+ continue
1513
+ for fn in funcs:
1514
+ if fn not in known_functions:
1515
+ available = sorted(known_functions)
1516
+ raise ValueError(
1517
+ f"Step '{step_name}' in context "
1518
+ f"'{context_name}' whitelists function "
1519
+ f"'{fn}' via set_functions(), but no such "
1520
+ f"SWAIG tool is registered on the agent and "
1521
+ f"it is not a reserved native tool. This "
1522
+ f"would emit a dangling function reference. "
1523
+ f"Register the tool (define_tool / a skill) "
1524
+ f"or remove it from the step. Available: "
1525
+ f"{available}"
1526
+ )
1527
+
1496
1528
  def to_dict(self) -> dict[str, Any]:
1497
1529
  """Convert all contexts to dictionary for SWML generation"""
1498
1530
  self.validate()
@@ -168,9 +168,13 @@ class SwmlRenderer:
168
168
  # Use the service to build the document
169
169
  service.reset_document()
170
170
 
171
- # Add a play block for the response if provided
171
+ # Add a play block for the response if provided. Text is played via the
172
+ # `say:` URL scheme — the SWML `play` verb has no `text` key (its config is
173
+ # PlayWithURL/PlayWithURLS, url matching `^...|say: ?.*|...$`). Emitting
174
+ # `{"text": ...}` produced a document the SWML schema rejects; the canonical
175
+ # form (mirrors SWMLBuilder.play) is `url: "say:<text>"`.
172
176
  if response_text:
173
- service.add_verb("play", {"text": response_text})
177
+ service.add_verb("play", {"url": f"say:{response_text}"})
174
178
 
175
179
  # Add any actions that were provided
176
180
  if actions:
@@ -534,6 +534,22 @@ class SWMLService(ToolMixin):
534
534
  handler = self.verb_registry.get_handler(verb_name)
535
535
  assert handler is not None # noqa: S101 # type-narrowing invariant (not input validation): guaranteed by has_handler() above
536
536
  is_valid, errors = handler.validate_config(config)
537
+ # A handler's validate_config carries verb-specific diagnostics
538
+ # (e.g. the ai verb's prompt/SWAIG shape checks) but does NOT reject
539
+ # unknown/misspelled TOP-LEVEL keys — so a typo'd key would slip
540
+ # through silently (r5 silent-drop family: ai temperatur/zzz). Add a
541
+ # shallow unknown-top-level-key check against the schema so a handler
542
+ # verb rejects stray keys like every other verb. We deliberately do
543
+ # NOT run the full deep schema here: the ai verb's DEEP shapes
544
+ # (an empty prompt.pom for a promptless agent, the SWAIG function
545
+ # shape) are the handler's remit and are legitimately emitted by the
546
+ # SDK in forms the JSON-schema's oneOf/pom rules don't all accept —
547
+ # full validation would false-reject valid documents. The shallow
548
+ # check is a no-op when validation is disabled.
549
+ if is_valid:
550
+ is_valid, errors = self.schema_utils._validate_verb_top_level_keys(
551
+ verb_name, config
552
+ )
537
553
  else:
538
554
  # Use schema-based validation for standard verbs
539
555
  is_valid, errors = self.schema_utils.validate_verb(verb_name, config)
@@ -603,6 +619,14 @@ class SWMLService(ToolMixin):
603
619
  handler = self.verb_registry.get_handler(verb_name)
604
620
  assert handler is not None # noqa: S101 # type-narrowing invariant (not input validation): guaranteed by has_handler() above
605
621
  is_valid, errors = handler.validate_config(config)
622
+ # See add_verb: also run the shallow unknown-top-level-key check so a
623
+ # handler verb rejects misspelled/unknown top-level keys (NOT the full
624
+ # deep schema, which would false-reject the ai verb's legitimate
625
+ # empty-pom / SWAIG emissions). No-op when validation is disabled.
626
+ if is_valid:
627
+ is_valid, errors = self.schema_utils._validate_verb_top_level_keys(
628
+ verb_name, config
629
+ )
606
630
  else:
607
631
  # Use schema-based validation for standard verbs
608
632
  is_valid, errors = self.schema_utils.validate_verb(verb_name, config)
@@ -407,6 +407,64 @@ class SchemaUtils:
407
407
 
408
408
  return len(errors) == 0, errors
409
409
 
410
+ def _verb_top_level_property_names(self, verb_name: str) -> set[str] | None:
411
+ """Resolve the set of KNOWN top-level property names for a verb's config
412
+ object, following a single ``$ref`` (e.g. AI -> AIObject). Returns None
413
+ when the verb's config schema is not a closed object-with-properties
414
+ (i.e. we cannot enumerate a known-key set, so no shallow check applies)."""
415
+ if verb_name not in self.verbs:
416
+ return None
417
+ verb_def = self.verbs[verb_name]["definition"]
418
+ props = verb_def.get("properties", {})
419
+ body = props.get(verb_name)
420
+ if not isinstance(body, dict):
421
+ return None
422
+ # Follow a single $ref (AI -> AIObject) to the object that declares the
423
+ # verb config's own properties.
424
+ if "$ref" in body:
425
+ ref_name = body["$ref"].split("/")[-1]
426
+ body = self.schema.get("$defs", {}).get(ref_name, {})
427
+ if not isinstance(body, dict) or body.get("type") != "object":
428
+ return None
429
+ prop_map = body.get("properties")
430
+ if not isinstance(prop_map, dict):
431
+ return None
432
+ # Only meaningful as a closed-key check when the schema itself closes the
433
+ # object (additionalProperties:false or unevaluatedProperties disallowed).
434
+ closes = (
435
+ body.get("additionalProperties") is False
436
+ or body.get("unevaluatedProperties") is False
437
+ or body.get("unevaluatedProperties") == {"not": {}}
438
+ )
439
+ if not closes:
440
+ return None
441
+ return set(prop_map.keys())
442
+
443
+ def _validate_verb_top_level_keys(
444
+ self, verb_name: str, verb_config: dict[str, Any]
445
+ ) -> tuple[bool, list[str]]:
446
+ """Shallow strict-render check: reject unknown/misspelled TOP-LEVEL keys
447
+ in a verb config against the schema's known property set, WITHOUT running
448
+ the full deep schema (which would false-reject legitimate deep emissions
449
+ such as the ai verb's empty prompt.pom). Used for handler verbs (the ai
450
+ verb) whose deep shapes the handler owns. A no-op when validation is
451
+ disabled or when the verb has no enumerable closed key-set."""
452
+ if not self._validation_enabled:
453
+ return True, []
454
+ if verb_name not in self.verbs:
455
+ return False, [f"Unknown verb: {verb_name}"]
456
+ known = self._verb_top_level_property_names(verb_name)
457
+ if known is None:
458
+ # No enumerable closed key-set — nothing shallow to enforce.
459
+ return True, []
460
+ unknown = [k for k in verb_config if k not in known]
461
+ if unknown:
462
+ return False, [
463
+ f"Unknown/misspelled key(s) {sorted(unknown)} for verb "
464
+ f"'{verb_name}'. Known keys: {sorted(known)}"
465
+ ]
466
+ return True, []
467
+
410
468
  def validate_document(self, document: dict[str, Any]) -> tuple[bool, list[str]]:
411
469
  """
412
470
  Validate a complete SWML document against the schema.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.2.0.dev95
3
+ Version: 3.2.0.dev97
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -142,6 +142,7 @@ Each agent is a self-contained microservice that generates [SWML](docs/swml_serv
142
142
  from signalwire import AgentBase
143
143
  from signalwire.core.function_result import FunctionResult
144
144
 
145
+
145
146
  class MyAgent(AgentBase):
146
147
  def __init__(self):
147
148
  super().__init__(name="my-agent", route="/agent")
@@ -153,8 +154,10 @@ class MyAgent(AgentBase):
153
154
  def get_time(self):
154
155
  """Get the current time"""
155
156
  from datetime import datetime
157
+
156
158
  return FunctionResult(f"The time is {datetime.now().strftime('%H:%M:%S')}")
157
159
 
160
+
158
161
  if __name__ == "__main__":
159
162
  agent = MyAgent()
160
163
  agent.run()
@@ -213,7 +216,10 @@ Real-time call control and messaging over WebSocket. The RELAY client connects t
213
216
  ```python
214
217
  from signalwire.relay import RelayClient
215
218
 
216
- client = RelayClient(project="...", token="...", host="example.signalwire.com", contexts=["default"])
219
+ client = RelayClient(
220
+ project="...", token="...", host="example.signalwire.com", contexts=["default"]
221
+ )
222
+
217
223
 
218
224
  @client.on_call
219
225
  async def handle(call):
@@ -222,6 +228,7 @@ async def handle(call):
222
228
  await action.wait()
223
229
  await call.hangup()
224
230
 
231
+
225
232
  client.run()
226
233
  ```
227
234
 
@@ -9,6 +9,7 @@ signalwire/signalwire/__init__.py
9
9
  signalwire/signalwire/agent_server.py
10
10
  signalwire/signalwire/py.typed
11
11
  signalwire/signalwire/schema.json
12
+ signalwire/signalwire/agents/__init__.py
12
13
  signalwire/signalwire/agents/bedrock.py
13
14
  signalwire/signalwire/cli/__init__.py
14
15
  signalwire/signalwire/cli/build_search.py