@livekit/agents 1.0.48 → 1.1.0-dev.0
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.
- package/dist/constants.cjs +27 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +9 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -1
- package/dist/inference/api_protos.d.cts +71 -71
- package/dist/inference/api_protos.d.ts +71 -71
- package/dist/inference/interruption/defaults.cjs +81 -0
- package/dist/inference/interruption/defaults.cjs.map +1 -0
- package/dist/inference/interruption/defaults.d.cts +19 -0
- package/dist/inference/interruption/defaults.d.ts +19 -0
- package/dist/inference/interruption/defaults.d.ts.map +1 -0
- package/dist/inference/interruption/defaults.js +46 -0
- package/dist/inference/interruption/defaults.js.map +1 -0
- package/dist/inference/interruption/errors.cjs +44 -0
- package/dist/inference/interruption/errors.cjs.map +1 -0
- package/dist/inference/interruption/errors.d.cts +12 -0
- package/dist/inference/interruption/errors.d.ts +12 -0
- package/dist/inference/interruption/errors.d.ts.map +1 -0
- package/dist/inference/interruption/errors.js +20 -0
- package/dist/inference/interruption/errors.js.map +1 -0
- package/dist/inference/interruption/http_transport.cjs +147 -0
- package/dist/inference/interruption/http_transport.cjs.map +1 -0
- package/dist/inference/interruption/http_transport.d.cts +63 -0
- package/dist/inference/interruption/http_transport.d.ts +63 -0
- package/dist/inference/interruption/http_transport.d.ts.map +1 -0
- package/dist/inference/interruption/http_transport.js +121 -0
- package/dist/inference/interruption/http_transport.js.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.js +34 -0
- package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
- package/dist/inference/interruption/interruption_detector.cjs +181 -0
- package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
- package/dist/inference/interruption/interruption_detector.d.cts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_detector.js +147 -0
- package/dist/inference/interruption/interruption_detector.js.map +1 -0
- package/dist/inference/interruption/interruption_stream.cjs +368 -0
- package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
- package/dist/inference/interruption/interruption_stream.d.cts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_stream.js +344 -0
- package/dist/inference/interruption/interruption_stream.js.map +1 -0
- package/dist/inference/interruption/types.cjs +17 -0
- package/dist/inference/interruption/types.cjs.map +1 -0
- package/dist/inference/interruption/types.d.cts +66 -0
- package/dist/inference/interruption/types.d.ts +66 -0
- package/dist/inference/interruption/types.d.ts.map +1 -0
- package/dist/inference/interruption/types.js +1 -0
- package/dist/inference/interruption/types.js.map +1 -0
- package/dist/inference/interruption/utils.cjs +130 -0
- package/dist/inference/interruption/utils.cjs.map +1 -0
- package/dist/inference/interruption/utils.d.cts +41 -0
- package/dist/inference/interruption/utils.d.ts +41 -0
- package/dist/inference/interruption/utils.d.ts.map +1 -0
- package/dist/inference/interruption/utils.js +105 -0
- package/dist/inference/interruption/utils.js.map +1 -0
- package/dist/inference/interruption/utils.test.cjs +105 -0
- package/dist/inference/interruption/utils.test.cjs.map +1 -0
- package/dist/inference/interruption/utils.test.js +104 -0
- package/dist/inference/interruption/utils.test.js.map +1 -0
- package/dist/inference/interruption/ws_transport.cjs +329 -0
- package/dist/inference/interruption/ws_transport.cjs.map +1 -0
- package/dist/inference/interruption/ws_transport.d.cts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
- package/dist/inference/interruption/ws_transport.js +295 -0
- package/dist/inference/interruption/ws_transport.js.map +1 -0
- package/dist/inference/llm.cjs +14 -10
- package/dist/inference/llm.cjs.map +1 -1
- package/dist/inference/llm.d.cts +2 -1
- package/dist/inference/llm.d.ts +2 -1
- package/dist/inference/llm.d.ts.map +1 -1
- package/dist/inference/llm.js +8 -10
- package/dist/inference/llm.js.map +1 -1
- package/dist/inference/stt.cjs +7 -2
- package/dist/inference/stt.cjs.map +1 -1
- package/dist/inference/stt.d.cts +2 -0
- package/dist/inference/stt.d.ts +2 -0
- package/dist/inference/stt.d.ts.map +1 -1
- package/dist/inference/stt.js +8 -3
- package/dist/inference/stt.js.map +1 -1
- package/dist/inference/tts.cjs +7 -2
- package/dist/inference/tts.cjs.map +1 -1
- package/dist/inference/tts.d.cts +2 -0
- package/dist/inference/tts.d.ts +2 -0
- package/dist/inference/tts.d.ts.map +1 -1
- package/dist/inference/tts.js +8 -3
- package/dist/inference/tts.js.map +1 -1
- package/dist/inference/utils.cjs +26 -7
- package/dist/inference/utils.cjs.map +1 -1
- package/dist/inference/utils.d.cts +13 -0
- package/dist/inference/utils.d.ts +13 -0
- package/dist/inference/utils.d.ts.map +1 -1
- package/dist/inference/utils.js +18 -2
- package/dist/inference/utils.js.map +1 -1
- package/dist/llm/chat_context.cjs +20 -2
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +19 -1
- package/dist/llm/chat_context.d.ts +19 -1
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +20 -2
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +1 -1
- package/dist/llm/index.d.ts +1 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +16 -1
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +9 -0
- package/dist/llm/llm.d.ts +9 -0
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +16 -1
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/realtime.cjs +3 -0
- package/dist/llm/realtime.cjs.map +1 -1
- package/dist/llm/realtime.d.cts +1 -0
- package/dist/llm/realtime.d.ts +1 -0
- package/dist/llm/realtime.d.ts.map +1 -1
- package/dist/llm/realtime.js +3 -0
- package/dist/llm/realtime.js.map +1 -1
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +45 -1
- package/dist/metrics/base.d.ts +45 -1
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/index.cjs +5 -0
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -1
- package/dist/metrics/index.d.ts +2 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +6 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/model_usage.cjs +189 -0
- package/dist/metrics/model_usage.cjs.map +1 -0
- package/dist/metrics/model_usage.d.cts +92 -0
- package/dist/metrics/model_usage.d.ts +92 -0
- package/dist/metrics/model_usage.d.ts.map +1 -0
- package/dist/metrics/model_usage.js +164 -0
- package/dist/metrics/model_usage.js.map +1 -0
- package/dist/metrics/model_usage.test.cjs +474 -0
- package/dist/metrics/model_usage.test.cjs.map +1 -0
- package/dist/metrics/model_usage.test.js +476 -0
- package/dist/metrics/model_usage.test.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +3 -0
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +9 -0
- package/dist/metrics/usage_collector.d.ts +9 -0
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +3 -0
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +9 -0
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +9 -0
- package/dist/metrics/utils.js.map +1 -1
- package/dist/stream/multi_input_stream.test.cjs +4 -0
- package/dist/stream/multi_input_stream.test.cjs.map +1 -1
- package/dist/stream/multi_input_stream.test.js +5 -1
- package/dist/stream/multi_input_stream.test.js.map +1 -1
- package/dist/stream/stream_channel.cjs +31 -0
- package/dist/stream/stream_channel.cjs.map +1 -1
- package/dist/stream/stream_channel.d.cts +4 -2
- package/dist/stream/stream_channel.d.ts +4 -2
- package/dist/stream/stream_channel.d.ts.map +1 -1
- package/dist/stream/stream_channel.js +31 -0
- package/dist/stream/stream_channel.js.map +1 -1
- package/dist/stt/stt.cjs +34 -2
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +22 -0
- package/dist/stt/stt.d.ts +22 -0
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +34 -2
- package/dist/stt/stt.js.map +1 -1
- package/dist/telemetry/otel_http_exporter.cjs +24 -5
- package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
- package/dist/telemetry/otel_http_exporter.d.cts +1 -0
- package/dist/telemetry/otel_http_exporter.d.ts +1 -0
- package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
- package/dist/telemetry/otel_http_exporter.js +24 -5
- package/dist/telemetry/otel_http_exporter.js.map +1 -1
- package/dist/telemetry/trace_types.cjs +5 -5
- package/dist/telemetry/trace_types.cjs.map +1 -1
- package/dist/telemetry/trace_types.d.cts +9 -5
- package/dist/telemetry/trace_types.d.ts +9 -5
- package/dist/telemetry/trace_types.d.ts.map +1 -1
- package/dist/telemetry/trace_types.js +5 -5
- package/dist/telemetry/trace_types.js.map +1 -1
- package/dist/telemetry/traces.cjs +47 -8
- package/dist/telemetry/traces.cjs.map +1 -1
- package/dist/telemetry/traces.d.ts.map +1 -1
- package/dist/telemetry/traces.js +47 -8
- package/dist/telemetry/traces.js.map +1 -1
- package/dist/tts/tts.cjs +64 -2
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +34 -0
- package/dist/tts/tts.d.ts +34 -0
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +64 -2
- package/dist/tts/tts.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/agent.cjs +25 -4
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +10 -2
- package/dist/voice/agent.d.ts +10 -2
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +25 -4
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent_activity.cjs +261 -36
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.cts +20 -6
- package/dist/voice/agent_activity.d.ts +20 -6
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +262 -37
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_session.cjs +105 -48
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +90 -20
- package/dist/voice/agent_session.d.ts +90 -20
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +105 -46
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/audio_recognition.cjs +287 -6
- package/dist/voice/audio_recognition.cjs.map +1 -1
- package/dist/voice/audio_recognition.d.cts +42 -3
- package/dist/voice/audio_recognition.d.ts +42 -3
- package/dist/voice/audio_recognition.d.ts.map +1 -1
- package/dist/voice/audio_recognition.js +289 -7
- package/dist/voice/audio_recognition.js.map +1 -1
- package/dist/voice/client_events.cjs +554 -0
- package/dist/voice/client_events.cjs.map +1 -0
- package/dist/voice/client_events.d.cts +195 -0
- package/dist/voice/client_events.d.ts +195 -0
- package/dist/voice/client_events.d.ts.map +1 -0
- package/dist/voice/client_events.js +548 -0
- package/dist/voice/client_events.js.map +1 -0
- package/dist/voice/events.cjs +1 -0
- package/dist/voice/events.cjs.map +1 -1
- package/dist/voice/events.d.cts +8 -5
- package/dist/voice/events.d.ts +8 -5
- package/dist/voice/events.d.ts.map +1 -1
- package/dist/voice/events.js +1 -0
- package/dist/voice/events.js.map +1 -1
- package/dist/voice/generation.cjs +43 -8
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.cts +3 -3
- package/dist/voice/generation.d.ts +3 -3
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js +43 -8
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/index.cjs +1 -0
- package/dist/voice/index.cjs.map +1 -1
- package/dist/voice/index.d.cts +1 -0
- package/dist/voice/index.d.ts +1 -0
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +1 -0
- package/dist/voice/index.js.map +1 -1
- package/dist/voice/report.cjs +20 -8
- package/dist/voice/report.cjs.map +1 -1
- package/dist/voice/report.d.cts +5 -0
- package/dist/voice/report.d.ts +5 -0
- package/dist/voice/report.d.ts.map +1 -1
- package/dist/voice/report.js +20 -8
- package/dist/voice/report.js.map +1 -1
- package/dist/voice/report.test.cjs +106 -0
- package/dist/voice/report.test.cjs.map +1 -0
- package/dist/voice/report.test.js +105 -0
- package/dist/voice/report.test.js.map +1 -0
- package/dist/voice/room_io/room_io.cjs +5 -39
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +4 -9
- package/dist/voice/room_io/room_io.d.ts +4 -9
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +5 -40
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/turn_config/endpointing.cjs +33 -0
- package/dist/voice/turn_config/endpointing.cjs.map +1 -0
- package/dist/voice/turn_config/endpointing.d.cts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
- package/dist/voice/turn_config/endpointing.js +9 -0
- package/dist/voice/turn_config/endpointing.js.map +1 -0
- package/dist/voice/turn_config/interruption.cjs +37 -0
- package/dist/voice/turn_config/interruption.cjs.map +1 -0
- package/dist/voice/turn_config/interruption.d.cts +53 -0
- package/dist/voice/turn_config/interruption.d.ts +53 -0
- package/dist/voice/turn_config/interruption.d.ts.map +1 -0
- package/dist/voice/turn_config/interruption.js +13 -0
- package/dist/voice/turn_config/interruption.js.map +1 -0
- package/dist/voice/turn_config/turn_handling.cjs +35 -0
- package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
- package/dist/voice/turn_config/turn_handling.d.cts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
- package/dist/voice/turn_config/turn_handling.js +11 -0
- package/dist/voice/turn_config/turn_handling.js.map +1 -0
- package/dist/voice/turn_config/utils.cjs +97 -0
- package/dist/voice/turn_config/utils.cjs.map +1 -0
- package/dist/voice/turn_config/utils.d.cts +25 -0
- package/dist/voice/turn_config/utils.d.ts +25 -0
- package/dist/voice/turn_config/utils.d.ts.map +1 -0
- package/dist/voice/turn_config/utils.js +73 -0
- package/dist/voice/turn_config/utils.js.map +1 -0
- package/dist/voice/turn_config/utils.test.cjs +86 -0
- package/dist/voice/turn_config/utils.test.cjs.map +1 -0
- package/dist/voice/turn_config/utils.test.js +85 -0
- package/dist/voice/turn_config/utils.test.js.map +1 -0
- package/dist/voice/wire_format.cjs +798 -0
- package/dist/voice/wire_format.cjs.map +1 -0
- package/dist/voice/wire_format.d.cts +5503 -0
- package/dist/voice/wire_format.d.ts +5503 -0
- package/dist/voice/wire_format.d.ts.map +1 -0
- package/dist/voice/wire_format.js +728 -0
- package/dist/voice/wire_format.js.map +1 -0
- package/package.json +2 -1
- package/src/constants.ts +13 -0
- package/src/inference/interruption/defaults.ts +51 -0
- package/src/inference/interruption/errors.ts +25 -0
- package/src/inference/interruption/http_transport.ts +187 -0
- package/src/inference/interruption/interruption_cache_entry.ts +50 -0
- package/src/inference/interruption/interruption_detector.ts +188 -0
- package/src/inference/interruption/interruption_stream.ts +467 -0
- package/src/inference/interruption/types.ts +84 -0
- package/src/inference/interruption/utils.test.ts +132 -0
- package/src/inference/interruption/utils.ts +137 -0
- package/src/inference/interruption/ws_transport.ts +402 -0
- package/src/inference/llm.ts +9 -12
- package/src/inference/stt.ts +10 -3
- package/src/inference/tts.ts +10 -3
- package/src/inference/utils.ts +29 -1
- package/src/llm/chat_context.ts +40 -2
- package/src/llm/index.ts +1 -0
- package/src/llm/llm.ts +16 -0
- package/src/llm/realtime.ts +4 -0
- package/src/metrics/base.ts +48 -1
- package/src/metrics/index.ts +11 -0
- package/src/metrics/model_usage.test.ts +545 -0
- package/src/metrics/model_usage.ts +262 -0
- package/src/metrics/usage_collector.ts +11 -0
- package/src/metrics/utils.ts +11 -0
- package/src/stream/multi_input_stream.test.ts +6 -1
- package/src/stream/stream_channel.ts +34 -2
- package/src/stt/stt.ts +38 -0
- package/src/telemetry/otel_http_exporter.ts +28 -5
- package/src/telemetry/trace_types.ts +11 -8
- package/src/telemetry/traces.ts +111 -54
- package/src/tts/tts.ts +69 -1
- package/src/voice/agent.ts +30 -3
- package/src/voice/agent_activity.ts +327 -28
- package/src/voice/agent_session.ts +207 -59
- package/src/voice/audio_recognition.ts +385 -9
- package/src/voice/client_events.ts +838 -0
- package/src/voice/events.ts +14 -4
- package/src/voice/generation.ts +52 -9
- package/src/voice/index.ts +1 -0
- package/src/voice/report.test.ts +117 -0
- package/src/voice/report.ts +29 -6
- package/src/voice/room_io/room_io.ts +7 -61
- package/src/voice/turn_config/endpointing.ts +33 -0
- package/src/voice/turn_config/interruption.ts +56 -0
- package/src/voice/turn_config/turn_handling.ts +45 -0
- package/src/voice/turn_config/utils.test.ts +100 -0
- package/src/voice/turn_config/utils.ts +103 -0
- package/src/voice/wire_format.ts +827 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/turn_handling.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TurnDetectionMode } from '../agent_session.js';\nimport { type EndpointingOptions, defaultEndpointingOptions } from './endpointing.js';\nimport { type InterruptionOptions, defaultInterruptionOptions } from './interruption.js';\n\n/**\n * Configuration for the turn handling system. Used to configure the turn taking behavior of the\n * session.\n */\nexport interface TurnHandlingOptions {\n /**\n * Strategy for deciding when the user has finished speaking.\n *\n * - `\"stt\"` – rely on speech-to-text end-of-utterance cues\n * - `\"vad\"` – rely on Voice Activity Detection start/stop cues\n * - `\"realtime_llm\"` – use server-side detection from a realtime LLM\n * - `\"manual\"` – caller controls turn boundaries explicitly\n *\n * If not set, the session chooses the best available mode in priority order\n * `realtime_llm → vad → stt → manual`; it automatically falls back if the necessary model\n * is missing.\n */\n turnDetection: TurnDetectionMode | undefined;\n /**\n * Configuration for endpointing.\n */\n endpointing: Partial<EndpointingOptions>;\n /**\n * Configuration for interruption handling.\n */\n interruption: Partial<InterruptionOptions>;\n}\n\nexport interface InternalTurnHandlingOptions extends TurnHandlingOptions {\n endpointing: EndpointingOptions;\n interruption: InterruptionOptions;\n}\n\nexport const defaultTurnHandlingOptions: InternalTurnHandlingOptions = {\n turnDetection: undefined,\n interruption: defaultInterruptionOptions,\n endpointing: defaultEndpointingOptions,\n};\n"],"mappings":"AAIA,SAAkC,iCAAiC;AACnE,SAAmC,kCAAkC;AAmC9D,MAAM,6BAA0D;AAAA,EACrE,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AACf;","names":[]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var utils_exports = {};
|
|
20
|
+
__export(utils_exports, {
|
|
21
|
+
mergeWithDefaults: () => mergeWithDefaults,
|
|
22
|
+
migrateLegacyOptions: () => migrateLegacyOptions,
|
|
23
|
+
stripUndefined: () => stripUndefined
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(utils_exports);
|
|
26
|
+
var import_log = require("../../log.cjs");
|
|
27
|
+
var import_agent_session = require("../agent_session.cjs");
|
|
28
|
+
var import_endpointing = require("./endpointing.cjs");
|
|
29
|
+
var import_interruption = require("./interruption.cjs");
|
|
30
|
+
var import_turn_handling = require("./turn_handling.cjs");
|
|
31
|
+
function migrateLegacyOptions(legacyOptions) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
const logger = (0, import_log.log)();
|
|
34
|
+
const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;
|
|
35
|
+
if (voiceOptions !== void 0 && sessionOptions !== void 0) {
|
|
36
|
+
logger.warn(
|
|
37
|
+
"Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence"
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
const originalTurnDetection = ((_a = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _a.turnDetection) ?? ((_b = voiceOptions == null ? void 0 : voiceOptions.turnHandling) == null ? void 0 : _b.turnDetection) ?? turnDetection;
|
|
41
|
+
const cloneableVoiceOptions = voiceOptions ? {
|
|
42
|
+
...voiceOptions,
|
|
43
|
+
turnHandling: voiceOptions.turnHandling ? { ...voiceOptions.turnHandling, turnDetection: void 0 } : voiceOptions.turnHandling
|
|
44
|
+
} : voiceOptions;
|
|
45
|
+
const cloneableSessionOptions = sessionOptions ? {
|
|
46
|
+
...sessionOptions,
|
|
47
|
+
turnHandling: sessionOptions.turnHandling ? { ...sessionOptions.turnHandling, turnDetection: void 0 } : sessionOptions.turnHandling
|
|
48
|
+
} : sessionOptions;
|
|
49
|
+
const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });
|
|
50
|
+
const turnHandling = {
|
|
51
|
+
interruption: {
|
|
52
|
+
discardAudioIfUninterruptible: mergedOptions == null ? void 0 : mergedOptions.discardAudioIfUninterruptible,
|
|
53
|
+
minDuration: mergedOptions == null ? void 0 : mergedOptions.minInterruptionDuration,
|
|
54
|
+
minWords: mergedOptions == null ? void 0 : mergedOptions.minInterruptionWords
|
|
55
|
+
},
|
|
56
|
+
endpointing: {
|
|
57
|
+
minDelay: mergedOptions == null ? void 0 : mergedOptions.minEndpointingDelay,
|
|
58
|
+
maxDelay: mergedOptions == null ? void 0 : mergedOptions.maxEndpointingDelay
|
|
59
|
+
},
|
|
60
|
+
...mergedOptions.turnHandling,
|
|
61
|
+
// Restore original turnDetection after spread to preserve class instance with methods
|
|
62
|
+
// (structuredClone converts class instances to plain objects, losing prototype methods)
|
|
63
|
+
turnDetection: originalTurnDetection
|
|
64
|
+
};
|
|
65
|
+
if ((mergedOptions == null ? void 0 : mergedOptions.allowInterruptions) === false) {
|
|
66
|
+
turnHandling.interruption.enabled = false;
|
|
67
|
+
}
|
|
68
|
+
const optionsWithDefaults = {
|
|
69
|
+
...import_agent_session.defaultSessionOptions,
|
|
70
|
+
...mergedOptions,
|
|
71
|
+
turnHandling: mergeWithDefaults(turnHandling)
|
|
72
|
+
};
|
|
73
|
+
const newAgentSessionOptions = {
|
|
74
|
+
...rest,
|
|
75
|
+
options: optionsWithDefaults,
|
|
76
|
+
voiceOptions: optionsWithDefaults,
|
|
77
|
+
turnDetection: turnHandling.turnDetection
|
|
78
|
+
};
|
|
79
|
+
return newAgentSessionOptions;
|
|
80
|
+
}
|
|
81
|
+
function stripUndefined(obj) {
|
|
82
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
|
|
83
|
+
}
|
|
84
|
+
function mergeWithDefaults(config) {
|
|
85
|
+
return {
|
|
86
|
+
turnDetection: config.turnDetection ?? import_turn_handling.defaultTurnHandlingOptions.turnDetection,
|
|
87
|
+
endpointing: { ...import_endpointing.defaultEndpointingOptions, ...stripUndefined(config.endpointing) },
|
|
88
|
+
interruption: { ...import_interruption.defaultInterruptionOptions, ...stripUndefined(config.interruption) }
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
92
|
+
0 && (module.exports = {
|
|
93
|
+
mergeWithDefaults,
|
|
94
|
+
migrateLegacyOptions,
|
|
95
|
+
stripUndefined
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../../log.js';\nimport {\n type AgentSessionOptions,\n type InternalSessionOptions,\n defaultSessionOptions,\n} from '../agent_session.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { type TurnHandlingOptions, defaultTurnHandlingOptions } from './turn_handling.js';\n\nexport function migrateLegacyOptions<UserData>(\n legacyOptions: AgentSessionOptions<UserData>,\n): AgentSessionOptions<UserData> & { options: InternalSessionOptions } {\n const logger = log();\n const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;\n\n if (voiceOptions !== undefined && sessionOptions !== undefined) {\n logger.warn(\n 'Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence',\n );\n }\n\n // Preserve turnDetection before cloning since structuredClone converts class instances to plain objects\n const originalTurnDetection =\n sessionOptions?.turnHandling?.turnDetection ??\n voiceOptions?.turnHandling?.turnDetection ??\n turnDetection;\n\n // Exclude potentially non-cloneable turnDetection objects before structuredClone.\n // They are restored from originalTurnDetection below.\n const cloneableVoiceOptions = voiceOptions\n ? {\n ...voiceOptions,\n turnHandling: voiceOptions.turnHandling\n ? { ...voiceOptions.turnHandling, turnDetection: undefined }\n : voiceOptions.turnHandling,\n }\n : voiceOptions;\n const cloneableSessionOptions = sessionOptions\n ? {\n ...sessionOptions,\n turnHandling: sessionOptions.turnHandling\n ? { ...sessionOptions.turnHandling, turnDetection: undefined }\n : sessionOptions.turnHandling,\n }\n : sessionOptions;\n\n const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });\n\n const turnHandling: TurnHandlingOptions = {\n interruption: {\n discardAudioIfUninterruptible: mergedOptions?.discardAudioIfUninterruptible,\n minDuration: mergedOptions?.minInterruptionDuration,\n minWords: mergedOptions?.minInterruptionWords,\n },\n endpointing: {\n minDelay: mergedOptions?.minEndpointingDelay,\n maxDelay: mergedOptions?.maxEndpointingDelay,\n },\n\n ...mergedOptions.turnHandling,\n // Restore original turnDetection after spread to preserve class instance with methods\n // (structuredClone converts class instances to plain objects, losing prototype methods)\n turnDetection: originalTurnDetection,\n } as const;\n\n if (mergedOptions?.allowInterruptions === false) {\n turnHandling.interruption.enabled = false;\n }\n\n const optionsWithDefaults = {\n ...defaultSessionOptions,\n ...mergedOptions,\n turnHandling: mergeWithDefaults(turnHandling),\n };\n\n const newAgentSessionOptions: AgentSessionOptions<UserData> & {\n options: InternalSessionOptions;\n } = {\n ...rest,\n options: optionsWithDefaults,\n voiceOptions: optionsWithDefaults,\n turnDetection: turnHandling.turnDetection,\n };\n\n return newAgentSessionOptions;\n}\n\n/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */\nexport function stripUndefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nexport function mergeWithDefaults(config: TurnHandlingOptions) {\n return {\n turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,\n endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },\n interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) },\n } as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAoB;AACpB,2BAIO;AACP,yBAA0C;AAC1C,0BAA2C;AAC3C,2BAAqE;AAE9D,SAAS,qBACd,eACqE;AAfvE;AAgBE,QAAM,aAAS,gBAAI;AACnB,QAAM,EAAE,cAAc,eAAe,SAAS,gBAAgB,GAAG,KAAK,IAAI;AAE1E,MAAI,iBAAiB,UAAa,mBAAmB,QAAW;AAC9D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,QAAM,0BACJ,sDAAgB,iBAAhB,mBAA8B,oBAC9B,kDAAc,iBAAd,mBAA4B,kBAC5B;AAIF,QAAM,wBAAwB,eAC1B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,aAAa,eACvB,EAAE,GAAG,aAAa,cAAc,eAAe,OAAU,IACzD,aAAa;AAAA,EACnB,IACA;AACJ,QAAM,0BAA0B,iBAC5B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,eAAe,eACzB,EAAE,GAAG,eAAe,cAAc,eAAe,OAAU,IAC3D,eAAe;AAAA,EACrB,IACA;AAEJ,QAAM,gBAAgB,gBAAgB,EAAE,GAAG,uBAAuB,GAAG,wBAAwB,CAAC;AAE9F,QAAM,eAAoC;AAAA,IACxC,cAAc;AAAA,MACZ,+BAA+B,+CAAe;AAAA,MAC9C,aAAa,+CAAe;AAAA,MAC5B,UAAU,+CAAe;AAAA,IAC3B;AAAA,IACA,aAAa;AAAA,MACX,UAAU,+CAAe;AAAA,MACzB,UAAU,+CAAe;AAAA,IAC3B;AAAA,IAEA,GAAG,cAAc;AAAA;AAAA;AAAA,IAGjB,eAAe;AAAA,EACjB;AAEA,OAAI,+CAAe,wBAAuB,OAAO;AAC/C,iBAAa,aAAa,UAAU;AAAA,EACtC;AAEA,QAAM,sBAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAc,kBAAkB,YAAY;AAAA,EAC9C;AAEA,QAAM,yBAEF;AAAA,IACF,GAAG;AAAA,IACH,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe,aAAa;AAAA,EAC9B;AAEA,SAAO;AACT;AAGO,SAAS,eAAiC,KAAoB;AACnE,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAClF;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,SAAO;AAAA,IACL,eAAe,OAAO,iBAAiB,gDAA2B;AAAA,IAClE,aAAa,EAAE,GAAG,8CAA2B,GAAG,eAAe,OAAO,WAAW,EAAE;AAAA,IACnF,cAAc,EAAE,GAAG,gDAA4B,GAAG,eAAe,OAAO,YAAY,EAAE;AAAA,EACxF;AACF;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type AgentSessionOptions, type InternalSessionOptions } from '../agent_session.js';
|
|
2
|
+
import { type TurnHandlingOptions } from './turn_handling.js';
|
|
3
|
+
export declare function migrateLegacyOptions<UserData>(legacyOptions: AgentSessionOptions<UserData>): AgentSessionOptions<UserData> & {
|
|
4
|
+
options: InternalSessionOptions;
|
|
5
|
+
};
|
|
6
|
+
/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */
|
|
7
|
+
export declare function stripUndefined<T extends object>(obj: T): Partial<T>;
|
|
8
|
+
export declare function mergeWithDefaults(config: TurnHandlingOptions): {
|
|
9
|
+
readonly turnDetection: import("../agent_session.js").TurnDetectionMode | undefined;
|
|
10
|
+
readonly endpointing: {
|
|
11
|
+
mode: "fixed" | "dynamic";
|
|
12
|
+
minDelay: number;
|
|
13
|
+
maxDelay: number;
|
|
14
|
+
};
|
|
15
|
+
readonly interruption: {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
mode: false | "vad" | "adaptive" | undefined;
|
|
18
|
+
discardAudioIfUninterruptible: boolean;
|
|
19
|
+
minDuration: number;
|
|
20
|
+
minWords: number;
|
|
21
|
+
falseInterruptionTimeout: number;
|
|
22
|
+
resumeFalseInterruption: boolean;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type AgentSessionOptions, type InternalSessionOptions } from '../agent_session.js';
|
|
2
|
+
import { type TurnHandlingOptions } from './turn_handling.js';
|
|
3
|
+
export declare function migrateLegacyOptions<UserData>(legacyOptions: AgentSessionOptions<UserData>): AgentSessionOptions<UserData> & {
|
|
4
|
+
options: InternalSessionOptions;
|
|
5
|
+
};
|
|
6
|
+
/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */
|
|
7
|
+
export declare function stripUndefined<T extends object>(obj: T): Partial<T>;
|
|
8
|
+
export declare function mergeWithDefaults(config: TurnHandlingOptions): {
|
|
9
|
+
readonly turnDetection: import("../agent_session.js").TurnDetectionMode | undefined;
|
|
10
|
+
readonly endpointing: {
|
|
11
|
+
mode: "fixed" | "dynamic";
|
|
12
|
+
minDelay: number;
|
|
13
|
+
maxDelay: number;
|
|
14
|
+
};
|
|
15
|
+
readonly interruption: {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
mode: false | "vad" | "adaptive" | undefined;
|
|
18
|
+
discardAudioIfUninterruptible: boolean;
|
|
19
|
+
minDuration: number;
|
|
20
|
+
minWords: number;
|
|
21
|
+
falseInterruptionTimeout: number;
|
|
22
|
+
resumeFalseInterruption: boolean;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/voice/turn_config/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAE5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,mBAAmB,EAA8B,MAAM,oBAAoB,CAAC;AAE1F,wBAAgB,oBAAoB,CAAC,QAAQ,EAC3C,aAAa,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAC3C,mBAAmB,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,CA0ErE;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;;;;;;;;EAM5D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { log } from "../../log.js";
|
|
2
|
+
import {
|
|
3
|
+
defaultSessionOptions
|
|
4
|
+
} from "../agent_session.js";
|
|
5
|
+
import { defaultEndpointingOptions } from "./endpointing.js";
|
|
6
|
+
import { defaultInterruptionOptions } from "./interruption.js";
|
|
7
|
+
import { defaultTurnHandlingOptions } from "./turn_handling.js";
|
|
8
|
+
function migrateLegacyOptions(legacyOptions) {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const logger = log();
|
|
11
|
+
const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;
|
|
12
|
+
if (voiceOptions !== void 0 && sessionOptions !== void 0) {
|
|
13
|
+
logger.warn(
|
|
14
|
+
"Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence"
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
const originalTurnDetection = ((_a = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _a.turnDetection) ?? ((_b = voiceOptions == null ? void 0 : voiceOptions.turnHandling) == null ? void 0 : _b.turnDetection) ?? turnDetection;
|
|
18
|
+
const cloneableVoiceOptions = voiceOptions ? {
|
|
19
|
+
...voiceOptions,
|
|
20
|
+
turnHandling: voiceOptions.turnHandling ? { ...voiceOptions.turnHandling, turnDetection: void 0 } : voiceOptions.turnHandling
|
|
21
|
+
} : voiceOptions;
|
|
22
|
+
const cloneableSessionOptions = sessionOptions ? {
|
|
23
|
+
...sessionOptions,
|
|
24
|
+
turnHandling: sessionOptions.turnHandling ? { ...sessionOptions.turnHandling, turnDetection: void 0 } : sessionOptions.turnHandling
|
|
25
|
+
} : sessionOptions;
|
|
26
|
+
const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });
|
|
27
|
+
const turnHandling = {
|
|
28
|
+
interruption: {
|
|
29
|
+
discardAudioIfUninterruptible: mergedOptions == null ? void 0 : mergedOptions.discardAudioIfUninterruptible,
|
|
30
|
+
minDuration: mergedOptions == null ? void 0 : mergedOptions.minInterruptionDuration,
|
|
31
|
+
minWords: mergedOptions == null ? void 0 : mergedOptions.minInterruptionWords
|
|
32
|
+
},
|
|
33
|
+
endpointing: {
|
|
34
|
+
minDelay: mergedOptions == null ? void 0 : mergedOptions.minEndpointingDelay,
|
|
35
|
+
maxDelay: mergedOptions == null ? void 0 : mergedOptions.maxEndpointingDelay
|
|
36
|
+
},
|
|
37
|
+
...mergedOptions.turnHandling,
|
|
38
|
+
// Restore original turnDetection after spread to preserve class instance with methods
|
|
39
|
+
// (structuredClone converts class instances to plain objects, losing prototype methods)
|
|
40
|
+
turnDetection: originalTurnDetection
|
|
41
|
+
};
|
|
42
|
+
if ((mergedOptions == null ? void 0 : mergedOptions.allowInterruptions) === false) {
|
|
43
|
+
turnHandling.interruption.enabled = false;
|
|
44
|
+
}
|
|
45
|
+
const optionsWithDefaults = {
|
|
46
|
+
...defaultSessionOptions,
|
|
47
|
+
...mergedOptions,
|
|
48
|
+
turnHandling: mergeWithDefaults(turnHandling)
|
|
49
|
+
};
|
|
50
|
+
const newAgentSessionOptions = {
|
|
51
|
+
...rest,
|
|
52
|
+
options: optionsWithDefaults,
|
|
53
|
+
voiceOptions: optionsWithDefaults,
|
|
54
|
+
turnDetection: turnHandling.turnDetection
|
|
55
|
+
};
|
|
56
|
+
return newAgentSessionOptions;
|
|
57
|
+
}
|
|
58
|
+
function stripUndefined(obj) {
|
|
59
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
|
|
60
|
+
}
|
|
61
|
+
function mergeWithDefaults(config) {
|
|
62
|
+
return {
|
|
63
|
+
turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,
|
|
64
|
+
endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },
|
|
65
|
+
interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) }
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
mergeWithDefaults,
|
|
70
|
+
migrateLegacyOptions,
|
|
71
|
+
stripUndefined
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../../log.js';\nimport {\n type AgentSessionOptions,\n type InternalSessionOptions,\n defaultSessionOptions,\n} from '../agent_session.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { type TurnHandlingOptions, defaultTurnHandlingOptions } from './turn_handling.js';\n\nexport function migrateLegacyOptions<UserData>(\n legacyOptions: AgentSessionOptions<UserData>,\n): AgentSessionOptions<UserData> & { options: InternalSessionOptions } {\n const logger = log();\n const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;\n\n if (voiceOptions !== undefined && sessionOptions !== undefined) {\n logger.warn(\n 'Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence',\n );\n }\n\n // Preserve turnDetection before cloning since structuredClone converts class instances to plain objects\n const originalTurnDetection =\n sessionOptions?.turnHandling?.turnDetection ??\n voiceOptions?.turnHandling?.turnDetection ??\n turnDetection;\n\n // Exclude potentially non-cloneable turnDetection objects before structuredClone.\n // They are restored from originalTurnDetection below.\n const cloneableVoiceOptions = voiceOptions\n ? {\n ...voiceOptions,\n turnHandling: voiceOptions.turnHandling\n ? { ...voiceOptions.turnHandling, turnDetection: undefined }\n : voiceOptions.turnHandling,\n }\n : voiceOptions;\n const cloneableSessionOptions = sessionOptions\n ? {\n ...sessionOptions,\n turnHandling: sessionOptions.turnHandling\n ? { ...sessionOptions.turnHandling, turnDetection: undefined }\n : sessionOptions.turnHandling,\n }\n : sessionOptions;\n\n const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });\n\n const turnHandling: TurnHandlingOptions = {\n interruption: {\n discardAudioIfUninterruptible: mergedOptions?.discardAudioIfUninterruptible,\n minDuration: mergedOptions?.minInterruptionDuration,\n minWords: mergedOptions?.minInterruptionWords,\n },\n endpointing: {\n minDelay: mergedOptions?.minEndpointingDelay,\n maxDelay: mergedOptions?.maxEndpointingDelay,\n },\n\n ...mergedOptions.turnHandling,\n // Restore original turnDetection after spread to preserve class instance with methods\n // (structuredClone converts class instances to plain objects, losing prototype methods)\n turnDetection: originalTurnDetection,\n } as const;\n\n if (mergedOptions?.allowInterruptions === false) {\n turnHandling.interruption.enabled = false;\n }\n\n const optionsWithDefaults = {\n ...defaultSessionOptions,\n ...mergedOptions,\n turnHandling: mergeWithDefaults(turnHandling),\n };\n\n const newAgentSessionOptions: AgentSessionOptions<UserData> & {\n options: InternalSessionOptions;\n } = {\n ...rest,\n options: optionsWithDefaults,\n voiceOptions: optionsWithDefaults,\n turnDetection: turnHandling.turnDetection,\n };\n\n return newAgentSessionOptions;\n}\n\n/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */\nexport function stripUndefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nexport function mergeWithDefaults(config: TurnHandlingOptions) {\n return {\n turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,\n endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },\n interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) },\n } as const;\n}\n"],"mappings":"AAGA,SAAS,WAAW;AACpB;AAAA,EAGE;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAmC,kCAAkC;AAE9D,SAAS,qBACd,eACqE;AAfvE;AAgBE,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,cAAc,eAAe,SAAS,gBAAgB,GAAG,KAAK,IAAI;AAE1E,MAAI,iBAAiB,UAAa,mBAAmB,QAAW;AAC9D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,QAAM,0BACJ,sDAAgB,iBAAhB,mBAA8B,oBAC9B,kDAAc,iBAAd,mBAA4B,kBAC5B;AAIF,QAAM,wBAAwB,eAC1B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,aAAa,eACvB,EAAE,GAAG,aAAa,cAAc,eAAe,OAAU,IACzD,aAAa;AAAA,EACnB,IACA;AACJ,QAAM,0BAA0B,iBAC5B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,eAAe,eACzB,EAAE,GAAG,eAAe,cAAc,eAAe,OAAU,IAC3D,eAAe;AAAA,EACrB,IACA;AAEJ,QAAM,gBAAgB,gBAAgB,EAAE,GAAG,uBAAuB,GAAG,wBAAwB,CAAC;AAE9F,QAAM,eAAoC;AAAA,IACxC,cAAc;AAAA,MACZ,+BAA+B,+CAAe;AAAA,MAC9C,aAAa,+CAAe;AAAA,MAC5B,UAAU,+CAAe;AAAA,IAC3B;AAAA,IACA,aAAa;AAAA,MACX,UAAU,+CAAe;AAAA,MACzB,UAAU,+CAAe;AAAA,IAC3B;AAAA,IAEA,GAAG,cAAc;AAAA;AAAA;AAAA,IAGjB,eAAe;AAAA,EACjB;AAEA,OAAI,+CAAe,wBAAuB,OAAO;AAC/C,iBAAa,aAAa,UAAU;AAAA,EACtC;AAEA,QAAM,sBAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAc,kBAAkB,YAAY;AAAA,EAC9C;AAEA,QAAM,yBAEF;AAAA,IACF,GAAG;AAAA,IACH,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe,aAAa;AAAA,EAC9B;AAEA,SAAO;AACT;AAGO,SAAS,eAAiC,KAAoB;AACnE,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAClF;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,SAAO;AAAA,IACL,eAAe,OAAO,iBAAiB,2BAA2B;AAAA,IAClE,aAAa,EAAE,GAAG,2BAA2B,GAAG,eAAe,OAAO,WAAW,EAAE;AAAA,IACnF,cAAc,EAAE,GAAG,4BAA4B,GAAG,eAAe,OAAO,YAAY,EAAE;AAAA,EACxF;AACF;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_log = require("../../log.cjs");
|
|
4
|
+
var import_endpointing = require("./endpointing.cjs");
|
|
5
|
+
var import_interruption = require("./interruption.cjs");
|
|
6
|
+
var import_turn_handling = require("./turn_handling.cjs");
|
|
7
|
+
var import_utils = require("./utils.cjs");
|
|
8
|
+
(0, import_vitest.beforeAll)(() => {
|
|
9
|
+
(0, import_log.initializeLogger)({ pretty: true, level: "info" });
|
|
10
|
+
});
|
|
11
|
+
(0, import_vitest.describe)("migrateLegacyOptions", () => {
|
|
12
|
+
(0, import_vitest.it)("should return all defaults when no options are provided", () => {
|
|
13
|
+
const result = (0, import_utils.migrateLegacyOptions)({});
|
|
14
|
+
(0, import_vitest.expect)(result.options.turnHandling).toEqual({
|
|
15
|
+
turnDetection: import_turn_handling.defaultTurnHandlingOptions.turnDetection,
|
|
16
|
+
endpointing: import_endpointing.defaultEndpointingOptions,
|
|
17
|
+
interruption: import_interruption.defaultInterruptionOptions
|
|
18
|
+
});
|
|
19
|
+
(0, import_vitest.expect)(result.options.maxToolSteps).toBe(3);
|
|
20
|
+
(0, import_vitest.expect)(result.options.preemptiveGeneration).toBe(false);
|
|
21
|
+
(0, import_vitest.expect)(result.options.userAwayTimeout).toBe(15);
|
|
22
|
+
});
|
|
23
|
+
(0, import_vitest.it)("should migrate legacy flat fields into nested turnHandling config", () => {
|
|
24
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
25
|
+
voiceOptions: {
|
|
26
|
+
minInterruptionDuration: 1e3,
|
|
27
|
+
minInterruptionWords: 3,
|
|
28
|
+
discardAudioIfUninterruptible: false,
|
|
29
|
+
minEndpointingDelay: 800,
|
|
30
|
+
maxEndpointingDelay: 5e3
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(1e3);
|
|
34
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minWords).toBe(3);
|
|
35
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
|
|
36
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(800);
|
|
37
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
|
|
38
|
+
});
|
|
39
|
+
(0, import_vitest.it)("should set interruption.enabled to false when allowInterruptions is false", () => {
|
|
40
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
41
|
+
options: {
|
|
42
|
+
allowInterruptions: false
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.enabled).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
(0, import_vitest.it)("should give options precedence over voiceOptions when both are provided", () => {
|
|
48
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
49
|
+
voiceOptions: {
|
|
50
|
+
minInterruptionDuration: 1e3,
|
|
51
|
+
maxEndpointingDelay: 5e3,
|
|
52
|
+
maxToolSteps: 10
|
|
53
|
+
},
|
|
54
|
+
options: {
|
|
55
|
+
minInterruptionDuration: 2e3,
|
|
56
|
+
maxEndpointingDelay: 8e3,
|
|
57
|
+
maxToolSteps: 5
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(2e3);
|
|
61
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
|
|
62
|
+
(0, import_vitest.expect)(result.options.maxToolSteps).toBe(5);
|
|
63
|
+
});
|
|
64
|
+
(0, import_vitest.it)("should let explicit turnHandling override legacy flat fields", () => {
|
|
65
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
66
|
+
options: {
|
|
67
|
+
minInterruptionDuration: 1e3,
|
|
68
|
+
minEndpointingDelay: 800,
|
|
69
|
+
turnHandling: {
|
|
70
|
+
interruption: { minDuration: 3e3 },
|
|
71
|
+
endpointing: { minDelay: 2e3 }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(3e3);
|
|
76
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
|
|
77
|
+
});
|
|
78
|
+
(0, import_vitest.it)("should preserve top-level turnDetection in the result", () => {
|
|
79
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
80
|
+
turnDetection: "vad"
|
|
81
|
+
});
|
|
82
|
+
(0, import_vitest.expect)(result.turnDetection).toBe("vad");
|
|
83
|
+
(0, import_vitest.expect)(result.options.turnHandling.turnDetection).toBe("vad");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=utils.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { initializeLogger } from "../../log.js";
|
|
3
|
+
import { defaultEndpointingOptions } from "./endpointing.js";
|
|
4
|
+
import { defaultInterruptionOptions } from "./interruption.js";
|
|
5
|
+
import { defaultTurnHandlingOptions } from "./turn_handling.js";
|
|
6
|
+
import { migrateLegacyOptions } from "./utils.js";
|
|
7
|
+
beforeAll(() => {
|
|
8
|
+
initializeLogger({ pretty: true, level: "info" });
|
|
9
|
+
});
|
|
10
|
+
describe("migrateLegacyOptions", () => {
|
|
11
|
+
it("should return all defaults when no options are provided", () => {
|
|
12
|
+
const result = migrateLegacyOptions({});
|
|
13
|
+
expect(result.options.turnHandling).toEqual({
|
|
14
|
+
turnDetection: defaultTurnHandlingOptions.turnDetection,
|
|
15
|
+
endpointing: defaultEndpointingOptions,
|
|
16
|
+
interruption: defaultInterruptionOptions
|
|
17
|
+
});
|
|
18
|
+
expect(result.options.maxToolSteps).toBe(3);
|
|
19
|
+
expect(result.options.preemptiveGeneration).toBe(false);
|
|
20
|
+
expect(result.options.userAwayTimeout).toBe(15);
|
|
21
|
+
});
|
|
22
|
+
it("should migrate legacy flat fields into nested turnHandling config", () => {
|
|
23
|
+
const result = migrateLegacyOptions({
|
|
24
|
+
voiceOptions: {
|
|
25
|
+
minInterruptionDuration: 1e3,
|
|
26
|
+
minInterruptionWords: 3,
|
|
27
|
+
discardAudioIfUninterruptible: false,
|
|
28
|
+
minEndpointingDelay: 800,
|
|
29
|
+
maxEndpointingDelay: 5e3
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(1e3);
|
|
33
|
+
expect(result.options.turnHandling.interruption.minWords).toBe(3);
|
|
34
|
+
expect(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
|
|
35
|
+
expect(result.options.turnHandling.endpointing.minDelay).toBe(800);
|
|
36
|
+
expect(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
|
|
37
|
+
});
|
|
38
|
+
it("should set interruption.enabled to false when allowInterruptions is false", () => {
|
|
39
|
+
const result = migrateLegacyOptions({
|
|
40
|
+
options: {
|
|
41
|
+
allowInterruptions: false
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
expect(result.options.turnHandling.interruption.enabled).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it("should give options precedence over voiceOptions when both are provided", () => {
|
|
47
|
+
const result = migrateLegacyOptions({
|
|
48
|
+
voiceOptions: {
|
|
49
|
+
minInterruptionDuration: 1e3,
|
|
50
|
+
maxEndpointingDelay: 5e3,
|
|
51
|
+
maxToolSteps: 10
|
|
52
|
+
},
|
|
53
|
+
options: {
|
|
54
|
+
minInterruptionDuration: 2e3,
|
|
55
|
+
maxEndpointingDelay: 8e3,
|
|
56
|
+
maxToolSteps: 5
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(2e3);
|
|
60
|
+
expect(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
|
|
61
|
+
expect(result.options.maxToolSteps).toBe(5);
|
|
62
|
+
});
|
|
63
|
+
it("should let explicit turnHandling override legacy flat fields", () => {
|
|
64
|
+
const result = migrateLegacyOptions({
|
|
65
|
+
options: {
|
|
66
|
+
minInterruptionDuration: 1e3,
|
|
67
|
+
minEndpointingDelay: 800,
|
|
68
|
+
turnHandling: {
|
|
69
|
+
interruption: { minDuration: 3e3 },
|
|
70
|
+
endpointing: { minDelay: 2e3 }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(3e3);
|
|
75
|
+
expect(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
|
|
76
|
+
});
|
|
77
|
+
it("should preserve top-level turnDetection in the result", () => {
|
|
78
|
+
const result = migrateLegacyOptions({
|
|
79
|
+
turnDetection: "vad"
|
|
80
|
+
});
|
|
81
|
+
expect(result.turnDetection).toBe("vad");
|
|
82
|
+
expect(result.options.turnHandling.turnDetection).toBe("vad");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"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","names":[]}
|