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.
- {roomkit-0.78.0 → roomkit-0.80.0}/PKG-INFO +6 -7
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/ai-channels.md +20 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/llms-full.txt +20 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/pyproject.toml +7 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/__init__.py +4 -0
- roomkit-0.80.0/src/roomkit/_version.py +1 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_generation.py +7 -4
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_stream_external_tools.py +5 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_streaming.py +4 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_tools.py +81 -10
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_realtime.py +12 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_delegation.py +21 -3
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tool_recovery.py +28 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tools.py +139 -28
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/ai.py +7 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/realtime_voice.py +3 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_hooks.py +6 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/exceptions.py +26 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/hooks.py +33 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/channel_ops.py +1 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/helpers.py +48 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/hooks_api.py +2 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/tool_call.py +33 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/tool_audit.py +23 -4
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/base.py +8 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/realtime.py +458 -52
- roomkit-0.80.0/src/roomkit/providers/gemini/realtime_models.py +186 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/sdk.py +56 -16
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live.py +40 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/external.py +14 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/mcp.py +68 -21
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/__init__.py +14 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_sip_types.py +2 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/provider.py +1 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini.py +7 -8
- roomkit-0.80.0/src/roomkit/voice/stt/gemini_transcribe.py +301 -0
- roomkit-0.80.0/tests/providers/gemini/test_sdk_env_warning.py +78 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_tool_loop.py +75 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_context_preservation.py +1 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_tool_provider.py +58 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_openai_live.py +75 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_realtime.py +750 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_realtime_models.py +14 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_skills.py +1 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_tool_recovery.py +105 -1
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_arg_fold.py +2 -2
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_unified_tool_call.py +410 -3
- roomkit-0.80.0/tests/voice/stt/test_gemini_transcribe.py +291 -0
- roomkit-0.78.0/src/roomkit/_version.py +0 -1
- roomkit-0.78.0/src/roomkit/providers/gemini/realtime_models.py +0 -44
- {roomkit-0.78.0 → roomkit-0.80.0}/.gitignore +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/AGENTS.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/LICENSE +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/README.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/QUALITY.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/README.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/__main__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/SKILL.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/references/rules.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/fixtures/quote-policy/scripts/total.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/harness.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/measurement.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality_oracles.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/quality_report.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/report.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/benchmarks/chat/scenarios.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/README.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/acp.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/api-reference.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/architecture.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/conference.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/hooks.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/identity-and-realtime.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/image-generation.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/installation.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/ollama-provider.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/orchestration.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/overview.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/quickstart.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/realtime-voice.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/resilience.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/rooms-and-channels.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/storage.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/testing.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/transport-providers.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/video.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/voice-channels.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/c7/voice-pipeline.md +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/architecture.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/avatar-pipeline.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/message-flow.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/orchestration.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/room-lifecycle.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/video-pipeline.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/voice-orchestration.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/docs/diagrams/voice-pipeline.svg +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/llms.txt +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/ai_docs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_client.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_acp_usage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_coalescers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_loop_rules.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_policy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_resilience.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_steering.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_ai_stream_round.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_cli_markdown.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_access.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_activity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_attachment.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_backlog.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_identity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_lane.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_lanes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_metadata.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_mixer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_operations.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_plug.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_recording_writer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_room_state.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_roster.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_session.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_shutdown.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_subscription.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_conference_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_dangling_recovery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_audio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_response.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_skills.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_speech.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_tool_search.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_realtime_transcription.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_sandbox_handlers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_activation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_constants.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_skill_handlers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_speaker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_task_planner.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_eviction.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_search.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_search_constants.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_tool_usage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_turn_config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_video_hooks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_video_resources.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_hooks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_stt.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_tts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/_voice_turn.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/acp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/acp_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/agent.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/av.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/cli.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/conference.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/realtime_av.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/video.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/channels/websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_mapping.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_media.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_session.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_livekit_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_mock_faults.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/_mock_media.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/livekit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/conference/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_activity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_brand.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_chat.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_display.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_shell.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_state.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_terminal.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/console/_tool_preview.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_delivery_targets.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_participant_channels.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/_voice_delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/callbacks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/circuit_breaker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/event_router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/framework.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/inbound_router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/lanes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/locks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/_child_execution.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/delegation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/deliver.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/event_ops.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/greeting.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_identity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_locked.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/inbound_streaming.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/lane_execution.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/membership.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/realtime_ops.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/recording.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/regenerate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/room_lifecycle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/source_ops.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/mixins/voice_ops.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/rate_limiter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/retry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/task_utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/transcoder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/core/visibility.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/_redis_scripts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/serialization.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/delivery/worker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/identity/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/knowledge/postgres.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/_wrapper.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/budget_aware.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/compacting.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/retrieval.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/sliding_window.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/summarizing.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/memory/token_estimator.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/enums.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/framework_event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/hook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/identity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/participant.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/pending_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/plan_event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/response_metadata.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/room.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/session_event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/steering.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/store_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/streaming.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/task.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/thinking_event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/trace.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/vision_event.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/models/voice_delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/handoff.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/result.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/session_audit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/state.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/status_bus.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/status_redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/loop.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_common.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_inject_per_worker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_inject_strategy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/_install_auto.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/core.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/delegate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/execution.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/prompts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/results.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/supervisor/supervised.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/orchestration/strategies/swarm.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/image_parts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ai/openai_dialect.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/_convert.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/avatar.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anam/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/anthropic/request.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/azure/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/agent.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/buzz/relay.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/cerebras/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/settings.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepgram/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/deepseek/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/bot.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/discord/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elasticemail/email.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/elevenlabs/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/email/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/errors.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/image_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/request.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/schema.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/vertex.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/gemini/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/provider.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http/webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/http_errors.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/options.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/image/usage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/litellm/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/facebook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/messenger/webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/mistral/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/ollama/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/image_stream.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_client.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_handlers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_hosted.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/live_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/realtime_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openai/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/image_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/openrouter/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/personaplex/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/polargrid/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/qwen/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/rcs/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sendgrid/email.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sinch/sms.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/meta.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/sms/phone.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/bot_framework.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/conversation_store.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/teams/webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/api.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/bot.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/entities.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/update.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telegram/webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/_signature.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/rcs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/telnyx/sms.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/_signature.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/rcs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/sms.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/twilio/webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/url_safety.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/vllm/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/vllm/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/voicemeup/sms.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/whatsapp/personal.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/image_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/realtime_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/providers/xai/voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/py.typed +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/_subscription.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/realtime/redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/_pyav_mux.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/_room_recorder_manager.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/recorder/pyav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/executor.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sandbox/tools.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/hook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/scoring/tracker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/errors.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/executor.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/parser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/paths.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/skills/registry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/buzz.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/discord.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/neonize.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/sse.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/sources/websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_lock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_mappers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/postgres_schema.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/store/sqlite.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/cache.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/delegate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tasks/models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/console.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/noop.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/opentelemetry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/pyroscope.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/telemetry/redaction.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/compose.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/human_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/policy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/tools/validation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/ai_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/musetalk.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/avatar/websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/fastrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/local.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/rtp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/screen.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/sip.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/backends/websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/decoder/pyav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/encoder/pyav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/engine.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/censor.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mediapipe_face_touch.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/mock_face_touch.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/watermark.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/filter/yolo.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/rich.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/subtitle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/overlay/text.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/resizer/pyav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/effects.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/pipeline/transform/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/opencv.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/recorder/pyav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/video_frame.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/encode.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/openai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/screen_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/screen_tool.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/video/vision/webcam_tool.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_g711.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_limits.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/_sounddevice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/audio_frame.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_mulaw.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_resample.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/_webrtc_auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/buzz_huddle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/fastrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/local.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/rtp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_audio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/sip_calling.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/twilio_ws.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/backends/webtransport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/local.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/capture/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/inbound.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/interruption.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/_telemetry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/speex.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/aec/webrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/agc/simple.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/backchannel/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/debug_taps.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/aicoustics.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/rnnoise.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/denoiser/webrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/diarization/sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/dtmf/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/engine.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/numpy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/mixer/python.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/offload.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/postprocessor/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/postprocessor/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/_wav_writer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/recorder/wav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/linear.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/numpy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/resampler/sinc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/turn/smart_turn.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/energy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/pipeline/vad/sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/_fastrtc_playback.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/fastrtc_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/injection.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/pacer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/reasoning.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/sip_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/realtime/ws_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/deepgram.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini_audio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gemini_transcript.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/gradium.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/language.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/qwen3.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/stt/sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/trace.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/testing/wav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/audio_utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/elevenlabs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/filters.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/gradium.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/grok.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/mock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/neutts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/qwen3.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/sentence_splitter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/tts/sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/voice/utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/LICENSE +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/stream.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/tracks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/webrtc_connection_mixin.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/src/roomkit/webrtc/websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/lane_audio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_backend_abc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_activity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_attach_failure.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_gating.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_hot_plug.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_identity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_lane.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_metadata.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_mixer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_outbound.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_pure_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_races.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime_hot_plug.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_realtime_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_recording.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_recording_isolation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_conference_teardown_failure.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_live.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_livekit_mapping.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_mock_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_mock_injection.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conference/test_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/conftest.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_redis_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_serialization.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_targeted.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/delivery/test_worker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/http_timeout_fakes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_framework_orchestration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_handoff.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_loop_strategy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_orchestration_base.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_session_audit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_state.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_status_bus.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_status_redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_behavioral.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_loop.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_supervisor.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_strategy_swarm.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_supervisor_inline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_supervisor_strategy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/orchestration/test_tool_audit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/test_reconfigure_preservation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/gemini/test_schema.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/openai/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/providers/openai/test_reconfigure.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/redis_fakes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_core.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_messaging.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/stress/test_stress_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_cache.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_child_room_trace.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_delegate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_runner.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/tasks/test_structured_result.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_addressing.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aec_bench.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aec_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_docs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_response_plain_stream.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_response_transcript.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_stream_contract.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_thinking.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_ai_streaming_tool_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_aicoustics_denoiser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_anam_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_backpressure.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_capture_source.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_limits.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_audio_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_auto_connect.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_av_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_avatar.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_before_ai_generation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_before_deliver_gate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_binding_permission_inheritance.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_bridge_hook_modification.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_buzz_huddle_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channel_abc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channel_attach_contract.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_empty_prompt.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_usage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_acp_usage_boundaries.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_agent.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_active_turns.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_empty_retry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_loop_rules.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_response_loop_end_reason.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_retry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_skill_gating.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_steering.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_streaming_compaction.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_ai_tool_loop.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_compact_context_tool_pairs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_email.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_http.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_loop_end_marker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_loop_end_reason_nonstreaming.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_messenger.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_multimodal_tool_result.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_sms.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_telegram.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_tool_usage_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_turn_config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_channels/test_whatsapp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_chat_benchmark.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_chat_quality.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_check_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_circuit_breaker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_activity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_console.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_prompt_shell.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_cli_select.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_commit_atomicity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_compacting_cache.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_compose_tool_handlers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_config_secret_hygiene.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_configs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_conformance_level0.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_console.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_context_carry_forward.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_context_visibility.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_current_turn_budget.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_dangling_recovery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_cancellation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_cancellation_streams.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_order.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_outcomes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_delivery_strategies.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_denoiser_rnnoise_loader.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_describe_screen_tool.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_describe_webcam_tool.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_drain_barge_in.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_edit_delete_authorization.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_energy_vad.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_enums.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_event_ops.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_event_text.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_examples_audio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_external_tool_handler.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_face_touch_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_audio_session.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_playback.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_fastrtc_realtime_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_aware.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_queries.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_framework_status_bus.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_realtime_failfast.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_gemini_transcript_dedup.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hook_payload_modification.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hook_side_effects.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_hooks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_http_timeouts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_human_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_idempotent_redelivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_hooks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_identity_unknown_outcomes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_connection_budget.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_deferred.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_error_surfacing.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_rate_limit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_response_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_routing.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_routing_ambiguity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_stream_cancellation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_stream_error_propagation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_inbound_visibility.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_ai_assistant.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_ai_chain_depth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_cerebras_live.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_cross_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_dynamic_channels.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_human_ai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_identity_resolution.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_observer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_regenerate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_integration/test_sin_scanning.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption_partials.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_interruption_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_invalid_tool_repeat_guard.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_knowledge_postgres.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lanes.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lanes_multiworker.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_lifecycle_hooks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_live_turn_playback.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_local_backend_aec.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_locks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_log_redaction.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_structured_content.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mcp_tools.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_media_recorder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory_new.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_memory_wrappers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_mock_providers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_observability.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_opencv_recorder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_opentelemetry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_optional_imports.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_outbound_audio_pacer.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pacer_response_boundary.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_parallel_tool_cleanup.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_participant_membership.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_personaplex_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_debug_taps.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_engine.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_providers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler_numpy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pipeline_resampler_sinc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_lock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_multiprocess.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_postgres_store.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_precommit_timeout.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_proactive_delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_proactive_delivery_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_protocol_trace.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/conftest.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_ai_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anam_avatar.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anam_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_anthropic.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_azure.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_azure_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_buzz.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_cerebras.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_cerebras_tool_arrays.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_deepseek.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_discord.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_elasticemail.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_list_models.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_gemini_vertex.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_http.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_http_timeouts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_advanced.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_parts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_sdk_contracts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_image_stream.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_litellm.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_messenger.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_mistral.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_ollama.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openai_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openrouter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_openrouter_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_personaplex_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_phone.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_polargrid.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_qwen.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_rcs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_realtime_voices.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sendgrid.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sinch.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_sms_utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_teams.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_teams_webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_api.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_bot.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_entities.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_update.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telegram_webhook.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telnyx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_telnyx_rcs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_twilio.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_vllm.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_voicemeup.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_whatsapp_personal.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_providers/test_xai_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_public_api.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_decode_native.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_media_recorder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_pyav_recorder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rate_limiter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_raw_payload_preservation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_av_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_deepgram.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_deferred_connection.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_elevenlabs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_fixed_tools.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_full_duplex.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_g711.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_hook_coverage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_playback_lifecycle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reasoning.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reconfiguration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_reconnection.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_redis.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_resample_offload.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_skill_delivery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_tool_search.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_voice_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_realtime_xai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recent_events_window.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recording_consent.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_recording_wiring.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_reentry_block_side_effects.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_related_family_tools.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_release_script.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_repeated_result_note.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_resilience.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_response_metadata.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_response_visibility.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_retrieval_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_retry_retryability.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_arbitrations.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_conformance.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_framework_events.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rfc_write_gates.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rnnoise.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_room_org_scoping.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_room_status_enforcement.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_router.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_rtp_video_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_scoring.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_screen_capture_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_screen_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_session_started.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sherpa_onnx_denoiser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sherpa_onnx_vad.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_audio_clock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_dial.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_helpers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_realtime_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sip_video_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skill_activation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skill_tool_gating.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skills.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_skills_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_smart_turn.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_smoke_quickstart.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_source_rate_limit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_source_url_redaction.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_init.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_neonize.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_sse.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_sources_websocket.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_speaker_attribution.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_speex_aec.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_activity.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_binding_contract.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_identity_scoping.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_lifecycle_immutability.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_postgres.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_store_sqlite.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_streaming_before_broadcast.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_deepgram_teardown.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_stt_qwen3.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_summarizing_memory.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_supervisor.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_task_planner.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_task_utils.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_telemetry.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_telemetry_pyroscope.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_threading.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_arg_validation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_context.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_eviction_room_scope.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_policy.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_protocol.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_repeat_guard.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_round_cap.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tool_search_text.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_transport_auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_elevenlabs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_grok.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_neutts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_qwen3.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_tts_text_split.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_turn_detection.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_twilio_ws_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vad_debug_logging.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_ai_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_channel.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_local.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_pipeline.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_pipeline_config.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_recording.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_session_isolation.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_video_transform.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vision_gemini.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_vision_openai.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_batch_stt.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_binding_gate.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_channel_aec.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_idempotency.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_recovery.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_delivery_store.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_dsp_vectorized.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_fastrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_frame_limit.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_inbound.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_injection_results.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_integration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_local.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_map.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_rtp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_say_play.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_security.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_session_lifecycle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_sherpa_onnx.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_streaming_ai_tts.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_streaming_stt.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_stt_language.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_voice_webtransport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_wake_word_backlog.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_wav_recorder.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_webrtc_offer_auth.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_webrtc_rtc_configuration.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_websocket_lifecycle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_websocket_room_scoping.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/test_yolo_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_av_channel_fastrtc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_fastrtc_video_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_image.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_rich.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_subtitle.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_overlay_text.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_screen_input.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_screen_input_tools.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_video_bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_video_effects.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_watermark_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_websocket_avatar.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/video/test_websocket_video_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_rtp.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_sip.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_sip_coverage.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/backends/test_webtransport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/stream_conformance.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_aicoustics_denoiser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_offload_callbacks.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_per_stream_regression.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_rnnoise_denoiser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_sherpa_diarization.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_simple_agc.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_smart_turn.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_speex_aec.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_stream_conformance.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_stream_entry_point.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_webrtc_aec.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/pipeline/test_webrtc_denoiser.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_fastrtc_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_realtime_bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/realtime/test_ws_transport.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_deepgram.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_deepgram_stream_language.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_gradium_stt.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_language_lock.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/stt/test_qwen3_asr.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_bridge.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_inbound_offload.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_backend.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_trace.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_testing_wav.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_tts_filters.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_voice_close_providers.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/test_voice_tts_filter.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/__init__.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/test_elevenlabs.py +0 -0
- {roomkit-0.78.0 → roomkit-0.80.0}/tests/voice/tts/test_gradium_tts.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
396
|
-
|
|
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=
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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=
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
380
|
-
|
|
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).
|