signalwire-sdk 3.2.0.dev91__tar.gz → 3.2.0.dev95__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 (250) hide show
  1. {signalwire_sdk-3.2.0.dev91/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.2.0.dev95}/PKG-INFO +1 -2
  2. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/pyproject.toml +1 -2
  3. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/__init__.py +78 -36
  4. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/agent_server.py +10 -2
  5. signalwire_sdk-3.2.0.dev95/signalwire/signalwire/core/__init__.py +59 -0
  6. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/logging_config.py +24 -3
  7. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/web_mixin.py +6 -0
  8. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swml_service.py +6 -0
  9. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/pom/pom_tool.py +33 -14
  10. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/call.py +20 -7
  11. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/client.py +148 -10
  12. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/constants.py +8 -0
  13. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/__init__.py +2 -0
  14. signalwire_sdk-3.2.0.dev95/signalwire/signalwire/rest/_base.py +485 -0
  15. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/_pagination.py +23 -1
  16. signalwire_sdk-3.2.0.dev95/signalwire/signalwire/rest/_request_options.py +159 -0
  17. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/client.py +3 -1
  18. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/addresses.py +2 -2
  19. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/calling.py +2 -2
  20. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +348 -55
  21. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/chat.py +2 -2
  22. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +9 -1
  23. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/datasphere.py +2 -2
  24. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +55 -9
  25. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/fabric.py +2 -2
  26. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +296 -62
  27. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +2 -0
  28. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/imported_numbers.py +2 -2
  29. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/logs.py +2 -2
  30. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +8 -2
  31. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/lookup.py +2 -2
  32. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +2 -0
  33. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +16 -2
  34. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/mfa.py +2 -2
  35. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/number_groups.py +2 -2
  36. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/phone_numbers.py +2 -2
  37. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/project.py +2 -2
  38. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +23 -4
  39. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +22 -4
  40. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/pubsub.py +2 -2
  41. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +9 -1
  42. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/queues.py +2 -2
  43. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/recordings.py +2 -2
  44. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/registry.py +2 -2
  45. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +362 -85
  46. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/short_codes.py +2 -2
  47. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/sip_profile.py +2 -2
  48. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/verified_callers.py +2 -2
  49. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/video.py +2 -2
  50. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +154 -36
  51. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +10 -2
  52. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -2
  53. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +1 -0
  54. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -1
  55. signalwire_sdk-3.2.0.dev91/signalwire/signalwire/core/__init__.py +0 -27
  56. signalwire_sdk-3.2.0.dev91/signalwire/signalwire/rest/_base.py +0 -251
  57. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/LICENSE +0 -0
  58. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/README.md +0 -0
  59. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/man/sw-agent-init.1 +0 -0
  60. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/man/sw-search.1 +0 -0
  61. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/man/swaig-test.1 +0 -0
  62. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/setup.cfg +0 -0
  63. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/setup.py +0 -0
  64. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/agents/bedrock.py +0 -0
  65. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/__init__.py +0 -0
  66. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/build_search.py +0 -0
  67. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/config.py +0 -0
  68. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/core/__init__.py +0 -0
  69. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  70. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  71. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  72. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  73. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/dokku.py +0 -0
  74. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  75. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  76. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  77. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/init_project.py +0 -0
  78. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/output/__init__.py +0 -0
  79. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  80. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  81. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  82. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  83. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  84. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  85. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  86. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/test_swaig.py +0 -0
  87. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/cli/types.py +0 -0
  88. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/_agent_host.py +0 -0
  89. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/__init__.py +0 -0
  90. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  91. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  92. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  93. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  94. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  95. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  96. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  97. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  98. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  99. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  100. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  101. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  102. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/agent_base.py +0 -0
  103. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/auth_handler.py +0 -0
  104. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/config_loader.py +0 -0
  105. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/contexts.py +0 -0
  106. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/data_map.py +0 -0
  107. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/function_result.py +0 -0
  108. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  109. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  110. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  111. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  112. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  113. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  114. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  115. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  116. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  117. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  118. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/pom_builder.py +0 -0
  119. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  120. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security/__init__.py +0 -0
  121. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security/security_utils.py +0 -0
  122. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security/session_manager.py +0 -0
  123. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  124. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  125. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/security_config.py +0 -0
  126. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/skill_base.py +0 -0
  127. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/skill_manager.py +0 -0
  128. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  129. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swaig_function.py +0 -0
  130. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  131. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swml_builder.py +0 -0
  132. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swml_handler.py +0 -0
  133. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swml_renderer.py +0 -0
  134. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  135. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/core/web.py +0 -0
  136. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/livewire/__init__.py +0 -0
  137. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/livewire/plugins.py +0 -0
  138. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  139. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  140. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  141. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  142. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/pom/__init__.py +0 -0
  143. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/pom/pom.py +0 -0
  144. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/__init__.py +0 -0
  145. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/concierge.py +0 -0
  146. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  147. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  148. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  149. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/prefabs/survey.py +0 -0
  150. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/py.typed +0 -0
  151. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/__init__.py +0 -0
  152. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/event.py +0 -0
  153. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/message.py +0 -0
  154. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  155. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/call_handler.py +0 -0
  156. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  157. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  158. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  159. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  160. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  161. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  162. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  163. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  164. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  165. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  166. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  167. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  168. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  169. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  170. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  171. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  172. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  173. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/schema.json +0 -0
  174. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/__init__.py +0 -0
  175. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/document_processor.py +0 -0
  176. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/index_builder.py +0 -0
  177. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/migration.py +0 -0
  178. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/models.py +0 -0
  179. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  180. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/query_processor.py +0 -0
  181. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/search_engine.py +0 -0
  182. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/search/search_service.py +0 -0
  183. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/README.md +0 -0
  184. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/__init__.py +0 -0
  185. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  186. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  187. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  188. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  189. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  190. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  191. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  192. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  193. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  194. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  195. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  196. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  197. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datetime/README.md +0 -0
  198. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  199. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  200. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  201. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  202. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  203. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  204. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  205. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/joke/README.md +0 -0
  206. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  207. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/joke/skill.py +0 -0
  208. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/math/README.md +0 -0
  209. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/math/__init__.py +0 -0
  210. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/math/skill.py +0 -0
  211. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  212. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  213. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  214. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  215. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  216. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  217. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  218. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  219. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  220. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/registry.py +0 -0
  221. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/spider/README.md +0 -0
  222. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  223. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/spider/skill.py +0 -0
  224. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  225. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  226. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  227. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  228. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  229. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  230. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/web_search/README.md +0 -0
  231. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  232. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  233. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  234. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  235. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  236. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  237. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  238. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/__init__.py +0 -0
  239. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/pom_utils.py +0 -0
  240. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/schema_utils.py +0 -0
  241. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/token_generators.py +0 -0
  242. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/url_validator.py +0 -0
  243. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/utils/validators.py +0 -0
  244. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/web/__init__.py +0 -0
  245. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire/web/web_service.py +0 -0
  246. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  247. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  248. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  249. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/tests/test_examples.py +0 -0
  250. {signalwire_sdk-3.2.0.dev91 → signalwire_sdk-3.2.0.dev95}/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.dev91
