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