signalwire-sdk 3.0.2.dev70__tar.gz → 3.0.2.dev73__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 (267) hide show
  1. {signalwire_sdk-3.0.2.dev70/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev73}/PKG-INFO +5 -2
  2. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/README.md +4 -1
  3. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/pyproject.toml +25 -8
  4. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/__init__.py +14 -7
  5. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/agent_server.py +34 -18
  6. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/service_loader.py +4 -2
  7. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/test_swaig.py +41 -2
  8. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/_agent_host.py +3 -0
  9. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/prompt/manager.py +4 -4
  10. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/decorator.py +17 -10
  11. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/registry.py +5 -5
  12. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/type_inference.py +16 -11
  13. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent_base.py +113 -14
  14. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/auth_handler.py +7 -5
  15. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/config_loader.py +3 -3
  16. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/contexts.py +2 -2
  17. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/data_map.py +3 -3
  18. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/function_result.py +3 -1
  19. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/logging_config.py +18 -14
  20. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/_mixin_host.py +5 -1
  21. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/ai_config_mixin.py +30 -3
  22. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/auth_mixin.py +8 -7
  23. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +2 -2
  24. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/prompt_mixin.py +7 -4
  25. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/serverless_mixin.py +10 -5
  26. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/skill_mixin.py +1 -1
  27. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/state_mixin.py +1 -1
  28. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/tool_mixin.py +14 -6
  29. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/web_mixin.py +124 -69
  30. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/pom_builder.py +1 -1
  31. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/post_prompt_generated.py +257 -0
  32. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/security_utils.py +8 -3
  33. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/webhook_middleware.py +70 -23
  34. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/webhook_validator.py +3 -3
  35. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security_config.py +16 -12
  36. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/skill_base.py +1 -1
  37. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/skill_manager.py +5 -2
  38. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swaig_actions_generated.py +187 -0
  39. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swaig_function.py +15 -9
  40. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swaig_request_generated.py +50 -0
  41. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_builder.py +42 -13
  42. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_handler.py +4 -4
  43. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_service.py +269 -83
  44. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swml_verbs_generated.py +2004 -0
  45. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/web.py +30 -0
  46. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/gateway_service.py +11 -11
  47. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/pom.py +2 -2
  48. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/pom_tool.py +4 -4
  49. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/concierge.py +6 -2
  50. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/faq_bot.py +6 -2
  51. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/receptionist.py +6 -2
  52. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/survey.py +6 -2
  53. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/py.typed +0 -0
  54. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/call.py +70 -84
  55. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/relay/protocol_types_generated.py +1722 -0
  56. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/__init__.py +1 -1
  57. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/_base.py +202 -0
  58. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/_pagination.py +17 -9
  59. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/call_handler.py +21 -0
  60. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/client.py +63 -0
  61. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +175 -0
  62. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/addresses.py +24 -0
  63. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling.py +24 -0
  64. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +775 -0
  65. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling_types_generated.py +1906 -0
  66. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat.py +24 -0
  67. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +51 -0
  68. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat_types_generated.py +90 -0
  69. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere.py +22 -0
  70. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +120 -0
  71. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +240 -0
  72. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric.py +54 -0
  73. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +1471 -0
  74. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +3672 -0
  75. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +24 -0
  76. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fax_types_generated.py +173 -0
  77. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/imported_numbers.py +24 -0
  78. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs.py +25 -0
  79. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +29 -0
  80. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs_types_generated.py +150 -0
  81. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/lookup.py +24 -0
  82. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/message_resources_generated.py +24 -0
  83. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/message_types_generated.py +167 -0
  84. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/mfa.py +24 -0
  85. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/number_groups.py +24 -0
  86. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/phone_numbers.py +24 -0
  87. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project.py +22 -0
  88. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project_resources_generated.py +70 -0
  89. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project_types_generated.py +101 -0
  90. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub.py +24 -0
  91. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +51 -0
  92. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +101 -0
  93. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/queues.py +24 -0
  94. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/recordings.py +24 -0
  95. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/registry.py +33 -0
  96. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +945 -0
  97. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +1780 -0
  98. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/short_codes.py +24 -0
  99. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/sip_profile.py +24 -0
  100. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +143 -0
  101. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/verified_callers.py +24 -0
  102. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video.py +39 -0
  103. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video_resources_generated.py +491 -0
  104. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video_types_generated.py +746 -0
  105. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +31 -0
  106. signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/voice_types_generated.py +265 -0
  107. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/document_processor.py +4 -3
  108. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/README.md +3 -0
  109. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/google_maps/skill.py +21 -5
  110. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/README.md +2 -0
  111. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/registry.py +8 -4
  112. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/skill.py +6 -3
  113. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/README.md +2 -0
  114. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/__init__.py +1 -5
  115. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/web/web_service.py +3 -3
  116. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73/signalwire/signalwire_sdk.egg-info}/PKG-INFO +5 -2
  117. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +33 -1
  118. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/tests/test_examples.py +29 -28
  119. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/tests/test_mcp_integration.py +19 -18
  120. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/_base.py +0 -117
  121. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/call_handler.py +0 -60
  122. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/client.py +0 -111
  123. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/addresses.py +0 -31
  124. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/calling.py +0 -152
  125. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/chat.py +0 -22
  126. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/compat.py +0 -278
  127. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/datasphere.py +0 -38
  128. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/fabric.py +0 -243
  129. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -22
  130. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/logs.py +0 -62
  131. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/lookup.py +0 -22
  132. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/mfa.py +0 -28
  133. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/number_groups.py +0 -43
  134. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -161
  135. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/project.py +0 -35
  136. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/pubsub.py +0 -22
  137. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/queues.py +0 -30
  138. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/recordings.py +0 -28
  139. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/registry.py +0 -75
  140. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/short_codes.py +0 -28
  141. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -25
  142. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -27
  143. signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/video.py +0 -127
  144. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/LICENSE +0 -0
  145. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/sw-agent-init.1 +0 -0
  146. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/sw-search.1 +0 -0
  147. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/swaig-test.1 +0 -0
  148. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/setup.cfg +0 -0
  149. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/setup.py +0 -0
  150. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/agents/bedrock.py +0 -0
  151. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/__init__.py +0 -0
  152. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/build_search.py +0 -0
  153. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/config.py +0 -0
  154. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/__init__.py +0 -0
  155. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  156. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  157. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  158. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/dokku.py +0 -0
  159. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  160. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  161. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  162. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/init_project.py +0 -0
  163. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/__init__.py +0 -0
  164. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  165. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  166. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  167. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  168. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  169. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  170. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  171. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/types.py +0 -0
  172. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/__init__.py +0 -0
  173. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/__init__.py +0 -0
  174. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  175. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  176. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  177. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  178. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  179. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  180. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  181. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  182. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  183. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/__init__.py +0 -0
  184. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/session_manager.py +0 -0
  185. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_renderer.py +0 -0
  186. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/livewire/__init__.py +0 -0
  187. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/livewire/plugins.py +0 -0
  188. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  189. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  190. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  191. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/__init__.py +0 -0
  192. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/__init__.py +0 -0
  193. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  194. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/__init__.py +0 -0
  195. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/client.py +0 -0
  196. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/constants.py +0 -0
  197. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/event.py +0 -0
  198. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/message.py +0 -0
  199. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  200. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/schema.json +0 -0
  201. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/__init__.py +0 -0
  202. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/index_builder.py +0 -0
  203. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/migration.py +0 -0
  204. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/models.py +0 -0
  205. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  206. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/query_processor.py +0 -0
  207. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/search_engine.py +0 -0
  208. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/search_service.py +0 -0
  209. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/README.md +0 -0
  210. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/__init__.py +0 -0
  211. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  212. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  213. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  214. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  215. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  216. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  217. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  218. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  219. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  220. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  221. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  222. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/README.md +0 -0
  223. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  224. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  225. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  226. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  227. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  228. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  229. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/README.md +0 -0
  230. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  231. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/skill.py +0 -0
  232. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/README.md +0 -0
  233. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/__init__.py +0 -0
  234. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/skill.py +0 -0
  235. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  236. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  237. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  238. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  239. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  240. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  241. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  242. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  243. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/README.md +0 -0
  244. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  245. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  246. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  247. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  248. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  249. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  250. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/README.md +0 -0
  251. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  252. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill.py +0 -0
  253. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  254. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  255. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  256. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  257. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  258. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/pom_utils.py +0 -0
  259. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/schema_utils.py +0 -0
  260. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/token_generators.py +0 -0
  261. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/url_validator.py +0 -0
  262. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/validators.py +0 -0
  263. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/web/__init__.py +0 -0
  264. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  265. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  266. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  267. {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.0.2.dev70
3
+ Version: 3.0.2.dev73
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -138,6 +138,7 @@ pip install signalwire-sdk
138
138
 
139
139
  Each agent is a self-contained microservice that generates [SWML](docs/swml_service_guide.md) (SignalWire Markup Language) and handles [SWAIG](docs/swaig_reference.md) (SignalWire AI Gateway) tool calls. The SignalWire platform runs the entire AI pipeline (STT, LLM, TTS) -- your agent just defines the behavior.
140
140
 
141
+ <!-- include: examples/quickstart_agent.py#agent -->
141
142
  ```python
142
143
  from signalwire import AgentBase
143
144
  from signalwire.core.function_result import FunctionResult
@@ -209,6 +210,7 @@ See [examples/README.md](examples/README.md) for the full list organized by cate
209
210
 
210
211
  Real-time call control and messaging over WebSocket. The RELAY client connects to SignalWire via the Blade protocol and gives you imperative, async control over live phone calls and SMS/MMS.
211
212
 
213
+ <!-- include: examples/quickstart_relay.py#relay -->
212
214
  ```python
213
215
  from signalwire.relay import RelayClient
214
216
 
@@ -237,6 +239,7 @@ See the **[RELAY documentation](relay/README.md)** for the full guide, API refer
237
239
 
238
240
  Synchronous REST client for managing SignalWire resources and controlling calls over HTTP. No WebSocket required.
239
241
 
242
+ <!-- include: examples/quickstart_rest.py#rest -->
240
243
  ```python
241
244
  from signalwire.rest import RestClient
242
245
 
@@ -248,7 +251,7 @@ client.phone_numbers.search(area_code="512")
248
251
  client.datasphere.documents.search(query_string="billing policy")
249
252
  ```
250
253
 
251
- - 21 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Compat (Twilio-compatible), Phone Numbers, SIP, Queues, Recordings, and more
254
+ - 20 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Phone Numbers, SIP, Queues, Recordings, and more
252
255
  - Shared `requests.Session` for connection pooling
253
256
  - Dict returns -- raw JSON, no wrapper objects
254
257
 
@@ -40,6 +40,7 @@ pip install signalwire-sdk
40
40
 
41
41
  Each agent is a self-contained microservice that generates [SWML](docs/swml_service_guide.md) (SignalWire Markup Language) and handles [SWAIG](docs/swaig_reference.md) (SignalWire AI Gateway) tool calls. The SignalWire platform runs the entire AI pipeline (STT, LLM, TTS) -- your agent just defines the behavior.
42
42
 
43
+ <!-- include: examples/quickstart_agent.py#agent -->
43
44
  ```python
44
45
  from signalwire import AgentBase
45
46
  from signalwire.core.function_result import FunctionResult
@@ -111,6 +112,7 @@ See [examples/README.md](examples/README.md) for the full list organized by cate
111
112
 
112
113
  Real-time call control and messaging over WebSocket. The RELAY client connects to SignalWire via the Blade protocol and gives you imperative, async control over live phone calls and SMS/MMS.
113
114
 
115
+ <!-- include: examples/quickstart_relay.py#relay -->
114
116
  ```python
115
117
  from signalwire.relay import RelayClient
116
118
 
@@ -139,6 +141,7 @@ See the **[RELAY documentation](relay/README.md)** for the full guide, API refer
139
141
 
140
142
  Synchronous REST client for managing SignalWire resources and controlling calls over HTTP. No WebSocket required.
141
143
 
144
+ <!-- include: examples/quickstart_rest.py#rest -->
142
145
  ```python
143
146
  from signalwire.rest import RestClient
144
147
 
@@ -150,7 +153,7 @@ client.phone_numbers.search(area_code="512")
150
153
  client.datasphere.documents.search(query_string="billing policy")
151
154
  ```
152
155
 
153
- - 21 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Compat (Twilio-compatible), Phone Numbers, SIP, Queues, Recordings, and more
156
+ - 20 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Phone Numbers, SIP, Queues, Recordings, and more
154
157
  - Shared `requests.Session` for connection pooling
155
158
  - Dict returns -- raw JSON, no wrapper objects
156
159
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire-sdk"
7
- version = "3.0.2.dev70"
7
+ version = "3.0.2.dev73"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -149,6 +149,7 @@ include-package-data = true
149
149
 
150
150
  [tool.setuptools.package-data]
151
151
  signalwire = [
152
+ "py.typed",
152
153
  "schema.json",
153
154
  "**/*.json",
154
155
  "skills/*/README.md",
@@ -182,6 +183,16 @@ select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "R
182
183
  # call) and S607 (partial executable path: git/ssh resolved via PATH, the normal
183
184
  # idiom) are expected and safe across this file.
184
185
  "signalwire/signalwire/cli/dokku.py" = ["S603", "S607"]
186
+ # REST namespace files import spec-generated types under TYPE_CHECKING and use
187
+ # them ONLY inside quoted forward-refs — method return annotations
188
+ # (`-> "RoomResponse"`) and the generic CRUD-base subscript bindings
189
+ # (`class VideoRooms(CrudResource["ListRoomsResponse", "RoomResponse", ...])`).
190
+ # Ruff's F401 cannot see usages inside a class-base subscript's string literals,
191
+ # so it false-positives "unused import" and `--fix` would strip imports that ARE
192
+ # used (breaking mypy). The bindings must stay quoted (a bare name in the base
193
+ # subscript is a runtime NameError under TYPE_CHECKING). Exempt F401 here; mypy +
194
+ # the SIGNATURES/DRIFT gate prove these imports are real and correct.
195
+ "signalwire/signalwire/rest/namespaces/*.py" = ["F401"]
185
196
 
186
197
  [tool.ruff.lint.flake8-bugbear]
187
198
  # FastAPI's dependency-injection idiom puts Depends()/Query()/etc. in argument
@@ -202,16 +213,22 @@ extend-immutable-calls = [
202
213
 
203
214
  [tool.mypy]
204
215
  python_version = "3.10"
205
- files = ["signalwire/signalwire"]
216
+ # Both the source tree AND the test suite are in scope — the generated REST tests are
217
+ # strict-clean by construction, and the hand-written tests were fully annotated, so the
218
+ # strict bar now covers tests too (a new untyped test fails the gate).
219
+ files = ["signalwire/signalwire", "tests"]
206
220
  # Third-party packages without type stubs (nltk, sentence_transformers, the
207
221
  # search/relay stacks) are out of scope — we type our own code, not theirs.
208
222
  ignore_missing_imports = true
209
- # The bar: our own code is clean. Bodies of untyped defs are checked so real
210
- # type errors inside them surface (this is what found the mixin cluster).
211
- check_untyped_defs = true
212
- warn_unused_ignores = true
213
- # `# type: ignore` is reserved for genuinely-unfixable third-party-stub gaps and
214
- # must carry an error code + reason. warn_unused_ignores keeps them honest.
223
+ # The bar: the whole source tree is mypy --strict clean (full annotations + all
224
+ # the strict sub-flags). Achieved by typing handlers with REAL types (FastAPI
225
+ # Response/dict, generated payload types where they exist) — never papered with
226
+ # bare `Any`. `strict` subsumes check_untyped_defs / warn_unused_ignores / etc.
227
+ strict = true
228
+ # `# type: ignore` is reserved for genuinely-unfixable third-party-stub gaps (e.g.
229
+ # flask/flask-limiter optional extras with no stubs) and the documented
230
+ # _HostTyped/AgentBase TYPE_CHECKING-vs-runtime split; each must carry an error
231
+ # code + reason. warn_unused_ignores (via strict) keeps them honest.
215
232
  show_error_codes = true
216
233
 
217
234
  # numpy (a search/relay-extra runtime dep we do NOT type — same class as nltk /
@@ -12,12 +12,19 @@ SignalWire SDK
12
12
  A package for building AI agents using SignalWire's AI and SWML capabilities.
13
13
  """
14
14
 
15
+ from typing import TYPE_CHECKING, Any
16
+
15
17
  # Configure logging before any other imports to ensure early initialization
16
18
  from .core.logging_config import configure_logging
17
19
 
20
+ if TYPE_CHECKING:
21
+ from signalwire.rest.client import RestClient as _RestClient
22
+ from signalwire.core.skill_base import SkillBase
23
+ from signalwire.skills.registry import SkillRegistry
24
+
18
25
  configure_logging()
19
26
 
20
- __version__ = "3.0.2.dev70"
27
+ __version__ = "3.0.2.dev73"
21
28
 
22
29
  # Import core classes for easier access.
23
30
  # These imports are intentionally placed after configure_logging() so the SDK's
@@ -53,14 +60,14 @@ from signalwire.web import WebService # noqa: E402
53
60
 
54
61
  # Lazy import skills to avoid slow startup for CLI tools
55
62
  # Skills are now loaded on-demand when requested
56
- def _get_skill_registry():
63
+ def _get_skill_registry() -> "SkillRegistry":
57
64
  """Lazy import and return skill registry"""
58
65
  import signalwire.skills
59
66
 
60
67
  return signalwire.skills.skill_registry
61
68
 
62
69
 
63
- def list_skills():
70
+ def list_skills() -> list[dict[str, Any]]:
64
71
  """List all available skills with metadata.
65
72
 
66
73
  Returns one dict per skill (name, description, version, required packages /
@@ -71,7 +78,7 @@ def list_skills():
71
78
  return skill_registry.list_skills()
72
79
 
73
80
 
74
- def list_skills_with_params():
81
+ def list_skills_with_params() -> dict[str, dict[str, Any]]:
75
82
  """
76
83
  Get complete schema for all available skills including parameter metadata
77
84
 
@@ -98,7 +105,7 @@ def list_skills_with_params():
98
105
  return skill_registry.get_all_skills_schema()
99
106
 
100
107
 
101
- def register_skill(skill_class):
108
+ def register_skill(skill_class: "type[SkillBase]") -> None:
102
109
  """
103
110
  Register a custom skill class
104
111
 
@@ -119,7 +126,7 @@ def register_skill(skill_class):
119
126
  return skill_registry.register_skill(skill_class)
120
127
 
121
128
 
122
- def add_skill_directory(path):
129
+ def add_skill_directory(path: str) -> None:
123
130
  """
124
131
  Add a directory to search for skills
125
132
 
@@ -138,7 +145,7 @@ def add_skill_directory(path):
138
145
  return skill_registry.add_skill_directory(path)
139
146
 
140
147
 
141
- def RestClient(*args, **kwargs):
148
+ def RestClient(*args: Any, **kwargs: Any) -> "_RestClient":
142
149
  """Create a SignalWire REST API client (lazy import)"""
143
150
  from signalwire.rest import RestClient as _RestClient
144
151
 
@@ -13,7 +13,7 @@ import os
13
13
  import re
14
14
  from pathlib import Path
15
15
  from typing import Any
16
- from collections.abc import Callable
16
+ from collections.abc import Awaitable, Callable
17
17
 
18
18
  try:
19
19
  from fastapi import FastAPI, Request, Response
@@ -26,6 +26,7 @@ except ImportError:
26
26
  from signalwire.core.agent_base import AgentBase
27
27
  from signalwire.core.swml_service import SWMLService
28
28
  from signalwire.core.logging_config import get_logger
29
+ from signalwire.core.mixins.web_mixin import _as_response
29
30
  import contextlib
30
31
 
31
32
 
@@ -67,7 +68,7 @@ class AgentServer:
67
68
  self.app = FastAPI(
68
69
  title="SignalWire AI Agents",
69
70
  description="Hosted SignalWire AI Agents",
70
- version="3.0.2.dev70",
71
+ version="3.0.2.dev73",
71
72
  redirect_slashes=False,
72
73
  docs_url=None,
73
74
  redoc_url=None,
@@ -76,7 +77,9 @@ class AgentServer:
76
77
 
77
78
  # Add security headers middleware
78
79
  @self.app.middleware("http")
79
- async def add_security_headers(request, call_next):
80
+ async def add_security_headers(
81
+ request: Request, call_next: Callable[[Request], Awaitable[Response]]
82
+ ) -> Response:
80
83
  response = await call_next(request)
81
84
  response.headers["X-Content-Type-Options"] = "nosniff"
82
85
  response.headers["X-Frame-Options"] = "DENY"
@@ -104,7 +107,7 @@ class AgentServer:
104
107
  # all other routes are registered. This ensures custom routes like /get_token
105
108
  # don't get overshadowed by the catch-all /{full_path:path} route.
106
109
  @self.app.on_event("startup")
107
- async def _setup_catch_all():
110
+ async def _setup_catch_all() -> None:
108
111
  self._register_catch_all_handler()
109
112
 
110
113
  def register(self, agent: AgentBase, route: str | None = None) -> None:
@@ -187,9 +190,10 @@ class AgentServer:
187
190
  for agent_route, agent in self.agents.items():
188
191
  self._auto_map_agent_sip_usernames(agent, agent_route)
189
192
 
190
- # Create a unified routing callback that checks all registered usernames
193
+ # Create a unified routing callback that checks all registered usernames.
194
+ # Framework-free (body, headers) shape; this callback only reads the body.
191
195
  def server_sip_routing_callback(
192
- request: Request, body: dict[str, Any]
196
+ body: dict[str, Any], headers: dict[str, Any]
193
197
  ) -> str | None:
194
198
  """Unified SIP routing callback that checks all registered usernames"""
195
199
  # Extract the SIP username
@@ -343,8 +347,8 @@ class AgentServer:
343
347
 
344
348
  def run(
345
349
  self,
346
- event=None,
347
- context=None,
350
+ event: Any = None,
351
+ context: Any = None,
348
352
  host: str | None = None,
349
353
  port: int | None = None,
350
354
  ) -> Any:
@@ -511,7 +515,7 @@ class AgentServer:
511
515
  error_response = {"error": "Not Found"}
512
516
  return self._format_cgi_response(error_response, status="404 Not Found")
513
517
 
514
- def _handle_lambda_request(self, event, context) -> dict:
518
+ def _handle_lambda_request(self, event: Any, context: Any) -> dict[str, Any]:
515
519
  """Handle Lambda request using same routing logic as server"""
516
520
  import json
517
521
 
@@ -600,7 +604,7 @@ class AgentServer:
600
604
  }
601
605
 
602
606
  def _format_cgi_response(
603
- self, data, content_type: str = "application/json", status: str = "200 OK"
607
+ self, data: Any, content_type: str = "application/json", status: str = "200 OK"
604
608
  ) -> str:
605
609
  """Format response for CGI output"""
606
610
  import json
@@ -634,7 +638,7 @@ class AgentServer:
634
638
  """
635
639
 
636
640
  @self.app.get("/health")
637
- def health_check():
641
+ def health_check() -> dict[str, Any]:
638
642
  return {
639
643
  "status": "ok",
640
644
  "agents": len(self.agents),
@@ -642,7 +646,7 @@ class AgentServer:
642
646
  }
643
647
 
644
648
  @self.app.get("/ready")
645
- def readiness_check():
649
+ def readiness_check() -> dict[str, Any]:
646
650
  return {"status": "ready", "agents": len(self.agents)}
647
651
 
648
652
  def _run_server(self, host: str | None = None, port: int | None = None) -> None:
@@ -709,15 +713,18 @@ class AgentServer:
709
713
  uvicorn.run(self.app, host=host, port=port, log_level=self.log_level)
710
714
 
711
715
  def register_global_routing_callback(
712
- self, callback_fn: Callable[[Request, dict[str, Any]], str | None], path: str
716
+ self,
717
+ callback_fn: Callable[[dict[str, Any], dict[str, Any]], str | None],
718
+ path: str,
713
719
  ) -> None:
714
720
  """
715
721
  Register a routing callback across all agents
716
722
 
717
723
  This allows you to add unified routing logic to all agents at the same path.
724
+ The callback receives ``(body, headers)`` — the framework-free shape.
718
725
 
719
726
  Args:
720
- callback_fn: The callback function to register
727
+ callback_fn: The callback function to register, ``(body, headers)``.
721
728
  path: The path to register the callback at
722
729
  """
723
730
  # Normalize the path
@@ -845,7 +852,7 @@ class AgentServer:
845
852
 
846
853
  @self.app.get("/{full_path:path}")
847
854
  @self.app.post("/{full_path:path}")
848
- async def handle_all_routes(request: Request, full_path: str):
855
+ async def handle_all_routes(request: Request, full_path: str) -> Response:
849
856
  """Handle requests that don't match registered routes (e.g. /matti instead of /matti/)"""
850
857
  # Check if this path maps to one of our registered agents
851
858
  for route, agent in self.agents.items():
@@ -868,11 +875,20 @@ class AgentServer:
868
875
  if clean_path == "swaig":
869
876
  from fastapi import Response
870
877
 
871
- return await agent._handle_swaig_request(request, Response())
878
+ # _handle_swaig_request returns Response | dict (the dict is a
879
+ # SWAIG-result passthrough); funnel through _as_response so this
880
+ # route handler stays -> Response (FastAPI-safe).
881
+ return _as_response(
882
+ await agent._handle_swaig_request(request, Response())
883
+ )
872
884
  if clean_path == "post_prompt":
873
- return await agent._handle_post_prompt_request(request)
885
+ return _as_response(
886
+ await agent._handle_post_prompt_request(request)
887
+ )
874
888
  if clean_path == "check_for_input":
875
- return await agent._handle_check_for_input_request(request)
889
+ return _as_response(
890
+ await agent._handle_check_for_input_request(request)
891
+ )
876
892
 
877
893
  # Check for custom routing callbacks
878
894
  if hasattr(agent, "_routing_callbacks"):
@@ -196,8 +196,10 @@ async def simulate_request_to_service(
196
196
  import json
197
197
 
198
198
  # json.loads() is typed -> Any; a FastAPI Response body is the rendered
199
- # SWML JSON object, matching the declared dict return.
200
- return cast(dict[str, Any], json.loads(result.body.decode()))
199
+ # SWML JSON object, matching the declared dict return. result.body is
200
+ # bytes | memoryview — bytes() handles both before decode (memoryview has
201
+ # no .decode()), a real latent bug strict typing surfaced.
202
+ return cast(dict[str, Any], json.loads(bytes(result.body).decode()))
201
203
  if isinstance(result, dict):
202
204
  return result
203
205
  # Try to get content from response
@@ -226,8 +226,25 @@ swaig-test agent.py --simulate-serverless cgi --cgi-host example.com --dump-swml
226
226
 
227
227
  def main() -> int:
228
228
  """Main entry point for the CLI tool"""
229
- # Set up suppression early if we're dumping SWML
230
- if "--dump-swml" in sys.argv:
229
+ # Detect --parse-only / --dry-run FIRST and strip it from argv.
230
+ # It is detected before everything else because:
231
+ # 1. --dump-swml installs a global stdout suppressor below; parse-only must
232
+ # still be able to print its one "parse OK" line, so we skip that setup.
233
+ # 2. The --exec split further down consumes every token after the function
234
+ # name as a function argument, so a --parse-only trailing an --exec
235
+ # invocation (the position the DOC-CLI gate appends it) would otherwise be
236
+ # swallowed and never reach argparse. Stripping it here makes the flag
237
+ # position-independent — it works whether it precedes or follows --exec.
238
+ # It is still declared as a normal argparse argument below so it appears in
239
+ # --help and validates like any flag.
240
+ parse_only_early = False
241
+ if "--parse-only" in sys.argv or "--dry-run" in sys.argv:
242
+ parse_only_early = True
243
+ sys.argv = [a for a in sys.argv if a not in ("--parse-only", "--dry-run")]
244
+
245
+ # Set up suppression early if we're dumping SWML (but never under --parse-only,
246
+ # which must be free to print its result line).
247
+ if "--dump-swml" in sys.argv and not parse_only_early:
231
248
  setup_output_suppression()
232
249
 
233
250
  # Check for help sections early
@@ -410,6 +427,18 @@ def main() -> int:
410
427
  "--help-examples", action="store_true", help="Show comprehensive usage examples"
411
428
  )
412
429
 
430
+ # Parse-only / dry-run: validate the invocation's arguments and exit WITHOUT
431
+ # loading the agent or hitting the network. Used by the DOC-CLI gate to prove a
432
+ # documented invocation's arguments are well-formed. Canonical contract mirrored
433
+ # by every port -- see the "--parse-only / --dry-run" section of docs/cli_guide.md.
434
+ parser.add_argument(
435
+ "--parse-only",
436
+ "--dry-run",
437
+ action="store_true",
438
+ dest="parse_only",
439
+ help="Validate arguments and exit without running the agent (prints 'parse OK')",
440
+ )
441
+
413
442
  args = parser.parse_args()
414
443
 
415
444
  # Restore original sys.argv
@@ -434,6 +463,16 @@ def main() -> int:
434
463
  # If no tool_name and no special flags, default to listing tools
435
464
  args.list_tools = True
436
465
 
466
+ # ===== PARSE-ONLY / DRY-RUN =====
467
+ # All argparse parsing + cross-flag validation has succeeded by this point.
468
+ # Report success and exit WITHOUT loading the agent, touching the filesystem,
469
+ # or hitting the network. (parser.parse_args()/parser.error() already exited
470
+ # non-zero on any bad flag or invalid combination above.) The flag is detected
471
+ # both early (stripped from argv, position-independent) and via argparse.
472
+ if parse_only_early or args.parse_only:
473
+ print("parse OK")
474
+ return 0
475
+
437
476
  # ===== SERVERLESS SIMULATION SETUP =====
438
477
  serverless_simulator = None
439
478
 
@@ -22,3 +22,6 @@ if TYPE_CHECKING:
22
22
  from signalwire.core.agent_base import AgentBase as AgentHost # type: ignore[attr-defined] # intentional TYPE_CHECKING-only re-export; agent_base imports this module's consumers (the mixins), so the name resolves for them but not in self-check
23
23
  else:
24
24
  AgentHost = object
25
+
26
+ # Explicit re-export so --strict (no_implicit_reexport) lets _mixin_host import AgentHost.
27
+ __all__ = ["AgentHost"]
@@ -20,7 +20,7 @@ logger = get_logger(__name__)
20
20
  class PromptManager:
21
21
  """Manages prompt building and configuration."""
22
22
 
23
- def __init__(self, agent):
23
+ def __init__(self, agent: Any) -> None:
24
24
  """
25
25
  Initialize PromptManager with reference to parent agent.
26
26
 
@@ -29,10 +29,10 @@ class PromptManager:
29
29
  """
30
30
  self.agent = agent
31
31
  self._prompt_text: str | None = None
32
- self._post_prompt_text = None
33
- self._contexts = None
32
+ self._post_prompt_text: str | None = None
33
+ self._contexts: dict[str, Any] | None = None
34
34
 
35
- def _validate_prompt_mode_exclusivity(self):
35
+ def _validate_prompt_mode_exclusivity(self) -> None:
36
36
  """
37
37
  Check that only one prompt mode is in use.
38
38
 
@@ -9,16 +9,23 @@ See LICENSE file in the project root for full license information.
9
9
  Tool decorator functionality.
10
10
  """
11
11
 
12
+ from typing import Any, TypeVar
13
+ from collections.abc import Callable
14
+
12
15
  from signalwire.core.logging_config import get_logger
13
16
 
14
17
  logger = get_logger(__name__)
15
18
 
19
+ _F = TypeVar("_F", bound=Callable[..., Any])
20
+
16
21
 
17
22
  class ToolDecorator:
18
23
  """Handles tool decoration logic."""
19
24
 
20
25
  @staticmethod
21
- def create_instance_decorator(registry):
26
+ def create_instance_decorator(
27
+ registry: Any,
28
+ ) -> Callable[..., Callable[[_F], _F]]:
22
29
  """
23
30
  Create instance tool decorator.
24
31
 
@@ -29,7 +36,7 @@ class ToolDecorator:
29
36
  Decorator function
30
37
  """
31
38
 
32
- def decorator(name=None, **kwargs):
39
+ def decorator(name: str | None = None, **kwargs: Any) -> Callable[[_F], _F]:
33
40
  """
34
41
  Decorator for defining SWAIG tools in a class.
35
42
 
@@ -78,7 +85,7 @@ class ToolDecorator:
78
85
  guidance.
79
86
  """
80
87
 
81
- def inner_decorator(func):
88
+ def inner_decorator(func: _F) -> _F:
82
89
  nonlocal name
83
90
  if name is None:
84
91
  name = func.__name__
@@ -90,7 +97,7 @@ class ToolDecorator:
90
97
  webhook_url = kwargs.pop("webhook_url", None)
91
98
  required = kwargs.pop("required", None)
92
99
 
93
- handler = func
100
+ handler: Callable[..., Any] = func
94
101
  is_typed = False
95
102
 
96
103
  # If parameters not explicitly provided, try type inference
@@ -138,7 +145,7 @@ class ToolDecorator:
138
145
  return decorator
139
146
 
140
147
  @classmethod
141
- def create_class_decorator(cls):
148
+ def create_class_decorator(cls) -> Callable[..., Callable[[_F], _F]]:
142
149
  """
143
150
  Create class tool decorator.
144
151
 
@@ -146,7 +153,7 @@ class ToolDecorator:
146
153
  Decorator function
147
154
  """
148
155
 
149
- def tool(name=None, **kwargs):
156
+ def tool(name: str | None = None, **kwargs: Any) -> Callable[[_F], _F]:
150
157
  """
151
158
  Class method decorator for defining SWAIG tools.
152
159
 
@@ -180,11 +187,11 @@ class ToolDecorator:
180
187
  ...
181
188
  """
182
189
 
183
- def decorator(func):
190
+ def decorator(func: _F) -> _F:
184
191
  # Mark the function as a tool
185
- func._is_tool = True
186
- func._tool_name = name if name else func.__name__
187
- func._tool_params = kwargs
192
+ func._is_tool = True # type: ignore[attr-defined] # dynamic marker attrs read back by ToolRegistry.register_class_decorated_tools
193
+ func._tool_name = name if name else func.__name__ # type: ignore[attr-defined]
194
+ func._tool_params = kwargs # type: ignore[attr-defined]
188
195
 
189
196
  # Return the original function
190
197
  return func
@@ -22,7 +22,7 @@ logger = get_logger(__name__)
22
22
  class ToolRegistry:
23
23
  """Manages SWAIG function registration."""
24
24
 
25
- def __init__(self, agent):
25
+ def __init__(self, agent: Any) -> None:
26
26
  """
27
27
  Initialize ToolRegistry with reference to parent agent.
28
28
 
@@ -30,15 +30,15 @@ class ToolRegistry:
30
30
  agent: Parent AgentBase instance
31
31
  """
32
32
  self.agent = agent
33
- self._swaig_functions = {}
34
- self._class_decorated_tools = []
33
+ self._swaig_functions: dict[str, SWAIGFunction | dict[str, Any]] = {}
34
+ self._class_decorated_tools: list[Any] = []
35
35
 
36
36
  def define_tool(
37
37
  self,
38
38
  name: str,
39
39
  description: str,
40
40
  parameters: dict[str, Any],
41
- handler: Callable,
41
+ handler: Callable[..., Any],
42
42
  secure: bool = True,
43
43
  fillers: dict[str, list[str]] | None = None,
44
44
  wait_file: str | None = None,
@@ -46,7 +46,7 @@ class ToolRegistry:
46
46
  webhook_url: str | None = None,
47
47
  required: list[str] | None = None,
48
48
  is_typed_handler: bool = False,
49
- **swaig_fields,
49
+ **swaig_fields: Any,
50
50
  ) -> None:
51
51
  """
52
52
  Define a SWAIG function that the AI can call.