3
+ Version: 3.2.0.dev95
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -21,7 +21,6 @@ Requires-Dist: fastapi>=0.115.12
21
21
  Requires-Dist: pydantic>=2.11.4
22
22
  Requires-Dist: PyYAML>=6.0.2
23
23
  Requires-Dist: Requests>=2.32.4
24
- Requires-Dist: docopt>=0.6.2
25
24
  Requires-Dist: structlog>=25.3.0
26
25
  Requires-Dist: uvicorn>=0.34.2
27
26
  Requires-Dist: beautifulsoup4>=4.12.3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire-sdk"
7
- version = "3.2.0.dev91"
7
+ version = "3.2.0.dev95"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -28,7 +28,6 @@ dependencies = [
28
28
  "pydantic>=2.11.4",
29
29
  "PyYAML>=6.0.2",
30
30
  "Requests>=2.32.4",
31
- "docopt>=0.6.2",
32
31
  "structlog>=25.3.0",
33
32
  "uvicorn>=0.34.2",
34
33
  "beautifulsoup4>=4.12.3",
@@ -14,48 +14,90 @@ A package for building AI agents using SignalWire's AI and SWML capabilities.
14
14
 
15
15
  from typing import TYPE_CHECKING, Any
16
16
 
17
- # Configure logging before any other imports to ensure early initialization
18
- from .core.logging_config import configure_logging
17
+ # Library-safe logging: importing signalwire installs ONLY a NullHandler on the
18
+ # `signalwire` namespace logger (done at logging_config module load). It does NOT
19
+ # configure global logging — that would hijack the host application's logging (its
20
+ # structlog config, its root/generic-named loggers). The app opts in to SDK log
21
+ # OUTPUT by calling configure_logging() explicitly; the server/CLI entry points do.
22
+ from .core.logging_config import configure_logging # noqa: F401 (re-exported)
19
23
 
20
24
  if TYPE_CHECKING:
21
25
  from signalwire.rest.client import RestClient as _RestClient
22
26
  from signalwire.core.skill_base import SkillBase
23
27
  from signalwire.skills.registry import SkillRegistry
24
28
 
25
- configure_logging()
26
-
27
- __version__ = "3.2.0.dev91"
28
-
29
- # Import core classes for easier access.
30
- # These imports are intentionally placed after configure_logging() so the SDK's
31
- # logging is initialized before any submodule is imported (E402 expected).
32
- from .core.agent_base import AgentBase # noqa: E402
33
- from .core.contexts import ( # noqa: E402
34
- ContextBuilder,
35
- Context,
36
- Step,
37
- GatherInfo,
38
- GatherQuestion,
39
- create_simple_context,
40
- )
41
- from .core.data_map import ( # noqa: E402
42
- DataMap,
43
- create_simple_api_tool,
44
- create_expression_tool,
45
- )
46
- from signalwire.agent_server import AgentServer # noqa: E402
47
- from signalwire.core.swml_service import SWMLService # noqa: E402
48
- from signalwire.core.swml_builder import SWMLBuilder # noqa: E402
49
- from signalwire.core.function_result import ( # noqa: E402
50
- FunctionResult,
51
- SwaigFunctionResult,
52
- )
53
- from signalwire.core.swaig_function import SWAIGFunction # noqa: E402
54
- from signalwire.agents.bedrock import BedrockAgent # noqa: E402
55
- from signalwire.utils.schema_utils import SchemaValidationError # noqa: E402
56
-
57
- # Import WebService for static file serving
58
- from signalwire.web import WebService # noqa: E402
29
+ # §6.2-python: the public symbols are LAZY at runtime (PEP 562, below) so
30
+ # `import signalwire` doesn't drag FastAPI/uvicorn/pydantic at import time; the
31
+ # eager imports here keep type checkers and IDEs fully aware of the real types.
32
+ from signalwire.core.agent_base import AgentBase
33
+ from signalwire.core.contexts import (
34
+ ContextBuilder,
35
+ Context,
36
+ Step,
37
+ GatherInfo,
38
+ GatherQuestion,
39
+ create_simple_context,
40
+ )
41
+ from signalwire.core.data_map import (
42
+ DataMap,
43
+ create_simple_api_tool,
44
+ create_expression_tool,
45
+ )
46
+ from signalwire.agent_server import AgentServer
47
+ from signalwire.core.swml_service import SWMLService
48
+ from signalwire.core.swml_builder import SWMLBuilder
49
+ from signalwire.core.function_result import FunctionResult, SwaigFunctionResult
50
+ from signalwire.core.swaig_function import SWAIGFunction
51
+ from signalwire.agents.bedrock import BedrockAgent
52
+ from signalwire.utils.schema_utils import SchemaValidationError
53
+ from signalwire.web import WebService
54
+
55
+ __version__ = "3.2.0.dev95"
56
+
57
+ # §6.2-python (owner decision: NO packaging split — one package, all deps required;
58
+ # IMPORT-TIME behavior only): the agent/web symbols are lazy-imported via module
59
+ # __getattr__ (PEP 562) so `import signalwire` no longer drags FastAPI / uvicorn /
60
+ # starlette / pydantic into every process — a REST-only script imports in
61
+ # milliseconds. First ATTRIBUTE ACCESS (signalwire.AgentBase,
62
+ # `from signalwire import AgentBase`) triggers the real import and caches it on the
63
+ # module, so the public surface is byte-identical to the old eager form.
64
+ _LAZY_IMPORTS: dict[str, tuple[str, str]] = {
65
+ "AgentBase": ("signalwire.core.agent_base", "AgentBase"),
66
+ "ContextBuilder": ("signalwire.core.contexts", "ContextBuilder"),
67
+ "Context": ("signalwire.core.contexts", "Context"),
68
+ "Step": ("signalwire.core.contexts", "Step"),
69
+ "GatherInfo": ("signalwire.core.contexts", "GatherInfo"),
70
+ "GatherQuestion": ("signalwire.core.contexts", "GatherQuestion"),
71
+ "create_simple_context": ("signalwire.core.contexts", "create_simple_context"),
72
+ "DataMap": ("signalwire.core.data_map", "DataMap"),
73
+ "create_simple_api_tool": ("signalwire.core.data_map", "create_simple_api_tool"),
74
+ "create_expression_tool": ("signalwire.core.data_map", "create_expression_tool"),
75
+ "AgentServer": ("signalwire.agent_server", "AgentServer"),
76
+ "SWMLService": ("signalwire.core.swml_service", "SWMLService"),
77
+ "SWMLBuilder": ("signalwire.core.swml_builder", "SWMLBuilder"),
78
+ "FunctionResult": ("signalwire.core.function_result", "FunctionResult"),
79
+ "SwaigFunctionResult": ("signalwire.core.function_result", "SwaigFunctionResult"),
80
+ "SWAIGFunction": ("signalwire.core.swaig_function", "SWAIGFunction"),
81
+ "BedrockAgent": ("signalwire.agents.bedrock", "BedrockAgent"),
82
+ "SchemaValidationError": ("signalwire.utils.schema_utils", "SchemaValidationError"),
83
+ "WebService": ("signalwire.web", "WebService"),
84
+ }
85
+
86
+
87
+ def __getattr__(name: str) -> Any:
88
+ """PEP 562 lazy attribute resolution for the public agent/web symbols."""
89
+ spec = _LAZY_IMPORTS.get(name)
90
+ if spec is None:
91
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
92
+ import importlib
93
+
94
+ value = getattr(importlib.import_module(spec[0]), spec[1])
95
+ globals()[name] = value # cache — subsequent access skips __getattr__
96
+ return value
97
+
98
+
99
+ def __dir__() -> list[str]:
100
+ return sorted(set(globals()) | set(_LAZY_IMPORTS))
59
101
 
60
102
 
61
103
  # Lazy import skills to avoid slow startup for CLI tools
@@ -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.dev91",
71
+ version="3.2.0.dev95",
72
72
  redirect_slashes=False,
73
73
  docs_url=None,
74
74
  redoc_url=None,
@@ -372,7 +372,15 @@ class AgentServer:
372
372
 
373
373
  # Imported lazily here so tests can patch
374
374
  # signalwire.core.logging_config.get_execution_mode at call time.
375
- from signalwire.core.logging_config import get_execution_mode
375
+ from signalwire.core.logging_config import (
376
+ configure_logging,
377
+ get_execution_mode,
378
+ )
379
+
380
+ # Opt-in to SDK logging OUTPUT at the run entry point (import is
381
+ # library-safe / silent; running is where the app wants logs). This also
382
+ # applies the CGI-off / auto detection that configure_logging performs.
383
+ configure_logging()
376
384
 
377
385
  # Detect execution mode
378
386
  mode = get_execution_mode()
@@ -0,0 +1,59 @@
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
+ Core components for SignalWire AI Agents
10
+ """
11
+
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from signalwire.core.agent_base import AgentBase
16
+ from signalwire.core.function_result import FunctionResult
17
+ from signalwire.core.swaig_function import SWAIGFunction
18
+ from signalwire.core.swml_service import SWMLService
19
+ from signalwire.core.swml_handler import SWMLVerbHandler, VerbHandlerRegistry
20
+ from signalwire.core.swml_builder import SWMLBuilder
21
+
22
+ # §6.2-python: lazy (PEP 562) so importing any signalwire.core.* leaf (e.g.
23
+ # logging_config from the package root) doesn't drag AgentBase → FastAPI into every
24
+ # process. First attribute access resolves + caches; public surface unchanged.
25
+ _LAZY_IMPORTS: dict[str, tuple[str, str]] = {
26
+ "AgentBase": ("signalwire.core.agent_base", "AgentBase"),
27
+ "FunctionResult": ("signalwire.core.function_result", "FunctionResult"),
28
+ "SWAIGFunction": ("signalwire.core.swaig_function", "SWAIGFunction"),
29
+ "SWMLService": ("signalwire.core.swml_service", "SWMLService"),
30
+ "SWMLVerbHandler": ("signalwire.core.swml_handler", "SWMLVerbHandler"),
31
+ "VerbHandlerRegistry": ("signalwire.core.swml_handler", "VerbHandlerRegistry"),
32
+ "SWMLBuilder": ("signalwire.core.swml_builder", "SWMLBuilder"),
33
+ }
34
+
35
+
36
+ def __getattr__(name: str) -> Any:
37
+ spec = _LAZY_IMPORTS.get(name)
38
+ if spec is None:
39
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
40
+ import importlib
41
+
42
+ value = getattr(importlib.import_module(spec[0]), spec[1])
43
+ globals()[name] = value
44
+ return value
45
+
46
+
47
+ def __dir__() -> list[str]:
48
+ return sorted(set(globals()) | set(_LAZY_IMPORTS))
49
+
50
+
51
+ __all__ = [
52
+ "AgentBase",
53
+ "FunctionResult",
54
+ "SWAIGFunction",
55
+ "SWMLBuilder",
56
+ "SWMLService",
57
+ "SWMLVerbHandler",
58
+ "VerbHandlerRegistry",
59
+ ]
@@ -43,6 +43,25 @@ def strip_control_chars(
43
43
  _logging_configured = False
44
44
 
45
45
 
46
+ def _install_library_null_handler() -> None:
47
+ """Attach a NullHandler to the ``signalwire`` namespace logger (the standard
48
+ library pattern for a well-behaved library, per the stdlib logging HOWTO).
49
+
50
+ This is the ONLY logging side effect of importing the SDK. It makes the SDK's
51
+ own loggers silent-by-default (no "No handlers could be found" warning) WITHOUT
52
+ touching the root logger, the host application's structlog config, or any
53
+ host-owned logger — so ``import signalwire`` never hijacks the app's logging.
54
+ The app opts in to SDK log OUTPUT by calling ``configure_logging()`` explicitly
55
+ (the server/CLI entry points do this)."""
56
+ sw_logger = logging.getLogger("signalwire")
57
+ if not any(isinstance(h, logging.NullHandler) for h in sw_logger.handlers):
58
+ sw_logger.addHandler(logging.NullHandler())
59
+
60
+
61
+ # Import-time side effect: ONLY the library NullHandler. NOT global configuration.
62
+ _install_library_null_handler()
63
+
64
+
46
65
  def get_execution_mode() -> str:
47
66
  """
48
67
  Determine the execution mode based on environment variables
@@ -307,7 +326,9 @@ def get_logger(name: str) -> Any:
307
326
  Returns:
308
327
  A structlog BoundLogger that supports .bind(), .info(), .debug(), etc.
309
328
  """
310
- # Ensure logging is configured
311
- configure_logging()
312
-
329
+ # Library-safe: do NOT auto-configure global logging here. Every SDK module
330
+ # calls get_logger() at import, so auto-configuring would hijack the host
331
+ # app's logging the moment any SDK submodule is imported. The SDK's own
332
+ # logger carries a NullHandler (installed at module load) so it's silent by
333
+ # default; the app opts in to SDK output via configure_logging().
313
334
  return structlog.get_logger(name)
@@ -204,6 +204,12 @@ class WebMixin(_HostTyped): # type: ignore[misc] # _HostTyped is object at run
204
204
  """
205
205
  import uvicorn
206
206
 
207
+ # Opt-in to SDK logging OUTPUT at the serve entry point (importing the SDK
208
+ # is library-safe / silent; running a server is where the app wants logs).
209
+ from signalwire.core.logging_config import configure_logging
210
+
211
+ configure_logging()
212
+
207
213
  if self._app is None:
208
214
  # Create a FastAPI app with explicit redirect_slashes=False
209
215
  app = FastAPI(
@@ -1200,6 +1200,12 @@ class SWMLService(ToolMixin):
1200
1200
  """
1201
1201
  import uvicorn
1202
1202
 
1203
+ # Opt-in to SDK logging OUTPUT at the serve entry point (import is
1204
+ # library-safe / silent; serving is where the app wants logs).
1205
+ from signalwire.core.logging_config import configure_logging
1206
+
1207
+ configure_logging()
1208
+
1203
1209
  # Store SSL configuration (override environment if explicitly provided)
1204
1210
  if ssl_enabled is not None:
1205
1211
  self.ssl_enabled = ssl_enabled
@@ -13,11 +13,11 @@ Options:
13
13
  --merge_pom=<arg> Merge another POM into a section: "<section name>:<filename>"
14
14
  """
15
15
 
16
+ import argparse
16
17
  import sys
17
18
  import json
18
19
  from pathlib import Path
19
20
  import yaml
20
- from docopt import docopt
21
21
  from signalwire.pom import PromptObjectModel
22
22
 
23
23
 
@@ -82,19 +82,38 @@ def render_pom(pom: "PromptObjectModel", output_format: str) -> str:
82
82
 
83
83
  def main() -> None:
84
84
  """Main entry point for the POM tool."""
85
- args = docopt(__doc__)
86
-
87
- input_file = args["<input_file>"]
88
- output_format = args["--output"] or "md"
89
- output_file = args["--outfile"]
90
- merge_pom = args["--merge_pom"]
91
-
92
- # Validate output format
93
- if output_format not in ["md", "xml", "json", "yaml"]:
94
- print(
95
- f"Error: Invalid output format '{output_format}'. Must be one of: md, xml, json, yaml"
96
- )
97
- sys.exit(1)
85
+ # §6.2-python: argparse (stdlib) replaced the unmaintained docopt — identical CLI
86
+ # surface (same flags/defaults/usage), one fewer dependency.
87
+ parser = argparse.ArgumentParser(
88
+ prog="pom_tool",
89
+ description="POM Tool - work with Prompt Object Model files",
90
+ )
91
+ parser.add_argument("input_file", help="POM file to load (JSON or YAML)")
92
+ parser.add_argument(
93
+ "--output",
94
+ default="md",
95
+ metavar="<format>",
96
+ choices=["md", "xml", "json", "yaml"],
97
+ help="Output format: md, xml, json, yaml [default: md]",
98
+ )
99
+ parser.add_argument(
100
+ "--outfile",
101
+ default=None,
102
+ metavar="<file>",
103
+ help="Output file (if not specified, prints to stdout)",
104
+ )
105
+ parser.add_argument(
106
+ "--merge_pom",
107
+ default=None,
108
+ metavar="<arg>",
109
+ help='Merge another POM into a section: "<section name>:<filename>"',
110
+ )
111
+ ns = parser.parse_args()
112
+
113
+ input_file = ns.input_file
114
+ output_format = ns.output
115
+ output_file = ns.outfile
116
+ merge_pom = ns.merge_pom
98
117
 
99
118
  try:
100
119
  # Load the POM
@@ -112,9 +112,15 @@ class Action:
112
112
  )
113
113
 
114
114
  async def wait(self, timeout: float | None = None) -> RelayEvent:
115
- """Wait for the action to complete. Returns the terminal event."""
115
+ """Wait for the action to complete. Returns the terminal event.
116
+
117
+ Raises ``asyncio.TimeoutError`` if ``timeout`` is exceeded. A timed-out
118
+ wait does NOT poison the action: ``self._done`` is shielded so the
119
+ ``wait_for`` cancellation stops the wait, not the underlying completion
120
+ future — the still-pending terminal event resolves the action normally
121
+ and a subsequent ``wait()`` returns it (mirrors ``Message.wait``)."""
116
122
  if timeout is not None:
117
- return await asyncio.wait_for(self._done, timeout=timeout)
123
+ return await asyncio.wait_for(asyncio.shield(self._done), timeout=timeout)
118
124
  return await self._done
119
125
 
120
126
  @property
@@ -377,9 +383,14 @@ class Call:
377
383
  The outer JSON-RPC method is ``"calling.<method>"`` (e.g.
378
384
  ``"calling.answer"``) with ``node_id`` and ``call_id`` in params.
379
385
 
380
- All server errors are logged gracefully and return an empty dict
381
- rather than raising exceptions. This is an SDK stack traces
382
- from server-side errors should never bubble up to the developer.
386
+ A2 contract (the documented behavior only "call gone" is swallowed):
387
+ a **404** or **410** server error means the call no longer exists, so the
388
+ verb is a no-op and returns ``{}`` (the caller's action can't proceed but
389
+ that isn't an error worth raising). **Every other non-2xx server error
390
+ RAISES** — the previous code swallowed ALL errors carrying a ``code``,
391
+ which hid real failures (auth, bad params, server faults) the developer
392
+ must see. The docstring/contract always promised 404/410-only; the code
393
+ now matches it.
383
394
  """
384
395
  rpc_method = f"calling.{method}"
385
396
  params: dict[str, Any] = {
@@ -392,11 +403,13 @@ class Call:
392
403
  return await self._client.execute(rpc_method, params)
393
404
  except Exception as exc:
394
405
  code = getattr(exc, "code", None)
395
- if code is not None:
406
+ if code in (404, 410):
407
+ # Call gone — swallow per the documented contract, return no-op.
396
408
  logger.warning(
397
- f"Call {self.call_id} error during {method} (code={code}): {exc}"
409
+ f"Call {self.call_id} gone during {method} (code={code}): {exc}"
398
410
  )
399
411
  return {}
412
+ # Any other server error (or a non-coded exception) propagates.
400
413
  raise
401
414
 
402
415
  # ------------------------------------------------------------------