@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,554 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var client_events_exports = {};
|
|
30
|
+
__export(client_events_exports, {
|
|
31
|
+
ClientEventsHandler: () => ClientEventsHandler,
|
|
32
|
+
RemoteSession: () => RemoteSession
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(client_events_exports);
|
|
35
|
+
var import_events = __toESM(require("events"), 1);
|
|
36
|
+
var import_constants = require("../constants.cjs");
|
|
37
|
+
var import_log = require("../log.cjs");
|
|
38
|
+
var import_utils = require("../utils.cjs");
|
|
39
|
+
var import_events2 = require("./events.cjs");
|
|
40
|
+
var import_wire_format = require("./wire_format.cjs");
|
|
41
|
+
function serializeOptions(opts) {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
return {
|
|
44
|
+
endpointing: ((_a = opts.turnHandling) == null ? void 0 : _a.endpointing) ?? {},
|
|
45
|
+
interruption: ((_b = opts.turnHandling) == null ? void 0 : _b.interruption) ?? {},
|
|
46
|
+
max_tool_steps: opts.maxToolSteps,
|
|
47
|
+
user_away_timeout: opts.userAwayTimeout,
|
|
48
|
+
preemptive_generation: opts.preemptiveGeneration,
|
|
49
|
+
use_tts_aligned_transcript: opts.useTtsAlignedTranscript
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function toolNames(toolCtx) {
|
|
53
|
+
if (!toolCtx) return [];
|
|
54
|
+
return Object.keys(toolCtx);
|
|
55
|
+
}
|
|
56
|
+
class ClientEventsHandler {
|
|
57
|
+
session;
|
|
58
|
+
roomIO;
|
|
59
|
+
textInputCb;
|
|
60
|
+
textStreamHandlerRegistered = false;
|
|
61
|
+
rpcHandlersRegistered = false;
|
|
62
|
+
requestHandlerRegistered = false;
|
|
63
|
+
eventHandlersRegistered = false;
|
|
64
|
+
started = false;
|
|
65
|
+
tasks = /* @__PURE__ */ new Set();
|
|
66
|
+
logger = (0, import_log.log)();
|
|
67
|
+
constructor(session, roomIO) {
|
|
68
|
+
this.session = session;
|
|
69
|
+
this.roomIO = roomIO;
|
|
70
|
+
}
|
|
71
|
+
get room() {
|
|
72
|
+
return this.roomIO.rtcRoom;
|
|
73
|
+
}
|
|
74
|
+
async start() {
|
|
75
|
+
if (this.started) return;
|
|
76
|
+
this.started = true;
|
|
77
|
+
this.registerRpcHandlers();
|
|
78
|
+
this.registerRequestHandler();
|
|
79
|
+
this.registerEventHandlers();
|
|
80
|
+
}
|
|
81
|
+
async close() {
|
|
82
|
+
if (!this.started) return;
|
|
83
|
+
this.started = false;
|
|
84
|
+
if (this.textStreamHandlerRegistered) {
|
|
85
|
+
this.room.unregisterTextStreamHandler(import_constants.TOPIC_CHAT);
|
|
86
|
+
this.textStreamHandlerRegistered = false;
|
|
87
|
+
}
|
|
88
|
+
if (this.rpcHandlersRegistered) {
|
|
89
|
+
const localParticipant = this.room.localParticipant;
|
|
90
|
+
if (localParticipant) {
|
|
91
|
+
localParticipant.unregisterRpcMethod(import_constants.RPC_GET_SESSION_STATE);
|
|
92
|
+
localParticipant.unregisterRpcMethod(import_constants.RPC_GET_CHAT_HISTORY);
|
|
93
|
+
localParticipant.unregisterRpcMethod(import_constants.RPC_GET_AGENT_INFO);
|
|
94
|
+
localParticipant.unregisterRpcMethod(import_constants.RPC_SEND_MESSAGE);
|
|
95
|
+
}
|
|
96
|
+
this.rpcHandlersRegistered = false;
|
|
97
|
+
}
|
|
98
|
+
if (this.requestHandlerRegistered) {
|
|
99
|
+
this.room.unregisterTextStreamHandler(import_constants.TOPIC_AGENT_REQUEST);
|
|
100
|
+
this.requestHandlerRegistered = false;
|
|
101
|
+
}
|
|
102
|
+
if (this.eventHandlersRegistered) {
|
|
103
|
+
this.session.off(import_events2.AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);
|
|
104
|
+
this.session.off(import_events2.AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);
|
|
105
|
+
this.session.off(import_events2.AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);
|
|
106
|
+
this.session.off(import_events2.AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);
|
|
107
|
+
this.session.off(import_events2.AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
|
|
108
|
+
this.session.off(import_events2.AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);
|
|
109
|
+
this.session.off(import_events2.AgentSessionEventTypes.UserOverlappingSpeech, this.onUserOverlapSpeech);
|
|
110
|
+
this.session.off(import_events2.AgentSessionEventTypes.Error, this.onError);
|
|
111
|
+
this.eventHandlersRegistered = false;
|
|
112
|
+
}
|
|
113
|
+
await (0, import_utils.cancelAndWait)([...this.tasks]);
|
|
114
|
+
this.tasks.clear();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Registers a callback to handle text input from clients.
|
|
118
|
+
*
|
|
119
|
+
* This callback will be called when a client sends a text message to the agent.
|
|
120
|
+
* The callback should return a promise that resolves when the text input has been processed.
|
|
121
|
+
*
|
|
122
|
+
* @param textInputCb - The callback to handle text input.
|
|
123
|
+
*/
|
|
124
|
+
registerTextInput(textInputCb) {
|
|
125
|
+
this.textInputCb = textInputCb;
|
|
126
|
+
if (this.textStreamHandlerRegistered) return;
|
|
127
|
+
this.room.registerTextStreamHandler(import_constants.TOPIC_CHAT, this.onUserTextInput);
|
|
128
|
+
this.textStreamHandlerRegistered = true;
|
|
129
|
+
}
|
|
130
|
+
registerRpcHandlers() {
|
|
131
|
+
if (this.rpcHandlersRegistered) return;
|
|
132
|
+
const localParticipant = this.room.localParticipant;
|
|
133
|
+
if (!localParticipant) return;
|
|
134
|
+
localParticipant.registerRpcMethod(import_constants.RPC_GET_SESSION_STATE, this.rpcGetSessionState);
|
|
135
|
+
localParticipant.registerRpcMethod(import_constants.RPC_GET_CHAT_HISTORY, this.rpcGetChatHistory);
|
|
136
|
+
localParticipant.registerRpcMethod(import_constants.RPC_GET_AGENT_INFO, this.rpcGetAgentInfo);
|
|
137
|
+
localParticipant.registerRpcMethod(import_constants.RPC_SEND_MESSAGE, this.rpcSendMessage);
|
|
138
|
+
this.rpcHandlersRegistered = true;
|
|
139
|
+
}
|
|
140
|
+
registerRequestHandler() {
|
|
141
|
+
if (this.requestHandlerRegistered) return;
|
|
142
|
+
this.room.registerTextStreamHandler(import_constants.TOPIC_AGENT_REQUEST, this.onStreamRequest);
|
|
143
|
+
this.requestHandlerRegistered = true;
|
|
144
|
+
}
|
|
145
|
+
registerEventHandlers() {
|
|
146
|
+
if (this.eventHandlersRegistered) return;
|
|
147
|
+
this.session.on(import_events2.AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);
|
|
148
|
+
this.session.on(import_events2.AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);
|
|
149
|
+
this.session.on(import_events2.AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);
|
|
150
|
+
this.session.on(import_events2.AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);
|
|
151
|
+
this.session.on(import_events2.AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
|
|
152
|
+
this.session.on(import_events2.AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);
|
|
153
|
+
this.session.on(import_events2.AgentSessionEventTypes.UserOverlappingSpeech, this.onUserOverlapSpeech);
|
|
154
|
+
this.session.on(import_events2.AgentSessionEventTypes.Error, this.onError);
|
|
155
|
+
this.eventHandlersRegistered = true;
|
|
156
|
+
}
|
|
157
|
+
onStreamRequest = (reader, participantInfo) => {
|
|
158
|
+
const task = import_utils.Task.from(async () => this.handleStreamRequest(reader, participantInfo.identity));
|
|
159
|
+
this.trackTask(task);
|
|
160
|
+
};
|
|
161
|
+
async handleStreamRequest(reader, participantIdentity) {
|
|
162
|
+
try {
|
|
163
|
+
const data = await reader.readAll();
|
|
164
|
+
const request = import_wire_format.streamRequestSchema.parse(JSON.parse(data));
|
|
165
|
+
let responsePayload = "";
|
|
166
|
+
let error = null;
|
|
167
|
+
try {
|
|
168
|
+
switch (request.method) {
|
|
169
|
+
case "get_session_state":
|
|
170
|
+
responsePayload = await this.streamGetSessionState();
|
|
171
|
+
break;
|
|
172
|
+
case "get_chat_history":
|
|
173
|
+
responsePayload = await this.streamGetChatHistory();
|
|
174
|
+
break;
|
|
175
|
+
case "get_agent_info":
|
|
176
|
+
responsePayload = await this.streamGetAgentInfo();
|
|
177
|
+
break;
|
|
178
|
+
case "send_message":
|
|
179
|
+
responsePayload = await this.streamSendMessage(request.payload);
|
|
180
|
+
break;
|
|
181
|
+
case "get_rtc_stats":
|
|
182
|
+
responsePayload = await this.streamGetRtcStats();
|
|
183
|
+
break;
|
|
184
|
+
case "get_session_usage":
|
|
185
|
+
responsePayload = await this.streamGetSessionUsage();
|
|
186
|
+
break;
|
|
187
|
+
default:
|
|
188
|
+
error = `Unknown method: ${request.method}`;
|
|
189
|
+
}
|
|
190
|
+
} catch (e) {
|
|
191
|
+
error = e instanceof Error ? e.message : String(e);
|
|
192
|
+
}
|
|
193
|
+
const response = {
|
|
194
|
+
request_id: request.request_id,
|
|
195
|
+
payload: responsePayload,
|
|
196
|
+
error
|
|
197
|
+
};
|
|
198
|
+
const localParticipant = this.room.localParticipant;
|
|
199
|
+
await localParticipant.sendText(JSON.stringify(response), {
|
|
200
|
+
topic: import_constants.TOPIC_AGENT_RESPONSE,
|
|
201
|
+
destinationIdentities: [participantIdentity]
|
|
202
|
+
});
|
|
203
|
+
} catch (e) {
|
|
204
|
+
this.logger.warn({ error: e }, "failed to handle stream request");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async streamGetSessionState() {
|
|
208
|
+
const agent = this.session.currentAgent;
|
|
209
|
+
const response = {
|
|
210
|
+
agent_state: this.session.agentState,
|
|
211
|
+
user_state: this.session.userState,
|
|
212
|
+
agent_id: agent.id,
|
|
213
|
+
options: serializeOptions({
|
|
214
|
+
turnHandling: this.session.options.turnHandling,
|
|
215
|
+
maxToolSteps: this.session.options.maxToolSteps,
|
|
216
|
+
userAwayTimeout: this.session.options.userAwayTimeout,
|
|
217
|
+
preemptiveGeneration: this.session.options.preemptiveGeneration,
|
|
218
|
+
useTtsAlignedTranscript: this.session.options.useTtsAlignedTranscript
|
|
219
|
+
}),
|
|
220
|
+
created_at: (0, import_wire_format.msToS)(this.session._startedAt ?? Date.now())
|
|
221
|
+
};
|
|
222
|
+
return JSON.stringify(response);
|
|
223
|
+
}
|
|
224
|
+
async streamGetChatHistory() {
|
|
225
|
+
return JSON.stringify({
|
|
226
|
+
items: this.session.history.items.map(import_wire_format.chatItemToWire)
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async streamGetAgentInfo() {
|
|
230
|
+
const agent = this.session.currentAgent;
|
|
231
|
+
return JSON.stringify({
|
|
232
|
+
id: agent.id,
|
|
233
|
+
instructions: agent.instructions,
|
|
234
|
+
tools: toolNames(agent.toolCtx),
|
|
235
|
+
chat_ctx: agent.chatCtx.items.map(import_wire_format.chatItemToWire)
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
async streamSendMessage(payload) {
|
|
239
|
+
const request = import_wire_format.sendMessageRequestSchema.parse(JSON.parse(payload));
|
|
240
|
+
const runResult = this.session.run({ userInput: request.text });
|
|
241
|
+
await runResult.wait();
|
|
242
|
+
return JSON.stringify({
|
|
243
|
+
items: runResult.events.map((ev) => (0, import_wire_format.chatItemToWire)(ev.item))
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async streamGetRtcStats() {
|
|
247
|
+
return JSON.stringify({
|
|
248
|
+
publisher_stats: [],
|
|
249
|
+
subscriber_stats: []
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
async streamGetSessionUsage() {
|
|
253
|
+
return JSON.stringify({
|
|
254
|
+
usage: (0, import_wire_format.agentSessionUsageToWire)(this.session.usage),
|
|
255
|
+
created_at: (0, import_wire_format.msToS)(Date.now())
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
onUserOverlapSpeech = (event) => {
|
|
259
|
+
const clientEvent = {
|
|
260
|
+
type: "user_overlapping_speech",
|
|
261
|
+
is_interruption: event.isInterruption,
|
|
262
|
+
created_at: (0, import_wire_format.msToS)(event.timestamp),
|
|
263
|
+
overlap_started_at: event.overlapStartedAt != null ? (0, import_wire_format.msToS)(event.overlapStartedAt) : null,
|
|
264
|
+
detection_delay: event.detectionDelayInS,
|
|
265
|
+
sent_at: (0, import_wire_format.msToS)(Date.now())
|
|
266
|
+
};
|
|
267
|
+
this.streamClientEvent(clientEvent);
|
|
268
|
+
};
|
|
269
|
+
onAgentStateChanged = (event) => {
|
|
270
|
+
const clientEvent = {
|
|
271
|
+
type: "agent_state_changed",
|
|
272
|
+
old_state: event.oldState,
|
|
273
|
+
new_state: event.newState,
|
|
274
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
275
|
+
};
|
|
276
|
+
this.streamClientEvent(clientEvent);
|
|
277
|
+
};
|
|
278
|
+
onUserStateChanged = (event) => {
|
|
279
|
+
const clientEvent = {
|
|
280
|
+
type: "user_state_changed",
|
|
281
|
+
old_state: event.oldState,
|
|
282
|
+
new_state: event.newState,
|
|
283
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
284
|
+
};
|
|
285
|
+
this.streamClientEvent(clientEvent);
|
|
286
|
+
};
|
|
287
|
+
onConversationItemAdded = (event) => {
|
|
288
|
+
if (event.item.type !== "message") {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
this.streamClientEvent({
|
|
292
|
+
type: "conversation_item_added",
|
|
293
|
+
item: (0, import_wire_format.chatMessageToWire)(event.item),
|
|
294
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
onUserInputTranscribed = (event) => {
|
|
298
|
+
this.streamClientEvent({
|
|
299
|
+
type: "user_input_transcribed",
|
|
300
|
+
transcript: event.transcript,
|
|
301
|
+
is_final: event.isFinal,
|
|
302
|
+
language: event.language,
|
|
303
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
304
|
+
});
|
|
305
|
+
};
|
|
306
|
+
onFunctionToolsExecuted = (event) => {
|
|
307
|
+
this.streamClientEvent({
|
|
308
|
+
type: "function_tools_executed",
|
|
309
|
+
function_calls: event.functionCalls.map(
|
|
310
|
+
import_wire_format.functionCallToWire
|
|
311
|
+
),
|
|
312
|
+
function_call_outputs: event.functionCallOutputs.map(
|
|
313
|
+
(o) => o ? (0, import_wire_format.functionCallOutputToWire)(o) : null
|
|
314
|
+
),
|
|
315
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
onMetricsCollected = (event) => {
|
|
319
|
+
this.streamClientEvent({
|
|
320
|
+
type: "metrics_collected",
|
|
321
|
+
metrics: (0, import_wire_format.agentMetricsToWire)(event.metrics),
|
|
322
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
323
|
+
});
|
|
324
|
+
this.streamClientEvent({
|
|
325
|
+
type: "session_usage",
|
|
326
|
+
usage: (0, import_wire_format.agentSessionUsageToWire)(this.session.usage),
|
|
327
|
+
created_at: (0, import_wire_format.msToS)(Date.now())
|
|
328
|
+
});
|
|
329
|
+
};
|
|
330
|
+
onError = (event) => {
|
|
331
|
+
const clientEvent = {
|
|
332
|
+
type: "error",
|
|
333
|
+
message: event.error ? String(event.error) : "Unknown error",
|
|
334
|
+
created_at: (0, import_wire_format.msToS)(event.createdAt)
|
|
335
|
+
};
|
|
336
|
+
this.streamClientEvent(clientEvent);
|
|
337
|
+
};
|
|
338
|
+
getTargetIdentities() {
|
|
339
|
+
const linked = this.roomIO.linkedParticipant;
|
|
340
|
+
return linked ? [linked.identity] : null;
|
|
341
|
+
}
|
|
342
|
+
streamClientEvent(event) {
|
|
343
|
+
const task = import_utils.Task.from(async () => this.sendClientEvent(event));
|
|
344
|
+
this.trackTask(task);
|
|
345
|
+
}
|
|
346
|
+
async sendClientEvent(event) {
|
|
347
|
+
if (!this.room.isConnected) return;
|
|
348
|
+
const destinationIdentities = this.getTargetIdentities();
|
|
349
|
+
if (!destinationIdentities) return;
|
|
350
|
+
try {
|
|
351
|
+
const localParticipant = this.room.localParticipant;
|
|
352
|
+
if (!localParticipant) return;
|
|
353
|
+
const writer = await localParticipant.streamText({
|
|
354
|
+
topic: import_constants.TOPIC_CLIENT_EVENTS,
|
|
355
|
+
destinationIdentities
|
|
356
|
+
});
|
|
357
|
+
await writer.write(JSON.stringify(event));
|
|
358
|
+
await writer.close();
|
|
359
|
+
} catch (e) {
|
|
360
|
+
this.logger.warn({ error: e }, "failed to stream event to clients");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
rpcGetSessionState = async () => {
|
|
364
|
+
return this.streamGetSessionState();
|
|
365
|
+
};
|
|
366
|
+
rpcGetChatHistory = async () => {
|
|
367
|
+
return this.streamGetChatHistory();
|
|
368
|
+
};
|
|
369
|
+
rpcGetAgentInfo = async () => {
|
|
370
|
+
return this.streamGetAgentInfo();
|
|
371
|
+
};
|
|
372
|
+
rpcSendMessage = async (data) => {
|
|
373
|
+
return this.streamSendMessage(data.payload);
|
|
374
|
+
};
|
|
375
|
+
onUserTextInput = (reader, participantInfo) => {
|
|
376
|
+
const linkedParticipant = this.roomIO.linkedParticipant;
|
|
377
|
+
if (linkedParticipant && participantInfo.identity !== linkedParticipant.identity) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const participant = this.room.remoteParticipants.get(participantInfo.identity);
|
|
381
|
+
if (!participant) {
|
|
382
|
+
this.logger.warn("participant not found, ignoring text input");
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if (!this.textInputCb) {
|
|
386
|
+
this.logger.error("text input callback is not set, ignoring text input");
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const task = import_utils.Task.from(async () => {
|
|
390
|
+
const text = await reader.readAll();
|
|
391
|
+
const result = this.textInputCb(this.session, {
|
|
392
|
+
text,
|
|
393
|
+
info: reader.info,
|
|
394
|
+
participantIdentity: participantInfo.identity
|
|
395
|
+
});
|
|
396
|
+
if (result instanceof Promise) {
|
|
397
|
+
await result;
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
this.trackTask(task);
|
|
401
|
+
};
|
|
402
|
+
trackTask(task) {
|
|
403
|
+
this.tasks.add(task);
|
|
404
|
+
task.addDoneCallback(() => {
|
|
405
|
+
this.tasks.delete(task);
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
class RemoteSession extends import_events.default {
|
|
410
|
+
room;
|
|
411
|
+
agentIdentity;
|
|
412
|
+
started = false;
|
|
413
|
+
tasks = /* @__PURE__ */ new Set();
|
|
414
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
415
|
+
logger = (0, import_log.log)();
|
|
416
|
+
constructor(room, agentIdentity) {
|
|
417
|
+
super();
|
|
418
|
+
this.room = room;
|
|
419
|
+
this.agentIdentity = agentIdentity;
|
|
420
|
+
}
|
|
421
|
+
async start() {
|
|
422
|
+
if (this.started) return;
|
|
423
|
+
this.started = true;
|
|
424
|
+
this.room.registerTextStreamHandler(import_constants.TOPIC_CLIENT_EVENTS, this.onEventStream);
|
|
425
|
+
this.room.registerTextStreamHandler(import_constants.TOPIC_AGENT_RESPONSE, this.onResponseStream);
|
|
426
|
+
}
|
|
427
|
+
async close() {
|
|
428
|
+
if (!this.started) return;
|
|
429
|
+
this.started = false;
|
|
430
|
+
this.room.unregisterTextStreamHandler(import_constants.TOPIC_CLIENT_EVENTS);
|
|
431
|
+
this.room.unregisterTextStreamHandler(import_constants.TOPIC_AGENT_RESPONSE);
|
|
432
|
+
for (const pending of this.pendingRequests.values()) {
|
|
433
|
+
pending.reject(new Error("RemoteSession closed"));
|
|
434
|
+
}
|
|
435
|
+
this.pendingRequests.clear();
|
|
436
|
+
await (0, import_utils.cancelAndWait)([...this.tasks]);
|
|
437
|
+
this.tasks.clear();
|
|
438
|
+
}
|
|
439
|
+
onEventStream = (reader, participantInfo) => {
|
|
440
|
+
if (participantInfo.identity !== this.agentIdentity) return;
|
|
441
|
+
this.trackTask(import_utils.Task.from(async () => this.readEvent(reader)));
|
|
442
|
+
};
|
|
443
|
+
onResponseStream = (reader, participantInfo) => {
|
|
444
|
+
if (participantInfo.identity !== this.agentIdentity) return;
|
|
445
|
+
this.trackTask(import_utils.Task.from(async () => this.readResponse(reader)));
|
|
446
|
+
};
|
|
447
|
+
async readResponse(reader) {
|
|
448
|
+
try {
|
|
449
|
+
const data = await reader.readAll();
|
|
450
|
+
const response = import_wire_format.streamResponseSchema.parse(JSON.parse(data));
|
|
451
|
+
const future = this.pendingRequests.get(response.request_id);
|
|
452
|
+
this.pendingRequests.delete(response.request_id);
|
|
453
|
+
if (!future || future.done) return;
|
|
454
|
+
future.resolve(response);
|
|
455
|
+
} catch (e) {
|
|
456
|
+
this.logger.warn({ error: e }, "failed to read stream response");
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
async readEvent(reader) {
|
|
460
|
+
try {
|
|
461
|
+
const data = await reader.readAll();
|
|
462
|
+
const event = this.parseEvent(data);
|
|
463
|
+
if (event) {
|
|
464
|
+
this.emit(event.type, event);
|
|
465
|
+
}
|
|
466
|
+
} catch (e) {
|
|
467
|
+
this.logger.warn({ error: e }, "failed to parse client event");
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
parseEvent(data) {
|
|
471
|
+
try {
|
|
472
|
+
const result = import_wire_format.clientEventSchema.safeParse(JSON.parse(data));
|
|
473
|
+
if (!result.success) {
|
|
474
|
+
this.logger.warn({ error: result.error }, "failed to validate event");
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
return result.data;
|
|
478
|
+
} catch (e) {
|
|
479
|
+
this.logger.warn({ error: e }, "failed to parse event");
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
async sendRequest(method, payload, timeout = 6e4) {
|
|
484
|
+
const requestId = (0, import_utils.shortuuid)("req_");
|
|
485
|
+
const request = {
|
|
486
|
+
request_id: requestId,
|
|
487
|
+
method,
|
|
488
|
+
payload
|
|
489
|
+
};
|
|
490
|
+
const future = new import_utils.Future();
|
|
491
|
+
this.pendingRequests.set(requestId, future);
|
|
492
|
+
const localParticipant = this.room.localParticipant;
|
|
493
|
+
if (!localParticipant) {
|
|
494
|
+
this.pendingRequests.delete(requestId);
|
|
495
|
+
throw new Error("RemoteSession room has no local participant");
|
|
496
|
+
}
|
|
497
|
+
await localParticipant.sendText(JSON.stringify(request), {
|
|
498
|
+
topic: import_constants.TOPIC_AGENT_REQUEST,
|
|
499
|
+
destinationIdentities: [this.agentIdentity]
|
|
500
|
+
});
|
|
501
|
+
const timer = setTimeout(() => {
|
|
502
|
+
if (!future.done) {
|
|
503
|
+
this.pendingRequests.delete(requestId);
|
|
504
|
+
future.reject(new Error(`RemoteSession request timed out: ${method}`));
|
|
505
|
+
}
|
|
506
|
+
}, timeout);
|
|
507
|
+
try {
|
|
508
|
+
const response = await future.await;
|
|
509
|
+
if (response.error) {
|
|
510
|
+
throw new Error(response.error);
|
|
511
|
+
}
|
|
512
|
+
return response.payload;
|
|
513
|
+
} finally {
|
|
514
|
+
clearTimeout(timer);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
async fetchSessionState() {
|
|
518
|
+
const raw = JSON.parse(await this.sendRequest("get_session_state", "{}"));
|
|
519
|
+
return import_wire_format.getSessionStateResponseSchema.parse(raw);
|
|
520
|
+
}
|
|
521
|
+
async fetchChatHistory() {
|
|
522
|
+
const raw = JSON.parse(await this.sendRequest("get_chat_history", "{}"));
|
|
523
|
+
return import_wire_format.getChatHistoryResponseSchema.parse(raw);
|
|
524
|
+
}
|
|
525
|
+
async fetchAgentInfo() {
|
|
526
|
+
const raw = JSON.parse(await this.sendRequest("get_agent_info", "{}"));
|
|
527
|
+
return import_wire_format.getAgentInfoResponseSchema.parse(raw);
|
|
528
|
+
}
|
|
529
|
+
async sendMessage(text, responseTimeout = 6e4) {
|
|
530
|
+
const payload = JSON.stringify({ text });
|
|
531
|
+
const raw = JSON.parse(await this.sendRequest("send_message", payload, responseTimeout));
|
|
532
|
+
return import_wire_format.sendMessageResponseSchema.parse(raw);
|
|
533
|
+
}
|
|
534
|
+
async fetchRtcStats() {
|
|
535
|
+
const raw = JSON.parse(await this.sendRequest("get_rtc_stats", "{}"));
|
|
536
|
+
return import_wire_format.getRTCStatsResponseSchema.parse(raw);
|
|
537
|
+
}
|
|
538
|
+
async fetchSessionUsage() {
|
|
539
|
+
const raw = JSON.parse(await this.sendRequest("get_session_usage", "{}"));
|
|
540
|
+
return import_wire_format.getSessionUsageResponseSchema.parse(raw);
|
|
541
|
+
}
|
|
542
|
+
trackTask(task) {
|
|
543
|
+
this.tasks.add(task);
|
|
544
|
+
task.addDoneCallback(() => {
|
|
545
|
+
this.tasks.delete(task);
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
550
|
+
0 && (module.exports = {
|
|
551
|
+
ClientEventsHandler,
|
|
552
|
+
RemoteSession
|
|
553
|
+
});
|
|
554
|
+
//# sourceMappingURL=client_events.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/voice/client_events.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { Room, RpcInvocationData, TextStreamInfo, TextStreamReader } from '@livekit/rtc-node';\nimport type { TypedEventEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport type { z } from 'zod';\nimport {\n RPC_GET_AGENT_INFO,\n RPC_GET_CHAT_HISTORY,\n RPC_GET_SESSION_STATE,\n RPC_SEND_MESSAGE,\n TOPIC_AGENT_REQUEST,\n TOPIC_AGENT_RESPONSE,\n TOPIC_CHAT,\n TOPIC_CLIENT_EVENTS,\n} from '../constants.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport type { ToolContext } from '../llm/tool_context.js';\nimport { log } from '../log.js';\nimport { Future, Task, cancelAndWait, shortuuid } from '../utils.js';\nimport type { AgentSession } from './agent_session.js';\nimport {\n AgentSessionEventTypes,\n type AgentStateChangedEvent,\n type ConversationItemAddedEvent,\n type ErrorEvent,\n type FunctionToolsExecutedEvent,\n type MetricsCollectedEvent,\n type UserInputTranscribedEvent,\n type UserStateChangedEvent,\n} from './events.js';\nimport type { RoomIO } from './room_io/room_io.js';\nimport {\n agentMetricsToWire,\n agentSessionUsageToWire,\n chatItemToWire,\n chatMessageToWire,\n type clientAgentStateChangedSchema,\n type clientConversationItemAddedSchema,\n type clientErrorSchema,\n clientEventSchema,\n type clientFunctionToolsExecutedSchema,\n type clientMetricsCollectedSchema,\n type clientSessionUsageSchema,\n type clientUserInputTranscribedSchema,\n type clientUserOverlappingSpeechSchema,\n type clientUserStateChangedSchema,\n functionCallOutputToWire,\n functionCallToWire,\n getAgentInfoResponseSchema,\n getChatHistoryResponseSchema,\n getRTCStatsResponseSchema,\n getSessionStateResponseSchema,\n getSessionUsageResponseSchema,\n msToS,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n streamRequestSchema,\n streamResponseSchema,\n} from './wire_format.js';\n\n/** @experimental */\nexport type ClientAgentStateChangedEvent = z.infer<typeof clientAgentStateChangedSchema>;\n\n/** @experimental */\nexport type ClientUserStateChangedEvent = z.infer<typeof clientUserStateChangedSchema>;\n\n/** @experimental */\nexport type ClientConversationItemAddedEvent = z.infer<typeof clientConversationItemAddedSchema>;\n\n/** @experimental */\nexport type ClientUserInputTranscribedEvent = z.infer<typeof clientUserInputTranscribedSchema>;\n\n/** @experimental */\nexport type ClientFunctionToolsExecutedEvent = z.infer<typeof clientFunctionToolsExecutedSchema>;\n\n/** @experimental */\nexport type ClientMetricsCollectedEvent = z.infer<typeof clientMetricsCollectedSchema>;\n\n/** @experimental */\nexport type ClientErrorEvent = z.infer<typeof clientErrorSchema>;\n\n/** @experimental */\nexport type ClientUserOverlappingSpeechEvent = z.infer<typeof clientUserOverlappingSpeechSchema>;\n\n/** @experimental */\nexport type ClientSessionUsageEvent = z.infer<typeof clientSessionUsageSchema>;\n\n/** @experimental */\nexport type ClientEvent = z.infer<typeof clientEventSchema>;\n\n/** @experimental */\nexport type ClientEventType = ClientEvent['type'];\n\n/** @experimental */\nexport type StreamRequest = z.infer<typeof streamRequestSchema>;\n\n/** @experimental */\nexport type StreamResponse = z.infer<typeof streamResponseSchema>;\n\n/** @experimental */\nexport type GetSessionStateRequest = Record<string, never>;\n\n/** @experimental */\nexport type GetSessionStateResponse = z.infer<typeof getSessionStateResponseSchema>;\n\n/** @experimental */\nexport type GetChatHistoryRequest = Record<string, never>;\n\n/** @experimental */\nexport type GetChatHistoryResponse = z.infer<typeof getChatHistoryResponseSchema>;\n\n/** @experimental */\nexport type GetAgentInfoRequest = Record<string, never>;\n\n/** @experimental */\nexport type GetAgentInfoResponse = z.infer<typeof getAgentInfoResponseSchema>;\n\n/** @experimental */\nexport type SendMessageRequest = z.infer<typeof sendMessageRequestSchema>;\n\n/** @experimental */\nexport type SendMessageResponse = z.infer<typeof sendMessageResponseSchema>;\n\n/** @experimental */\nexport type GetRTCStatsRequest = Record<string, never>;\n\n/** @experimental */\nexport type GetRTCStatsResponse = z.infer<typeof getRTCStatsResponseSchema>;\n\n/** @experimental */\nexport type GetSessionUsageRequest = Record<string, never>;\n\n/** @experimental */\nexport type GetSessionUsageResponse = z.infer<typeof getSessionUsageResponseSchema>;\n\nfunction serializeOptions(opts: {\n turnHandling?: {\n endpointing?: unknown;\n interruption?: unknown;\n };\n maxToolSteps?: number;\n userAwayTimeout?: number | null;\n preemptiveGeneration?: boolean;\n useTtsAlignedTranscript?: boolean;\n}): Record<string, unknown> {\n return {\n endpointing: opts.turnHandling?.endpointing ?? {},\n interruption: opts.turnHandling?.interruption ?? {},\n max_tool_steps: opts.maxToolSteps,\n user_away_timeout: opts.userAwayTimeout,\n preemptive_generation: opts.preemptiveGeneration,\n use_tts_aligned_transcript: opts.useTtsAlignedTranscript,\n };\n}\n\nfunction toolNames(toolCtx: ToolContext | undefined): string[] {\n if (!toolCtx) return [];\n return Object.keys(toolCtx);\n}\n\n/** @experimental */\nexport type RemoteSessionEventTypes =\n | 'agent_state_changed'\n | 'user_state_changed'\n | 'conversation_item_added'\n | 'user_input_transcribed'\n | 'function_tools_executed'\n | 'metrics_collected'\n | 'user_overlapping_speech'\n | 'session_usage'\n | 'error';\n\n/** @experimental */\nexport type RemoteSessionCallbacks = {\n agent_state_changed: (ev: ClientAgentStateChangedEvent) => void;\n user_state_changed: (ev: ClientUserStateChangedEvent) => void;\n conversation_item_added: (ev: ClientConversationItemAddedEvent) => void;\n user_input_transcribed: (ev: ClientUserInputTranscribedEvent) => void;\n function_tools_executed: (ev: ClientFunctionToolsExecutedEvent) => void;\n metrics_collected: (ev: ClientMetricsCollectedEvent) => void;\n user_overlapping_speech: (ev: ClientUserOverlappingSpeechEvent) => void;\n session_usage: (ev: ClientSessionUsageEvent) => void;\n error: (ev: ClientErrorEvent) => void;\n};\n\nexport interface TextInputEvent {\n text: string;\n info: TextStreamInfo;\n participantIdentity: string;\n}\n\nexport type TextInputCallback = (session: AgentSession, ev: TextInputEvent) => void | Promise<void>;\n\n/**\n * Handles exposing AgentSession state to room participants and allows interaction.\n *\n * This class provides:\n * - Event streaming: Automatically streams AgentSession events to clients via a text stream\n * - RPC handlers: Allows clients to request state, chat history, and agent info on demand\n * - Text input handling: Receives text messages from clients and generates agent replies\n */\n\n/** @experimental */\nexport class ClientEventsHandler {\n private readonly session: AgentSession;\n private readonly roomIO: RoomIO;\n\n private textInputCb?: TextInputCallback;\n private textStreamHandlerRegistered = false;\n private rpcHandlersRegistered = false;\n private requestHandlerRegistered = false;\n private eventHandlersRegistered = false;\n private started = false;\n\n private readonly tasks = new Set<Task<void>>();\n private readonly logger = log();\n\n constructor(session: AgentSession, roomIO: RoomIO) {\n this.session = session;\n this.roomIO = roomIO;\n }\n\n private get room(): Room {\n return this.roomIO.rtcRoom;\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n\n this.started = true;\n this.registerRpcHandlers();\n this.registerRequestHandler();\n this.registerEventHandlers();\n }\n\n async close(): Promise<void> {\n if (!this.started) return;\n this.started = false;\n\n if (this.textStreamHandlerRegistered) {\n this.room.unregisterTextStreamHandler(TOPIC_CHAT);\n this.textStreamHandlerRegistered = false;\n }\n\n if (this.rpcHandlersRegistered) {\n const localParticipant = this.room.localParticipant;\n if (localParticipant) {\n localParticipant.unregisterRpcMethod(RPC_GET_SESSION_STATE);\n localParticipant.unregisterRpcMethod(RPC_GET_CHAT_HISTORY);\n localParticipant.unregisterRpcMethod(RPC_GET_AGENT_INFO);\n localParticipant.unregisterRpcMethod(RPC_SEND_MESSAGE);\n }\n this.rpcHandlersRegistered = false;\n }\n\n if (this.requestHandlerRegistered) {\n this.room.unregisterTextStreamHandler(TOPIC_AGENT_REQUEST);\n this.requestHandlerRegistered = false;\n }\n\n if (this.eventHandlersRegistered) {\n this.session.off(AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);\n this.session.off(AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);\n this.session.off(AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);\n this.session.off(AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);\n this.session.off(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);\n this.session.off(AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);\n this.session.off(AgentSessionEventTypes.UserOverlappingSpeech, this.onUserOverlapSpeech);\n this.session.off(AgentSessionEventTypes.Error, this.onError);\n this.eventHandlersRegistered = false;\n }\n\n await cancelAndWait([...this.tasks]);\n this.tasks.clear();\n }\n\n /**\n * Registers a callback to handle text input from clients.\n *\n * This callback will be called when a client sends a text message to the agent.\n * The callback should return a promise that resolves when the text input has been processed.\n *\n * @param textInputCb - The callback to handle text input.\n */\n registerTextInput(textInputCb: TextInputCallback): void {\n this.textInputCb = textInputCb;\n if (this.textStreamHandlerRegistered) return;\n this.room.registerTextStreamHandler(TOPIC_CHAT, this.onUserTextInput);\n this.textStreamHandlerRegistered = true;\n }\n\n private registerRpcHandlers(): void {\n if (this.rpcHandlersRegistered) return;\n\n const localParticipant = this.room.localParticipant;\n if (!localParticipant) return;\n\n localParticipant.registerRpcMethod(RPC_GET_SESSION_STATE, this.rpcGetSessionState);\n localParticipant.registerRpcMethod(RPC_GET_CHAT_HISTORY, this.rpcGetChatHistory);\n localParticipant.registerRpcMethod(RPC_GET_AGENT_INFO, this.rpcGetAgentInfo);\n localParticipant.registerRpcMethod(RPC_SEND_MESSAGE, this.rpcSendMessage);\n this.rpcHandlersRegistered = true;\n }\n\n private registerRequestHandler(): void {\n if (this.requestHandlerRegistered) return;\n\n this.room.registerTextStreamHandler(TOPIC_AGENT_REQUEST, this.onStreamRequest);\n this.requestHandlerRegistered = true;\n }\n\n private registerEventHandlers(): void {\n if (this.eventHandlersRegistered) return;\n\n this.session.on(AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);\n this.session.on(AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);\n this.session.on(AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);\n this.session.on(AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);\n this.session.on(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);\n this.session.on(AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);\n this.session.on(AgentSessionEventTypes.UserOverlappingSpeech, this.onUserOverlapSpeech);\n this.session.on(AgentSessionEventTypes.Error, this.onError);\n this.eventHandlersRegistered = true;\n }\n\n private onStreamRequest = (\n reader: TextStreamReader,\n participantInfo: { identity: string },\n ): void => {\n const task = Task.from(async () => this.handleStreamRequest(reader, participantInfo.identity));\n this.trackTask(task);\n };\n\n private async handleStreamRequest(\n reader: TextStreamReader,\n participantIdentity: string,\n ): Promise<void> {\n try {\n const data = await reader.readAll();\n const request = streamRequestSchema.parse(JSON.parse(data));\n\n let responsePayload = '';\n let error: string | null = null;\n\n try {\n switch (request.method) {\n case 'get_session_state':\n responsePayload = await this.streamGetSessionState();\n break;\n case 'get_chat_history':\n responsePayload = await this.streamGetChatHistory();\n break;\n case 'get_agent_info':\n responsePayload = await this.streamGetAgentInfo();\n break;\n case 'send_message':\n responsePayload = await this.streamSendMessage(request.payload);\n break;\n case 'get_rtc_stats':\n responsePayload = await this.streamGetRtcStats();\n break;\n case 'get_session_usage':\n responsePayload = await this.streamGetSessionUsage();\n break;\n default:\n error = `Unknown method: ${request.method}`;\n }\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n\n const response: StreamResponse = {\n request_id: request.request_id,\n payload: responsePayload,\n error,\n };\n\n const localParticipant = this.room.localParticipant;\n await localParticipant!.sendText(JSON.stringify(response), {\n topic: TOPIC_AGENT_RESPONSE,\n destinationIdentities: [participantIdentity],\n });\n } catch (e) {\n this.logger.warn({ error: e }, 'failed to handle stream request');\n }\n }\n\n private async streamGetSessionState(): Promise<string> {\n const agent = this.session.currentAgent;\n\n const response: GetSessionStateResponse = {\n agent_state: this.session.agentState,\n user_state: this.session.userState,\n agent_id: agent.id,\n options: serializeOptions({\n turnHandling: this.session.options.turnHandling,\n maxToolSteps: this.session.options.maxToolSteps,\n userAwayTimeout: this.session.options.userAwayTimeout,\n preemptiveGeneration: this.session.options.preemptiveGeneration,\n useTtsAlignedTranscript: this.session.options.useTtsAlignedTranscript,\n }),\n created_at: msToS(this.session._startedAt ?? Date.now()),\n };\n return JSON.stringify(response);\n }\n\n private async streamGetChatHistory(): Promise<string> {\n return JSON.stringify({\n items: this.session.history.items.map(chatItemToWire),\n });\n }\n\n private async streamGetAgentInfo(): Promise<string> {\n const agent = this.session.currentAgent;\n return JSON.stringify({\n id: agent.id,\n instructions: agent.instructions,\n tools: toolNames(agent.toolCtx),\n chat_ctx: agent.chatCtx.items.map(chatItemToWire),\n });\n }\n\n private async streamSendMessage(payload: string): Promise<string> {\n const request = sendMessageRequestSchema.parse(JSON.parse(payload));\n const runResult = this.session.run({ userInput: request.text });\n await runResult.wait();\n return JSON.stringify({\n items: runResult.events.map((ev) => chatItemToWire(ev.item)),\n });\n }\n\n private async streamGetRtcStats(): Promise<string> {\n // TODO(parity): map rtc stats fields once getRtcStats API shape is finalized in rtc-node.\n return JSON.stringify({\n publisher_stats: [],\n subscriber_stats: [],\n });\n }\n\n private async streamGetSessionUsage(): Promise<string> {\n return JSON.stringify({\n usage: agentSessionUsageToWire(this.session.usage),\n created_at: msToS(Date.now()),\n });\n }\n\n private onUserOverlapSpeech = (event: OverlappingSpeechEvent): void => {\n const clientEvent: ClientUserOverlappingSpeechEvent = {\n type: 'user_overlapping_speech',\n is_interruption: event.isInterruption,\n created_at: msToS(event.timestamp),\n overlap_started_at: event.overlapStartedAt != null ? msToS(event.overlapStartedAt) : null,\n detection_delay: event.detectionDelayInS,\n sent_at: msToS(Date.now()),\n };\n this.streamClientEvent(clientEvent);\n };\n\n private onAgentStateChanged = (event: AgentStateChangedEvent): void => {\n const clientEvent: ClientAgentStateChangedEvent = {\n type: 'agent_state_changed',\n old_state: event.oldState,\n new_state: event.newState,\n created_at: msToS(event.createdAt),\n };\n this.streamClientEvent(clientEvent);\n };\n\n private onUserStateChanged = (event: UserStateChangedEvent): void => {\n const clientEvent: ClientUserStateChangedEvent = {\n type: 'user_state_changed',\n old_state: event.oldState,\n new_state: event.newState,\n created_at: msToS(event.createdAt),\n };\n this.streamClientEvent(clientEvent);\n };\n\n private onConversationItemAdded = (event: ConversationItemAddedEvent): void => {\n if (event.item.type !== 'message') {\n return;\n }\n this.streamClientEvent({\n type: 'conversation_item_added',\n item: chatMessageToWire(event.item) as ClientConversationItemAddedEvent['item'],\n created_at: msToS(event.createdAt),\n });\n };\n\n private onUserInputTranscribed = (event: UserInputTranscribedEvent): void => {\n this.streamClientEvent({\n type: 'user_input_transcribed',\n transcript: event.transcript,\n is_final: event.isFinal,\n language: event.language,\n created_at: msToS(event.createdAt),\n });\n };\n\n private onFunctionToolsExecuted = (event: FunctionToolsExecutedEvent): void => {\n this.streamClientEvent({\n type: 'function_tools_executed',\n function_calls: event.functionCalls.map(\n functionCallToWire,\n ) as ClientFunctionToolsExecutedEvent['function_calls'],\n function_call_outputs: event.functionCallOutputs.map((o) =>\n o\n ? (functionCallOutputToWire(o) as NonNullable<\n ClientFunctionToolsExecutedEvent['function_call_outputs'][number]\n >)\n : null,\n ),\n created_at: msToS(event.createdAt),\n });\n };\n\n private onMetricsCollected = (event: MetricsCollectedEvent): void => {\n this.streamClientEvent({\n type: 'metrics_collected',\n metrics: agentMetricsToWire(event.metrics) as ClientMetricsCollectedEvent['metrics'],\n created_at: msToS(event.createdAt),\n });\n\n this.streamClientEvent({\n type: 'session_usage',\n usage: agentSessionUsageToWire(this.session.usage) as ClientSessionUsageEvent['usage'],\n created_at: msToS(Date.now()),\n });\n };\n\n private onError = (event: ErrorEvent): void => {\n const clientEvent: ClientErrorEvent = {\n type: 'error',\n message: event.error ? String(event.error) : 'Unknown error',\n created_at: msToS(event.createdAt),\n };\n this.streamClientEvent(clientEvent);\n };\n\n private getTargetIdentities(): string[] | null {\n const linked = this.roomIO.linkedParticipant;\n\n // TODO(permissions): check linked.permissions.can_subscribe_metrics\n return linked ? [linked.identity] : null;\n }\n\n private streamClientEvent(event: ClientEvent): void {\n const task = Task.from(async () => this.sendClientEvent(event));\n this.trackTask(task);\n }\n\n private async sendClientEvent(event: ClientEvent): Promise<void> {\n if (!this.room.isConnected) return;\n\n const destinationIdentities = this.getTargetIdentities();\n if (!destinationIdentities) return;\n\n try {\n const localParticipant = this.room.localParticipant;\n if (!localParticipant) return;\n\n const writer = await localParticipant.streamText({\n topic: TOPIC_CLIENT_EVENTS,\n destinationIdentities,\n });\n await writer.write(JSON.stringify(event));\n await writer.close();\n } catch (e) {\n this.logger.warn({ error: e }, 'failed to stream event to clients');\n }\n }\n\n private rpcGetSessionState = async (): Promise<string> => {\n return this.streamGetSessionState();\n };\n\n private rpcGetChatHistory = async (): Promise<string> => {\n return this.streamGetChatHistory();\n };\n\n private rpcGetAgentInfo = async (): Promise<string> => {\n return this.streamGetAgentInfo();\n };\n\n private rpcSendMessage = async (data: RpcInvocationData): Promise<string> => {\n return this.streamSendMessage(data.payload);\n };\n\n private onUserTextInput = (\n reader: TextStreamReader,\n participantInfo: { identity: string },\n ): void => {\n const linkedParticipant = this.roomIO.linkedParticipant;\n if (linkedParticipant && participantInfo.identity !== linkedParticipant.identity) {\n return;\n }\n\n const participant = this.room.remoteParticipants.get(participantInfo.identity);\n if (!participant) {\n this.logger.warn('participant not found, ignoring text input');\n return;\n }\n\n if (!this.textInputCb) {\n this.logger.error('text input callback is not set, ignoring text input');\n return;\n }\n\n const task = Task.from(async () => {\n const text = await reader.readAll();\n const result = this.textInputCb!(this.session, {\n text,\n info: reader.info,\n participantIdentity: participantInfo.identity,\n });\n\n if (result instanceof Promise) {\n await result;\n }\n });\n\n this.trackTask(task);\n };\n\n private trackTask(task: Task<void>): void {\n this.tasks.add(task);\n task.addDoneCallback(() => {\n this.tasks.delete(task);\n });\n }\n}\n\n/**\n * Client-side interface to interact with a remote AgentSession.\n *\n * This class allows frontends/clients to:\n * - Subscribe to real-time events from the agent session\n * - Query session state, chat history, and agent info via RPC\n * - Send messages to the agent\n *\n * Example:\n * ```typescript\n * const session = new RemoteSession(room, agentIdentity);\n * session.on('agent_state_changed', (event) => {\n * console.log('Agent state changed:', event.new_state);\n * });\n * session.on('user_state_changed', (event) => {\n * console.log('User state changed:', event.new_state);\n * });\n * session.on('conversation_item_added', (event) => {\n * console.log('Conversation item added:', event.item);\n * });\n * await session.start();\n *\n * const state = await session.fetchSessionState();\n * console.log('Session state:', state);\n *\n * const response = await session.sendMessage('Hello!');\n * console.log('Response:', response);\n * ```\n */\n// TODO: expose this class\n/** @experimental */\nexport class RemoteSession extends (EventEmitter as new () => TypedEventEmitter<RemoteSessionCallbacks>) {\n private readonly room: Room;\n private readonly agentIdentity: string;\n private started = false;\n\n private readonly tasks = new Set<Task<void>>();\n private readonly pendingRequests = new Map<string, Future<StreamResponse>>();\n private readonly logger = log();\n\n constructor(room: Room, agentIdentity: string) {\n super();\n this.room = room;\n this.agentIdentity = agentIdentity;\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n this.room.registerTextStreamHandler(TOPIC_CLIENT_EVENTS, this.onEventStream);\n this.room.registerTextStreamHandler(TOPIC_AGENT_RESPONSE, this.onResponseStream);\n }\n\n async close(): Promise<void> {\n if (!this.started) return;\n\n this.started = false;\n this.room.unregisterTextStreamHandler(TOPIC_CLIENT_EVENTS);\n this.room.unregisterTextStreamHandler(TOPIC_AGENT_RESPONSE);\n\n for (const pending of this.pendingRequests.values()) {\n pending.reject(new Error('RemoteSession closed'));\n }\n\n this.pendingRequests.clear();\n\n await cancelAndWait([...this.tasks]);\n this.tasks.clear();\n }\n\n private onEventStream = (\n reader: TextStreamReader,\n participantInfo: { identity: string },\n ): void => {\n if (participantInfo.identity !== this.agentIdentity) return;\n this.trackTask(Task.from(async () => this.readEvent(reader)));\n };\n\n private onResponseStream = (\n reader: TextStreamReader,\n participantInfo: { identity: string },\n ): void => {\n if (participantInfo.identity !== this.agentIdentity) return;\n this.trackTask(Task.from(async () => this.readResponse(reader)));\n };\n\n private async readResponse(reader: TextStreamReader): Promise<void> {\n try {\n const data = await reader.readAll();\n const response = streamResponseSchema.parse(JSON.parse(data));\n const future = this.pendingRequests.get(response.request_id);\n this.pendingRequests.delete(response.request_id);\n\n if (!future || future.done) return;\n future.resolve(response);\n } catch (e) {\n this.logger.warn({ error: e }, 'failed to read stream response');\n }\n }\n\n private async readEvent(reader: TextStreamReader): Promise<void> {\n try {\n const data = await reader.readAll();\n const event = this.parseEvent(data);\n if (event) {\n this.emit(event.type, event as never);\n }\n } catch (e) {\n this.logger.warn({ error: e }, 'failed to parse client event');\n }\n }\n\n private parseEvent(data: string): ClientEvent | null {\n try {\n const result = clientEventSchema.safeParse(JSON.parse(data));\n if (!result.success) {\n this.logger.warn({ error: result.error }, 'failed to validate event');\n return null;\n }\n return result.data;\n } catch (e) {\n this.logger.warn({ error: e }, 'failed to parse event');\n return null;\n }\n }\n\n private async sendRequest(method: string, payload: string, timeout = 60000): Promise<string> {\n const requestId = shortuuid('req_');\n const request: StreamRequest = {\n request_id: requestId,\n method,\n payload,\n };\n\n const future = new Future<StreamResponse>();\n this.pendingRequests.set(requestId, future);\n\n const localParticipant = this.room.localParticipant;\n if (!localParticipant) {\n this.pendingRequests.delete(requestId);\n throw new Error('RemoteSession room has no local participant');\n }\n\n await localParticipant.sendText(JSON.stringify(request), {\n topic: TOPIC_AGENT_REQUEST,\n destinationIdentities: [this.agentIdentity],\n });\n\n const timer = setTimeout(() => {\n if (!future.done) {\n this.pendingRequests.delete(requestId);\n future.reject(new Error(`RemoteSession request timed out: ${method}`));\n }\n }, timeout);\n\n try {\n const response = await future.await;\n if (response.error) {\n throw new Error(response.error);\n }\n return response.payload;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async fetchSessionState(): Promise<GetSessionStateResponse> {\n const raw = JSON.parse(await this.sendRequest('get_session_state', '{}'));\n return getSessionStateResponseSchema.parse(raw);\n }\n\n async fetchChatHistory(): Promise<GetChatHistoryResponse> {\n const raw = JSON.parse(await this.sendRequest('get_chat_history', '{}'));\n return getChatHistoryResponseSchema.parse(raw);\n }\n\n async fetchAgentInfo(): Promise<GetAgentInfoResponse> {\n const raw = JSON.parse(await this.sendRequest('get_agent_info', '{}'));\n return getAgentInfoResponseSchema.parse(raw);\n }\n\n async sendMessage(text: string, responseTimeout = 60000): Promise<SendMessageResponse> {\n const payload = JSON.stringify({ text } satisfies SendMessageRequest);\n const raw = JSON.parse(await this.sendRequest('send_message', payload, responseTimeout));\n return sendMessageResponseSchema.parse(raw);\n }\n\n async fetchRtcStats(): Promise<GetRTCStatsResponse> {\n const raw = JSON.parse(await this.sendRequest('get_rtc_stats', '{}'));\n return getRTCStatsResponseSchema.parse(raw);\n }\n\n async fetchSessionUsage(): Promise<GetSessionUsageResponse> {\n const raw = JSON.parse(await this.sendRequest('get_session_usage', '{}'));\n return getSessionUsageResponseSchema.parse(raw);\n }\n\n private trackTask(task: Task<void>): void {\n this.tasks.add(task);\n task.addDoneCallback(() => {\n this.tasks.delete(task);\n });\n }\n}\n"],"mappings":"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","names":["import_events","EventEmitter"]}
|