roomkit 0.78.0__tar.gz → 0.80.0__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 (1279) hide show
  1. {roomkit-0.78.0 → roomkit-0.80.0}/PKG-INFO +6 -7
  2. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/ai-channels.md +20 -0
  3. {roomkit-0.78.0 → roomkit-0.80.0}/llms-full.txt +20 -0
  4. {roomkit-0.78.0 → roomkit-0.80.0}/pyproject.toml +7 -2
  5. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/__init__.py +4 -0
  6. roomkit-0.80.0/src/roomkit/_version.py +1 -0
  7. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_generation.py +7 -4
  8. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_stream_external_tools.py +5 -1
  9. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_streaming.py +4 -2
  10. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_tools.py +81 -10
  11. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_realtime.py +12 -0
  12. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_delegation.py +21 -3
  13. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tool_recovery.py +28 -0
  14. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tools.py +139 -28
  15. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/ai.py +7 -1
  16. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/realtime_voice.py +3 -0
  17. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_hooks.py +6 -0
  18. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/exceptions.py +26 -0
  19. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/hooks.py +33 -0
  20. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/channel_ops.py +1 -0
  21. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/helpers.py +48 -0
  22. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/hooks_api.py +2 -2
  23. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/tool_call.py +33 -0
  24. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/tool_audit.py +23 -4
  25. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/base.py +8 -0
  26. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/realtime.py +458 -52
  27. roomkit-0.80.0/src/roomkit/providers/gemini/realtime_models.py +186 -0
  28. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/sdk.py +56 -16
  29. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live.py +40 -2
  30. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/external.py +14 -2
  31. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/mcp.py +68 -21
  32. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/__init__.py +14 -0
  33. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_sip_types.py +2 -1
  34. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/provider.py +1 -1
  35. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini.py +7 -8
  36. roomkit-0.80.0/src/roomkit/voice/stt/gemini_transcribe.py +301 -0
  37. roomkit-0.80.0/tests/providers/gemini/test_sdk_env_warning.py +78 -0
  38. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_tool_loop.py +75 -2
  39. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_context_preservation.py +1 -1
  40. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_tool_provider.py +58 -0
  41. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_openai_live.py +75 -2
  42. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_realtime.py +750 -2
  43. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_realtime_models.py +14 -0
  44. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_skills.py +1 -1
  45. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_tool_recovery.py +105 -1
  46. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_arg_fold.py +2 -2
  47. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_unified_tool_call.py +410 -3
  48. roomkit-0.80.0/tests/voice/stt/test_gemini_transcribe.py +291 -0
  49. roomkit-0.78.0/src/roomkit/_version.py +0 -1
  50. roomkit-0.78.0/src/roomkit/providers/gemini/realtime_models.py +0 -44
  51. {roomkit-0.78.0 → roomkit-0.80.0}/.gitignore +0 -0
  52. {roomkit-0.78.0 → roomkit-0.80.0}/AGENTS.md +0 -0
  53. {roomkit-0.78.0 → roomkit-0.80.0}/LICENSE +0 -0
  54. {roomkit-0.78.0 → roomkit-0.80.0}/README.md +0 -0
  55. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/__init__.py +0 -0
  56. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/QUALITY.md +0 -0
  57. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/README.md +0 -0
  58. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/__init__.py +0 -0
  59. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/__main__.py +0 -0
  60. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/SKILL.md +0 -0
  61. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/references/rules.md +0 -0
  62. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/scripts/total.py +0 -0
  63. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/harness.py +0 -0
  64. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/measurement.py +0 -0
  65. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality.py +0 -0
  66. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality_oracles.py +0 -0
  67. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality_report.py +0 -0
  68. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/report.py +0 -0
  69. {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/scenarios.py +0 -0
  70. {roomkit-0.78.0 → roomkit-0.80.0}/docs/README.md +0 -0
  71. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/acp.md +0 -0
  72. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/api-reference.md +0 -0
  73. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/architecture.md +0 -0
  74. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/conference.md +0 -0
  75. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/hooks.md +0 -0
  76. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/identity-and-realtime.md +0 -0
  77. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/image-generation.md +0 -0
  78. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/installation.md +0 -0
  79. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/ollama-provider.md +0 -0
  80. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/orchestration.md +0 -0
  81. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/overview.md +0 -0
  82. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/quickstart.md +0 -0
  83. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/realtime-voice.md +0 -0
  84. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/resilience.md +0 -0
  85. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/rooms-and-channels.md +0 -0
  86. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/storage.md +0 -0
  87. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/testing.md +0 -0
  88. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/transport-providers.md +0 -0
  89. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/video.md +0 -0
  90. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/voice-channels.md +0 -0
  91. {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/voice-pipeline.md +0 -0
  92. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/architecture.svg +0 -0
  93. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/avatar-pipeline.svg +0 -0
  94. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/message-flow.svg +0 -0
  95. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/orchestration.svg +0 -0
  96. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/room-lifecycle.svg +0 -0
  97. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/video-pipeline.svg +0 -0
  98. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/voice-orchestration.svg +0 -0
  99. {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/voice-pipeline.svg +0 -0
  100. {roomkit-0.78.0 → roomkit-0.80.0}/llms.txt +0 -0
  101. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/ai_docs.py +0 -0
  102. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/__init__.py +0 -0
  103. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_client.py +0 -0
  104. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_context.py +0 -0
  105. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_events.py +0 -0
  106. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_usage.py +0 -0
  107. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_coalescers.py +0 -0
  108. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_context.py +0 -0
  109. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_events.py +0 -0
  110. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_loop_rules.py +0 -0
  111. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_policy.py +0 -0
  112. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_resilience.py +0 -0
  113. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_steering.py +0 -0
  114. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_stream_round.py +0 -0
  115. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_cli_markdown.py +0 -0
  116. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_access.py +0 -0
  117. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_activity.py +0 -0
  118. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_attachment.py +0 -0
  119. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_backlog.py +0 -0
  120. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_identity.py +0 -0
  121. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_lane.py +0 -0
  122. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_lanes.py +0 -0
  123. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_metadata.py +0 -0
  124. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_mixer.py +0 -0
  125. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_operations.py +0 -0
  126. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_plug.py +0 -0
  127. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording.py +0 -0
  128. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording_events.py +0 -0
  129. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording_writer.py +0 -0
  130. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_room_state.py +0 -0
  131. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_roster.py +0 -0
  132. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_session.py +0 -0
  133. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_shutdown.py +0 -0
  134. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_subscription.py +0 -0
  135. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_voice.py +0 -0
  136. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_dangling_recovery.py +0 -0
  137. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_audio.py +0 -0
  138. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_context.py +0 -0
  139. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_response.py +0 -0
  140. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_skills.py +0 -0
  141. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_speech.py +0 -0
  142. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tool_search.py +0 -0
  143. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_transcription.py +0 -0
  144. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_sandbox_handlers.py +0 -0
  145. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_activation.py +0 -0
  146. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_constants.py +0 -0
  147. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_handlers.py +0 -0
  148. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_speaker.py +0 -0
  149. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_task_planner.py +0 -0
  150. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_eviction.py +0 -0
  151. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_search.py +0 -0
  152. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_search_constants.py +0 -0
  153. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_usage.py +0 -0
  154. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_turn_config.py +0 -0
  155. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_video_hooks.py +0 -0
  156. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_video_resources.py +0 -0
  157. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_hooks.py +0 -0
  158. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_pipeline.py +0 -0
  159. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_stt.py +0 -0
  160. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_tts.py +0 -0
  161. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_turn.py +0 -0
  162. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/acp.py +0 -0
  163. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/acp_transport.py +0 -0
  164. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/agent.py +0 -0
  165. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/av.py +0 -0
  166. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/base.py +0 -0
  167. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/cli.py +0 -0
  168. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/conference.py +0 -0
  169. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/realtime_av.py +0 -0
  170. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/transport.py +0 -0
  171. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/video.py +0 -0
  172. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/voice.py +0 -0
  173. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/websocket.py +0 -0
  174. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/__init__.py +0 -0
  175. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_mapping.py +0 -0
  176. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_media.py +0 -0
  177. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_session.py +0 -0
  178. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_voice.py +0 -0
  179. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_mock_faults.py +0 -0
  180. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_mock_media.py +0 -0
  181. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/base.py +0 -0
  182. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/livekit.py +0 -0
  183. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/mock.py +0 -0
  184. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/models.py +0 -0
  185. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/__init__.py +0 -0
  186. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_activity.py +0 -0
  187. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_brand.py +0 -0
  188. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_chat.py +0 -0
  189. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_display.py +0 -0
  190. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_shell.py +0 -0
  191. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_state.py +0 -0
  192. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_terminal.py +0 -0
  193. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_tool_preview.py +0 -0
  194. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/__init__.py +0 -0
  195. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_delivery_targets.py +0 -0
  196. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_participant_channels.py +0 -0
  197. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_voice_delivery.py +0 -0
  198. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/callbacks.py +0 -0
  199. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/circuit_breaker.py +0 -0
  200. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/delivery.py +0 -0
  201. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/event_router.py +0 -0
  202. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/framework.py +0 -0
  203. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/inbound_router.py +0 -0
  204. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/lanes.py +0 -0
  205. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/locks.py +0 -0
  206. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/__init__.py +0 -0
  207. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/_child_execution.py +0 -0
  208. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/delegation.py +0 -0
  209. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/deliver.py +0 -0
  210. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/event_ops.py +0 -0
  211. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/greeting.py +0 -0
  212. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound.py +0 -0
  213. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_identity.py +0 -0
  214. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_locked.py +0 -0
  215. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_streaming.py +0 -0
  216. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/lane_execution.py +0 -0
  217. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/membership.py +0 -0
  218. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/realtime_ops.py +0 -0
  219. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/recording.py +0 -0
  220. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/regenerate.py +0 -0
  221. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/room_lifecycle.py +0 -0
  222. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/source_ops.py +0 -0
  223. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/voice_ops.py +0 -0
  224. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/rate_limiter.py +0 -0
  225. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/retry.py +0 -0
  226. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/router.py +0 -0
  227. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/task_utils.py +0 -0
  228. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/transcoder.py +0 -0
  229. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/visibility.py +0 -0
  230. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/__init__.py +0 -0
  231. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/_redis_scripts.py +0 -0
  232. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/base.py +0 -0
  233. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/memory.py +0 -0
  234. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/redis.py +0 -0
  235. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/serialization.py +0 -0
  236. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/worker.py +0 -0
  237. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/__init__.py +0 -0
  238. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/base.py +0 -0
  239. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/mock.py +0 -0
  240. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/__init__.py +0 -0
  241. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/base.py +0 -0
  242. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/mock.py +0 -0
  243. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/postgres.py +0 -0
  244. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/__init__.py +0 -0
  245. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/_wrapper.py +0 -0
  246. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/base.py +0 -0
  247. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/budget_aware.py +0 -0
  248. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/compacting.py +0 -0
  249. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/mock.py +0 -0
  250. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/retrieval.py +0 -0
  251. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/sliding_window.py +0 -0
  252. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/summarizing.py +0 -0
  253. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/token_estimator.py +0 -0
  254. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/__init__.py +0 -0
  255. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/channel.py +0 -0
  256. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/context.py +0 -0
  257. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/delivery.py +0 -0
  258. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/enums.py +0 -0
  259. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/event.py +0 -0
  260. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/framework_event.py +0 -0
  261. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/hook.py +0 -0
  262. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/identity.py +0 -0
  263. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/participant.py +0 -0
  264. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/pending_input.py +0 -0
  265. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/plan_event.py +0 -0
  266. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/response_metadata.py +0 -0
  267. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/room.py +0 -0
  268. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/session_event.py +0 -0
  269. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/steering.py +0 -0
  270. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/store_filter.py +0 -0
  271. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/streaming.py +0 -0
  272. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/task.py +0 -0
  273. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/thinking_event.py +0 -0
  274. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/trace.py +0 -0
  275. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/vision_event.py +0 -0
  276. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/voice_delivery.py +0 -0
  277. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/__init__.py +0 -0
  278. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/base.py +0 -0
  279. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/handoff.py +0 -0
  280. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/pipeline.py +0 -0
  281. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/result.py +0 -0
  282. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/router.py +0 -0
  283. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/session_audit.py +0 -0
  284. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/state.py +0 -0
  285. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/status_bus.py +0 -0
  286. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/status_redis.py +0 -0
  287. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/__init__.py +0 -0
  288. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/loop.py +0 -0
  289. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/pipeline.py +0 -0
  290. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/__init__.py +0 -0
  291. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_common.py +0 -0
  292. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_inject_per_worker.py +0 -0
  293. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_inject_strategy.py +0 -0
  294. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_install_auto.py +0 -0
  295. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/core.py +0 -0
  296. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/delegate.py +0 -0
  297. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/execution.py +0 -0
  298. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/prompts.py +0 -0
  299. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/results.py +0 -0
  300. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/supervised.py +0 -0
  301. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/swarm.py +0 -0
  302. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/__init__.py +0 -0
  303. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/__init__.py +0 -0
  304. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/image_parts.py +0 -0
  305. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/mock.py +0 -0
  306. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/openai_dialect.py +0 -0
  307. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/__init__.py +0 -0
  308. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/_convert.py +0 -0
  309. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/avatar.py +0 -0
  310. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/config.py +0 -0
  311. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/realtime.py +0 -0
  312. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/__init__.py +0 -0
  313. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/ai.py +0 -0
  314. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/config.py +0 -0
  315. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/models.py +0 -0
  316. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/request.py +0 -0
  317. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/__init__.py +0 -0
  318. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/ai.py +0 -0
  319. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/config.py +0 -0
  320. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/image.py +0 -0
  321. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/__init__.py +0 -0
  322. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/agent.py +0 -0
  323. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/base.py +0 -0
  324. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/config.py +0 -0
  325. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/mock.py +0 -0
  326. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/relay.py +0 -0
  327. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/__init__.py +0 -0
  328. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/ai.py +0 -0
  329. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/config.py +0 -0
  330. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/models.py +0 -0
  331. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/__init__.py +0 -0
  332. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/config.py +0 -0
  333. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/realtime.py +0 -0
  334. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/settings.py +0 -0
  335. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/voices.py +0 -0
  336. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/__init__.py +0 -0
  337. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/ai.py +0 -0
  338. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/config.py +0 -0
  339. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/models.py +0 -0
  340. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/__init__.py +0 -0
  341. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/base.py +0 -0
  342. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/bot.py +0 -0
  343. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/config.py +0 -0
  344. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/mock.py +0 -0
  345. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/__init__.py +0 -0
  346. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/config.py +0 -0
  347. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/email.py +0 -0
  348. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/__init__.py +0 -0
  349. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/config.py +0 -0
  350. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/realtime.py +0 -0
  351. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/voices.py +0 -0
  352. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/__init__.py +0 -0
  353. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/base.py +0 -0
  354. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/mock.py +0 -0
  355. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/__init__.py +0 -0
  356. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/ai.py +0 -0
  357. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/config.py +0 -0
  358. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/errors.py +0 -0
  359. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/image.py +0 -0
  360. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/image_models.py +0 -0
  361. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/models.py +0 -0
  362. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/request.py +0 -0
  363. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/schema.py +0 -0
  364. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/vertex.py +0 -0
  365. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/voices.py +0 -0
  366. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/__init__.py +0 -0
  367. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/base.py +0 -0
  368. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/config.py +0 -0
  369. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/mock.py +0 -0
  370. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/provider.py +0 -0
  371. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/webhook.py +0 -0
  372. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http_errors.py +0 -0
  373. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/__init__.py +0 -0
  374. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/base.py +0 -0
  375. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/mock.py +0 -0
  376. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/options.py +0 -0
  377. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/usage.py +0 -0
  378. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/__init__.py +0 -0
  379. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/ai.py +0 -0
  380. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/config.py +0 -0
  381. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/__init__.py +0 -0
  382. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/base.py +0 -0
  383. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/config.py +0 -0
  384. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/facebook.py +0 -0
  385. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/mock.py +0 -0
  386. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/webhook.py +0 -0
  387. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/__init__.py +0 -0
  388. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/ai.py +0 -0
  389. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/config.py +0 -0
  390. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/models.py +0 -0
  391. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/__init__.py +0 -0
  392. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/ai.py +0 -0
  393. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/config.py +0 -0
  394. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/models.py +0 -0
  395. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/__init__.py +0 -0
  396. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/ai.py +0 -0
  397. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/config.py +0 -0
  398. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image.py +0 -0
  399. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image_models.py +0 -0
  400. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image_stream.py +0 -0
  401. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_client.py +0 -0
  402. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_config.py +0 -0
  403. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_events.py +0 -0
  404. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_handlers.py +0 -0
  405. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_hosted.py +0 -0
  406. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_models.py +0 -0
  407. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/models.py +0 -0
  408. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime.py +0 -0
  409. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_base.py +0 -0
  410. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_events.py +0 -0
  411. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_models.py +0 -0
  412. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/voices.py +0 -0
  413. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/__init__.py +0 -0
  414. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/ai.py +0 -0
  415. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/config.py +0 -0
  416. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/image.py +0 -0
  417. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/image_models.py +0 -0
  418. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/models.py +0 -0
  419. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/__init__.py +0 -0
  420. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/config.py +0 -0
  421. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/realtime.py +0 -0
  422. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/voices.py +0 -0
  423. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/__init__.py +0 -0
  424. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/ai.py +0 -0
  425. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/config.py +0 -0
  426. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/models.py +0 -0
  427. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/__init__.py +0 -0
  428. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/ai.py +0 -0
  429. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/config.py +0 -0
  430. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/models.py +0 -0
  431. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/__init__.py +0 -0
  432. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/base.py +0 -0
  433. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/mock.py +0 -0
  434. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/__init__.py +0 -0
  435. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/config.py +0 -0
  436. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/email.py +0 -0
  437. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/__init__.py +0 -0
  438. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/config.py +0 -0
  439. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/sms.py +0 -0
  440. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/__init__.py +0 -0
  441. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/base.py +0 -0
  442. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/meta.py +0 -0
  443. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/mock.py +0 -0
  444. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/phone.py +0 -0
  445. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/__init__.py +0 -0
  446. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/base.py +0 -0
  447. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/bot_framework.py +0 -0
  448. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/config.py +0 -0
  449. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/conversation_store.py +0 -0
  450. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/mock.py +0 -0
  451. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/models.py +0 -0
  452. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/webhook.py +0 -0
  453. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/__init__.py +0 -0
  454. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/api.py +0 -0
  455. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/base.py +0 -0
  456. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/bot.py +0 -0
  457. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/config.py +0 -0
  458. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/entities.py +0 -0
  459. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/mock.py +0 -0
  460. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/update.py +0 -0
  461. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/webhook.py +0 -0
  462. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/__init__.py +0 -0
  463. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/_signature.py +0 -0
  464. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/config.py +0 -0
  465. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/rcs.py +0 -0
  466. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/sms.py +0 -0
  467. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/__init__.py +0 -0
  468. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/_signature.py +0 -0
  469. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/config.py +0 -0
  470. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/rcs.py +0 -0
  471. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/sms.py +0 -0
  472. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/webhook.py +0 -0
  473. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/url_safety.py +0 -0
  474. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/utils.py +0 -0
  475. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/vllm/__init__.py +0 -0
  476. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/vllm/config.py +0 -0
  477. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/__init__.py +0 -0
  478. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/config.py +0 -0
  479. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/sms.py +0 -0
  480. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/__init__.py +0 -0
  481. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/base.py +0 -0
  482. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/mock.py +0 -0
  483. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/personal.py +0 -0
  484. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/__init__.py +0 -0
  485. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/ai.py +0 -0
  486. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/config.py +0 -0
  487. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/image.py +0 -0
  488. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/image_models.py +0 -0
  489. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/models.py +0 -0
  490. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/realtime.py +0 -0
  491. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/realtime_models.py +0 -0
  492. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/voices.py +0 -0
  493. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/py.typed +0 -0
  494. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/__init__.py +0 -0
  495. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/_subscription.py +0 -0
  496. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/base.py +0 -0
  497. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/memory.py +0 -0
  498. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/redis.py +0 -0
  499. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/__init__.py +0 -0
  500. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/_pyav_mux.py +0 -0
  501. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/_room_recorder_manager.py +0 -0
  502. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/base.py +0 -0
  503. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/mock.py +0 -0
  504. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/pyav.py +0 -0
  505. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/__init__.py +0 -0
  506. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/executor.py +0 -0
  507. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/models.py +0 -0
  508. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/tools.py +0 -0
  509. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/__init__.py +0 -0
  510. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/base.py +0 -0
  511. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/hook.py +0 -0
  512. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/mock.py +0 -0
  513. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/tracker.py +0 -0
  514. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/__init__.py +0 -0
  515. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/errors.py +0 -0
  516. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/executor.py +0 -0
  517. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/models.py +0 -0
  518. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/parser.py +0 -0
  519. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/paths.py +0 -0
  520. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/registry.py +0 -0
  521. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/__init__.py +0 -0
  522. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/base.py +0 -0
  523. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/buzz.py +0 -0
  524. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/discord.py +0 -0
  525. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/neonize.py +0 -0
  526. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/sse.py +0 -0
  527. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/websocket.py +0 -0
  528. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/__init__.py +0 -0
  529. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/base.py +0 -0
  530. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/memory.py +0 -0
  531. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres.py +0 -0
  532. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_lock.py +0 -0
  533. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_mappers.py +0 -0
  534. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_schema.py +0 -0
  535. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/sqlite.py +0 -0
  536. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/__init__.py +0 -0
  537. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/base.py +0 -0
  538. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/cache.py +0 -0
  539. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/delegate.py +0 -0
  540. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/memory.py +0 -0
  541. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/models.py +0 -0
  542. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/__init__.py +0 -0
  543. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/base.py +0 -0
  544. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/config.py +0 -0
  545. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/console.py +0 -0
  546. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/context.py +0 -0
  547. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/mock.py +0 -0
  548. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/noop.py +0 -0
  549. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/opentelemetry.py +0 -0
  550. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/pyroscope.py +0 -0
  551. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/redaction.py +0 -0
  552. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/__init__.py +0 -0
  553. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/base.py +0 -0
  554. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/compose.py +0 -0
  555. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/context.py +0 -0
  556. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/human_input.py +0 -0
  557. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/policy.py +0 -0
  558. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/validation.py +0 -0
  559. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/__init__.py +0 -0
  560. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/ai_integration.py +0 -0
  561. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/__init__.py +0 -0
  562. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/base.py +0 -0
  563. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/mock.py +0 -0
  564. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/musetalk.py +0 -0
  565. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/websocket.py +0 -0
  566. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/__init__.py +0 -0
  567. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/base.py +0 -0
  568. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/fastrtc.py +0 -0
  569. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/local.py +0 -0
  570. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/mock.py +0 -0
  571. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/rtp.py +0 -0
  572. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/screen.py +0 -0
  573. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/sip.py +0 -0
  574. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/websocket.py +0 -0
  575. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/base.py +0 -0
  576. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/bridge.py +0 -0
  577. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/events.py +0 -0
  578. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/__init__.py +0 -0
  579. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/config.py +0 -0
  580. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/__init__.py +0 -0
  581. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/base.py +0 -0
  582. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/mock.py +0 -0
  583. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/pyav.py +0 -0
  584. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/__init__.py +0 -0
  585. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/base.py +0 -0
  586. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/pyav.py +0 -0
  587. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/engine.py +0 -0
  588. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/__init__.py +0 -0
  589. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/base.py +0 -0
  590. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/censor.py +0 -0
  591. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mediapipe_face_touch.py +0 -0
  592. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mock.py +0 -0
  593. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mock_face_touch.py +0 -0
  594. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/watermark.py +0 -0
  595. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/yolo.py +0 -0
  596. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/__init__.py +0 -0
  597. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/base.py +0 -0
  598. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/filter.py +0 -0
  599. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/image.py +0 -0
  600. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/mock.py +0 -0
  601. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/rich.py +0 -0
  602. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/subtitle.py +0 -0
  603. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/text.py +0 -0
  604. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/__init__.py +0 -0
  605. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/base.py +0 -0
  606. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/mock.py +0 -0
  607. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/pyav.py +0 -0
  608. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/__init__.py +0 -0
  609. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/base.py +0 -0
  610. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/effects.py +0 -0
  611. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/mock.py +0 -0
  612. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/__init__.py +0 -0
  613. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/base.py +0 -0
  614. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/mock.py +0 -0
  615. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/opencv.py +0 -0
  616. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/pyav.py +0 -0
  617. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/utils.py +0 -0
  618. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/video_frame.py +0 -0
  619. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/__init__.py +0 -0
  620. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/base.py +0 -0
  621. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/encode.py +0 -0
  622. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/gemini.py +0 -0
  623. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/mock.py +0 -0
  624. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/openai.py +0 -0
  625. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/screen_input.py +0 -0
  626. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/screen_tool.py +0 -0
  627. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/webcam_tool.py +0 -0
  628. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_g711.py +0 -0
  629. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_limits.py +0 -0
  630. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_sounddevice.py +0 -0
  631. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/audio_frame.py +0 -0
  632. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/auth.py +0 -0
  633. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/__init__.py +0 -0
  634. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_mulaw.py +0 -0
  635. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_resample.py +0 -0
  636. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_webrtc_auth.py +0 -0
  637. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/base.py +0 -0
  638. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/buzz_huddle.py +0 -0
  639. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/fastrtc.py +0 -0
  640. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/local.py +0 -0
  641. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/mock.py +0 -0
  642. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/rtp.py +0 -0
  643. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip.py +0 -0
  644. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_audio.py +0 -0
  645. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_auth.py +0 -0
  646. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_calling.py +0 -0
  647. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/twilio_ws.py +0 -0
  648. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/webtransport.py +0 -0
  649. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/base.py +0 -0
  650. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/bridge.py +0 -0
  651. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/__init__.py +0 -0
  652. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/base.py +0 -0
  653. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/local.py +0 -0
  654. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/mock.py +0 -0
  655. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/events.py +0 -0
  656. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/inbound.py +0 -0
  657. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/interruption.py +0 -0
  658. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/__init__.py +0 -0
  659. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/_telemetry.py +0 -0
  660. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/__init__.py +0 -0
  661. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/base.py +0 -0
  662. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/mock.py +0 -0
  663. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/speex.py +0 -0
  664. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/webrtc.py +0 -0
  665. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/__init__.py +0 -0
  666. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/base.py +0 -0
  667. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/mock.py +0 -0
  668. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/simple.py +0 -0
  669. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/__init__.py +0 -0
  670. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/base.py +0 -0
  671. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/mock.py +0 -0
  672. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/config.py +0 -0
  673. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/debug_taps.py +0 -0
  674. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/__init__.py +0 -0
  675. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/aicoustics.py +0 -0
  676. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/base.py +0 -0
  677. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/mock.py +0 -0
  678. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/rnnoise.py +0 -0
  679. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/sherpa_onnx.py +0 -0
  680. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/webrtc.py +0 -0
  681. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/__init__.py +0 -0
  682. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/base.py +0 -0
  683. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/mock.py +0 -0
  684. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/sherpa_onnx.py +0 -0
  685. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/__init__.py +0 -0
  686. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/base.py +0 -0
  687. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/mock.py +0 -0
  688. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/engine.py +0 -0
  689. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/__init__.py +0 -0
  690. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/base.py +0 -0
  691. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/numpy.py +0 -0
  692. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/python.py +0 -0
  693. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/offload.py +0 -0
  694. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/postprocessor/__init__.py +0 -0
  695. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/postprocessor/base.py +0 -0
  696. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/__init__.py +0 -0
  697. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/_wav_writer.py +0 -0
  698. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/base.py +0 -0
  699. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/mock.py +0 -0
  700. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/wav.py +0 -0
  701. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/__init__.py +0 -0
  702. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/base.py +0 -0
  703. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/linear.py +0 -0
  704. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/mock.py +0 -0
  705. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/numpy.py +0 -0
  706. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/sinc.py +0 -0
  707. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/__init__.py +0 -0
  708. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/base.py +0 -0
  709. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/mock.py +0 -0
  710. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/smart_turn.py +0 -0
  711. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/__init__.py +0 -0
  712. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/base.py +0 -0
  713. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/energy.py +0 -0
  714. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/mock.py +0 -0
  715. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/sherpa_onnx.py +0 -0
  716. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/__init__.py +0 -0
  717. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/_fastrtc_playback.py +0 -0
  718. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/bridge.py +0 -0
  719. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/events.py +0 -0
  720. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/fastrtc_transport.py +0 -0
  721. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/injection.py +0 -0
  722. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/mock.py +0 -0
  723. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/pacer.py +0 -0
  724. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/reasoning.py +0 -0
  725. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/sip_transport.py +0 -0
  726. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/ws_transport.py +0 -0
  727. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/__init__.py +0 -0
  728. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/base.py +0 -0
  729. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/deepgram.py +0 -0
  730. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini_audio.py +0 -0
  731. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini_transcript.py +0 -0
  732. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gradium.py +0 -0
  733. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/language.py +0 -0
  734. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/mock.py +0 -0
  735. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/qwen3.py +0 -0
  736. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/sherpa_onnx.py +0 -0
  737. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/__init__.py +0 -0
  738. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/backend.py +0 -0
  739. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/trace.py +0 -0
  740. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/wav.py +0 -0
  741. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/__init__.py +0 -0
  742. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/audio_utils.py +0 -0
  743. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/base.py +0 -0
  744. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/elevenlabs.py +0 -0
  745. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/filters.py +0 -0
  746. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/gemini.py +0 -0
  747. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/gradium.py +0 -0
  748. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/grok.py +0 -0
  749. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/mock.py +0 -0
  750. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/neutts.py +0 -0
  751. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/qwen3.py +0 -0
  752. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/sentence_splitter.py +0 -0
  753. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/sherpa_onnx.py +0 -0
  754. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/utils.py +0 -0
  755. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/LICENSE +0 -0
  756. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/__init__.py +0 -0
  757. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/stream.py +0 -0
  758. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/tracks.py +0 -0
  759. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/utils.py +0 -0
  760. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/webrtc_connection_mixin.py +0 -0
  761. {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/websocket.py +0 -0
  762. {roomkit-0.78.0 → roomkit-0.80.0}/tests/__init__.py +0 -0
  763. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/__init__.py +0 -0
  764. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/lane_audio.py +0 -0
  765. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_backend_abc.py +0 -0
  766. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_activity.py +0 -0
  767. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_attach_failure.py +0 -0
  768. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_channel.py +0 -0
  769. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_gating.py +0 -0
  770. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_hot_plug.py +0 -0
  771. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_identity.py +0 -0
  772. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_lane.py +0 -0
  773. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_metadata.py +0 -0
  774. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_mixer.py +0 -0
  775. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_outbound.py +0 -0
  776. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_pure_transport.py +0 -0
  777. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_races.py +0 -0
  778. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime.py +0 -0
  779. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime_hot_plug.py +0 -0
  780. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime_voice.py +0 -0
  781. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_recording.py +0 -0
  782. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_recording_isolation.py +0 -0
  783. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_teardown_failure.py +0 -0
  784. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_backend.py +0 -0
  785. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_live.py +0 -0
  786. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_mapping.py +0 -0
  787. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_mock_backend.py +0 -0
  788. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_mock_injection.py +0 -0
  789. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_models.py +0 -0
  790. {roomkit-0.78.0 → roomkit-0.80.0}/tests/conftest.py +0 -0
  791. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/__init__.py +0 -0
  792. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_base.py +0 -0
  793. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_integration.py +0 -0
  794. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_memory.py +0 -0
  795. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_redis.py +0 -0
  796. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_redis_integration.py +0 -0
  797. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_serialization.py +0 -0
  798. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_targeted.py +0 -0
  799. {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_worker.py +0 -0
  800. {roomkit-0.78.0 → roomkit-0.80.0}/tests/http_timeout_fakes.py +0 -0
  801. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/__init__.py +0 -0
  802. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_framework_orchestration.py +0 -0
  803. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_handoff.py +0 -0
  804. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_loop_strategy.py +0 -0
  805. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_orchestration_base.py +0 -0
  806. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_pipeline.py +0 -0
  807. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_router.py +0 -0
  808. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_session_audit.py +0 -0
  809. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_state.py +0 -0
  810. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_status_bus.py +0 -0
  811. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_status_redis.py +0 -0
  812. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_behavioral.py +0 -0
  813. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_loop.py +0 -0
  814. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_pipeline.py +0 -0
  815. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_supervisor.py +0 -0
  816. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_swarm.py +0 -0
  817. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_supervisor_inline.py +0 -0
  818. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_supervisor_strategy.py +0 -0
  819. {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_tool_audit.py +0 -0
  820. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/__init__.py +0 -0
  821. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/__init__.py +0 -0
  822. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/test_reconfigure_preservation.py +0 -0
  823. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/test_schema.py +0 -0
  824. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/openai/__init__.py +0 -0
  825. {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/openai/test_reconfigure.py +0 -0
  826. {roomkit-0.78.0 → roomkit-0.80.0}/tests/redis_fakes.py +0 -0
  827. {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/__init__.py +0 -0
  828. {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_core.py +0 -0
  829. {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_messaging.py +0 -0
  830. {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_voice.py +0 -0
  831. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/__init__.py +0 -0
  832. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_cache.py +0 -0
  833. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_child_room_trace.py +0 -0
  834. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_delegate.py +0 -0
  835. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_integration.py +0 -0
  836. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_models.py +0 -0
  837. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_runner.py +0 -0
  838. {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_structured_result.py +0 -0
  839. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_addressing.py +0 -0
  840. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aec_bench.py +0 -0
  841. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aec_pipeline.py +0 -0
  842. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_docs.py +0 -0
  843. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_response_plain_stream.py +0 -0
  844. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_response_transcript.py +0 -0
  845. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_stream_contract.py +0 -0
  846. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_thinking.py +0 -0
  847. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_tool_events.py +0 -0
  848. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aicoustics_denoiser.py +0 -0
  849. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_anam_realtime.py +0 -0
  850. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_backpressure.py +0 -0
  851. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_capture_source.py +0 -0
  852. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_limits.py +0 -0
  853. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_pipeline.py +0 -0
  854. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_auto_connect.py +0 -0
  855. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_av_channel.py +0 -0
  856. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_avatar.py +0 -0
  857. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_before_ai_generation.py +0 -0
  858. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_before_deliver_gate.py +0 -0
  859. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_binding_permission_inheritance.py +0 -0
  860. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_bridge_hook_modification.py +0 -0
  861. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_buzz_huddle_backend.py +0 -0
  862. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channel_abc.py +0 -0
  863. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channel_attach_contract.py +0 -0
  864. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/__init__.py +0 -0
  865. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp.py +0 -0
  866. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_empty_prompt.py +0 -0
  867. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_usage.py +0 -0
  868. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_usage_boundaries.py +0 -0
  869. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_agent.py +0 -0
  870. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai.py +0 -0
  871. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_active_turns.py +0 -0
  872. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_empty_retry.py +0 -0
  873. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_loop_rules.py +0 -0
  874. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_response_loop_end_reason.py +0 -0
  875. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_retry.py +0 -0
  876. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_skill_gating.py +0 -0
  877. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_steering.py +0 -0
  878. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_streaming_compaction.py +0 -0
  879. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_tool_loop.py +0 -0
  880. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_compact_context_tool_pairs.py +0 -0
  881. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_email.py +0 -0
  882. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_http.py +0 -0
  883. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_loop_end_marker.py +0 -0
  884. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_loop_end_reason_nonstreaming.py +0 -0
  885. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_messenger.py +0 -0
  886. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_multimodal_tool_result.py +0 -0
  887. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_sms.py +0 -0
  888. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_telegram.py +0 -0
  889. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_tool_usage_memory.py +0 -0
  890. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_turn_config.py +0 -0
  891. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_websocket.py +0 -0
  892. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_whatsapp.py +0 -0
  893. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_chat_benchmark.py +0 -0
  894. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_chat_quality.py +0 -0
  895. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_check_models.py +0 -0
  896. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_circuit_breaker.py +0 -0
  897. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_activity.py +0 -0
  898. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_channel.py +0 -0
  899. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_console.py +0 -0
  900. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_prompt_shell.py +0 -0
  901. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_select.py +0 -0
  902. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_commit_atomicity.py +0 -0
  903. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_compacting_cache.py +0 -0
  904. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_compose_tool_handlers.py +0 -0
  905. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_config_secret_hygiene.py +0 -0
  906. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_configs.py +0 -0
  907. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_conformance_level0.py +0 -0
  908. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_console.py +0 -0
  909. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_context_carry_forward.py +0 -0
  910. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_context_visibility.py +0 -0
  911. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_current_turn_budget.py +0 -0
  912. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_dangling_recovery.py +0 -0
  913. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_cancellation.py +0 -0
  914. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_cancellation_streams.py +0 -0
  915. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_order.py +0 -0
  916. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_outcomes.py +0 -0
  917. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_strategies.py +0 -0
  918. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_denoiser_rnnoise_loader.py +0 -0
  919. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_describe_screen_tool.py +0 -0
  920. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_describe_webcam_tool.py +0 -0
  921. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_drain_barge_in.py +0 -0
  922. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_edit_delete_authorization.py +0 -0
  923. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_energy_vad.py +0 -0
  924. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_enums.py +0 -0
  925. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_event_ops.py +0 -0
  926. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_event_text.py +0 -0
  927. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_examples_audio.py +0 -0
  928. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_external_tool_handler.py +0 -0
  929. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_face_touch_filter.py +0 -0
  930. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_audio_session.py +0 -0
  931. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_playback.py +0 -0
  932. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_realtime_transport.py +0 -0
  933. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework.py +0 -0
  934. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_aware.py +0 -0
  935. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_events.py +0 -0
  936. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_queries.py +0 -0
  937. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_status_bus.py +0 -0
  938. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_realtime_failfast.py +0 -0
  939. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_transcript_dedup.py +0 -0
  940. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hook_payload_modification.py +0 -0
  941. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hook_side_effects.py +0 -0
  942. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hooks.py +0 -0
  943. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_http_timeouts.py +0 -0
  944. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_human_input.py +0 -0
  945. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_idempotent_redelivery.py +0 -0
  946. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_hooks.py +0 -0
  947. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_pipeline.py +0 -0
  948. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_unknown_outcomes.py +0 -0
  949. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_connection_budget.py +0 -0
  950. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_deferred.py +0 -0
  951. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_error_surfacing.py +0 -0
  952. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_rate_limit.py +0 -0
  953. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_response_events.py +0 -0
  954. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_routing.py +0 -0
  955. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_routing_ambiguity.py +0 -0
  956. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_stream_cancellation.py +0 -0
  957. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_stream_error_propagation.py +0 -0
  958. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_visibility.py +0 -0
  959. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/__init__.py +0 -0
  960. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_ai_assistant.py +0 -0
  961. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_ai_chain_depth.py +0 -0
  962. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_cerebras_live.py +0 -0
  963. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_cross_channel.py +0 -0
  964. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_dynamic_channels.py +0 -0
  965. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_human_ai.py +0 -0
  966. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_identity_resolution.py +0 -0
  967. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_observer.py +0 -0
  968. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_regenerate.py +0 -0
  969. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_sin_scanning.py +0 -0
  970. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption.py +0 -0
  971. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption_partials.py +0 -0
  972. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption_pipeline.py +0 -0
  973. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_invalid_tool_repeat_guard.py +0 -0
  974. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_knowledge_postgres.py +0 -0
  975. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lanes.py +0 -0
  976. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lanes_multiworker.py +0 -0
  977. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lifecycle_hooks.py +0 -0
  978. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_live_turn_playback.py +0 -0
  979. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_local_backend_aec.py +0 -0
  980. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_locks.py +0 -0
  981. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_log_redaction.py +0 -0
  982. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_structured_content.py +0 -0
  983. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_tools.py +0 -0
  984. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_media_recorder.py +0 -0
  985. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory.py +0 -0
  986. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory_new.py +0 -0
  987. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory_wrappers.py +0 -0
  988. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mock_providers.py +0 -0
  989. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_models.py +0 -0
  990. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_observability.py +0 -0
  991. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_opencv_recorder.py +0 -0
  992. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_opentelemetry.py +0 -0
  993. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_optional_imports.py +0 -0
  994. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_outbound_audio_pacer.py +0 -0
  995. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pacer_response_boundary.py +0 -0
  996. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_parallel_tool_cleanup.py +0 -0
  997. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_participant_membership.py +0 -0
  998. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_personaplex_realtime.py +0 -0
  999. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_debug_taps.py +0 -0
  1000. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_engine.py +0 -0
  1001. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_providers.py +0 -0
  1002. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler.py +0 -0
  1003. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler_numpy.py +0 -0
  1004. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler_sinc.py +0 -0
  1005. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_lock.py +0 -0
  1006. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_multiprocess.py +0 -0
  1007. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_store.py +0 -0
  1008. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_precommit_timeout.py +0 -0
  1009. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_proactive_delivery.py +0 -0
  1010. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_proactive_delivery_voice.py +0 -0
  1011. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_protocol_trace.py +0 -0
  1012. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/__init__.py +0 -0
  1013. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/conftest.py +0 -0
  1014. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_ai_models.py +0 -0
  1015. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anam_avatar.py +0 -0
  1016. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anam_realtime.py +0 -0
  1017. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anthropic.py +0 -0
  1018. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_azure.py +0 -0
  1019. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_azure_image.py +0 -0
  1020. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_buzz.py +0 -0
  1021. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_cerebras.py +0 -0
  1022. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_cerebras_tool_arrays.py +0 -0
  1023. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_deepseek.py +0 -0
  1024. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_discord.py +0 -0
  1025. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_elasticemail.py +0 -0
  1026. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini.py +0 -0
  1027. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_image.py +0 -0
  1028. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_list_models.py +0 -0
  1029. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_vertex.py +0 -0
  1030. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_http.py +0 -0
  1031. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_http_timeouts.py +0 -0
  1032. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image.py +0 -0
  1033. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_advanced.py +0 -0
  1034. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_parts.py +0 -0
  1035. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_sdk_contracts.py +0 -0
  1036. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_stream.py +0 -0
  1037. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_litellm.py +0 -0
  1038. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_messenger.py +0 -0
  1039. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_mistral.py +0 -0
  1040. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_ollama.py +0 -0
  1041. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai.py +0 -0
  1042. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai_image.py +0 -0
  1043. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai_realtime.py +0 -0
  1044. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openrouter.py +0 -0
  1045. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openrouter_image.py +0 -0
  1046. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_personaplex_realtime.py +0 -0
  1047. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_phone.py +0 -0
  1048. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_polargrid.py +0 -0
  1049. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_qwen.py +0 -0
  1050. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_rcs.py +0 -0
  1051. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_realtime_voices.py +0 -0
  1052. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sendgrid.py +0 -0
  1053. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sinch.py +0 -0
  1054. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sms_utils.py +0 -0
  1055. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_teams.py +0 -0
  1056. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_teams_webhook.py +0 -0
  1057. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_api.py +0 -0
  1058. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_bot.py +0 -0
  1059. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_entities.py +0 -0
  1060. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_update.py +0 -0
  1061. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_webhook.py +0 -0
  1062. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telnyx.py +0 -0
  1063. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telnyx_rcs.py +0 -0
  1064. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_twilio.py +0 -0
  1065. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_vllm.py +0 -0
  1066. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_voicemeup.py +0 -0
  1067. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_whatsapp_personal.py +0 -0
  1068. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai.py +0 -0
  1069. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai_image.py +0 -0
  1070. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai_realtime.py +0 -0
  1071. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_public_api.py +0 -0
  1072. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_decode_native.py +0 -0
  1073. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_media_recorder.py +0 -0
  1074. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_recorder.py +0 -0
  1075. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rate_limiter.py +0 -0
  1076. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_raw_payload_preservation.py +0 -0
  1077. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime.py +0 -0
  1078. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_av_channel.py +0 -0
  1079. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_deepgram.py +0 -0
  1080. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_deferred_connection.py +0 -0
  1081. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_elevenlabs.py +0 -0
  1082. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_fixed_tools.py +0 -0
  1083. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_full_duplex.py +0 -0
  1084. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_g711.py +0 -0
  1085. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_hook_coverage.py +0 -0
  1086. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_playback_lifecycle.py +0 -0
  1087. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reasoning.py +0 -0
  1088. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reconfiguration.py +0 -0
  1089. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reconnection.py +0 -0
  1090. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_redis.py +0 -0
  1091. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_resample_offload.py +0 -0
  1092. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_skill_delivery.py +0 -0
  1093. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_tool_search.py +0 -0
  1094. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_voice.py +0 -0
  1095. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_voice_integration.py +0 -0
  1096. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_xai.py +0 -0
  1097. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recent_events_window.py +0 -0
  1098. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recording_consent.py +0 -0
  1099. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recording_wiring.py +0 -0
  1100. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_reentry_block_side_effects.py +0 -0
  1101. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_related_family_tools.py +0 -0
  1102. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_release_script.py +0 -0
  1103. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_repeated_result_note.py +0 -0
  1104. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_resilience.py +0 -0
  1105. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_response_metadata.py +0 -0
  1106. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_response_visibility.py +0 -0
  1107. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_retrieval_memory.py +0 -0
  1108. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_retry_retryability.py +0 -0
  1109. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_arbitrations.py +0 -0
  1110. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_conformance.py +0 -0
  1111. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_framework_events.py +0 -0
  1112. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_write_gates.py +0 -0
  1113. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rnnoise.py +0 -0
  1114. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_room_org_scoping.py +0 -0
  1115. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_room_status_enforcement.py +0 -0
  1116. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_router.py +0 -0
  1117. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rtp_video_backend.py +0 -0
  1118. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_scoring.py +0 -0
  1119. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_screen_capture_backend.py +0 -0
  1120. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_screen_input.py +0 -0
  1121. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_session_started.py +0 -0
  1122. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sherpa_onnx_denoiser.py +0 -0
  1123. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sherpa_onnx_vad.py +0 -0
  1124. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_audio_clock.py +0 -0
  1125. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_auth.py +0 -0
  1126. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_dial.py +0 -0
  1127. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_helpers.py +0 -0
  1128. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_realtime_transport.py +0 -0
  1129. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_video_backend.py +0 -0
  1130. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skill_activation.py +0 -0
  1131. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skill_tool_gating.py +0 -0
  1132. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skills.py +0 -0
  1133. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skills_integration.py +0 -0
  1134. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_smart_turn.py +0 -0
  1135. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_smoke_quickstart.py +0 -0
  1136. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_source_rate_limit.py +0 -0
  1137. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_source_url_redaction.py +0 -0
  1138. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources.py +0 -0
  1139. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_init.py +0 -0
  1140. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_neonize.py +0 -0
  1141. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_sse.py +0 -0
  1142. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_websocket.py +0 -0
  1143. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_speaker_attribution.py +0 -0
  1144. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_speex_aec.py +0 -0
  1145. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_activity.py +0 -0
  1146. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_binding_contract.py +0 -0
  1147. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_identity_scoping.py +0 -0
  1148. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_lifecycle_immutability.py +0 -0
  1149. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_memory.py +0 -0
  1150. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_postgres.py +0 -0
  1151. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_sqlite.py +0 -0
  1152. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_streaming_before_broadcast.py +0 -0
  1153. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_deepgram_teardown.py +0 -0
  1154. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_gemini.py +0 -0
  1155. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_qwen3.py +0 -0
  1156. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_summarizing_memory.py +0 -0
  1157. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_supervisor.py +0 -0
  1158. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_task_planner.py +0 -0
  1159. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_task_utils.py +0 -0
  1160. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_telemetry.py +0 -0
  1161. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_telemetry_pyroscope.py +0 -0
  1162. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_threading.py +0 -0
  1163. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_arg_validation.py +0 -0
  1164. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_context.py +0 -0
  1165. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_eviction_room_scope.py +0 -0
  1166. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_policy.py +0 -0
  1167. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_protocol.py +0 -0
  1168. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_repeat_guard.py +0 -0
  1169. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_round_cap.py +0 -0
  1170. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_search_text.py +0 -0
  1171. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_transport_auth.py +0 -0
  1172. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_elevenlabs.py +0 -0
  1173. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_gemini.py +0 -0
  1174. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_grok.py +0 -0
  1175. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_neutts.py +0 -0
  1176. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_qwen3.py +0 -0
  1177. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_text_split.py +0 -0
  1178. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_turn_detection.py +0 -0
  1179. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_twilio_ws_backend.py +0 -0
  1180. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vad_debug_logging.py +0 -0
  1181. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video.py +0 -0
  1182. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_ai_integration.py +0 -0
  1183. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_channel.py +0 -0
  1184. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_local.py +0 -0
  1185. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_pipeline.py +0 -0
  1186. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_pipeline_config.py +0 -0
  1187. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_recording.py +0 -0
  1188. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_session_isolation.py +0 -0
  1189. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_transform.py +0 -0
  1190. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vision_gemini.py +0 -0
  1191. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vision_openai.py +0 -0
  1192. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice.py +0 -0
  1193. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_batch_stt.py +0 -0
  1194. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_binding_gate.py +0 -0
  1195. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_channel_aec.py +0 -0
  1196. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_idempotency.py +0 -0
  1197. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_recovery.py +0 -0
  1198. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_store.py +0 -0
  1199. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_dsp_vectorized.py +0 -0
  1200. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_fastrtc.py +0 -0
  1201. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_frame_limit.py +0 -0
  1202. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_inbound.py +0 -0
  1203. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_injection_results.py +0 -0
  1204. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_integration.py +0 -0
  1205. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_local.py +0 -0
  1206. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_map.py +0 -0
  1207. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_rtp.py +0 -0
  1208. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_say_play.py +0 -0
  1209. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_security.py +0 -0
  1210. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_session_lifecycle.py +0 -0
  1211. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_sherpa_onnx.py +0 -0
  1212. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_streaming_ai_tts.py +0 -0
  1213. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_streaming_stt.py +0 -0
  1214. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_stt_language.py +0 -0
  1215. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_webtransport.py +0 -0
  1216. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_wake_word_backlog.py +0 -0
  1217. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_wav_recorder.py +0 -0
  1218. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_webrtc_offer_auth.py +0 -0
  1219. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_webrtc_rtc_configuration.py +0 -0
  1220. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_websocket_lifecycle.py +0 -0
  1221. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_websocket_room_scoping.py +0 -0
  1222. {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_yolo_filter.py +0 -0
  1223. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/__init__.py +0 -0
  1224. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_av_channel_fastrtc.py +0 -0
  1225. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_fastrtc_video_backend.py +0 -0
  1226. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_filter.py +0 -0
  1227. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_image.py +0 -0
  1228. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_rich.py +0 -0
  1229. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_subtitle.py +0 -0
  1230. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_text.py +0 -0
  1231. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_screen_input.py +0 -0
  1232. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_screen_input_tools.py +0 -0
  1233. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_video_bridge.py +0 -0
  1234. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_video_effects.py +0 -0
  1235. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_watermark_filter.py +0 -0
  1236. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_websocket_avatar.py +0 -0
  1237. {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_websocket_video_backend.py +0 -0
  1238. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/__init__.py +0 -0
  1239. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/__init__.py +0 -0
  1240. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_rtp.py +0 -0
  1241. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_sip.py +0 -0
  1242. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_sip_coverage.py +0 -0
  1243. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_webtransport.py +0 -0
  1244. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/__init__.py +0 -0
  1245. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/stream_conformance.py +0 -0
  1246. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_aicoustics_denoiser.py +0 -0
  1247. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_offload_callbacks.py +0 -0
  1248. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_per_stream_regression.py +0 -0
  1249. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_rnnoise_denoiser.py +0 -0
  1250. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_sherpa_diarization.py +0 -0
  1251. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_simple_agc.py +0 -0
  1252. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_smart_turn.py +0 -0
  1253. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_speex_aec.py +0 -0
  1254. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_stream_conformance.py +0 -0
  1255. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_stream_entry_point.py +0 -0
  1256. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_webrtc_aec.py +0 -0
  1257. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_webrtc_denoiser.py +0 -0
  1258. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/__init__.py +0 -0
  1259. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_fastrtc_transport.py +0 -0
  1260. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_realtime_bridge.py +0 -0
  1261. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_ws_transport.py +0 -0
  1262. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/__init__.py +0 -0
  1263. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_deepgram.py +0 -0
  1264. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_deepgram_stream_language.py +0 -0
  1265. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_gradium_stt.py +0 -0
  1266. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_language_lock.py +0 -0
  1267. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_qwen3_asr.py +0 -0
  1268. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_bridge.py +0 -0
  1269. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_inbound_offload.py +0 -0
  1270. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_backend.py +0 -0
  1271. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_trace.py +0 -0
  1272. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_wav.py +0 -0
  1273. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_tts_filters.py +0 -0
  1274. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_voice_close_providers.py +0 -0
  1275. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_voice_tts_filter.py +0 -0
  1276. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/__init__.py +0 -0
  1277. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/test_elevenlabs.py +0 -0
  1278. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/test_gradium_tts.py +0 -0
  1279. {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/test_qwen3_tts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: roomkit
3
- Version: 0.78.0
3
+ Version: 0.80.0
4
4
  Summary: Pure async Python library for multi-channel conversations
5
5
  Project-URL: Homepage, https://roomkit.live
6
6
  Project-URL: Documentation, https://www.roomkit.live/docs/
@@ -39,8 +39,7 @@ Requires-Dist: botbuilder-core>=4.17; extra == 'all'
39
39
  Requires-Dist: deepgram-sdk>=6.0.0; extra == 'all'
40
40
  Requires-Dist: discord-py>=2.4; extra == 'all'
41
41
  Requires-Dist: elevenlabs>=2.40; extra == 'all'
42
- Requires-Dist: google-genai>=2.0.0; extra == 'all'
43
- Requires-Dist: google-genai>=2.18.0; extra == 'all'
42
+ Requires-Dist: google-genai>=2.24.0; extra == 'all'
44
43
  Requires-Dist: gradium>=0.5.7; extra == 'all'
45
44
  Requires-Dist: httpx-sse>=0.4; extra == 'all'
46
45
  Requires-Dist: httpx>=0.27; extra == 'all'
@@ -96,7 +95,7 @@ Requires-Dist: asyncpg>=0.29; extra == 'dev'
96
95
  Requires-Dist: bandit>=1.7; extra == 'dev'
97
96
  Requires-Dist: botbuilder-core>=4.17; extra == 'dev'
98
97
  Requires-Dist: discord-py>=2.4; extra == 'dev'
99
- Requires-Dist: google-genai>=2.18.0; extra == 'dev'
98
+ Requires-Dist: google-genai>=2.24.0; extra == 'dev'
100
99
  Requires-Dist: gradium>=0.5.7; extra == 'dev'
101
100
  Requires-Dist: httpx-sse>=0.4; extra == 'dev'
102
101
  Requires-Dist: httpx>=0.27; extra == 'dev'
@@ -139,7 +138,7 @@ Requires-Dist: librosa>=0.10; extra == 'fastrtc'
139
138
  Requires-Dist: numpy<2.5,>=1.26; extra == 'fastrtc'
140
139
  Requires-Dist: pydub>=0.25; extra == 'fastrtc'
141
140
  Provides-Extra: gemini
142
- Requires-Dist: google-genai>=2.18.0; extra == 'gemini'
141
+ Requires-Dist: google-genai>=2.24.0; extra == 'gemini'
143
142
  Provides-Extra: gradium
144
143
  Requires-Dist: gradium>=0.5.7; extra == 'gradium'
145
144
  Provides-Extra: httpx
@@ -181,7 +180,7 @@ Provides-Extra: providers
181
180
  Requires-Dist: anthropic>=0.30; extra == 'providers'
182
181
  Requires-Dist: botbuilder-core>=4.17; extra == 'providers'
183
182
  Requires-Dist: discord-py>=2.4; extra == 'providers'
184
- Requires-Dist: google-genai>=2.18.0; extra == 'providers'
183
+ Requires-Dist: google-genai>=2.24.0; extra == 'providers'
185
184
  Requires-Dist: gradium>=0.5.7; extra == 'providers'
186
185
  Requires-Dist: httpx>=0.27; extra == 'providers'
187
186
  Requires-Dist: mistralai<3,>=2.0; extra == 'providers'
@@ -205,7 +204,7 @@ Requires-Dist: websockets>=14.0; extra == 'realtime-deepgram'
205
204
  Provides-Extra: realtime-elevenlabs
206
205
  Requires-Dist: elevenlabs>=2.40; extra == 'realtime-elevenlabs'
207
206
  Provides-Extra: realtime-gemini
208
- Requires-Dist: google-genai>=2.0.0; extra == 'realtime-gemini'
207
+ Requires-Dist: google-genai>=2.24.0; extra == 'realtime-gemini'
209
208
  Provides-Extra: realtime-openai
210
209
  Requires-Dist: openai>=2.28; extra == 'realtime-openai'
211
210
  Requires-Dist: websockets>=14.0; extra == 'realtime-openai'
@@ -163,6 +163,26 @@ ai = AIChannel(
163
163
  )
164
164
  ```
165
165
 
166
+ #### Refusing a call
167
+
168
+ What the handler returns is the tool's answer, so a refusal returned as a body
169
+ reads as work that was done: the tool-call event says `completed`, and an audit
170
+ trail records a call that never ran. Raise `ToolRefusedError` instead.
171
+
172
+ ```python
173
+ from roomkit import ToolRefusedError
174
+
175
+ async def handle_tools(name: str, arguments: dict) -> str:
176
+ if name not in MY_TOOLS:
177
+ raise ToolRefusedError(f"Error: the tool '{name}' does not exist.")
178
+ ...
179
+ ```
180
+
181
+ The message reaches the model verbatim, which is the point: a generic `raise`
182
+ would replace it with `Error executing tool '<name>': <exc>`. The call is marked
183
+ failed, `ON_TOOL_CALL` observers see `event.is_error`, and the stored
184
+ `TOOL_CALL_END` carries the reason.
185
+
166
186
  ### Tool Protocol (Tool ABC)
167
187
 
168
188
  For structured tool definitions, use the `Tool` base class:
@@ -1415,6 +1415,26 @@ ai = AIChannel(
1415
1415
  )
1416
1416
  ```
1417
1417
 
1418
+ #### Refusing a call
1419
+
1420
+ What the handler returns is the tool's answer, so a refusal returned as a body
1421
+ reads as work that was done: the tool-call event says `completed`, and an audit
1422
+ trail records a call that never ran. Raise `ToolRefusedError` instead.
1423
+
1424
+ ```python
1425
+ from roomkit import ToolRefusedError
1426
+
1427
+ async def handle_tools(name: str, arguments: dict) -> str:
1428
+ if name not in MY_TOOLS:
1429
+ raise ToolRefusedError(f"Error: the tool '{name}' does not exist.")
1430
+ ...
1431
+ ```
1432
+
1433
+ The message reaches the model verbatim, which is the point: a generic `raise`
1434
+ would replace it with `Error executing tool '<name>': <exc>`. The call is marked
1435
+ failed, `ON_TOOL_CALL` observers see `event.is_error`, and the stored
1436
+ `TOOL_CALL_END` carries the reason.
1437
+
1418
1438
  ### Tool Protocol (Tool ABC)
1419
1439
 
1420
1440
  For structured tool definitions, use the `Tool` base class:
@@ -49,7 +49,7 @@ cerebras = ["openai>=2.28,<3"]
49
49
  # read like the family's umbrella install rather than the chat provider.
50
50
  qwen-ai = ["openai>=2.28,<3"]
51
51
  ollama = ["ollama>=0.4"]
52
- gemini = ["google-genai>=2.18.0"]
52
+ gemini = ["google-genai>=2.24.0"]
53
53
  mistral = ["mistralai>=2.0,<3"]
54
54
  polargrid = ["polargrid-sdk>=0.10.0"]
55
55
  deepgram = ["deepgram-sdk>=6.0.0"]
@@ -88,7 +88,7 @@ twilio = ["twilio>=9.0"]
88
88
  phonenumbers = ["phonenumbers>=8.13"]
89
89
  pynacl = ["pynacl>=1.5"]
90
90
  realtime-openai = ["openai>=2.28", "websockets>=14.0"]
91
- realtime-gemini = ["google-genai>=2.0.0"]
91
+ realtime-gemini = ["google-genai>=2.24.0"]
92
92
  realtime-elevenlabs = ["elevenlabs>=2.40"]
93
93
  realtime-deepgram = ["websockets>=14.0"]
94
94
  websocket = ["websockets>=14.0"]
@@ -252,6 +252,11 @@ filterwarnings = [
252
252
  "ignore:bind_voice_session\\(\\) is deprecated:DeprecationWarning",
253
253
  "ignore:connect_voice\\(auto_greet=True\\) is deprecated:DeprecationWarning",
254
254
  "ignore::ResourceWarning",
255
+ # google-genai builds a Union over typing._UnionGenericAlias at import
256
+ # time; Python 3.14 deprecates that internal (removal in 3.17). Nothing
257
+ # here can fix it, and without the ignore any test file that imports
258
+ # google.genai first fails to collect on 3.14.
259
+ "ignore:'_UnionGenericAlias' is deprecated:DeprecationWarning",
255
260
  ]
256
261
 
257
262
  [tool.ty.environment]
@@ -76,6 +76,7 @@ from roomkit.core.exceptions import (
76
76
  ParticipantNotAdmittedError,
77
77
  ProviderDeliveryError,
78
78
  RoomNotAttachedError,
79
+ ToolRefusedError,
79
80
  VoiceSessionEndedError,
80
81
  )
81
82
  from roomkit.core.framework import (
@@ -145,6 +146,7 @@ from roomkit.models.tool_call import (
145
146
  BeforeGenerationCallback,
146
147
  ToolCallCallback,
147
148
  ToolCallEvent,
149
+ ToolCallObserver,
148
150
  response_transcript,
149
151
  )
150
152
  from roomkit.models.voice_delivery import VoiceDeliveryRecord
@@ -273,6 +275,7 @@ __all__ = [
273
275
  "ConferenceCapabilityError",
274
276
  "ConferenceCloseError",
275
277
  "RoomNotAttachedError",
278
+ "ToolRefusedError",
276
279
  # Delivery
277
280
  "DeliveryBackend",
278
281
  "DeliveryItem",
@@ -463,6 +466,7 @@ __all__ = [
463
466
  "ThinkingEvent",
464
467
  "Tool",
465
468
  "ToolCallCallback",
469
+ "ToolCallObserver",
466
470
  "ToolCallContent",
467
471
  "ToolCallEvent",
468
472
  "ToolHandler",
@@ -0,0 +1 @@
1
+ __version__ = "0.80.0"
@@ -392,9 +392,12 @@ class AIGenerationMixin(AIToolLoopRulesMixin):
392
392
  # Tool call start + end events
393
393
  for tc, rp in zip(rnd.tool_calls, rnd.results, strict=False):
394
394
  result_val = getattr(rp, "result", None)
395
- is_error = isinstance(result_val, str) and result_val.startswith(
396
- "Error executing tool"
397
- )
395
+ # Read the outcome, never the body: the tool loop already knows
396
+ # whether this call failed. Matching the prose sentence it
397
+ # writes for a raised handler missed every other failure — a
398
+ # refused call, a multimodal result — and misread a tool whose
399
+ # own output happened to start that way.
400
+ is_error = bool(getattr(rp, "is_error", False))
398
401
  events.append(
399
402
  RoomEvent(
400
403
  room_id=room_id,
@@ -423,7 +426,7 @@ class AIGenerationMixin(AIToolLoopRulesMixin):
423
426
  result=result_val,
424
427
  status="failed" if is_error else "completed",
425
428
  duration_ms=rnd.duration_ms,
426
- error=result_val if is_error else None,
429
+ error=rp.as_text() if is_error else None,
427
430
  structured_content=getattr(rp, "structured_content", None),
428
431
  ),
429
432
  chain_depth=chain_depth,
@@ -112,7 +112,10 @@ class _ExternalStreamTools:
112
112
  arguments = dict(call.arguments)
113
113
  already_executed = "_result" in arguments
114
114
  result = arguments.pop("_result", None)
115
- arguments.pop("_is_error", None)
115
+ # The proxy's own verdict on a call it already ran. It travelled
116
+ # this far as a private argument; drop it from what the hook reads
117
+ # as arguments, keep it as the outcome it is.
118
+ is_error = bool(arguments.pop("_is_error", False))
116
119
  event = ToolCallEvent(
117
120
  channel_id=self.channel_id,
118
121
  channel_type=ChannelType.AI,
@@ -127,6 +130,7 @@ class _ExternalStreamTools:
127
130
  else None
128
131
  ),
129
132
  room_id=self.room_id,
133
+ is_error=is_error,
130
134
  )
131
135
  if already_executed and self.after is not None:
132
136
  await self.after(event)
@@ -528,7 +528,7 @@ class AIStreamingMixin(AIToolLoopRulesMixin):
528
528
  turn.tool_rounds_count += 1
529
529
  for call, result in zip(calls, results, strict=False):
530
530
  value = result.result
531
- is_error = isinstance(value, str) and value.startswith("Error executing tool")
531
+ is_error = result.is_error
532
532
  yield ToolCallEndMarker(
533
533
  tool_name=call.name,
534
534
  tool_id=call.id,
@@ -536,7 +536,9 @@ class AIStreamingMixin(AIToolLoopRulesMixin):
536
536
  result=value,
537
537
  status="failed" if is_error else "completed",
538
538
  duration_ms=duration_ms,
539
- error=value if is_error else None,
539
+ # ``error`` is text; a failure that answered with content parts
540
+ # flattens the way any text consumer of that result would.
541
+ error=result.as_text() if is_error else None,
540
542
  structured_content=result.structured_content,
541
543
  )
542
544
  if turn.room_id:
@@ -36,6 +36,7 @@ from roomkit.channels._tool_search_constants import (
36
36
  TOOL_LIST_TOOLS,
37
37
  TOOL_SEARCH_INFRA_TOOL_NAMES,
38
38
  )
39
+ from roomkit.core.exceptions import ToolRefusedError
39
40
  from roomkit.models.enums import ChannelType
40
41
  from roomkit.models.tool_call import ToolCallEvent
41
42
  from roomkit.providers.ai.base import (
@@ -59,7 +60,7 @@ if TYPE_CHECKING:
59
60
  from roomkit.channels._tool_eviction import ToolEviction
60
61
  from roomkit.channels._tool_usage import ToolUsageMemory
61
62
  from roomkit.channels.ai import _ContentPart, _ToolLoopContext
62
- from roomkit.models.tool_call import ToolCallCallback
63
+ from roomkit.models.tool_call import ToolCallCallback, ToolCallObserver
63
64
  from roomkit.realtime.base import RealtimeBackend
64
65
  from roomkit.sandbox.executor import SandboxExecutor
65
66
  from roomkit.skills.executor import ScriptExecutor
@@ -88,6 +89,8 @@ class AIToolsHost(Protocol):
88
89
  _planner: Optional task planner.
89
90
  _realtime: Realtime backend for ephemeral events.
90
91
  _tool_call_hook: Optional unified ON_TOOL_CALL hook callback.
92
+ _tool_observer_hook: Optional ON_TOOL_CALL observer callback, fired for
93
+ a call that failed or was refused.
91
94
  channel_id: Unique identifier for this channel.
92
95
 
93
96
  Properties / methods provided by other mixins:
@@ -113,6 +116,7 @@ class AIToolsHost(Protocol):
113
116
  _realtime: RealtimeBackend | None
114
117
  _plan_updated_hook: Any # ON_PLAN_UPDATED callback — injected by register_channel
115
118
  _tool_call_hook: ToolCallCallback | None
119
+ _tool_observer_hook: ToolCallObserver | None
116
120
  _before_tool_call_hook: Any
117
121
  _tool_search: bool | None
118
122
  _tool_search_pinned: set[str]
@@ -155,6 +159,7 @@ class AIToolsMixin:
155
159
  _realtime: RealtimeBackend | None
156
160
  _plan_updated_hook: Any # ON_PLAN_UPDATED callback — injected by register_channel
157
161
  _tool_call_hook: ToolCallCallback | None
162
+ _tool_observer_hook: ToolCallObserver | None
158
163
  _before_tool_call_hook: Any
159
164
  _tool_search: bool | None
160
165
  _tool_search_pinned: set[str]
@@ -242,6 +247,47 @@ class AIToolsMixin:
242
247
  }
243
248
  return {"error": f"Unknown tool '{name}': it is not declared"}
244
249
 
250
+ async def _fire_tool_refusal(
251
+ self,
252
+ tc: Any,
253
+ arguments: dict[str, Any],
254
+ result: str,
255
+ room_id: str | None,
256
+ ) -> None:
257
+ """Fire ON_TOOL_CALL for a call that failed or was refused.
258
+
259
+ The refusal paths below return before the handler runs, and a handler
260
+ that raises jumps past the firing that follows it — so without this,
261
+ ON_TOOL_CALL only ever reported the calls that worked. A host auditing
262
+ tool use saw a denied tool as a tool that was never called, which reads
263
+ the same as an agent that never tried.
264
+
265
+ Observational by construction: it reaches the ASYNC observers of
266
+ ON_TOOL_CALL and no further. A SYNC hook is the one that can *serve* a
267
+ call, so a refused call must not reach one — otherwise the refusal
268
+ would hide the side effect instead of preventing it. A hook that raises
269
+ must not turn a refusal into a crash either: the refusal is already on
270
+ its way to the model.
271
+ """
272
+ if self._tool_observer_hook is None:
273
+ return
274
+ event = ToolCallEvent(
275
+ channel_id=self.channel_id,
276
+ channel_type=ChannelType.AI,
277
+ tool_call_id=tc.id,
278
+ name=tc.name,
279
+ arguments=arguments,
280
+ result=result,
281
+ room_id=room_id,
282
+ is_error=True,
283
+ )
284
+ try:
285
+ await self._tool_observer_hook(event)
286
+ except Exception:
287
+ logger.debug(
288
+ "ON_TOOL_CALL observation failed for refused tool %s", tc.name, exc_info=True
289
+ )
290
+
245
291
  async def _execute_tools_parallel(
246
292
  self,
247
293
  tool_calls: list[Any],
@@ -263,13 +309,15 @@ class AIToolsMixin:
263
309
  async def _run_one(tc: Any) -> AIToolResultPart:
264
310
  logger.info("Executing tool: %s(%s)", tc.name, tc.id)
265
311
 
266
- def rejected(error: dict[str, Any]) -> AIToolResultPart:
312
+ async def rejected(error: dict[str, Any]) -> AIToolResultPart:
267
313
  # Refusals never reach the handler's guard. Count their raw
268
314
  # attempts here; successful calls are counted only by the
269
315
  # handler, using the effective payload after folds and hooks.
270
316
  guard = self._repeated_call_guard(tc.name, tc.arguments)
317
+ body = guard or json.dumps(error)
318
+ await self._fire_tool_refusal(tc, tc.arguments, body, room_id)
271
319
  return AIToolResultPart(
272
- tool_call_id=tc.id, name=tc.name, result=guard or json.dumps(error)
320
+ tool_call_id=tc.id, name=tc.name, result=body, is_error=True
273
321
  )
274
322
 
275
323
  # Execution guard: argument validation against the declared schema
@@ -285,7 +333,7 @@ class AIToolsMixin:
285
333
  recovered = self._recover_deferred_tool(tc.name)
286
334
  if recovered is None:
287
335
  logger.warning("Provider requested undeclared tool %s", tc.name)
288
- return rejected(self._undeclared_tool_error(tc.name))
336
+ return await rejected(self._undeclared_tool_error(tc.name))
289
337
  # The model skipped find_tools but named a real catalogue tool:
290
338
  # the reveal happened at call time instead of ahead of it, and
291
339
  # every guard below still applies.
@@ -299,7 +347,9 @@ class AIToolsMixin:
299
347
  folded, fold_error = fold_hoisted_arguments(params, call_arguments)
300
348
  if fold_error is not None:
301
349
  logger.warning("Tool %s arguments ambiguous: %s", tc.name, fold_error)
302
- return rejected({"error": f"Invalid arguments for '{tc.name}': {fold_error}"})
350
+ return await rejected(
351
+ {"error": f"Invalid arguments for '{tc.name}': {fold_error}"}
352
+ )
303
353
  if folded is not None:
304
354
  logger.info(
305
355
  "Tool %s: folded hoisted arguments %s into its container (model=%s)",
@@ -311,7 +361,9 @@ class AIToolsMixin:
311
361
  arg_error = validate_tool_arguments(params, call_arguments)
312
362
  if arg_error is not None:
313
363
  logger.warning("Tool %s arguments rejected: %s", tc.name, arg_error)
314
- return rejected({"error": f"Invalid arguments for '{tc.name}': {arg_error}"})
364
+ return await rejected(
365
+ {"error": f"Invalid arguments for '{tc.name}': {arg_error}"}
366
+ )
315
367
 
316
368
  # Execution guard: policy deny (defense-in-depth, role-aware)
317
369
  # Sandbox tools are exempt — they are channel-managed, not user-managed.
@@ -324,7 +376,7 @@ class AIToolsMixin:
324
376
  and not effective_policy.is_allowed(tc.name)
325
377
  ):
326
378
  logger.warning("Tool %s blocked by policy", tc.name)
327
- return rejected(
379
+ return await rejected(
328
380
  {"error": f"Tool '{tc.name}' is not permitted by the agent's tool policy."}
329
381
  )
330
382
 
@@ -339,7 +391,7 @@ class AIToolsMixin:
339
391
  and matches_any_pattern(tc.name, self._gated_tool_names)
340
392
  ):
341
393
  logger.warning("Tool %s blocked by skill gating", tc.name)
342
- return rejected(
394
+ return await rejected(
343
395
  {
344
396
  "error": (
345
397
  f"Tool '{tc.name}' is gated by a skill. "
@@ -368,7 +420,9 @@ class AIToolsMixin:
368
420
  decision = await self._before_tool_call_hook(pre_event)
369
421
  if not decision:
370
422
  logger.info("Tool %s denied by BEFORE_TOOL_USE hook", tc.name)
371
- return rejected({"error": f"Tool '{tc.name}' denied by pre-execution hook."})
423
+ return await rejected(
424
+ {"error": f"Tool '{tc.name}' denied by pre-execution hook."}
425
+ )
372
426
  if decision.arguments is not None:
373
427
  arguments = decision.arguments
374
428
  arguments_rewritten = True
@@ -388,7 +442,7 @@ class AIToolsMixin:
388
442
  logger.warning(
389
443
  "Tool %s %sarguments rejected: %s", tc.name, qualifier, arg_error
390
444
  )
391
- return rejected(
445
+ return await rejected(
392
446
  {"error": (f"Invalid {qualifier}arguments for '{tc.name}': {arg_error}")}
393
447
  )
394
448
 
@@ -399,6 +453,7 @@ class AIToolsMixin:
399
453
  attributes={"tool.name": tc.name, "tool.id": tc.id},
400
454
  )
401
455
  structured_content: dict[str, Any] | None = None
456
+ tool_failed = False
402
457
  if executed_arguments is not None:
403
458
  # Snapshot the post-hook payload before handing it to user
404
459
  # code. Streaming persistence can then distinguish what the
@@ -449,10 +504,25 @@ class AIToolsMixin:
449
504
  except asyncio.CancelledError:
450
505
  telemetry.end_span(tool_span_id, status="cancelled")
451
506
  raise
507
+ except ToolRefusedError as refusal:
508
+ # The branch below with the message kept. A handler that
509
+ # declines a call has words for the model — a host tunes them
510
+ # for a small one — and the generic wrapper would replace them
511
+ # with its own sentence, which is how the reason gets lost.
512
+ telemetry.end_span(tool_span_id, status="error", error_message=refusal.message)
513
+ logger.info("Tool %s refused: %s", tc.name, refusal.message)
514
+ result = refusal.message
515
+ tool_failed = True
516
+ await self._fire_tool_refusal(tc, arguments, result, room_id)
452
517
  except Exception as exc:
453
518
  telemetry.end_span(tool_span_id, status="error", error_message=str(exc))
454
519
  logger.warning("Tool %s raised %s: %s", tc.name, type(exc).__name__, exc)
455
520
  result = f"Error executing tool '{tc.name}': {exc}"
521
+ tool_failed = True
522
+ # Fired here, on the raw sentence: the hook sees what the
523
+ # handler produced, before the repeated-result note annotates
524
+ # the model's copy of it — same as on the success path above.
525
+ await self._fire_tool_refusal(tc, arguments, result, room_id)
456
526
  # Remember this call (final result, success or error) so later turns
457
527
  # can show "tools you've already used" and re-reveal it under Tool
458
528
  # Search. Infra/discovery tools are filtered inside record().
@@ -469,6 +539,7 @@ class AIToolsMixin:
469
539
  name=tc.name,
470
540
  result=result,
471
541
  structured_content=structured_content,
542
+ is_error=tool_failed,
472
543
  )
473
544
 
474
545
  tasks = [asyncio.create_task(_run_one(tc)) for tc in tool_calls]
@@ -34,6 +34,7 @@ from typing import TYPE_CHECKING, Any
34
34
 
35
35
  from roomkit.channels._conference_mixer import ConferenceMixer
36
36
  from roomkit.channels._conference_operations import ConferenceResource
37
+ from roomkit.core.exceptions import ToolRefusedError
37
38
  from roomkit.core.task_utils import log_task_exception
38
39
  from roomkit.models.event import TextContent
39
40
  from roomkit.voice.base import AudioChunk, VoiceSession
@@ -495,6 +496,17 @@ class ConferenceRealtime:
495
496
  else:
496
497
  try:
497
498
  result = await config.tool_handler(session.room_id, name, arguments)
499
+ except ToolRefusedError as refusal:
500
+ # A declined call, in the handler's own words. Wrapping it the
501
+ # way the branch below wraps a crash would hand the model the
502
+ # exception's class name instead of the reason.
503
+ logger.info(
504
+ "Conference channel %r: the tool handler refused %r in room %s",
505
+ self._channel_id,
506
+ name,
507
+ session.room_id,
508
+ )
509
+ result = refusal.message
498
510
  except Exception as error:
499
511
  logger.exception(
500
512
  "Conference channel %r: the tool handler failed on %r in room %s",
@@ -20,6 +20,7 @@ import threading
20
20
  from typing import TYPE_CHECKING, Any, Literal, Protocol
21
21
  from uuid import uuid4
22
22
 
23
+ from roomkit.core.exceptions import ToolRefusedError
23
24
  from roomkit.models.enums import HookTrigger
24
25
  from roomkit.telemetry.base import Attr, SpanKind
25
26
  from roomkit.telemetry.context import reset_span
@@ -111,6 +112,7 @@ class RealtimeDelegationMixin:
111
112
  _telemetry_provider: Any # see RealtimeDelegationHost — cross-mixin
112
113
  _authorize_realtime_tool: Any # see RealtimeToolsMixin
113
114
  _serve_gated_tool_call: Any # see RealtimeToolsMixin
115
+ _fire_tool_refusal: Any # see RealtimeToolsMixin
114
116
 
115
117
  # -----------------------------------------------------------------
116
118
  # Transcript ledger
@@ -376,9 +378,25 @@ class RealtimeDelegationMixin:
376
378
  telemetry.end_span(span_id)
377
379
  return denial
378
380
 
379
- result_str = await self._serve_gated_tool_call(
380
- session, call_id, name, arguments, room_id, gate_context
381
- )
381
+ try:
382
+ result_str = await self._serve_gated_tool_call(
383
+ session, call_id, name, arguments, room_id, gate_context
384
+ )
385
+ except ToolRefusedError as refusal:
386
+ # Same shape as the pre-execution denial above: the backend
387
+ # reads why it was refused, and the span does not report the
388
+ # call as one that ran.
389
+ telemetry.end_span(span_id, attributes={Attr.REALTIME_TOOL_DENIED: True})
390
+ logger.info(
391
+ "Backend tool %s refused by its handler (delegation %s, session %s)",
392
+ name,
393
+ delegation_id,
394
+ session.id,
395
+ )
396
+ await self._fire_tool_refusal(
397
+ session, call_id, name, arguments, refusal.message, room_id
398
+ )
399
+ return refusal.message
382
400
  telemetry.end_span(span_id)
383
401
  logger.info(
384
402
  "Backend tool %s handled (delegation %s, session %s)",
@@ -25,6 +25,7 @@ from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable
25
25
  from uuid import uuid4
26
26
 
27
27
  from roomkit.channels._realtime_tools import result_text
28
+ from roomkit.core.exceptions import ToolRefusedError
28
29
  from roomkit.models.enums import ChannelType
29
30
  from roomkit.telemetry.base import Attr, SpanKind
30
31
  from roomkit.voice.base import VoiceSessionState
@@ -112,6 +113,7 @@ class RealtimeToolRecoveryMixin:
112
113
  _track_task: Any # cross-mixin
113
114
  _authorize_realtime_tool: Any # cross-mixin (RealtimeToolsMixin)
114
115
  _fire_tool_hook: Any # cross-mixin (RealtimeToolsMixin)
116
+ _fire_tool_refusal: Any # cross-mixin (RealtimeToolsMixin)
115
117
  _truncate_tool_result: Any # cross-mixin (RealtimeToolsMixin)
116
118
 
117
119
  # ------------------------------------------------------------------
@@ -289,6 +291,11 @@ class RealtimeToolRecoveryMixin:
289
291
  call_id,
290
292
  session.id,
291
293
  )
294
+ # Observed like a denial on the function-calling path: an audit
295
+ # hook sees the refusal, and nothing that could serve it does.
296
+ await self._fire_tool_refusal(
297
+ session, call_id, tool_name, arguments, denial, room_id
298
+ )
292
299
  return
293
300
 
294
301
  # Run tool_handler.
@@ -297,10 +304,31 @@ class RealtimeToolRecoveryMixin:
297
304
  from roomkit.channels._realtime_context import _current_voice_session
298
305
 
299
306
  token = _current_voice_session.set(session)
307
+ refused: str | None = None
300
308
  try:
301
309
  raw = await self._tool_handler(tool_name, arguments)
310
+ except ToolRefusedError as refusal:
311
+ refused = refusal.message
302
312
  finally:
303
313
  _current_voice_session.reset(token)
314
+ if refused is not None:
315
+ # Ends the call the way the pre-execution denial above
316
+ # does, and for the same reason: the model reads why it was
317
+ # refused, in the handler's words, and can correct itself.
318
+ await self._inject_recovered_result(
319
+ session, tool_name, call_id, refused, denied=True
320
+ )
321
+ telemetry.end_span(span_id, attributes={Attr.REALTIME_TOOL_DENIED: True})
322
+ logger.info(
323
+ "Recovered tool %s(%s) refused by its handler for session %s",
324
+ tool_name,
325
+ call_id,
326
+ session.id,
327
+ )
328
+ await self._fire_tool_refusal(
329
+ session, call_id, tool_name, arguments, refused, room_id
330
+ )
331
+ return
304
332
  handler_result = result_text(raw)
305
333
 
306
334
  # Fire ON_TOOL_CALL hook (for observability / overrides).