signalwire-sdk 3.4.3.dev117__tar.gz → 3.4.3.dev119__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. signalwire_sdk-3.4.3.dev119/CHANGELOG.md +619 -0
  2. signalwire_sdk-3.4.3.dev119/MANIFEST.in +207 -0
  3. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/PKG-INFO +89 -60
  4. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/README.md +87 -58
  5. signalwire_sdk-3.4.3.dev119/docs/agent_guide.md +3228 -0
  6. signalwire_sdk-3.4.3.dev119/docs/ai_chat_gateway.md +315 -0
  7. signalwire_sdk-3.4.3.dev119/docs/api_reference.md +3438 -0
  8. signalwire_sdk-3.4.3.dev119/docs/architecture.md +1274 -0
  9. signalwire_sdk-3.4.3.dev119/docs/bedrock_agent.md +415 -0
  10. signalwire_sdk-3.4.3.dev119/docs/cli_guide.md +2376 -0
  11. signalwire_sdk-3.4.3.dev119/docs/cloud_functions_guide.md +491 -0
  12. signalwire_sdk-3.4.3.dev119/docs/configuration.md +377 -0
  13. signalwire_sdk-3.4.3.dev119/docs/contexts_guide.md +1534 -0
  14. signalwire_sdk-3.4.3.dev119/docs/datamap_guide.md +1488 -0
  15. signalwire_sdk-3.4.3.dev119/docs/developer_pain_points.md +548 -0
  16. signalwire_sdk-3.4.3.dev119/docs/llm_parameters.md +253 -0
  17. signalwire_sdk-3.4.3.dev119/docs/mcp_gateway_reference.md +686 -0
  18. signalwire_sdk-3.4.3.dev119/docs/mcp_integration.md +160 -0
  19. signalwire_sdk-3.4.3.dev119/docs/pgi_agent_guide.md +1563 -0
  20. signalwire_sdk-3.4.3.dev119/docs/programmatically_governed_inference.md +269 -0
  21. signalwire_sdk-3.4.3.dev119/docs/sdk_features.md +499 -0
  22. signalwire_sdk-3.4.3.dev119/docs/search_deployment.md +1980 -0
  23. signalwire_sdk-3.4.3.dev119/docs/search_indexing.md +1806 -0
  24. signalwire_sdk-3.4.3.dev119/docs/search_integration.md +1481 -0
  25. signalwire_sdk-3.4.3.dev119/docs/search_overview.md +605 -0
  26. signalwire_sdk-3.4.3.dev119/docs/search_troubleshooting.md +885 -0
  27. signalwire_sdk-3.4.3.dev119/docs/security.md +474 -0
  28. signalwire_sdk-3.4.3.dev119/docs/skills_parameter_schema.md +400 -0
  29. signalwire_sdk-3.4.3.dev119/docs/skills_system.md +533 -0
  30. signalwire_sdk-3.4.3.dev119/docs/swaig_reference.md +913 -0
  31. signalwire_sdk-3.4.3.dev119/docs/swml_service_guide.md +627 -0
  32. signalwire_sdk-3.4.3.dev119/docs/third_party_skills.md +556 -0
  33. signalwire_sdk-3.4.3.dev119/docs/web_service.md +743 -0
  34. signalwire_sdk-3.4.3.dev119/examples/Dockerfile.flexible +41 -0
  35. signalwire_sdk-3.4.3.dev119/examples/Dockerfile.k8s +39 -0
  36. signalwire_sdk-3.4.3.dev119/examples/README.md +213 -0
  37. signalwire_sdk-3.4.3.dev119/examples/advanced_datamap_demo.py +235 -0
  38. signalwire_sdk-3.4.3.dev119/examples/auto_vivified_example.py +422 -0
  39. signalwire_sdk-3.4.3.dev119/examples/basic_swml_service.py +438 -0
  40. signalwire_sdk-3.4.3.dev119/examples/bedrock_agent_run.py +29 -0
  41. signalwire_sdk-3.4.3.dev119/examples/bedrock_agent_test.py +44 -0
  42. signalwire_sdk-3.4.3.dev119/examples/bedrock_server_test.py +33 -0
  43. signalwire_sdk-3.4.3.dev119/examples/bedrock_with_skills.py +69 -0
  44. signalwire_sdk-3.4.3.dev119/examples/call_flow_and_actions_demo.py +246 -0
  45. signalwire_sdk-3.4.3.dev119/examples/comprehensive_dynamic_agent.py +371 -0
  46. signalwire_sdk-3.4.3.dev119/examples/concierge_agent_example.py +162 -0
  47. signalwire_sdk-3.4.3.dev119/examples/contexts_demo.py +346 -0
  48. signalwire_sdk-3.4.3.dev119/examples/custom_path_agent.py +106 -0
  49. signalwire_sdk-3.4.3.dev119/examples/data_map_demo.py +321 -0
  50. signalwire_sdk-3.4.3.dev119/examples/datasphere_multi_instance_demo.py +204 -0
  51. signalwire_sdk-3.4.3.dev119/examples/datasphere_serverless_demo.py +230 -0
  52. signalwire_sdk-3.4.3.dev119/examples/datasphere_serverless_env_demo.py +206 -0
  53. signalwire_sdk-3.4.3.dev119/examples/datasphere_webhook_env_demo.py +226 -0
  54. signalwire_sdk-3.4.3.dev119/examples/declarative_agent.py +293 -0
  55. signalwire_sdk-3.4.3.dev119/examples/dynamic_info_gatherer_example.py +151 -0
  56. signalwire_sdk-3.4.3.dev119/examples/dynamic_swml_service.py +490 -0
  57. signalwire_sdk-3.4.3.dev119/examples/faq_bot_agent.py +219 -0
  58. signalwire_sdk-3.4.3.dev119/examples/gather_info_demo.py +84 -0
  59. signalwire_sdk-3.4.3.dev119/examples/gather_per_question_functions_demo.py +143 -0
  60. signalwire_sdk-3.4.3.dev119/examples/info_gatherer_example.py +85 -0
  61. signalwire_sdk-3.4.3.dev119/examples/joke_agent.py +126 -0
  62. signalwire_sdk-3.4.3.dev119/examples/joke_skill_demo.py +111 -0
  63. signalwire_sdk-3.4.3.dev119/examples/k8s-deployment.yaml +95 -0
  64. signalwire_sdk-3.4.3.dev119/examples/kubernetes_ready_agent.py +119 -0
  65. signalwire_sdk-3.4.3.dev119/examples/lambda_agent.py +136 -0
  66. signalwire_sdk-3.4.3.dev119/examples/llm_params_demo.py +225 -0
  67. signalwire_sdk-3.4.3.dev119/examples/mcp_agent.py +122 -0
  68. signalwire_sdk-3.4.3.dev119/examples/mcp_gateway_demo.py +53 -0
  69. signalwire_sdk-3.4.3.dev119/examples/multi_agent_server.py +545 -0
  70. signalwire_sdk-3.4.3.dev119/examples/multi_endpoint_agent.py +276 -0
  71. signalwire_sdk-3.4.3.dev119/examples/pgvector_search_agent.py +127 -0
  72. signalwire_sdk-3.4.3.dev119/examples/quickstart_agent.py +40 -0
  73. signalwire_sdk-3.4.3.dev119/examples/quickstart_relay.py +33 -0
  74. signalwire_sdk-3.4.3.dev119/examples/quickstart_rest.py +27 -0
  75. signalwire_sdk-3.4.3.dev119/examples/receptionist_agent_example.py +138 -0
  76. signalwire_sdk-3.4.3.dev119/examples/record_call_example.py +182 -0
  77. signalwire_sdk-3.4.3.dev119/examples/relay_answer_and_welcome.py +37 -0
  78. signalwire_sdk-3.4.3.dev119/examples/room_and_sip_example.py +311 -0
  79. signalwire_sdk-3.4.3.dev119/examples/search_server_standalone.py +258 -0
  80. signalwire_sdk-3.4.3.dev119/examples/search_with_custom_formatter.py +195 -0
  81. signalwire_sdk-3.4.3.dev119/examples/session_and_state_demo.py +180 -0
  82. signalwire_sdk-3.4.3.dev119/examples/sigmond_native_search.py +353 -0
  83. signalwire_sdk-3.4.3.dev119/examples/sigmond_remote_search.py +296 -0
  84. signalwire_sdk-3.4.3.dev119/examples/sigmond_simple.py +452 -0
  85. signalwire_sdk-3.4.3.dev119/examples/simple_agent.py +469 -0
  86. signalwire_sdk-3.4.3.dev119/examples/simple_dynamic_agent.py +150 -0
  87. signalwire_sdk-3.4.3.dev119/examples/simple_dynamic_enhanced.py +280 -0
  88. signalwire_sdk-3.4.3.dev119/examples/simple_static_agent.py +120 -0
  89. signalwire_sdk-3.4.3.dev119/examples/skills_demo.py +183 -0
  90. signalwire_sdk-3.4.3.dev119/examples/static_files/file.txt +1 -0
  91. signalwire_sdk-3.4.3.dev119/examples/static_files/static_files/file.txt +1 -0
  92. signalwire_sdk-3.4.3.dev119/examples/step_function_inheritance_demo.py +121 -0
  93. signalwire_sdk-3.4.3.dev119/examples/survey_agent_example.py +362 -0
  94. signalwire_sdk-3.4.3.dev119/examples/swaig_features_agent.py +233 -0
  95. signalwire_sdk-3.4.3.dev119/examples/swml_service_example.py +240 -0
  96. signalwire_sdk-3.4.3.dev119/examples/swml_service_routing_example.py +194 -0
  97. signalwire_sdk-3.4.3.dev119/examples/swmlservice_ai_sidecar.py +107 -0
  98. signalwire_sdk-3.4.3.dev119/examples/swmlservice_swaig_standalone.py +73 -0
  99. signalwire_sdk-3.4.3.dev119/examples/tap_example.py +342 -0
  100. signalwire_sdk-3.4.3.dev119/examples/web_search_agent.py +133 -0
  101. signalwire_sdk-3.4.3.dev119/examples/web_search_multi_instance_demo.py +244 -0
  102. signalwire_sdk-3.4.3.dev119/examples/wikipedia_demo.py +98 -0
  103. signalwire_sdk-3.4.3.dev119/livewire/README.md +71 -0
  104. signalwire_sdk-3.4.3.dev119/livewire/docs/migration-guide.md +117 -0
  105. signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_basic_agent.py +58 -0
  106. signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_handoff.py +87 -0
  107. signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_multi_tool.py +70 -0
  108. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/sw-agent-init.1 +6 -0
  109. signalwire_sdk-3.4.3.dev119/man/sw-pydocs.1 +82 -0
  110. signalwire_sdk-3.4.3.dev119/mcp/swml-schema-search/README.md +183 -0
  111. signalwire_sdk-3.4.3.dev119/mcp/swml-schema-search/swml_schema_mcp.py +440 -0
  112. signalwire_sdk-3.4.3.dev119/mcp_gateway/.env.example +36 -0
  113. signalwire_sdk-3.4.3.dev119/mcp_gateway/.gitignore +37 -0
  114. signalwire_sdk-3.4.3.dev119/mcp_gateway/Dockerfile +26 -0
  115. signalwire_sdk-3.4.3.dev119/mcp_gateway/README.md +343 -0
  116. signalwire_sdk-3.4.3.dev119/mcp_gateway/certs/.gitignore +9 -0
  117. signalwire_sdk-3.4.3.dev119/mcp_gateway/docker-compose.yml +47 -0
  118. signalwire_sdk-3.4.3.dev119/mcp_gateway/examples/generate_cert.sh +28 -0
  119. signalwire_sdk-3.4.3.dev119/mcp_gateway/mcp-docker.sh +211 -0
  120. signalwire_sdk-3.4.3.dev119/mcp_gateway/sample_config.json +71 -0
  121. signalwire_sdk-3.4.3.dev119/mcp_gateway/test/test_agent.py +112 -0
  122. signalwire_sdk-3.4.3.dev119/mcp_gateway/test/test_gateway.sh +71 -0
  123. signalwire_sdk-3.4.3.dev119/mcp_gateway/test/todo_mcp.py +340 -0
  124. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/pyproject.toml +8 -4
  125. signalwire_sdk-3.4.3.dev119/relay/README.md +83 -0
  126. signalwire_sdk-3.4.3.dev119/relay/docs/call-methods.md +545 -0
  127. signalwire_sdk-3.4.3.dev119/relay/docs/client-reference.md +157 -0
  128. signalwire_sdk-3.4.3.dev119/relay/docs/events.md +140 -0
  129. signalwire_sdk-3.4.3.dev119/relay/docs/getting-started.md +147 -0
  130. signalwire_sdk-3.4.3.dev119/relay/docs/messaging.md +202 -0
  131. signalwire_sdk-3.4.3.dev119/relay/examples/relay_answer_and_welcome.py +37 -0
  132. signalwire_sdk-3.4.3.dev119/relay/examples/relay_dial_and_play.py +69 -0
  133. signalwire_sdk-3.4.3.dev119/relay/examples/relay_ivr_connect.py +123 -0
  134. signalwire_sdk-3.4.3.dev119/rest/README.md +92 -0
  135. signalwire_sdk-3.4.3.dev119/rest/docs/calling.md +299 -0
  136. signalwire_sdk-3.4.3.dev119/rest/docs/client-reference.md +154 -0
  137. signalwire_sdk-3.4.3.dev119/rest/docs/fabric.md +183 -0
  138. signalwire_sdk-3.4.3.dev119/rest/docs/getting-started.md +120 -0
  139. signalwire_sdk-3.4.3.dev119/rest/docs/namespaces.md +317 -0
  140. signalwire_sdk-3.4.3.dev119/rest/examples/rest_10dlc_registration.py +148 -0
  141. signalwire_sdk-3.4.3.dev119/rest/examples/rest_bind_phone_to_swml_webhook.py +59 -0
  142. signalwire_sdk-3.4.3.dev119/rest/examples/rest_calling_ivr_and_ai.py +181 -0
  143. signalwire_sdk-3.4.3.dev119/rest/examples/rest_calling_play_and_record.py +136 -0
  144. signalwire_sdk-3.4.3.dev119/rest/examples/rest_datasphere_search.py +72 -0
  145. signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_conferences_and_routing.py +138 -0
  146. signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_subscribers_and_sip.py +99 -0
  147. signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_swml_and_callflows.py +92 -0
  148. signalwire_sdk-3.4.3.dev119/rest/examples/rest_manage_resources.py +58 -0
  149. signalwire_sdk-3.4.3.dev119/rest/examples/rest_phone_number_management.py +164 -0
  150. signalwire_sdk-3.4.3.dev119/rest/examples/rest_queues_mfa_and_recordings.py +124 -0
  151. signalwire_sdk-3.4.3.dev119/rest/examples/rest_video_rooms.py +158 -0
  152. signalwire_sdk-3.4.3.dev119/setup.py +57 -0
  153. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/AGENTS.md +11 -0
  154. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__init__.py +9 -3
  155. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/__main__.py +15 -0
  156. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agent_server.py +89 -198
  157. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/bedrock.py +40 -45
  158. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/__init__.py +29 -0
  159. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/build_search.py +86 -153
  160. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/config.py +2 -0
  161. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/argparse_helpers.py +54 -14
  162. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/dokku.py +2 -0
  163. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/datamap_exec.py +87 -91
  164. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/init_project.py +13 -0
  165. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/swml_dump.py +12 -5
  166. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/__init__.py +319 -0
  167. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_agents_note.py +97 -0
  168. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_api.py +269 -0
  169. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_bundle.py +155 -0
  170. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_files.py +163 -0
  171. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_render.py +477 -0
  172. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_topics.py +1070 -0
  173. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/test_swaig.py +61 -7
  174. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/_sync_handlers.py +113 -0
  175. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/type_inference.py +24 -5
  176. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent_base.py +257 -84
  177. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/contexts.py +2 -0
  178. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/data_map.py +16 -9
  179. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/function_result.py +17 -12
  180. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/logging_config.py +84 -47
  181. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/auth_mixin.py +3 -15
  182. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/mixins/mcp_server_mixin.py +198 -0
  183. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/mixins/serverless_mixin.py +703 -0
  184. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/tool_mixin.py +24 -4
  185. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/web_mixin.py +341 -160
  186. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/security_utils.py +1 -1
  187. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/session_manager.py +5 -3
  188. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_middleware.py +46 -13
  189. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security_config.py +6 -0
  190. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_manager.py +21 -1
  191. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_function.py +30 -2
  192. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_service.py +136 -44
  193. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/__init__.py +3 -3
  194. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/llms.txt +70 -0
  195. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/gateway_service.py +61 -1
  196. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/client.py +2 -0
  197. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/client.py +2 -0
  198. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/search/__init__.py +143 -0
  199. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/document_processor.py +31 -19
  200. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/index_builder.py +12 -1
  201. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/migration.py +12 -153
  202. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/models.py +13 -2
  203. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/pgvector_backend.py +20 -5
  204. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_engine.py +11 -2
  205. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_service.py +37 -9
  206. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/README.md +47 -40
  207. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +38 -12
  208. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/README.md +28 -14
  209. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/README.md +42 -2
  210. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/skill.py +6 -6
  211. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/README.md +65 -17
  212. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/skill.py +6 -6
  213. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/README.md +33 -4
  214. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/README.md +7 -2
  215. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/README.md +22 -0
  216. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/README.md +46 -17
  217. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/README.md +32 -11
  218. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/README.md +83 -6
  219. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/skill.py +133 -65
  220. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/README.md +26 -5
  221. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/README.md +65 -35
  222. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/skill.py +192 -49
  223. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/README.md +52 -9
  224. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/README.md +54 -17
  225. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/skills/web_search/README.md +220 -0
  226. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill.py +16 -9
  227. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/README.md +57 -16
  228. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/skill.py +16 -4
  229. signalwire_sdk-3.4.3.dev119/signalwire/signalwire/utils/url_validator.py +243 -0
  230. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/PKG-INFO +89 -60
  231. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +213 -1
  232. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/entry_points.txt +1 -0
  233. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/tests/test_mcp_integration.py +100 -18
  234. signalwire_sdk-3.4.3.dev119/tutorial/fred/.env.example +20 -0
  235. signalwire_sdk-3.4.3.dev119/tutorial/fred/Dockerfile +40 -0
  236. signalwire_sdk-3.4.3.dev119/tutorial/fred/Dockerfile.multi +50 -0
  237. signalwire_sdk-3.4.3.dev119/tutorial/fred/docker-compose.yml +60 -0
  238. signalwire_sdk-3.4.3.dev119/tutorial/fred/fred.py +206 -0
  239. signalwire_sdk-3.4.3.dev119/tutorial/fred/fred.sh +175 -0
  240. signalwire_sdk-3.4.3.dev119/tutorial/fred/requirements.txt +1 -0
  241. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/01-introduction.md +138 -0
  242. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/02-setup.md +331 -0
  243. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/03-basic-agent.md +358 -0
  244. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/04-wikipedia-skill.md +313 -0
  245. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/05-custom-functions.md +378 -0
  246. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/06-running-testing.md +638 -0
  247. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/README.md +56 -0
  248. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/appendix-complete-code.md +568 -0
  249. signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/appendix-docker-deployment.md +492 -0
  250. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/.env.example +28 -0
  251. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/.gitignore +8 -0
  252. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/Dockerfile +17 -0
  253. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/check_docs.py +163 -0
  254. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/handlers.py +361 -0
  255. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/penny.py +205 -0
  256. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/penny.sh +61 -0
  257. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/requirements.txt +5 -0
  258. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/reservations.py +764 -0
  259. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/test_penny.py +588 -0
  260. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/01-why-guardrails.md +136 -0
  261. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/02-design-first.md +139 -0
  262. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/03-rules-first.md +322 -0
  263. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/04-the-shell.md +193 -0
  264. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/05-steps-and-scoping.md +203 -0
  265. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/06-tools-that-decide.md +340 -0
  266. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/07-gather-and-projection.md +145 -0
  267. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/08-the-verification-gate.md +273 -0
  268. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/09-people-and-endings.md +262 -0
  269. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/10-testing-and-running.md +263 -0
  270. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/README.md +102 -0
  271. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-complete-code.md +1557 -0
  272. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-deployment.md +184 -0
  273. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-technique-map.md +116 -0
  274. signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/workflow.py +181 -0
  275. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/README.md +266 -0
  276. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson1_first_agent.md +472 -0
  277. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson2_knowledge_bases.md +523 -0
  278. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson3_multi_agent_systems.md +486 -0
  279. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson4_advanced_features.md +802 -0
  280. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson5_extending_agents.md +955 -0
  281. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/pc_builder.py +588 -0
  282. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_agent.py +99 -0
  283. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_agent_with_search.py +132 -0
  284. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_knowledge.md +139 -0
  285. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_knowledge.swsearch +0 -0
  286. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/support_knowledge.md +256 -0
  287. signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/support_knowledge.swsearch +0 -0
  288. signalwire_sdk-3.4.3.dev117/setup.py +0 -12
  289. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/cli/__init__.py +0 -16
  290. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -145
  291. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -543
  292. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/search/__init__.py +0 -146
  293. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/skills/web_search/README.md +0 -163
  294. signalwire_sdk-3.4.3.dev117/signalwire/signalwire/utils/url_validator.py +0 -94
  295. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/LICENSE +0 -0
  296. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/sw-search.1 +0 -0
  297. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/swaig-test.1 +0 -0
  298. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/setup.cfg +0 -0
  299. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/__init__.py +0 -0
  300. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/__init__.py +0 -0
  301. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/client.py +0 -0
  302. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/gateway.py +0 -0
  303. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/handoff.py +0 -0
  304. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/__init__.py +0 -0
  305. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  306. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  307. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  308. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  309. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  310. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/__init__.py +0 -0
  311. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  312. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  313. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  314. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  315. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  316. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  317. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/types.py +0 -0
  318. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/__init__.py +0 -0
  319. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/_agent_host.py +0 -0
  320. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/__init__.py +0 -0
  321. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  322. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  323. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  324. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  325. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  326. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  327. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  328. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  329. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  330. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  331. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  332. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/auth_handler.py +0 -0
  333. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/capabilities.py +0 -0
  334. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/config_loader.py +0 -0
  335. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  336. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  337. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
  338. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  339. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  340. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  341. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/pom_builder.py +0 -0
  342. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt.py +0 -0
  343. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
  344. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/__init__.py +0 -0
  345. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  346. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_base.py +0 -0
  347. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
  348. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
  349. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_builder.py +0 -0
  350. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_handler.py +0 -0
  351. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_renderer.py +0 -0
  352. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
  353. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/web.py +0 -0
  354. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/plugins.py +0 -0
  355. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  356. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  357. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  358. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/__init__.py +0 -0
  359. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom.py +0 -0
  360. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom_tool.py +0 -0
  361. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/__init__.py +0 -0
  362. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/concierge.py +0 -0
  363. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  364. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  365. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  366. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/survey.py +0 -0
  367. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/py.typed +0 -0
  368. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/__init__.py +0 -0
  369. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/call.py +0 -0
  370. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/constants.py +0 -0
  371. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/event.py +0 -0
  372. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/message.py +0 -0
  373. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
  374. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/__init__.py +0 -0
  375. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_base.py +0 -0
  376. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_pagination.py +0 -0
  377. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_request_options.py +0 -0
  378. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/call_handler.py +0 -0
  379. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  380. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
  381. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  382. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  383. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
  384. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
  385. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  386. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
  387. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
  388. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  389. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
  390. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
  391. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  392. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
  393. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
  394. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
  395. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
  396. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  397. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  398. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
  399. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
  400. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  401. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
  402. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
  403. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
  404. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
  405. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  406. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  407. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  408. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  409. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
  410. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
  411. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
  412. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
  413. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  414. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
  415. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
  416. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  417. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  418. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  419. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
  420. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
  421. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  422. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  423. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
  424. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  425. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  426. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
  427. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
  428. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
  429. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
  430. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/schema.json +0 -0
  431. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/query_processor.py +0 -0
  432. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/__init__.py +0 -0
  433. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  434. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  435. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  436. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  437. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  438. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  439. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  440. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  441. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  442. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  443. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  444. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  445. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  446. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/skill.py +0 -0
  447. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/__init__.py +0 -0
  448. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/skill.py +0 -0
  449. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  450. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  451. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  452. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  453. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  454. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/registry.py +0 -0
  455. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  456. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  457. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  458. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  459. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  460. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  461. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  462. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  463. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  464. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/__init__.py +0 -0
  465. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/pom_utils.py +0 -0
  466. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/schema_utils.py +0 -0
  467. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/token_generators.py +0 -0
  468. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/validators.py +0 -0
  469. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/__init__.py +0 -0
  470. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/web_service.py +0 -0
  471. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  472. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  473. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  474. {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/tests/test_examples.py +0 -0
@@ -0,0 +1,619 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ Webhook signatures and SWAIG tokens are now enforced on every path, including
6
+ serverless. Skills that fetch URLs no longer reach internal addresses through
7
+ redirects, the agent's `/mcp` endpoint requires basic auth, and `async def`
8
+ tool handlers run. Synchronous handlers and callbacks run in worker threads,
9
+ so a slow one no longer holds up every other call. The package now installs
10
+ its documentation, and `sw-pydocs` prints it.
11
+
12
+ ### Added
13
+ - `sw-pydocs`: the SDK's documentation for the installed version, for people
14
+ and coding agents. With no arguments it prints an index; `sw-pydocs <topic>`
15
+ covers an area, with the installed docs to read, examples and API names;
16
+ `sw-pydocs api <name>` prints a signature, docstring and members from the
17
+ installed code; and `examples`, `grep`, `show` and `path` find the installed
18
+ files. `python -m signalwire` runs it too.
19
+ - The wheel installs the docs, examples and tutorials, under
20
+ `signalwire/_docs/`, so it's about twice as large (1.7 MB).
21
+ - `sw-pydocs init` adds a section to a project's `AGENTS.md` that tells coding
22
+ agents to use `sw-pydocs`, and `sw-agent-init` writes it into new projects.
23
+ - The package's `llms.txt` lists the installed docs.
24
+
25
+ ### Changed
26
+ - The web server runs synchronous user code in a worker thread, from AnyIO's
27
+ thread pool (40 threads by default), instead of on its event loop: `def`
28
+ tool handlers, the per-request configuration callback and the render of the
29
+ copy it configures, routing callbacks, `on_summary`, the debug event handler
30
+ and tools called through `/mcp`. Before, a handler that waited on an API or
31
+ a database held up every other request on the server, including other
32
+ calls' SWML. The context variables that code sets are applied to the
33
+ request's context when it returns, so they still reach the request's later
34
+ steps, such as the configuration callback's to the tool. `async def`
35
+ handlers are still awaited directly on the event loop, without a worker
36
+ thread.
37
+ An `on_swml_request` override (including `InfoGathererAgent`'s question
38
+ callback) and the render of the agent's own document stay on the event
39
+ loop too, as do a plain `SWMLService`'s `on_request` and render. Set
40
+ `SWML_SYNC_HANDLERS_INLINE=true` to run everything on the event loop, as
41
+ before.
42
+ - With a per-request configuration callback set, a tool handler that's a
43
+ method of the agent (an `@AgentBase.tool` method, or `self.method` passed to
44
+ `define_tool()`, or a partial of one) runs with `self` as that request's
45
+ configured copy, as `on_summary` already did. It used to run on the
46
+ original agent, so it couldn't see what the callback configured. Tools
47
+ called through `/mcp` don't use the callback and still run on the agent.
48
+ - The per-request copy starts with the skills the agent loaded, instead of
49
+ loading each one again, which ran every skill's `setup()` on every
50
+ request and left the copy's skill list empty.
51
+ - Importing `signalwire.cli` no longer imports `swaig-test`, so the SDK's other
52
+ commands start about 0.8 seconds sooner.
53
+
54
+ ### Fixed
55
+ - Security: `serve()` (and so `run()`) registered its catch-all route before the
56
+ agent's router, so every request reached the handlers without the webhook
57
+ signature check. With a `signing_key` set, an unsigned `POST` to the SWML,
58
+ SWAIG or post-prompt endpoint was accepted. The router now comes first, and
59
+ the catch-alls in `serve()`, `mount()` and `AgentServer` run the same check
60
+ before dispatching, so the agent's bare route and slash variants such as
61
+ `/agent//swaig` are covered too.
62
+ - Security: a `secure=True` SWAIG function ran when the request carried no
63
+ token at all, or a token but no `call_id`; only a wrong token was refused.
64
+ Now a secure function runs only with a valid token for that function and
65
+ call. The token is checked against the agent that runs the function, so a
66
+ secure tool registered by per-call configuration needs its token too.
67
+ - Security: routing-callback paths (`register_routing_callback`) render SWML
68
+ like the root, and now need a signature like the root when a `signing_key`
69
+ is set.
70
+ - Tokens for a call whose id contains a dot (composed conversation ids such as
71
+ `root.2`) never validated, so that call's secure functions were refused.
72
+ - Security: a `POST` to the post-prompt endpoint now needs the token minted
73
+ into the post-prompt URL. It was validated only when present, and processed
74
+ either way. A request whose URL and body name different calls is refused,
75
+ so one call's token can't deliver another call's summary.
76
+ - Security: serverless requests (Lambda, CGI, Cloud Functions, Azure Functions,
77
+ and `AgentServer`'s CGI and Lambda modes) never checked signatures or SWAIG
78
+ tokens, and `AgentServer`'s serverless modes didn't check basic auth. They now
79
+ share one request path with the web server's rules: running a function or
80
+ delivering a summary takes a POST, and every POST needs a valid signature
81
+ when a `signing_key` is set, whatever its path.
82
+ - Serverless: post-prompt summaries reach `on_summary`, with the same token
83
+ check as on the web server; before, the post-prompt URL was treated as a
84
+ function name and the summary was lost.
85
+ - Serverless: SWML is rendered for the call the request names, with per-call
86
+ configuration applied (it sees the request's query and headers), so its
87
+ tokens validate when the call's functions run. Function calls get the same
88
+ per-call configuration, so a tool it registers can run.
89
+ Tool calls on a route other than `/` now reach the function (they failed with
90
+ "Function 'agent/swaig' not found"), as do CGI calls to `/swaig` and Azure
91
+ calls whose URL has a query string. CGI responses now carry a status and
92
+ headers, `AgentServer` passes a function its arguments rather than the whole
93
+ request body, and `AgentServer` serves an agent registered at `/`.
94
+ - Serverless signature checks rebuild the public URL the way the web server
95
+ does. Behind trusted forwarded headers the platform's path prefix (a CGI
96
+ script, an Azure function app) is kept, and for API Gateway REST events,
97
+ which lose the query's original encoding, both encodings are tried.
98
+ - `get_app()` serves the agent's route without a trailing slash (it answered
99
+ 204), and `/agentswaig` is no longer treated as `/agent/swaig`.
100
+ - Logging: until something configures logging, SDK loggers printed every
101
+ level, debug included, to stdout. They now write through stdlib logging and
102
+ are silent until `configure_logging()` runs (as `serve()` and `run()` do) or
103
+ the host app configures logging. `swaig-test --verbose` turns them on, and
104
+ `swaig-test --dump-swml --raw` prints clean JSON. Every SDK logger now lives
105
+ under the `signalwire` namespace (`agent_base` is `signalwire.agent_base`),
106
+ so the SDK no longer shares, or reconfigures, a host app's logger that
107
+ happens to have the same name.
108
+ - `wikipedia_search` sends a User-Agent; Wikipedia answered 403 without one.
109
+ - Security: the spider and web_search skills checked a URL before fetching it,
110
+ then followed redirects, so a public page that redirected to an internal
111
+ address, such as a cloud metadata service, was fetched and returned. A
112
+ hostname whose DNS answer changed between the check and the connection had
113
+ the same effect. They now check every request, redirects included, and
114
+ refuse a connection to a private or internal address. `validate_url()` also
115
+ blocks IPv4-mapped IPv6 addresses such as `::ffff:169.254.169.254`, and the
116
+ unspecified address.
117
+ - Security: the agent's `/mcp` endpoint (`enable_mcp_server()`) had no
118
+ authentication, and found none of the agent's tools: `tools/list` was empty
119
+ and `tools/call` answered "Unknown tool". It now requires the agent's basic
120
+ auth credentials, lists and calls the tools the agent runs itself (not
121
+ DataMap or external webhook tools), and awaits `async def` handlers.
122
+ - Security: the MCP gateway's sample and generated configurations listen on
123
+ `0.0.0.0` with the published password `changeme`. While that password is in
124
+ use, the gateway now listens on `127.0.0.1` only, and logs a warning.
125
+ - Tool handlers defined with `async def` never ran. The SDK returned their
126
+ coroutine, and `/swaig` answered with its repr. `/swaig` now awaits them on
127
+ the request's event loop, and serverless, `swaig-test` and
128
+ `SWAIGFunction.execute()` run them to completion.
129
+ - Constructor arguments take precedence over an agent's config file, as
130
+ documented. The file's `service.name` always replaced the `name` passed to
131
+ `AgentBase`, and its route and host replaced a `route="/"` or
132
+ `host="0.0.0.0"` passed on purpose.
133
+ - `get_basic_auth_credentials(include_source=True)` reports where the
134
+ credentials came from, recorded when they were resolved. It guessed from
135
+ their values, and credentials passed to the constructor could show as
136
+ generated.
137
+ - native_vector_search: logs no longer include the password in `remote_url`,
138
+ and log the caller's query, the tool arguments, and error details that can
139
+ echo the query at DEBUG only. The SWAIG request isn't logged.
140
+ - native_vector_search: the pgvector auto-build appended another full copy of
141
+ every chunk on each start, and ignored `overwrite`. It now builds a
142
+ collection only when it doesn't exist, or rebuilds it when `overwrite` is
143
+ set. If it can't tell whether the collection exists, it logs an error and
144
+ doesn't build. `IndexBuilder.build_index()` accepts `overwrite`.
145
+ - pgvector: `overwrite` failed on a database with no collections yet.
146
+ - A context step that lists a tool the agent doesn't have made rendering fail
147
+ with "Missing required field 'prompt'", and the reason was only logged,
148
+ which `swaig-test` suppresses by default. Rendering now raises the reason:
149
+ the step, the missing tool and the tools that exist.
150
+ - Search service: the query cache ignored `similarity_threshold` and
151
+ `language`, so a repeated query with a stricter threshold got the earlier
152
+ results, and it cached the empty results of a failed search. It no longer
153
+ logs the caller's query at INFO on a cache hit.
154
+ - Search: both markdown chunkers recorded sibling headings as parent and
155
+ child in a document that starts at `##` or skips a level. Section paths now
156
+ follow each heading's real level. This changes the `section`, `h1`/`h2`,
157
+ `depth:N` tags and `metadata_text` of affected chunks in indexes built from
158
+ now on.
159
+ - Search: `SearchIndexMigrator.migrate_pgvector_to_sqlite()` deleted the
160
+ output index, wrote one with no chunks, and reported success. Chunk export
161
+ was never implemented, so it now raises `NotImplementedError` before it
162
+ connects or touches the output path.
163
+ - Search: importing `signalwire.search` no longer imports the model stack, so
164
+ `sw-search` starts in about a second instead of 15. `openpyxl` is imported
165
+ only to read an Excel file.
166
+ - `sw-search --help` lists every option; it omitted `--backend`,
167
+ `--connection-string`, `--overwrite`, `--output-dir` and `--output-format`.
168
+ - `sw-search remote` accepts `--user` and `--password`, and no longer prints
169
+ the endpoint's password in verbose output or errors. Its threshold option is
170
+ `--similarity-threshold`, since higher is stricter; `--distance-threshold`
171
+ still works.
172
+ - `swaig-test`: the DataMap simulator accepts a webhook that returns a JSON
173
+ array, arguments the function doesn't declare get a warning, and
174
+ `--aws-api-gateway-id` and `--aws-stage` now simulate an API Gateway URL.
175
+ The DataMap simulator read a webhook's object response under `response.`,
176
+ where the platform reads it from the root, and it didn't expand the `lc`
177
+ and `enc` helpers or nested templates; it now does, and it points out a
178
+ `${response.…}` that doesn't resolve.
179
+ `--dump-swml` showed whatever a per-call configuration callback adds twice;
180
+ it shows it once, as the server sends it. It can also dump a plain
181
+ `SWMLService`, and `--help` lists `--call-id`.
182
+ - `BedrockAgent` renders `max_tokens`, `presence_penalty` and
183
+ `frequency_penalty`, and `set_prompt_llm_params()` accepts the settings the
184
+ Bedrock prompt defines. The examples use voices Bedrock offers.
185
+ - spider: `follow_robots_txt` is enforced, redirects included. The parameter
186
+ schema's defaults and `extract_type` values now match what the skill does.
187
+ - Five skills declared parameter ranges as `minimum`/`maximum`; every built-in
188
+ skill now uses `min`/`max`.
189
+ - The SWML schema search MCP server in `mcp/swml-schema-search/` finds
190
+ `schema.json` without `SWML_SCHEMA_PATH`.
191
+ - The MCP gateway's Docker image builds and runs, and Compose passes its
192
+ defaults instead of empty strings for unset variables.
193
+ - The per-request copy of an agent shared the agent's SWML document until its
194
+ render, so a verb method such as `play()` called on the copy in the
195
+ per-request callback added the verb to the agent's own document. The copy
196
+ now starts with its own.
197
+ - `add_mcp_server()` in the per-request callback added the server to the
198
+ agent's own list, so every call added another, and later calls saw them
199
+ all. The copy now has its own list, as it does for SIP usernames.
200
+ - The spider skill's page cache could raise `KeyError` when two fetches ran
201
+ at once, which they now can. It's locked.
202
+
203
+ ### Deprecated
204
+ - `keyword_weight` (`SearchEngine.search()`, the pgvector backend,
205
+ native_vector_search and `sw-search --keyword-weight`). It never changed
206
+ ranking, and passing it now warns.
207
+ - The `large` model alias, which loads the same model as `base`. Use `base`.
208
+ - spider's `concurrent_requests`, which was never used, and the `extract_type`
209
+ values `clean_text`, `full_text`, `html` and `custom`, which work as
210
+ `fast_text` with a warning.
211
+
212
+ ### Removed
213
+ - The standalone copies of the MCP gateway service in `mcp_gateway/`
214
+ (`gateway_service.py`, `mcp_manager.py`, `session_manager.py` and
215
+ `requirements.txt`). The Docker image runs the packaged `mcp-gateway`
216
+ command.
217
+
218
+ ### Notes for upgraders
219
+ - Calling a secure function directly, for example with `curl`, now needs the
220
+ token from the function's `web_hook_url` in the SWML, fetched with
221
+ `?call_id=<id>`. `swaig-test` is unaffected. SignalWire's own requests
222
+ already carry the token.
223
+ - A serverless agent with a `signing_key` now validates signatures. If its
224
+ requests start failing with 403, the platform sees a different URL than the
225
+ one SignalWire called; set `SWML_PROXY_URL_BASE` to the public URL.
226
+ - An app that embeds an agent (`get_app()`, `as_router()`) no longer gets SDK
227
+ log output on stdout by default. Configure `logging`, or call
228
+ `signalwire.configure_logging()`.
229
+ - SDK logger names gained a `signalwire.` prefix. Code that configured a short
230
+ name such as `logging.getLogger("agent_base")` should use
231
+ `signalwire.agent_base`, or the `signalwire` namespace.
232
+ - A serverless function call must be a POST; other methods get 405.
233
+ - An MCP client that calls an agent's `/mcp` endpoint must send the agent's
234
+ basic auth credentials.
235
+ - The MCP gateway, with the published password, listens on `127.0.0.1` only.
236
+ Set `auth_password` (or `MCP_AUTH_PASSWORD`) to accept other connections.
237
+ Compose now requires `MCP_AUTH_PASSWORD`, and the sample configuration,
238
+ Compose file and scripts use port 8080, the code's default, instead of 8100.
239
+ - With a per-request configuration callback set, a tool method's `self` is
240
+ the request's copy of the agent. A method that kept state across calls by
241
+ assigning an attribute (`self.count += 1`) now assigns it on the copy, and
242
+ the value is gone after the request. Keep that state in an object the
243
+ agent already holds, or in your own storage.
244
+ - Synchronous tool handlers and callbacks can now run at the same time as each
245
+ other. Guard state they share, such as a module-level dictionary, with a
246
+ `threading.Lock`, and don't share one `sqlite3` connection between them.
247
+ A synchronous handler no longer runs on the event loop, so
248
+ `asyncio.create_task()`, `asyncio.get_running_loop()` and similar calls in
249
+ it raise `RuntimeError`; make such a handler `async def`.
250
+ Without a per-request configuration callback, a handler that's a method of
251
+ the agent runs with `self` as the agent every call shares. Setting
252
+ `SWML_SYNC_HANDLERS_INLINE=true` restores the previous behavior while you
253
+ check.
254
+ - The MCP gateway's Docker image installs `signalwire-sdk` from PyPI (pin one
255
+ with `--build-arg SDK_VERSION=x.y.z`), so it gets these fixes only from a
256
+ release that includes them.
257
+ - The spider and web_search skills fetch pages directly, ignoring
258
+ `HTTP_PROXY` and `HTTPS_PROXY`, because through a proxy the address check
259
+ can't apply. To fetch through a proxy that blocks private destinations
260
+ itself, set `SWML_URL_FETCH_USE_PROXY=true`. web_search's Google API request
261
+ still uses the proxy.
262
+ - With `follow_robots_txt` on, the spider skips pages the site's robots.txt
263
+ disallows. It was ignored before.
264
+ - A pgvector collection that the auto-build appended to on each start holds
265
+ duplicate chunks. Rebuild it once with `overwrite` set.
266
+ - Rebuild markdown indexes to get the corrected section paths; existing
267
+ indexes don't change.
268
+ - `migrate_pgvector_to_sqlite()` raises `NotImplementedError`. Rebuild the
269
+ SQLite index from the source documents instead.
270
+ - A subclass that passes its own `route="/"` default to `AgentBase` now
271
+ overrides a route set in the config file, even when its caller didn't pass a
272
+ route. Forward only the arguments the caller gave.
273
+ - The docs showed DataMap templates reading a webhook's response as
274
+ `${response.field}`, which the platform doesn't resolve: it reads the JSON
275
+ response from the root, as `${field}`, and arguments as `${args.name}`.
276
+ Check DataMap tools written from the old docs.
277
+ - Code that reads `minimum`/`maximum` from a skill's parameter schema should
278
+ read `min`/`max`.
279
+ - The credential source is `provided`, `environment`, `config file` or
280
+ `generated`. `SWMLService` returned `auto-generated`, and `config file` is
281
+ new.
282
+
283
+ ## [3.4.3] - 2026-09-17
284
+
285
+ AI Chat gateway: browser-volunteered page context.
286
+
287
+ ### Added
288
+ - `ChatGateway` forwards an optional `user_meta_data` object from the browser
289
+ to the chat service, reaching your agent's config endpoint at
290
+ `params.user_meta_data`. It exists so a chat agent can tailor its greeting
291
+ from page context the way a voice agent already does from dial-time
292
+ `userVariables` — send the same structure on both and one parse serves both
293
+ transports. The service reads it only on the call that *creates* the
294
+ conversation, so it is a snapshot taken at the greeting rather than a live
295
+ feed; see `docs/ai_chat_gateway.md`. It is the single field the gateway
296
+ forwards rather than overwrites, so it is bounded (8 KiB serialized, `413`
297
+ past that; `400` if not an object) and stays nested under its own key where
298
+ it cannot displace the conversation id or `config_url`. Browser-authored:
299
+ treat it as a visitor's claim, never as authority.
300
+
301
+ ## [3.4.2] - 2026-09-17
302
+
303
+ Search-index and webhook-signature fixes.
304
+
305
+ ### Fixed
306
+ - Search: the FTS5 keyword index is now populated at build time. `chunks_fts` is
307
+ an external-content table, so nothing filled it and `MATCH` returned nothing on
308
+ a freshly built `.swsearch` — keyword search silently degraded to a LIKE scan.
309
+ Rebuild existing indexes to gain working keyword search.
310
+ - Search: the zero-embedding fallback for a chunk that fails to embed now matches
311
+ the loaded model's dimension instead of a hardcoded 768, which corrupted
312
+ indexes built with a 384-dim model (the mini/all-MiniLM default).
313
+
314
+ ### Added
315
+ - Webhook signature validation now accepts the stronger
316
+ `X-SignalWire-Sha256-Signature` header (HMAC-SHA256), preferred over the SHA-1
317
+ `X-SignalWire-Signature` when present and falling back to it so existing
318
+ deployments keep working. New `validate_webhook_signature_sha256()` and
319
+ `SIGNALWIRE_SHA256_SIGNATURE_HEADER` are exported from `core/security`.
320
+
321
+ ## [3.4.1] - 2026-09-06
322
+
323
+ Search correctness and retrieval-quality fixes.
324
+
325
+ ### Fixed
326
+ - pgvector: `SET LOCAL ivfflat.probes` was discarded before the query ran, so
327
+ every search scanned a single list — roughly 1% of the table — and silently
328
+ returned whatever happened to live there. Recall looked like a model problem
329
+ and was a transaction-scope bug.
330
+ - Search results are no longer served from a stale cache after an index is
331
+ reloaded.
332
+ - Non-semantic signals (keyword agreement) now REORDER results rather than
333
+ choosing them: a chunk vector search never found cannot be promoted into the
334
+ answer on keyword agreement alone, and agreement earns a bounded tiebreak
335
+ rather than an unbounded boost.
336
+ - `_get_model_name` falls back to the default model when no connection string
337
+ is available, instead of constructing a backend with `None`.
338
+ - Optional-dependency shims are tested with `is None` rather than truthiness,
339
+ and `_blend` is annotated — clearing the findings CI reports when the search
340
+ extras are installed.
341
+
342
+ ### Changed
343
+ - pgvector indexes build as **HNSW** instead of IVFFlat: better recall at lower
344
+ latency, and reproducible — IVFFlat's list assignment depends on the data
345
+ present at build time, so the same corpus indexed twice could answer
346
+ differently. Existing indexes keep working; rebuild to get the new type.
347
+
348
+ ## [3.4.0] - 2026-08-24
349
+
350
+ Covers everything landed since 3.2.0. 3.3.0 was never tagged or documented, so
351
+ its contents are folded in here.
352
+
353
+ ### New Features
354
+ - AI Chat: added `signalwire.ai_chat` — `AIChatClient`, an async client for the
355
+ AI Chat service (`POST https://{space}.signalwire.com/api/ai/chat`). HTTP
356
+ Basic `project:api_token` with the space in the hostname and a JSON-RPC body
357
+ carrying pure payload; identity never rides in the body. Methods:
358
+ `create_conversation`, `chat`, `end`, `delete`, `log`, `summarize`, with
359
+ JSON-RPC error codes mapped to typed exceptions.
360
+ - AI Chat: added `ChatGateway`, a back-for-frontend so browser widgets never
361
+ hold a chat-service token. The page talks to your host, your host holds the
362
+ credential, and the conversation id the page carries is an HMAC-signed handle
363
+ it cannot forge or repoint at someone else's conversation. Four methods:
364
+ `start` (creates, and can post the opening turn so the agent greets first),
365
+ `chat`, `log` (tab-scoped resume replays the transcript), `end`.
366
+ - AI Chat: `ChatGateway` now reports `conversation_timeout` on create, `start`
367
+ and `log`. A conversation idle past its timeout is ended server-side and the
368
+ next message quietly opens a different one, with the transcript above it
369
+ still reading as continuous; the browser cannot see that coming from the
370
+ JSON-RPC result alone, and the gateway is the only component that knows.
371
+ - AI Chat: added `HandoffRouter` (`ai_chat/handoff.py`) for the `/handoff`,
372
+ `/escalate` and `/say` routes the SignalWire address widget already targets
373
+ against a `ChatGateway` URL. Owns the wire contract only — routes, nonce,
374
+ ordering guarantee, spend guards.
375
+ - Agent: capability declaration and post-prompt normalization.
376
+ - SWML schema: typed `ai_sidecar` verb and `RingbackConfig`, merged to 169
377
+ `$defs` while preserving the SDK-side `x-sdk-*` annotations.
378
+
379
+ ### FunctionResult
380
+ - `response` may now be an object separating outcome from instruction:
381
+ `{"tool_result": ..., "tool_prompt": ...}`, via `set_tool_response()` or the
382
+ new `tool_result=` / `tool_prompt=` constructor arguments. `tool_result` is
383
+ what the tool DID, for the model to reason from; `tool_prompt` is what the
384
+ model should SAY. Splitting them stops a status line being read aloud and
385
+ stops an instruction being mistaken for data. The plain string form is
386
+ unchanged.
387
+ - `hold()` takes an optional prompt as its first argument and sets `response`
388
+ and `post_process` itself. The hold action carries no prompt of its own, and
389
+ during hold speech detection is paused and the agent will not respond, so
390
+ anything the caller needs to hear has to be said before the action lands.
391
+ An int in that position is still treated as the timeout, so `hold(120)` and
392
+ `hold(timeout=120)` are unchanged.
393
+ - `hold()` gained `step` and `timeout_step`, which route the call to a chosen
394
+ step when the hold ends — `step` when it is released early, `timeout_step`
395
+ when it expires. These are deferred: they fire when the hold actually ends,
396
+ unlike `swml_change_step()`, which applies immediately and would move the
397
+ caller before the hold begins. Omitting both emits the bare integer form.
398
+ - `rpc_ai_message()` accepts `global_data`, merged into the target call's
399
+ `global_data`, and `message_text` is now optional. Added
400
+ `rpc_ai_global_data()` for the data-only case. A message competes for
401
+ attention with everything else arriving on that turn; data is silent until a
402
+ prompt expands it with `${global_data.key}`, which makes it the better
403
+ channel for content a later step needs to speak.
404
+ - Docs: corrected the class docstring's description of `response`. It said
405
+ "Text the AI should say back to the user", which reads as a script; the SWML
406
+ schema defines it as "a static response text or message returned to the AI
407
+ agent's context". It is an instruction the model reads and interprets, not
408
+ speech played to the caller. Documented the second-person form and when
409
+ `post_process` is required.
410
+
411
+ ### Fixes
412
+ - Search: `count` truncates results instead of reordering them. The candidate
413
+ pool was `count * 3` and every stage of `_process_candidates` reads the whole
414
+ pool, so a smaller pool could drop a document's keyword hit, cost it the
415
+ agreement boost, and sink it — retrieval quality depended on how many results
416
+ you asked for.
417
+ - Search: subsection chunks are retrievable.
418
+ - REST/docs: corrected the documented `live_transcribe` call shape. The docs
419
+ showed `live_transcribe(call_id, action="start", lang="en")`, but the
420
+ generated signature takes `action` as a keyword-only TypedDict union and has
421
+ no `lang`/`from_lang`/`to_lang` parameters, so copying the documented call
422
+ raised `TypeError`.
423
+
424
+ ### Notes for upgraders
425
+ - `rpc_ai_message()` raises `ValueError` when given neither `message_text` nor
426
+ `global_data`. Positional callers are unaffected; a caller previously passing
427
+ `message_text=None` produced a malformed RPC and now gets an exception.
428
+
429
+ ## [3.2.0] - 2026-07-14
430
+
431
+ ### New Features
432
+ - REST: added the `client.messages` resource for the native messaging API
433
+ (`/api/messaging`): `create` sends an SMS/MMS message
434
+ (`POST /api/messaging/messages`) and `update` redacts a previously sent
435
+ message's body (`PATCH /api/messaging/messages/{message_id}`). This is the
436
+ plural send/redact resource, distinct from the singular message *logs*
437
+ reachable via `client.logs.messages`.
438
+
439
+ ## [3.1.0] - 2026-07-14
440
+
441
+ ### New Features
442
+ - REST: added the `client.projects` CRUD resource for the project-management
443
+ API (`/api/projects`), including `rotate_signing_key`.
444
+
445
+ ## [3.0.2] - 2026-07-11
446
+
447
+ - REST: `ReadResource.paginate()` wires the `PaginatedIterator` into every list
448
+ resource so callers can page through all results (follows `links.next`).
449
+ - Docs: corrected env-var names and documented previously-undocumented knobs
450
+ (including the proxy/SSRF trust toggles);
451
+ fixed stale skill/namespace counts and phantom method references.
452
+
453
+ ## [3.0.1] - 2026-04-12
454
+
455
+ - Update install instructions and PyPI URLs to use `signalwire-sdk`
456
+
457
+ ## [3.0.0] - 2026-04-12
458
+
459
+ - Version bump
460
+
461
+ ## [1.1.0] - 2026-03-17
462
+
463
+ - Version bump
464
+
465
+ ## [1.0.22] - 2026-03-17
466
+
467
+ - Version bump
468
+
469
+ ## [1.0.19] - 2026-02-19
470
+
471
+ ### New Features
472
+ - Add full JSON Schema validation with `jsonschema-rs`
473
+ - `SchemaValidationError` exception on validation failures
474
+ - Option to disable schema validation
475
+ - Add RPC action methods for cross-call communication
476
+ - Add gather steps for structured data collection in contexts
477
+ - Add `replace` action for step history manipulation
478
+ - Add `add_dynamic_hints()` and `clear_dynamic_hints()` to `SwaigFunctionResult`
479
+ - Add `Context.get_step()` and `ContextBuilder.get_context()`, deep-copy contexts per call
480
+ - Add `remove_step()`, `move_step()`, and `clear_sections()` to Context/Step
481
+ - Add inline content kwargs to `Context.add_step()`
482
+ - Add `skip_prompt` flag to `SkillBase` for suppressing default POM injection
483
+ - Add namespaced `global_data` helpers to `SkillBase`
484
+ - Auto-hide SWAIG functions once gather questions are completed
485
+
486
+ ### New Skills
487
+ - Add `google_maps` skill for address validation and route computation
488
+ - Add `info_gatherer` skill for structured information collection
489
+ - Add `claude_skills` skill for loading Claude Code SKILL.md files
490
+
491
+ ### Bug Fixes
492
+ - Fix ~60 bugs found in comprehensive security and code audit
493
+ - Fix bug with invalid token handling
494
+ - Fix spurious error log when SWAIG function is called with empty raw arguments
495
+ - Fix `set_global_data` to merge without clobbering existing keys
496
+ - Remove deprecated `pkg_resources` usage
497
+
498
+ ### Testing
499
+ - Expand test coverage from 52% to 78% with 1,820 new tests
500
+ - Fix all 145 pre-existing test failures
501
+
502
+ ## [1.0.18] - 2026-01-26
503
+
504
+ - Fix `record_call()` default timeouts causing silent recording failures
505
+ - Change `initial_timeout` and `end_silence_timeout` defaults from `0.0` to `None`
506
+ - Timeout parameters now only included in SWML when explicitly set
507
+ - Add SWML schema search MCP server (`mcp/swml-schema-search/`)
508
+ - Fix bug in vector search scoring for pgvector backend
509
+ - Fix `fetch_conversation` response handling in post_prompt endpoint
510
+
511
+ ## [1.0.17] - 2025-12-21
512
+
513
+ - Add GitHub Actions for automated PyPI publishing
514
+ - `publish-dev.yml`: Publishes dev versions (X.Y.Z.devN) on push to main
515
+ - `publish-release.yml`: Publishes stable releases on version tags (v*)
516
+
517
+ ## [1.0.16] - 2025-12-11
518
+
519
+ - Support PORT environment variable for server port configuration
520
+ - Add Slack notification support to `sw-agent-dokku` deploy workflow template
521
+
522
+ ## [1.0.15] - 2025-12-09
523
+
524
+ - Fix catch-all handler overshadowing custom routes in `sw-agent-dokku` generated apps
525
+ - Fix static files and routes without trailing slash for gunicorn compatibility
526
+ - Add tests for AgentServer custom route handling
527
+
528
+ ## [1.0.14] - 2025-12-09
529
+
530
+ - Add WebRTC calling support to `sw-agent-dokku` generated apps
531
+ - Dynamic token generation via `/get_token` endpoint (24-hour expiration)
532
+ - `/get_credentials` endpoint for curl examples in web UI
533
+ - `/get_resource_info` endpoint for SignalWire dashboard integration
534
+ - Auto-create/update SWML handlers on startup
535
+ - Enhanced web UI with WebRTC calling controls and audio settings
536
+ - Add SignalWire credentials to generated `app.json` and `.env.example` templates
537
+ - Add `requests` dependency to generated requirements.txt
538
+
539
+ ## [1.0.13] - 2025-12-09
540
+
541
+ - Add `sw-agent-dokku` CLI for scaffolding Dokku deployments
542
+ - Simple mode: generates Procfile, runtime.txt, requirements.txt, CHECKS
543
+ - CI/CD mode: adds GitHub Actions workflows for auto-deployment
544
+ - Web interface option: `--web` flag for static file serving
545
+ - Register `/health` and `/ready` endpoints in `AgentServer.__init__()` for gunicorn compatibility
546
+ - Fix static files auth by using `AgentServer.serve_static_files()` in templates
547
+
548
+ ## [1.0.12] - 2025-12-08
549
+
550
+ - Export `SkillBase` from `signalwire_agents.skills` for convenience imports
551
+
552
+ ## [1.0.11] - 2025-12-06
553
+
554
+ - Add `mcp-gateway` as installed CLI command (`pip install "signalwire-agents[mcp-gateway]"`)
555
+ - Move MCP Gateway core files into `signalwire_agents/mcp_gateway/` package
556
+ - Add flask and flask-limiter as optional `[mcp-gateway]` dependencies
557
+ - Add cloud function support to `sw-agent-init` CLI tool
558
+ - Fix `sw-agent-init` to generate swaig-test compatible app.py
559
+ - Add comprehensive test script for `sw-agent-init`
560
+
561
+ ## [1.0.10] - 2025-11-30
562
+
563
+ - Fix Google Cloud Functions /swaig endpoint to support function name in request body
564
+ - Add URL detection for Google Cloud Functions to generate correct webhook URLs in SWML
565
+
566
+ ## [1.0.9] - 2025-11-30
567
+
568
+ - Add Azure Functions serverless support with proper URL detection for webhook URLs
569
+ - Add Google Cloud Functions serverless support
570
+ - Fix Flask header iteration bug in Google Cloud Functions auth check (use .get() instead of iteration)
571
+ - Fix Azure Functions auth check to use .get() method for headers
572
+ - Improve serverless mixin to properly detect base URL from request for correct SWML webhook URLs
573
+
574
+ ## [1.0.8] - 2025-11-29
575
+
576
+ - Fix tool definitions in docs to include parameters
577
+ - Add sw-agent-init CLI tool and man pages for all CLI tools
578
+
579
+ ## [1.0.7] - 2025-11-27
580
+
581
+ - Version bump
582
+
583
+ ## [1.0.6] - 2025-11-27
584
+
585
+ - Update documentation for contexts, datamap, API reference, SWAIG actions, and function results
586
+ - Add comprehensive example testing suite (tests/test_examples.py)
587
+ - Add static file serving example
588
+
589
+ ## [1.0.5] - 2025-11-26
590
+
591
+ - Add setuptools version upper bound (<81) to fix compatibility issues
592
+
593
+ ## [1.0.4] - 2025-11-26
594
+
595
+ - Add call flow verb insertion API for customizing SWML call flow
596
+ - `add_pre_answer_verb()` - Add verbs before answering (ringback, screening, routing)
597
+ - `add_post_answer_verb()` - Add verbs after answer, before AI (welcome messages, disclaimers)
598
+ - `add_post_ai_verb()` - Add verbs after AI ends (cleanup, transfers, logging)
599
+ - `add_answer_verb()` - Configure the answer verb (max_duration, etc.)
600
+ - `clear_pre_answer_verbs()`, `clear_post_answer_verbs()`, `clear_post_ai_verbs()`
601
+ - Fix `auto_answer=False` constructor parameter to actually skip the answer verb
602
+ - Add validation for pre-answer safe verbs with helpful warnings
603
+
604
+ ## [1.0.3] - 2025-11-24
605
+
606
+ - Version bump
607
+
608
+ ## [1.0.2] - 2025-11-24
609
+
610
+ - Version bump
611
+
612
+ ## [1.0.1] - 2025-11-23
613
+
614
+ - Version bump
615
+
616
+ ## [1.0.0] - 2025-11-22
617
+
618
+ - Version bump
619
+