signalwire-sdk 3.4.3.dev118__tar.gz → 3.4.3.dev119__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 (467) hide show
  1. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/CHANGELOG.md +52 -2
  2. {signalwire_sdk-3.4.3.dev118/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.4.3.dev119}/PKG-INFO +1 -1
  3. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/agent_guide.md +18 -1
  4. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/architecture.md +2 -0
  5. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/pgi_agent_guide.md +1 -1
  6. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/pyproject.toml +1 -1
  7. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__init__.py +1 -1
  8. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agent_server.py +1 -1
  9. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_topics.py +6 -3
  10. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/_sync_handlers.py +113 -0
  11. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/type_inference.py +24 -5
  12. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent_base.py +95 -29
  13. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +11 -0
  14. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/web_mixin.py +40 -8
  15. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_manager.py +21 -1
  16. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_service.py +126 -34
  17. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/skill.py +15 -7
  18. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
  19. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +1 -0
  20. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/LICENSE +0 -0
  21. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/MANIFEST.in +0 -0
  22. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/README.md +0 -0
  23. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/ai_chat_gateway.md +0 -0
  24. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/api_reference.md +0 -0
  25. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/bedrock_agent.md +0 -0
  26. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/cli_guide.md +0 -0
  27. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/cloud_functions_guide.md +0 -0
  28. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/configuration.md +0 -0
  29. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/contexts_guide.md +0 -0
  30. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/datamap_guide.md +0 -0
  31. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/developer_pain_points.md +0 -0
  32. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/llm_parameters.md +0 -0
  33. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/mcp_gateway_reference.md +0 -0
  34. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/mcp_integration.md +0 -0
  35. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/programmatically_governed_inference.md +0 -0
  36. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/sdk_features.md +0 -0
  37. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_deployment.md +0 -0
  38. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_indexing.md +0 -0
  39. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_integration.md +0 -0
  40. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_overview.md +0 -0
  41. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_troubleshooting.md +0 -0
  42. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/security.md +0 -0
  43. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/skills_parameter_schema.md +0 -0
  44. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/skills_system.md +0 -0
  45. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/swaig_reference.md +0 -0
  46. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/swml_service_guide.md +0 -0
  47. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/third_party_skills.md +0 -0
  48. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/web_service.md +0 -0
  49. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/Dockerfile.flexible +0 -0
  50. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/Dockerfile.k8s +0 -0
  51. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/README.md +0 -0
  52. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/advanced_datamap_demo.py +0 -0
  53. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/auto_vivified_example.py +0 -0
  54. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/basic_swml_service.py +0 -0
  55. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_agent_run.py +0 -0
  56. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_agent_test.py +0 -0
  57. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_server_test.py +0 -0
  58. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_with_skills.py +0 -0
  59. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/call_flow_and_actions_demo.py +0 -0
  60. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/comprehensive_dynamic_agent.py +0 -0
  61. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/concierge_agent_example.py +0 -0
  62. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/contexts_demo.py +0 -0
  63. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/custom_path_agent.py +0 -0
  64. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/data_map_demo.py +0 -0
  65. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_multi_instance_demo.py +0 -0
  66. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_serverless_demo.py +0 -0
  67. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_serverless_env_demo.py +0 -0
  68. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_webhook_env_demo.py +0 -0
  69. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/declarative_agent.py +0 -0
  70. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/dynamic_info_gatherer_example.py +0 -0
  71. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/dynamic_swml_service.py +0 -0
  72. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/faq_bot_agent.py +0 -0
  73. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/gather_info_demo.py +0 -0
  74. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/gather_per_question_functions_demo.py +0 -0
  75. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/info_gatherer_example.py +0 -0
  76. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/joke_agent.py +0 -0
  77. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/joke_skill_demo.py +0 -0
  78. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/k8s-deployment.yaml +0 -0
  79. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/kubernetes_ready_agent.py +0 -0
  80. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/lambda_agent.py +0 -0
  81. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/llm_params_demo.py +0 -0
  82. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/mcp_agent.py +0 -0
  83. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/mcp_gateway_demo.py +0 -0
  84. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/multi_agent_server.py +0 -0
  85. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/multi_endpoint_agent.py +0 -0
  86. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/pgvector_search_agent.py +0 -0
  87. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_agent.py +0 -0
  88. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_relay.py +0 -0
  89. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_rest.py +0 -0
  90. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/receptionist_agent_example.py +0 -0
  91. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/record_call_example.py +0 -0
  92. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/relay_answer_and_welcome.py +0 -0
  93. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/room_and_sip_example.py +0 -0
  94. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/search_server_standalone.py +0 -0
  95. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/search_with_custom_formatter.py +0 -0
  96. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/session_and_state_demo.py +0 -0
  97. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_native_search.py +0 -0
  98. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_remote_search.py +0 -0
  99. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_simple.py +0 -0
  100. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_agent.py +0 -0
  101. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_dynamic_agent.py +0 -0
  102. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_dynamic_enhanced.py +0 -0
  103. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_static_agent.py +0 -0
  104. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/skills_demo.py +0 -0
  105. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/static_files/file.txt +0 -0
  106. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/static_files/static_files/file.txt +0 -0
  107. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/step_function_inheritance_demo.py +0 -0
  108. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/survey_agent_example.py +0 -0
  109. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swaig_features_agent.py +0 -0
  110. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swml_service_example.py +0 -0
  111. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swml_service_routing_example.py +0 -0
  112. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swmlservice_ai_sidecar.py +0 -0
  113. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swmlservice_swaig_standalone.py +0 -0
  114. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/tap_example.py +0 -0
  115. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/web_search_agent.py +0 -0
  116. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/web_search_multi_instance_demo.py +0 -0
  117. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/wikipedia_demo.py +0 -0
  118. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/README.md +0 -0
  119. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/docs/migration-guide.md +0 -0
  120. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_basic_agent.py +0 -0
  121. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_handoff.py +0 -0
  122. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_multi_tool.py +0 -0
  123. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-agent-init.1 +0 -0
  124. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-pydocs.1 +0 -0
  125. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-search.1 +0 -0
  126. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/swaig-test.1 +0 -0
  127. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp/swml-schema-search/README.md +0 -0
  128. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp/swml-schema-search/swml_schema_mcp.py +0 -0
  129. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/.env.example +0 -0
  130. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/.gitignore +0 -0
  131. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/Dockerfile +0 -0
  132. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/README.md +0 -0
  133. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/certs/.gitignore +0 -0
  134. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/docker-compose.yml +0 -0
  135. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/examples/generate_cert.sh +0 -0
  136. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/mcp-docker.sh +0 -0
  137. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/sample_config.json +0 -0
  138. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/test_agent.py +0 -0
  139. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/test_gateway.sh +0 -0
  140. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/todo_mcp.py +0 -0
  141. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/README.md +0 -0
  142. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/call-methods.md +0 -0
  143. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/client-reference.md +0 -0
  144. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/events.md +0 -0
  145. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/getting-started.md +0 -0
  146. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/messaging.md +0 -0
  147. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_answer_and_welcome.py +0 -0
  148. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_dial_and_play.py +0 -0
  149. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_ivr_connect.py +0 -0
  150. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/README.md +0 -0
  151. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/calling.md +0 -0
  152. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/client-reference.md +0 -0
  153. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/fabric.md +0 -0
  154. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/getting-started.md +0 -0
  155. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/namespaces.md +0 -0
  156. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_10dlc_registration.py +0 -0
  157. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_bind_phone_to_swml_webhook.py +0 -0
  158. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_calling_ivr_and_ai.py +0 -0
  159. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_calling_play_and_record.py +0 -0
  160. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_datasphere_search.py +0 -0
  161. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_conferences_and_routing.py +0 -0
  162. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_subscribers_and_sip.py +0 -0
  163. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_swml_and_callflows.py +0 -0
  164. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_manage_resources.py +0 -0
  165. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_phone_number_management.py +0 -0
  166. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_queues_mfa_and_recordings.py +0 -0
  167. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_video_rooms.py +0 -0
  168. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/setup.cfg +0 -0
  169. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/setup.py +0 -0
  170. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/AGENTS.md +0 -0
  171. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__main__.py +0 -0
  172. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/__init__.py +0 -0
  173. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/bedrock.py +0 -0
  174. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/__init__.py +0 -0
  175. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/client.py +0 -0
  176. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/gateway.py +0 -0
  177. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/handoff.py +0 -0
  178. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/__init__.py +0 -0
  179. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/build_search.py +0 -0
  180. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/config.py +0 -0
  181. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/__init__.py +0 -0
  182. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  183. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  184. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  185. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  186. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/dokku.py +0 -0
  187. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  188. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  189. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  190. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/init_project.py +0 -0
  191. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/__init__.py +0 -0
  192. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  193. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  194. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/__init__.py +0 -0
  195. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_agents_note.py +0 -0
  196. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_api.py +0 -0
  197. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_bundle.py +0 -0
  198. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_files.py +0 -0
  199. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_render.py +0 -0
  200. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  201. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  202. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  203. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  204. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  205. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/test_swaig.py +0 -0
  206. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/types.py +0 -0
  207. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/__init__.py +0 -0
  208. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/_agent_host.py +0 -0
  209. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/__init__.py +0 -0
  210. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  211. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  212. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  213. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  214. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  215. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  216. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  217. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  218. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  219. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  220. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  221. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/auth_handler.py +0 -0
  222. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/capabilities.py +0 -0
  223. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/config_loader.py +0 -0
  224. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/contexts.py +0 -0
  225. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/data_map.py +0 -0
  226. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/function_result.py +0 -0
  227. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/logging_config.py +0 -0
  228. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  229. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  230. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  231. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  232. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  233. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  234. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  235. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  236. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  237. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/pom_builder.py +0 -0
  238. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt.py +0 -0
  239. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  240. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/__init__.py +0 -0
  241. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/security_utils.py +0 -0
  242. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/session_manager.py +0 -0
  243. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  244. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  245. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security_config.py +0 -0
  246. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_base.py +0 -0
  247. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  248. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_function.py +0 -0
  249. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  250. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_builder.py +0 -0
  251. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_handler.py +0 -0
  252. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_renderer.py +0 -0
  253. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  254. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/web.py +0 -0
  255. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/__init__.py +0 -0
  256. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/plugins.py +0 -0
  257. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/llms.txt +0 -0
  258. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  259. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  260. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  261. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  262. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/__init__.py +0 -0
  263. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom.py +0 -0
  264. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom_tool.py +0 -0
  265. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/__init__.py +0 -0
  266. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/concierge.py +0 -0
  267. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  268. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  269. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  270. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/survey.py +0 -0
  271. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/py.typed +0 -0
  272. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/__init__.py +0 -0
  273. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/call.py +0 -0
  274. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/client.py +0 -0
  275. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/constants.py +0 -0
  276. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/event.py +0 -0
  277. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/message.py +0 -0
  278. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  279. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/__init__.py +0 -0
  280. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_base.py +0 -0
  281. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_pagination.py +0 -0
  282. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_request_options.py +0 -0
  283. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/call_handler.py +0 -0
  284. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/client.py +0 -0
  285. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  286. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  287. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  288. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  289. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  290. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  291. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  292. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  293. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  294. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  295. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  296. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  297. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  298. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  299. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  300. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  301. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  302. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  303. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  304. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  305. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  306. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  307. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  308. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  309. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  310. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  311. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  312. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  313. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  314. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  315. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  316. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  317. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  318. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  319. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  320. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  321. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  322. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  323. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  324. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  325. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  326. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  327. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  328. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  329. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  330. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  331. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  332. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  333. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  334. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  335. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  336. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/schema.json +0 -0
  337. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/__init__.py +0 -0
  338. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/document_processor.py +0 -0
  339. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/index_builder.py +0 -0
  340. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/migration.py +0 -0
  341. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/models.py +0 -0
  342. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  343. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/query_processor.py +0 -0
  344. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_engine.py +0 -0
  345. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_service.py +0 -0
  346. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/README.md +0 -0
  347. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/__init__.py +0 -0
  348. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  349. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  350. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  351. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  352. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  353. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  354. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  355. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  356. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  357. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  358. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  359. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  360. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/README.md +0 -0
  361. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  362. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  363. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  364. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  365. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  366. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  367. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  368. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/README.md +0 -0
  369. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  370. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/skill.py +0 -0
  371. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/README.md +0 -0
  372. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/__init__.py +0 -0
  373. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/skill.py +0 -0
  374. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  375. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  376. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  377. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  378. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  379. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  380. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  381. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  382. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  383. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/registry.py +0 -0
  384. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/README.md +0 -0
  385. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  386. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  387. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  388. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  389. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  390. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  391. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  392. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/README.md +0 -0
  393. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  394. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  395. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  396. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  397. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  398. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  399. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  400. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/__init__.py +0 -0
  401. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/pom_utils.py +0 -0
  402. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/schema_utils.py +0 -0
  403. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/token_generators.py +0 -0
  404. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/url_validator.py +0 -0
  405. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/validators.py +0 -0
  406. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/__init__.py +0 -0
  407. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/web_service.py +0 -0
  408. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  409. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  410. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  411. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  412. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tests/test_examples.py +0 -0
  413. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tests/test_mcp_integration.py +0 -0
  414. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/.env.example +0 -0
  415. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/Dockerfile +0 -0
  416. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/Dockerfile.multi +0 -0
  417. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/docker-compose.yml +0 -0
  418. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/fred.py +0 -0
  419. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/fred.sh +0 -0
  420. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/requirements.txt +0 -0
  421. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/01-introduction.md +0 -0
  422. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/02-setup.md +0 -0
  423. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/03-basic-agent.md +0 -0
  424. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/04-wikipedia-skill.md +0 -0
  425. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/05-custom-functions.md +0 -0
  426. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/06-running-testing.md +0 -0
  427. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/README.md +0 -0
  428. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/appendix-complete-code.md +0 -0
  429. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/appendix-docker-deployment.md +0 -0
  430. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/.env.example +0 -0
  431. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/.gitignore +0 -0
  432. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/Dockerfile +0 -0
  433. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/check_docs.py +0 -0
  434. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/handlers.py +0 -0
  435. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/penny.py +0 -0
  436. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/penny.sh +0 -0
  437. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/requirements.txt +0 -0
  438. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/reservations.py +0 -0
  439. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/test_penny.py +0 -0
  440. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/01-why-guardrails.md +0 -0
  441. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/02-design-first.md +0 -0
  442. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/03-rules-first.md +0 -0
  443. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/04-the-shell.md +0 -0
  444. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/05-steps-and-scoping.md +0 -0
  445. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/06-tools-that-decide.md +0 -0
  446. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/07-gather-and-projection.md +0 -0
  447. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/08-the-verification-gate.md +0 -0
  448. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/09-people-and-endings.md +0 -0
  449. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/10-testing-and-running.md +0 -0
  450. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/README.md +0 -0
  451. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-complete-code.md +0 -0
  452. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-deployment.md +0 -0
  453. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-technique-map.md +0 -0
  454. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/workflow.py +0 -0
  455. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/README.md +0 -0
  456. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson1_first_agent.md +0 -0
  457. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson2_knowledge_bases.md +0 -0
  458. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson3_multi_agent_systems.md +0 -0
  459. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson4_advanced_features.md +0 -0
  460. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson5_extending_agents.md +0 -0
  461. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/pc_builder.py +0 -0
  462. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_agent.py +0 -0
  463. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_agent_with_search.py +0 -0
  464. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_knowledge.md +0 -0
  465. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_knowledge.swsearch +0 -0
  466. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/support_knowledge.md +0 -0
  467. {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/support_knowledge.swsearch +0 -0
@@ -5,8 +5,9 @@
5
5
  Webhook signatures and SWAIG tokens are now enforced on every path, including
6
6
  serverless. Skills that fetch URLs no longer reach internal addresses through
7
7
  redirects, the agent's `/mcp` endpoint requires basic auth, and `async def`
8
- tool handlers run. The package now installs its documentation, and
9
- `sw-pydocs` prints it.
8
+ tool handlers run. Synchronous handlers and callbacks run in worker threads,
9
+ so a slow one no longer holds up every other call. The package now installs
10
+ its documentation, and `sw-pydocs` prints it.
10
11
 
11
12
  ### Added
12
13
  - `sw-pydocs`: the SDK's documentation for the installed version, for people
@@ -22,6 +23,31 @@ tool handlers run. The package now installs its documentation, and
22
23
  - The package's `llms.txt` lists the installed docs.
23
24
 
24
25
  ### Changed
26
+ - The web server runs synchronous user code in a worker thread, from AnyIO's
27
+ thread pool (40 threads by default), instead of on its event loop: `def`
28
+ tool handlers, the per-request configuration callback and the render of the
29
+ copy it configures, routing callbacks, `on_summary`, the debug event handler
30
+ and tools called through `/mcp`. Before, a handler that waited on an API or
31
+ a database held up every other request on the server, including other
32
+ calls' SWML. The context variables that code sets are applied to the
33
+ request's context when it returns, so they still reach the request's later
34
+ steps, such as the configuration callback's to the tool. `async def`
35
+ handlers are still awaited directly on the event loop, without a worker
36
+ thread.
37
+ An `on_swml_request` override (including `InfoGathererAgent`'s question
38
+ callback) and the render of the agent's own document stay on the event
39
+ loop too, as do a plain `SWMLService`'s `on_request` and render. Set
40
+ `SWML_SYNC_HANDLERS_INLINE=true` to run everything on the event loop, as
41
+ before.
42
+ - With a per-request configuration callback set, a tool handler that's a
43
+ method of the agent (an `@AgentBase.tool` method, or `self.method` passed to
44
+ `define_tool()`, or a partial of one) runs with `self` as that request's
45
+ configured copy, as `on_summary` already did. It used to run on the
46
+ original agent, so it couldn't see what the callback configured. Tools
47
+ called through `/mcp` don't use the callback and still run on the agent.
48
+ - The per-request copy starts with the skills the agent loaded, instead of
49
+ loading each one again, which ran every skill's `setup()` on every
50
+ request and left the copy's skill list empty.
25
51
  - Importing `signalwire.cli` no longer imports `swaig-test`, so the SDK's other
26
52
  commands start about 0.8 seconds sooner.
27
53
 
@@ -164,6 +190,15 @@ tool handlers run. The package now installs its documentation, and
164
190
  `schema.json` without `SWML_SCHEMA_PATH`.
165
191
  - The MCP gateway's Docker image builds and runs, and Compose passes its
166
192
  defaults instead of empty strings for unset variables.
193
+ - The per-request copy of an agent shared the agent's SWML document until its
194
+ render, so a verb method such as `play()` called on the copy in the
195
+ per-request callback added the verb to the agent's own document. The copy
196
+ now starts with its own.
197
+ - `add_mcp_server()` in the per-request callback added the server to the
198
+ agent's own list, so every call added another, and later calls saw them
199
+ all. The copy now has its own list, as it does for SIP usernames.
200
+ - The spider skill's page cache could raise `KeyError` when two fetches ran
201
+ at once, which they now can. It's locked.
167
202
 
168
203
  ### Deprecated
169
204
  - `keyword_weight` (`SearchEngine.search()`, the pgvector backend,
@@ -201,6 +236,21 @@ tool handlers run. The package now installs its documentation, and
201
236
  Set `auth_password` (or `MCP_AUTH_PASSWORD`) to accept other connections.
202
237
  Compose now requires `MCP_AUTH_PASSWORD`, and the sample configuration,
203
238
  Compose file and scripts use port 8080, the code's default, instead of 8100.
239
+ - With a per-request configuration callback set, a tool method's `self` is
240
+ the request's copy of the agent. A method that kept state across calls by
241
+ assigning an attribute (`self.count += 1`) now assigns it on the copy, and
242
+ the value is gone after the request. Keep that state in an object the
243
+ agent already holds, or in your own storage.
244
+ - Synchronous tool handlers and callbacks can now run at the same time as each
245
+ other. Guard state they share, such as a module-level dictionary, with a
246
+ `threading.Lock`, and don't share one `sqlite3` connection between them.
247
+ A synchronous handler no longer runs on the event loop, so
248
+ `asyncio.create_task()`, `asyncio.get_running_loop()` and similar calls in
249
+ it raise `RuntimeError`; make such a handler `async def`.
250
+ Without a per-request configuration callback, a handler that's a method of
251
+ the agent runs with `self` as the agent every call shares. Setting
252
+ `SWML_SYNC_HANDLERS_INLINE=true` restores the previous behavior while you
253
+ check.
204
254
  - The MCP gateway's Docker image installs `signalwire-sdk` from PyPI (pin one
205
255
  with `--build-arg SDK_VERSION=x.y.z`), so it gets these fixes only from a
206
256
  release that includes them.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.4.3.dev118
3
+ Version: 3.4.3.dev119
4
4
  Summary: SignalWire SDK for AI voice agents, live call control (RELAY) and REST. Run sw-pydocs for its documentation.
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -331,6 +331,21 @@ def get_weather(self, args, raw_data):
331
331
 
332
332
  A handler can also be an `async def` function, so it can await other asynchronous calls. When the agent serves `/swaig`, the SDK awaits the handler on the request's event loop. In serverless deployments and in `swaig-test`, it runs the handler to completion.
333
333
 
334
+ #### Handlers and Concurrency
335
+
336
+ The agent's web server handles every call on one event loop. A plain `def` handler, such as one that calls an API with `requests`, runs in a worker thread, so a slow handler on one call doesn't hold up the others. The same is true of the per-request configuration callback, routing callbacks, `on_summary`, the debug event handler and tools called through `/mcp`. The threads come from AnyIO's thread pool, the one FastAPI uses for `def` routes, which runs 40 at a time by default. An `async def` handler runs on the event loop, so it must not block it: await asynchronous calls instead.
337
+
338
+ Because handlers for different calls can run at the same time, treat anything they share as shared between threads:
339
+
340
+ - A handler that's a method of your agent, such as one defined with `@AgentBase.tool` or passed to `define_tool()` as `self.method`, runs with `self` as the agent, which every call shares. With a per-request configuration callback set, a tool call from SignalWire runs the method on that request's copy instead, so `self` sees what the callback configured, and an attribute it assigns stays on the copy. A function that captures the agent in a closure always sees the shared agent, and so does a tool called through `/mcp`, which doesn't use the callback. Don't change the shared agent's configuration from a handler; return a `FunctionResult` with actions, such as `update_global_data()`, to change the call instead.
341
+ - Protect module-level or instance state that handlers change, such as a dictionary of orders by call ID, with a `threading.Lock`, or keep it in a database.
342
+ - Open a database connection in the handler, or use a pool. A `sqlite3` connection opened in one thread can't be used from another.
343
+ - A plain `def` handler has no running event loop, so `asyncio.create_task()`, `asyncio.get_running_loop()` and similar calls raise `RuntimeError` there. Make a handler that needs the loop `async def`.
344
+
345
+ An `on_swml_request` override still runs on the event loop, because it can change the agent just before the agent's own document is rendered. So does `InfoGathererAgent`'s question callback, which its `on_swml_request` calls. Keep them fast, or do per-request work in the per-request configuration callback instead.
346
+
347
+ Set `SWML_SYNC_HANDLERS_INLINE=true` to run synchronous handlers and callbacks on the event loop instead, one at a time, as earlier releases did. The serverless entry points call handlers directly, as before.
348
+
334
349
  ### 2. External Webhook Functions
335
350
 
336
351
  External webhook functions allow you to delegate function execution to external services instead of handling them locally. This is useful when you want to:
@@ -1389,7 +1404,9 @@ The callback function receives four parameters:
1389
1404
 
1390
1405
  ### Dynamic Configuration Methods
1391
1406
 
1392
- The `agent` parameter in your callback is a copy of the agent made for this request, so you can use all the same configuration methods you would use during initialization, and the changes apply to this request only. The configuration the SDK manages, such as the prompt, tools, skills, languages, parameters, hints and global data, is copied. Other attributes, such as ones your own class adds, are shared with the agent and with other requests: assign a new value to one rather than changing the shared object in place, and keep per-caller state in global data or your own storage.
1407
+ The `agent` parameter in your callback is a copy of the agent made for this request, so you can use all the same configuration methods you would use during initialization, and the changes apply to this request only. The configuration the SDK manages, such as the prompt, tools, skills, languages, parameters, hints, global data and MCP servers, is copied. Other attributes, such as ones your own class adds, are shared with the agent and with other requests: assign a new value to one rather than changing the shared object in place, and keep per-caller state in global data or your own storage.
1408
+
1409
+ The callback, and the rendering of the copy it configured, run in a worker thread, so the callback can look up a tenant in a database without holding up other calls. Callbacks for different calls run at the same time, which is why changing a shared object in place is unsafe: two requests can change it at once. See [Handlers and Concurrency](#handlers-and-concurrency).
1393
1410
 
1394
1411
  #### Language Configuration
1395
1412
 
@@ -1207,6 +1207,8 @@ Proxy / request-trust knobs (all default OFF, enable only behind a trusted proxy
1207
1207
  - `SWML_PROXY_DEBUG`: verbose proxy-header resolution logging
1208
1208
 
1209
1209
  Other knobs:
1210
+ - `SWML_SYNC_HANDLERS_INLINE`: run synchronous tool handlers and callbacks on the
1211
+ event loop, one at a time, instead of in worker threads (`1`/`true`/`yes`)
1210
1212
  - `SWML_SKIP_SCHEMA_VALIDATION`: skip SWML schema validation (`1`), for debugging only
1211
1213
  - `SIGNALWIRE_LOG_FORMAT`: log renderer, `console` (default) or `json`
1212
1214
  - `SIGNALWIRE_SPACE_NAME`: default space name used by `sw-agent-init` scaffolding
@@ -294,7 +294,7 @@ Handlers typically receive full SWAIG data in `raw_data` and can access `raw_dat
294
294
 
295
295
  `define_tool` supports explicit schemas and a handler receiving `(args, raw_data)`. Type-hinted decorators can infer schemas, but inspect the result instead of assuming the decorator knows your policy. Use narrow inputs, explicit required fields, and backend validation. The registered tool name and the Python handler name may differ. [S05]
296
296
 
297
- A handler can be `async def`; the SDK awaits it on the request's event loop. A plain `def` handler runs on that loop too, so move slow blocking work, such as a database call that can wait on a lock, off the loop. [S27]
297
+ A handler can be `async def`; the SDK awaits it on the request's event loop, so it must not block. At this guide's baseline, a plain `def` handler runs on that loop too, so move slow blocking work, such as a database call that can wait on a lock, off the loop. Later code runs a plain `def` handler in a worker thread instead, so a slow one doesn't hold up other calls, but handlers for different calls can then run at the same time: protect state they share, and don't share one `sqlite3` connection between threads. `SWML_SYNC_HANDLERS_INLINE=true` restores the baseline's behavior. [S27]
298
298
 
299
299
  **Verify:** malformed values, omitted required fields, unexpected fields, tenant mismatch, stale state, replay, and backend failures. Descriptions help the model use a tool; they do not validate its inputs. Avoid returning stack traces, credentials, full records, or untrusted instructions as a tool prompt.
300
300
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire-sdk"
7
- version = "3.4.3.dev118"
7
+ version = "3.4.3.dev119"
8
8
  description = "SignalWire SDK for AI voice agents, live call control (RELAY) and REST. Run sw-pydocs for its documentation."
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -58,7 +58,7 @@ if TYPE_CHECKING:
58
58
  from signalwire.utils.schema_utils import SchemaValidationError
59
59
  from signalwire.web import WebService
60
60
 
61
- __version__ = "3.4.3.dev118"
61
+ __version__ = "3.4.3.dev119"
62
62
 
63
63
  # §6.2-python (owner decision: NO packaging split — one package, all deps required;
64
64
  # 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.3.dev118",
71
+ version="3.4.3.dev119",
72
72
  redirect_slashes=False,
73
73
  docs_url=None,
74
74
  redoc_url=None,
@@ -133,7 +133,8 @@ existing FastAPI app.
133
133
 
134
134
  Per-call configuration: `set_dynamic_config_callback()` configures a copy of
135
135
  the agent for each request, from its query parameters, body and headers, for
136
- per-tenant prompts, voices and tools. Don't keep per-caller state on the
136
+ per-tenant prompts, voices and tools. The callback runs in a worker thread,
137
+ at the same time as other calls' callbacks. Don't keep per-caller state on the
137
138
  shared agent instance.
138
139
 
139
140
  Configuration precedence: constructor arguments, then the config file, then
@@ -231,8 +232,10 @@ _TOOLS = Topic(
231
232
  summary="Functions the model can call, and what they return",
232
233
  body="""\
233
234
  A tool is a function the model can ask to call. SignalWire sends the call to
234
- the agent's `/swaig` endpoint, and the SDK runs your handler. Handlers can be
235
- `async def`.
235
+ the agent's `/swaig` endpoint, and the SDK runs your handler. A plain `def`
236
+ handler runs in a worker thread, so handlers for different calls run at the
237
+ same time: guard state they share. An `async def` handler runs on the event
238
+ loop and must not block it.
236
239
 
237
240
  Declare a tool with type hints, and the SDK builds its schema. The docstring's
238
241
  summary is the tool's description, and its `Args:` describe the parameters:
@@ -0,0 +1,113 @@
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
+ Run synchronous user code off the event loop.
10
+
11
+ The web server's endpoints are async and share one event loop. Synchronous
12
+ user code called directly on that loop, such as a tool handler that makes an
13
+ HTTP request, blocks every other request, on every call, until it returns.
14
+ The endpoints call that code through ``run_sync_handler``, which runs it in a
15
+ worker thread from AnyIO's thread pool, the pool FastAPI uses for ``def``
16
+ routes. That pool runs 40 threads at a time by default.
17
+
18
+ The code runs in the worker's copy of the request's context, as for a
19
+ ``def`` route, and the context variables it sets are applied to the request's
20
+ context when it returns. So a variable one step sets reaches the request's
21
+ later steps, such as the per-request configuration callback's to the tool
22
+ handler, as it did when every step ran inline.
23
+
24
+ An ``async def`` handler runs on the event loop, awaited directly, and needs
25
+ no worker thread. When an endpoint can't tell a handler is async, calling it
26
+ in the thread only creates its coroutine, which the endpoint then awaits.
27
+
28
+ Setting ``SWML_SYNC_HANDLERS_INLINE`` to ``1``, ``true`` or ``yes`` calls the
29
+ code on the event loop instead, as earlier releases did.
30
+ """
31
+
32
+ import contextvars
33
+ import functools
34
+ import inspect
35
+ import os
36
+ from collections.abc import Callable
37
+ from typing import Any, ParamSpec, TypeVar
38
+
39
+ from starlette.concurrency import run_in_threadpool
40
+
41
+ _P = ParamSpec("_P")
42
+ _T = TypeVar("_T")
43
+ _UNSET = object()
44
+
45
+
46
+ def sync_handlers_inline() -> bool:
47
+ """True when ``SWML_SYNC_HANDLERS_INLINE`` asks for the event loop."""
48
+ return os.getenv("SWML_SYNC_HANDLERS_INLINE", "").lower() in ("1", "true", "yes")
49
+
50
+
51
+ def is_async_callable(obj: object) -> bool:
52
+ """True for an ``async def`` function or method, a partial of one, or an
53
+ object whose ``__call__`` is ``async def``: calling it only creates a
54
+ coroutine."""
55
+ while isinstance(obj, functools.partial):
56
+ obj = obj.func
57
+ if inspect.iscoroutinefunction(obj):
58
+ return True
59
+ # An instance of a class whose __call__ is async def
60
+ return callable(obj) and inspect.iscoroutinefunction(type(obj).__call__)
61
+
62
+
63
+ async def run_sync_handler(
64
+ func: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs
65
+ ) -> _T:
66
+ """Call ``func`` in a worker thread, or inline when so configured.
67
+
68
+ ``func`` sees the caller's context variables, such as the per-request
69
+ proxy URL and structlog's bound context. The ones it sets, even if it
70
+ then raises, are set in the caller's context once it finishes, as they
71
+ would have been had it run inline. If the caller is cancelled first, they
72
+ aren't.
73
+ """
74
+ if sync_handlers_inline():
75
+ return func(*args, **kwargs)
76
+ changes = _Changes()
77
+ try:
78
+ return await run_in_threadpool(
79
+ functools.partial(_recording_changes, changes, func, *args, **kwargs)
80
+ )
81
+ finally:
82
+ if changes.complete:
83
+ for var, value in changes.values:
84
+ var.set(value)
85
+
86
+
87
+ class _Changes:
88
+ """The context variables a function set in its worker thread."""
89
+
90
+ def __init__(self) -> None:
91
+ self.values: list[tuple[contextvars.ContextVar[Any], Any]] = []
92
+ # Set last, once values is final
93
+ self.complete = False
94
+
95
+
96
+ def _recording_changes(
97
+ changes: _Changes, func: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs
98
+ ) -> _T:
99
+ """Call ``func``, and record in ``changes`` the context variables it sets.
100
+
101
+ It runs in the worker's context, where the thread pool has already made
102
+ its own settings, so only what ``func`` itself changes is recorded.
103
+ """
104
+ before = contextvars.copy_context()
105
+ try:
106
+ return func(*args, **kwargs)
107
+ finally:
108
+ changes.values = [
109
+ (var, value)
110
+ for var, value in contextvars.copy_context().items()
111
+ if before.get(var, _UNSET) is not value
112
+ ]
113
+ changes.complete = True
@@ -287,14 +287,33 @@ def create_typed_handler_wrapper(
287
287
  A wrapper function with signature (args, raw_data).
288
288
  """
289
289
 
290
- def wrapper(args: dict[str, Any], raw_data: dict[str, Any] | None) -> Any:
291
- if has_raw_data:
292
- return func(raw_data=raw_data, **args)
293
- return func(**args)
290
+ wrapper: Callable[..., Any]
291
+ if inspect.iscoroutinefunction(func):
292
+ # An async wrapper, so the dispatcher can tell the handler is async
293
+ # and await it on the event loop without a worker thread.
294
+ async def async_wrapper(
295
+ args: dict[str, Any], raw_data: dict[str, Any] | None
296
+ ) -> Any:
297
+ if has_raw_data:
298
+ return await func(raw_data=raw_data, **args)
299
+ return await func(**args)
300
+
301
+ wrapper = async_wrapper
302
+ else:
303
+
304
+ def sync_wrapper(args: dict[str, Any], raw_data: dict[str, Any] | None) -> Any:
305
+ if has_raw_data:
306
+ return func(raw_data=raw_data, **args)
307
+ return func(**args)
308
+
309
+ wrapper = sync_wrapper
294
310
 
295
311
  # Preserve original function metadata for debugging
296
312
  wrapper.__name__ = getattr(func, "__name__", "typed_handler")
297
313
  wrapper.__doc__ = getattr(func, "__doc__", None)
298
- wrapper.__wrapped__ = func # type: ignore[attr-defined] # standard functools __wrapped__ convention
314
+ wrapper.__wrapped__ = func # type: ignore[union-attr] # standard functools __wrapped__ convention
315
+ # Marks the SDK's own wrapper, so a per-request copy of the agent can
316
+ # rebuild it around a method bound to the copy
317
+ wrapper._typed_has_raw_data = has_raw_data # type: ignore[union-attr] # marker attribute on a function
299
318
 
300
319
  return wrapper
@@ -13,6 +13,7 @@ The SDK's installed documentation covers this module: run ``sw-pydocs agents``,
13
13
  """
14
14
 
15
15
  import contextlib
16
+ import copy
16
17
  import functools
17
18
  import inspect
18
19
  import logging
@@ -20,6 +21,7 @@ import os
20
21
  import json
21
22
  import uuid
22
23
  import re
24
+ import types
23
25
  from typing import (
24
26
  Any,
25
27
  ClassVar,
@@ -112,6 +114,56 @@ def _record_explicit_args(init: Callable[_P, None]) -> Callable[_P, None]:
112
114
  return wrapper
113
115
 
114
116
 
117
+ def _bound_to(function: Any, original: object, ephemeral: object) -> Any:
118
+ """``function``, with its handler bound to ``ephemeral`` if it's bound to ``original``."""
119
+ rebound = _rebound(getattr(function, "handler", None), original, ephemeral)
120
+ if rebound is None:
121
+ return function
122
+ function = copy.copy(function)
123
+ function.handler = rebound
124
+ return function
125
+
126
+
127
+ def _rebound(handler: Any, original: object, ephemeral: object) -> Any:
128
+ """``handler`` bound to ``ephemeral``, or None if it isn't bound to ``original``.
129
+
130
+ Covers a method of ``original``, a partial of one, and the SDK's typed
131
+ wrapper around one. A function that captures ``original`` in a closure
132
+ can't be rebound.
133
+ """
134
+ if isinstance(handler, types.MethodType) and handler.__self__ is original:
135
+ return types.MethodType(handler.__func__, ephemeral)
136
+ if isinstance(handler, functools.partial):
137
+ inner = _rebound(handler.func, original, ephemeral)
138
+ if inner is None:
139
+ return None
140
+ return functools.partial(inner, *handler.args, **handler.keywords)
141
+ has_raw_data = getattr(handler, "_typed_has_raw_data", None)
142
+ if has_raw_data is not None:
143
+ inner = _rebound(getattr(handler, "__wrapped__", None), original, ephemeral)
144
+ if inner is None:
145
+ return None
146
+ from signalwire.core.agent.tools.type_inference import (
147
+ create_typed_handler_wrapper,
148
+ )
149
+
150
+ return create_typed_handler_wrapper(inner, has_raw_data)
151
+ return None
152
+
153
+
154
+ def _slot_names(klass: type) -> list[str]:
155
+ """The attribute names ``klass``'s own ``__slots__`` declares, as stored."""
156
+ slots = klass.__dict__.get("__slots__", ())
157
+ names = []
158
+ for slot in (slots,) if isinstance(slots, str) else slots:
159
+ if slot in ("__dict__", "__weakref__"):
160
+ continue
161
+ if slot.startswith("__") and not slot.endswith("__"):
162
+ slot = f"_{klass.__name__.lstrip('_')}{slot}" # name mangling
163
+ names.append(slot)
164
+ return names
165
+
166
+
115
167
  class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/_proxy_url_base override SWMLService/ServerlessMixin's by MRO order; mypy flags the base-vs-base shape diff but the resolution is deliberate
116
168
  AuthMixin,
117
169
  WebMixin,
@@ -1587,6 +1639,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1587
1639
  self.log.debug("swml_rendered", swml_size=len(swml))
1588
1640
  return Response(content=swml, media_type="application/json")
1589
1641
 
1642
+ def _swaig_configures_per_call(self) -> bool:
1643
+ return self._dynamic_config_callback is not None
1644
+
1590
1645
  def _swaig_pre_dispatch(
1591
1646
  self,
1592
1647
  request: Request,
@@ -1806,11 +1861,13 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1806
1861
  _internal_fillers, _swaig_query_params, _native_functions,
1807
1862
  native_functions, pom, _contexts_builder, _contexts_defined,
1808
1863
  skill_manager, _debug_events_enabled, _debug_events_level,
1809
- _debug_event_handler,
1864
+ _debug_event_handler, _mcp_servers, _sip_usernames,
1865
+ _current_document (a new, empty document; the render rebuilds it),
1810
1866
  _prompt_manager (fresh instance; its _sections, _prompt_text,
1811
1867
  _post_prompt_text and _contexts are copied),
1812
1868
  _tool_registry (fresh instance; its _swaig_functions and
1813
- _tool_instances are copied)
1869
+ _tool_instances are copied, and a tool whose handler is a
1870
+ method of this agent gets a handler bound to the copy)
1814
1871
 
1815
1872
  Anything NOT in that list is the master's own object, shared with
1816
1873
  every other request in flight. The distinction that matters is between
@@ -1824,7 +1881,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1824
1881
  Getting this wrong does not raise. It produces one visitor's data
1825
1882
  appearing in another visitor's prompt, under concurrency, which is why
1826
1883
  the safe set is enumerated here rather than left to be inferred from
1827
- the code below.
1884
+ the code below. The concurrency is real: the web server runs the
1885
+ callback and the copy's render in a worker thread, so copies for
1886
+ different calls are configured at the same time.
1828
1887
 
1829
1888
  Callers who need per-request state of their own should keep it in
1830
1889
  `_global_data` (copied) or rebind a fresh object onto the ephemeral
@@ -1839,9 +1898,24 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1839
1898
  cls = self.__class__
1840
1899
  ephemeral_agent = cls.__new__(cls)
1841
1900
 
1842
- # Copy all attributes as shallow references first
1843
- for key, value in self.__dict__.items():
1901
+ # Copy all attributes as shallow references first. The items are
1902
+ # snapshotted, because this runs in a worker thread while other
1903
+ # requests use the agent.
1904
+ for key, value in list(self.__dict__.items()):
1844
1905
  setattr(ephemeral_agent, key, value)
1906
+ # A subclass's __slots__ attributes aren't in __dict__
1907
+ for klass in cls.__mro__:
1908
+ for slot in _slot_names(klass):
1909
+ try:
1910
+ value = klass.__dict__[slot].__get__(self, klass)
1911
+ except AttributeError:
1912
+ continue # declared but not set
1913
+ klass.__dict__[slot].__set__(ephemeral_agent, value)
1914
+
1915
+ # The copy's own document. Sharing this agent's would let a verb
1916
+ # method called on the copy, such as play(), add to the document
1917
+ # another request is rendering.
1918
+ ephemeral_agent._current_document = ephemeral_agent._create_empty_document()
1845
1919
 
1846
1920
  # Deep copy only the configuration that affects SWML generation
1847
1921
  # These are the parts that dynamic config might modify
@@ -1852,6 +1926,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1852
1926
  ephemeral_agent._pronounce = copy.deepcopy(self._pronounce)
1853
1927
  ephemeral_agent._global_data = copy.deepcopy(self._global_data)
1854
1928
  ephemeral_agent._function_includes = copy.deepcopy(self._function_includes)
1929
+ ephemeral_agent._mcp_servers = copy.deepcopy(self._mcp_servers)
1930
+ if "_sip_usernames" in self.__dict__:
1931
+ ephemeral_agent._sip_usernames = set(self._sip_usernames)
1855
1932
 
1856
1933
  # Deep copy routing callbacks to prevent cross-agent mutation
1857
1934
  if hasattr(self, "_routing_callbacks"):
@@ -1923,12 +2000,15 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1923
2000
 
1924
2001
  # Create new tool registry for the ephemeral agent
1925
2002
  ephemeral_agent._tool_registry = ToolRegistry(ephemeral_agent)
1926
- # Copy the SWAIG functions - we need a shallow copy here because
1927
- # the functions themselves can be shared, we just need a new dict
2003
+ # Copy the SWAIG functions. Most can be shared; one whose handler is
2004
+ # a method of this agent is copied with the handler bound to the
2005
+ # copy, so the handler's self sees what the per-request callback
2006
+ # configured, as on_summary does.
1928
2007
  if hasattr(self._tool_registry, "_swaig_functions"):
1929
- ephemeral_agent._tool_registry._swaig_functions = (
1930
- self._tool_registry._swaig_functions.copy()
1931
- )
2008
+ ephemeral_agent._tool_registry._swaig_functions = {
2009
+ name: _bound_to(function, self, ephemeral_agent)
2010
+ for name, function in self._tool_registry._swaig_functions.items()
2011
+ }
1932
2012
  if hasattr(self._tool_registry, "_tool_instances"):
1933
2013
  ephemeral_agent._tool_registry._tool_instances = ( # type: ignore[attr-defined] # ToolRegistry internal state, guarded by hasattr above
1934
2014
  self._tool_registry._tool_instances.copy()
@@ -1940,25 +2020,11 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
1940
2020
 
1941
2021
  ephemeral_agent.skill_manager = SkillManager(ephemeral_agent)
1942
2022
 
1943
- # Copy any already loaded skills from the original agent
1944
- # This ensures skills loaded during __init__ are available in the ephemeral agent
1945
- if hasattr(self.skill_manager, "loaded_skills"):
1946
- for skill_instance in self.skill_manager.loaded_skills.values():
1947
- # Re-load the skill in the ephemeral agent's context
1948
- # We need to get the skill name and params from the existing instance
1949
- skill_name = skill_instance.SKILL_NAME
1950
- skill_params = getattr(skill_instance, "params", {})
1951
- try:
1952
- if skill_name is not None:
1953
- ephemeral_agent.skill_manager.load_skill(
1954
- skill_name, type(skill_instance), skill_params
1955
- )
1956
- except Exception as e:
1957
- self.log.warning(
1958
- "failed_to_copy_skill_to_ephemeral",
1959
- skill_name=skill_name,
1960
- error=str(e),
1961
- )
2023
+ # The copy starts with the skills this agent has loaded, sharing their
2024
+ # instances. Their tools, hints, prompt sections and global data are
2025
+ # already in the copied configuration. Skills the callback adds load
2026
+ # on the copy only.
2027
+ ephemeral_agent.skill_manager._inherit(self.skill_manager.loaded_skills)
1962
2028
 
1963
2029
  # Re-bind the tool decorator method to the new instance
1964
2030
  ephemeral_agent.tool = ephemeral_agent._tool_decorator # type: ignore[method-assign] # intentional per-instance decorator binding
@@ -13,6 +13,8 @@ import logging
13
13
  from collections.abc import Awaitable
14
14
  from typing import Any
15
15
 
16
+ from signalwire.core._sync_handlers import is_async_callable
17
+
16
18
  logger = logging.getLogger(__name__)
17
19
 
18
20
 
@@ -56,6 +58,15 @@ class MCPServerMixin:
56
58
 
57
59
  return tools
58
60
 
61
+ def _mcp_request_runs_sync_code(self, body: dict[str, Any]) -> bool:
62
+ """True when ``body`` is a tools/call for a synchronous handler."""
63
+ if not isinstance(body, dict) or body.get("method") != "tools/call":
64
+ return False
65
+ params = body.get("params")
66
+ name = params.get("name", "") if isinstance(params, dict) else ""
67
+ tool = self._mcp_tools().get(name)
68
+ return tool is not None and not is_async_callable(tool.handler)
69
+
59
70
  def _handle_mcp_request(
60
71
  self, body: dict[str, Any]
61
72
  ) -> dict[str, Any] | Awaitable[dict[str, Any]]: