@livekit/agents 1.1.0-dev.0 → 1.2.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.
Files changed (292) hide show
  1. package/dist/cli.cjs +2 -0
  2. package/dist/cli.cjs.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +2 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/constants.cjs +3 -0
  7. package/dist/constants.cjs.map +1 -1
  8. package/dist/constants.d.cts +1 -0
  9. package/dist/constants.d.ts +1 -0
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +2 -0
  12. package/dist/constants.js.map +1 -1
  13. package/dist/cpu.cjs +189 -0
  14. package/dist/cpu.cjs.map +1 -0
  15. package/dist/cpu.d.cts +24 -0
  16. package/dist/cpu.d.ts +24 -0
  17. package/dist/cpu.d.ts.map +1 -0
  18. package/dist/cpu.js +152 -0
  19. package/dist/cpu.js.map +1 -0
  20. package/dist/cpu.test.cjs +227 -0
  21. package/dist/cpu.test.cjs.map +1 -0
  22. package/dist/cpu.test.js +204 -0
  23. package/dist/cpu.test.js.map +1 -0
  24. package/dist/index.cjs +12 -10
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +13 -13
  27. package/dist/index.d.ts +13 -13
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +11 -10
  30. package/dist/index.js.map +1 -1
  31. package/dist/inference/interruption/defaults.cjs +1 -1
  32. package/dist/inference/interruption/defaults.cjs.map +1 -1
  33. package/dist/inference/interruption/defaults.d.cts +1 -1
  34. package/dist/inference/interruption/defaults.d.ts +1 -1
  35. package/dist/inference/interruption/defaults.d.ts.map +1 -1
  36. package/dist/inference/interruption/defaults.js +1 -1
  37. package/dist/inference/interruption/defaults.js.map +1 -1
  38. package/dist/inference/interruption/http_transport.cjs +44 -28
  39. package/dist/inference/interruption/http_transport.cjs.map +1 -1
  40. package/dist/inference/interruption/http_transport.d.ts.map +1 -1
  41. package/dist/inference/interruption/http_transport.js +45 -29
  42. package/dist/inference/interruption/http_transport.js.map +1 -1
  43. package/dist/inference/interruption/interruption_detector.cjs +22 -5
  44. package/dist/inference/interruption/interruption_detector.cjs.map +1 -1
  45. package/dist/inference/interruption/interruption_detector.d.cts +2 -2
  46. package/dist/inference/interruption/interruption_detector.d.ts +2 -2
  47. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -1
  48. package/dist/inference/interruption/interruption_detector.js +22 -5
  49. package/dist/inference/interruption/interruption_detector.js.map +1 -1
  50. package/dist/inference/interruption/interruption_stream.cjs +4 -4
  51. package/dist/inference/interruption/interruption_stream.cjs.map +1 -1
  52. package/dist/inference/interruption/interruption_stream.js +4 -4
  53. package/dist/inference/interruption/interruption_stream.js.map +1 -1
  54. package/dist/inference/interruption/types.cjs.map +1 -1
  55. package/dist/inference/interruption/types.d.cts +2 -2
  56. package/dist/inference/interruption/types.d.ts +2 -2
  57. package/dist/inference/interruption/types.d.ts.map +1 -1
  58. package/dist/inference/interruption/ws_transport.cjs +60 -47
  59. package/dist/inference/interruption/ws_transport.cjs.map +1 -1
  60. package/dist/inference/interruption/ws_transport.d.ts.map +1 -1
  61. package/dist/inference/interruption/ws_transport.js +60 -47
  62. package/dist/inference/interruption/ws_transport.js.map +1 -1
  63. package/dist/inference/llm.cjs.map +1 -1
  64. package/dist/inference/llm.d.cts +1 -1
  65. package/dist/inference/llm.d.ts +1 -1
  66. package/dist/inference/llm.d.ts.map +1 -1
  67. package/dist/inference/llm.js.map +1 -1
  68. package/dist/inference/stt.cjs +20 -12
  69. package/dist/inference/stt.cjs.map +1 -1
  70. package/dist/inference/stt.d.cts +3 -2
  71. package/dist/inference/stt.d.ts +3 -2
  72. package/dist/inference/stt.d.ts.map +1 -1
  73. package/dist/inference/stt.js +20 -12
  74. package/dist/inference/stt.js.map +1 -1
  75. package/dist/inference/stt.test.cjs +14 -0
  76. package/dist/inference/stt.test.cjs.map +1 -1
  77. package/dist/inference/stt.test.js +14 -0
  78. package/dist/inference/stt.test.js.map +1 -1
  79. package/dist/inference/tts.cjs +13 -4
  80. package/dist/inference/tts.cjs.map +1 -1
  81. package/dist/inference/tts.d.cts +8 -1
  82. package/dist/inference/tts.d.ts +8 -1
  83. package/dist/inference/tts.d.ts.map +1 -1
  84. package/dist/inference/tts.js +13 -4
  85. package/dist/inference/tts.js.map +1 -1
  86. package/dist/inference/tts.test.cjs +10 -0
  87. package/dist/inference/tts.test.cjs.map +1 -1
  88. package/dist/inference/tts.test.js +10 -0
  89. package/dist/inference/tts.test.js.map +1 -1
  90. package/dist/ipc/job_proc_lazy_main.cjs +41 -23
  91. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  92. package/dist/ipc/job_proc_lazy_main.js +41 -23
  93. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  94. package/dist/job.cjs +1 -1
  95. package/dist/job.cjs.map +1 -1
  96. package/dist/job.js +1 -1
  97. package/dist/job.js.map +1 -1
  98. package/dist/language.cjs +394 -0
  99. package/dist/language.cjs.map +1 -0
  100. package/dist/language.d.cts +15 -0
  101. package/dist/language.d.ts +15 -0
  102. package/dist/language.d.ts.map +1 -0
  103. package/dist/language.js +363 -0
  104. package/dist/language.js.map +1 -0
  105. package/dist/language.test.cjs +43 -0
  106. package/dist/language.test.cjs.map +1 -0
  107. package/dist/language.test.js +49 -0
  108. package/dist/language.test.js.map +1 -0
  109. package/dist/llm/index.cjs +2 -0
  110. package/dist/llm/index.cjs.map +1 -1
  111. package/dist/llm/index.d.cts +1 -1
  112. package/dist/llm/index.d.ts +1 -1
  113. package/dist/llm/index.d.ts.map +1 -1
  114. package/dist/llm/index.js +2 -0
  115. package/dist/llm/index.js.map +1 -1
  116. package/dist/stream/deferred_stream.cjs +6 -2
  117. package/dist/stream/deferred_stream.cjs.map +1 -1
  118. package/dist/stream/deferred_stream.d.ts.map +1 -1
  119. package/dist/stream/deferred_stream.js +6 -2
  120. package/dist/stream/deferred_stream.js.map +1 -1
  121. package/dist/stt/stt.cjs.map +1 -1
  122. package/dist/stt/stt.d.cts +2 -1
  123. package/dist/stt/stt.d.ts +2 -1
  124. package/dist/stt/stt.d.ts.map +1 -1
  125. package/dist/stt/stt.js.map +1 -1
  126. package/dist/utils.cjs +15 -0
  127. package/dist/utils.cjs.map +1 -1
  128. package/dist/utils.d.cts +8 -0
  129. package/dist/utils.d.ts +8 -0
  130. package/dist/utils.d.ts.map +1 -1
  131. package/dist/utils.js +13 -0
  132. package/dist/utils.js.map +1 -1
  133. package/dist/version.cjs +1 -1
  134. package/dist/version.js +1 -1
  135. package/dist/voice/agent.cjs +14 -17
  136. package/dist/voice/agent.cjs.map +1 -1
  137. package/dist/voice/agent.d.cts +10 -11
  138. package/dist/voice/agent.d.ts +10 -11
  139. package/dist/voice/agent.d.ts.map +1 -1
  140. package/dist/voice/agent.js +15 -18
  141. package/dist/voice/agent.js.map +1 -1
  142. package/dist/voice/agent.test.cjs +194 -0
  143. package/dist/voice/agent.test.cjs.map +1 -1
  144. package/dist/voice/agent.test.js +195 -1
  145. package/dist/voice/agent.test.js.map +1 -1
  146. package/dist/voice/agent_activity.cjs +116 -39
  147. package/dist/voice/agent_activity.cjs.map +1 -1
  148. package/dist/voice/agent_activity.d.cts +2 -0
  149. package/dist/voice/agent_activity.d.ts +2 -0
  150. package/dist/voice/agent_activity.d.ts.map +1 -1
  151. package/dist/voice/agent_activity.js +117 -40
  152. package/dist/voice/agent_activity.js.map +1 -1
  153. package/dist/voice/agent_activity.test.cjs +135 -0
  154. package/dist/voice/agent_activity.test.cjs.map +1 -0
  155. package/dist/voice/agent_activity.test.js +134 -0
  156. package/dist/voice/agent_activity.test.js.map +1 -0
  157. package/dist/voice/agent_session.cjs +38 -38
  158. package/dist/voice/agent_session.cjs.map +1 -1
  159. package/dist/voice/agent_session.d.cts +65 -56
  160. package/dist/voice/agent_session.d.ts +65 -56
  161. package/dist/voice/agent_session.d.ts.map +1 -1
  162. package/dist/voice/agent_session.js +37 -37
  163. package/dist/voice/agent_session.js.map +1 -1
  164. package/dist/voice/audio_recognition.cjs +106 -52
  165. package/dist/voice/audio_recognition.cjs.map +1 -1
  166. package/dist/voice/audio_recognition.d.cts +4 -2
  167. package/dist/voice/audio_recognition.d.ts +4 -2
  168. package/dist/voice/audio_recognition.d.ts.map +1 -1
  169. package/dist/voice/audio_recognition.js +106 -52
  170. package/dist/voice/audio_recognition.js.map +1 -1
  171. package/dist/voice/audio_recognition_span.test.cjs +84 -22
  172. package/dist/voice/audio_recognition_span.test.cjs.map +1 -1
  173. package/dist/voice/audio_recognition_span.test.js +90 -23
  174. package/dist/voice/audio_recognition_span.test.js.map +1 -1
  175. package/dist/voice/events.cjs +1 -1
  176. package/dist/voice/events.cjs.map +1 -1
  177. package/dist/voice/events.d.cts +4 -3
  178. package/dist/voice/events.d.ts +4 -3
  179. package/dist/voice/events.d.ts.map +1 -1
  180. package/dist/voice/events.js +1 -1
  181. package/dist/voice/events.js.map +1 -1
  182. package/dist/voice/index.cjs +9 -1
  183. package/dist/voice/index.cjs.map +1 -1
  184. package/dist/voice/index.d.cts +1 -1
  185. package/dist/voice/index.d.ts +1 -1
  186. package/dist/voice/index.d.ts.map +1 -1
  187. package/dist/voice/index.js +10 -1
  188. package/dist/voice/index.js.map +1 -1
  189. package/dist/voice/remote_session.cjs +922 -0
  190. package/dist/voice/remote_session.cjs.map +1 -0
  191. package/dist/voice/remote_session.d.cts +108 -0
  192. package/dist/voice/remote_session.d.ts +108 -0
  193. package/dist/voice/remote_session.d.ts.map +1 -0
  194. package/dist/voice/remote_session.js +887 -0
  195. package/dist/voice/remote_session.js.map +1 -0
  196. package/dist/voice/report.cjs +11 -10
  197. package/dist/voice/report.cjs.map +1 -1
  198. package/dist/voice/report.d.cts +5 -3
  199. package/dist/voice/report.d.ts +5 -3
  200. package/dist/voice/report.d.ts.map +1 -1
  201. package/dist/voice/report.js +11 -10
  202. package/dist/voice/report.js.map +1 -1
  203. package/dist/voice/report.test.cjs +15 -0
  204. package/dist/voice/report.test.cjs.map +1 -1
  205. package/dist/voice/report.test.js +15 -0
  206. package/dist/voice/report.test.js.map +1 -1
  207. package/dist/voice/room_io/room_io.cjs +39 -0
  208. package/dist/voice/room_io/room_io.cjs.map +1 -1
  209. package/dist/voice/room_io/room_io.d.cts +3 -1
  210. package/dist/voice/room_io/room_io.d.ts +3 -1
  211. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  212. package/dist/voice/room_io/room_io.js +40 -1
  213. package/dist/voice/room_io/room_io.js.map +1 -1
  214. package/dist/voice/turn_config/interruption.cjs.map +1 -1
  215. package/dist/voice/turn_config/interruption.d.cts +1 -1
  216. package/dist/voice/turn_config/interruption.d.ts +1 -1
  217. package/dist/voice/turn_config/interruption.d.ts.map +1 -1
  218. package/dist/voice/turn_config/interruption.js.map +1 -1
  219. package/dist/voice/turn_config/utils.cjs +95 -35
  220. package/dist/voice/turn_config/utils.cjs.map +1 -1
  221. package/dist/voice/turn_config/utils.d.cts +17 -5
  222. package/dist/voice/turn_config/utils.d.ts +17 -5
  223. package/dist/voice/turn_config/utils.d.ts.map +1 -1
  224. package/dist/voice/turn_config/utils.js +93 -35
  225. package/dist/voice/turn_config/utils.js.map +1 -1
  226. package/dist/voice/turn_config/utils.test.cjs +83 -41
  227. package/dist/voice/turn_config/utils.test.cjs.map +1 -1
  228. package/dist/voice/turn_config/utils.test.js +84 -42
  229. package/dist/voice/turn_config/utils.test.js.map +1 -1
  230. package/dist/worker.cjs +6 -29
  231. package/dist/worker.cjs.map +1 -1
  232. package/dist/worker.d.ts.map +1 -1
  233. package/dist/worker.js +6 -19
  234. package/dist/worker.js.map +1 -1
  235. package/package.json +3 -2
  236. package/src/cli.ts +2 -0
  237. package/src/constants.ts +1 -0
  238. package/src/cpu.test.ts +239 -0
  239. package/src/cpu.ts +173 -0
  240. package/src/index.ts +13 -15
  241. package/src/inference/interruption/defaults.ts +1 -1
  242. package/src/inference/interruption/http_transport.ts +49 -30
  243. package/src/inference/interruption/interruption_detector.ts +22 -6
  244. package/src/inference/interruption/interruption_stream.ts +4 -4
  245. package/src/inference/interruption/types.ts +2 -2
  246. package/src/inference/interruption/ws_transport.ts +63 -59
  247. package/src/inference/llm.ts +3 -1
  248. package/src/inference/stt.test.ts +17 -0
  249. package/src/inference/stt.ts +22 -14
  250. package/src/inference/tts.test.ts +12 -0
  251. package/src/inference/tts.ts +22 -6
  252. package/src/ipc/job_proc_lazy_main.ts +44 -24
  253. package/src/job.ts +1 -1
  254. package/src/language.test.ts +62 -0
  255. package/src/language.ts +380 -0
  256. package/src/llm/index.ts +2 -0
  257. package/src/stream/deferred_stream.ts +5 -1
  258. package/src/stt/stt.ts +2 -1
  259. package/src/utils.ts +20 -0
  260. package/src/voice/agent.test.ts +208 -1
  261. package/src/voice/agent.ts +21 -22
  262. package/src/voice/agent_activity.test.ts +194 -0
  263. package/src/voice/agent_activity.ts +161 -43
  264. package/src/voice/agent_session.ts +103 -92
  265. package/src/voice/audio_recognition.ts +124 -61
  266. package/src/voice/audio_recognition_span.test.ts +115 -35
  267. package/src/voice/events.ts +4 -3
  268. package/src/voice/index.ts +10 -1
  269. package/src/voice/remote_session.ts +1083 -0
  270. package/src/voice/report.test.ts +22 -3
  271. package/src/voice/report.ts +31 -14
  272. package/src/voice/room_io/room_io.ts +52 -2
  273. package/src/voice/turn_config/interruption.ts +1 -1
  274. package/src/voice/turn_config/utils.test.ts +91 -43
  275. package/src/voice/turn_config/utils.ts +120 -56
  276. package/src/worker.ts +34 -50
  277. package/dist/voice/client_events.cjs +0 -554
  278. package/dist/voice/client_events.cjs.map +0 -1
  279. package/dist/voice/client_events.d.cts +0 -195
  280. package/dist/voice/client_events.d.ts +0 -195
  281. package/dist/voice/client_events.d.ts.map +0 -1
  282. package/dist/voice/client_events.js +0 -548
  283. package/dist/voice/client_events.js.map +0 -1
  284. package/dist/voice/wire_format.cjs +0 -798
  285. package/dist/voice/wire_format.cjs.map +0 -1
  286. package/dist/voice/wire_format.d.cts +0 -5503
  287. package/dist/voice/wire_format.d.ts +0 -5503
  288. package/dist/voice/wire_format.d.ts.map +0 -1
  289. package/dist/voice/wire_format.js +0 -728
  290. package/dist/voice/wire_format.js.map +0 -1
  291. package/src/voice/client_events.ts +0 -838
  292. package/src/voice/wire_format.ts +0 -827
@@ -0,0 +1,887 @@
1
+ import { Timestamp } from "@bufbuild/protobuf";
2
+ import { AgentSession as pb } from "@livekit/protocol";
3
+ import EventEmitter from "events";
4
+ import { TOPIC_SESSION_MESSAGES } from "../constants.js";
5
+ import { log } from "../log.js";
6
+ import { Future, Task, shortuuid } from "../utils.js";
7
+ import {
8
+ AgentSessionEventTypes
9
+ } from "./events.js";
10
+ class SessionTransport {
11
+ async start() {
12
+ }
13
+ }
14
+ class RoomSessionTransport extends SessionTransport {
15
+ room;
16
+ handlerRegistered = false;
17
+ closed = false;
18
+ pendingMessages = [];
19
+ waitingResolve = null;
20
+ roomIO;
21
+ constructor(room, roomIO) {
22
+ super();
23
+ this.room = room;
24
+ this.roomIO = roomIO;
25
+ }
26
+ getRemoteIdentity() {
27
+ var _a;
28
+ return (_a = this.roomIO.linkedParticipant) == null ? void 0 : _a.identity;
29
+ }
30
+ async start() {
31
+ if (this.handlerRegistered) return;
32
+ this.room.registerByteStreamHandler(TOPIC_SESSION_MESSAGES, this.onByteStream);
33
+ this.handlerRegistered = true;
34
+ }
35
+ onByteStream = (reader, participantInfo) => {
36
+ if (this.getRemoteIdentity() && participantInfo.identity !== this.getRemoteIdentity()) {
37
+ return;
38
+ }
39
+ this.readStream(reader).catch((e) => {
40
+ log().warn({ error: e }, "failed to read binary stream message");
41
+ });
42
+ };
43
+ async readStream(reader) {
44
+ try {
45
+ const chunks = await reader.readAll();
46
+ let totalLength = 0;
47
+ for (const chunk of chunks) {
48
+ totalLength += chunk.length;
49
+ }
50
+ const data = new Uint8Array(totalLength);
51
+ let offset = 0;
52
+ for (const chunk of chunks) {
53
+ data.set(chunk, offset);
54
+ offset += chunk.length;
55
+ }
56
+ const msg = pb.AgentSessionMessage.fromBinary(data);
57
+ this.enqueue(msg);
58
+ } catch (e) {
59
+ if (!this.closed) {
60
+ log().warn({ error: e }, "failed to parse binary stream message");
61
+ }
62
+ }
63
+ }
64
+ async sendMessage(msg) {
65
+ if (this.closed || !this.room.isConnected) return;
66
+ try {
67
+ const data = msg.toBinary();
68
+ const opts = {
69
+ topic: TOPIC_SESSION_MESSAGES,
70
+ name: shortuuid("AS_")
71
+ };
72
+ const remoteIdentity = this.getRemoteIdentity();
73
+ if (remoteIdentity) {
74
+ opts.destinationIdentities = [remoteIdentity];
75
+ }
76
+ const writer = await this.room.localParticipant.streamBytes(opts);
77
+ await writer.write(new Uint8Array(data));
78
+ await writer.close();
79
+ } catch (e) {
80
+ log().warn({ error: e }, "failed to send binary stream message");
81
+ }
82
+ }
83
+ async close() {
84
+ if (this.closed) return;
85
+ this.closed = true;
86
+ if (this.handlerRegistered) {
87
+ try {
88
+ this.room.unregisterByteStreamHandler(TOPIC_SESSION_MESSAGES);
89
+ } catch (e) {
90
+ log().debug({ error: e }, "byte stream handler already unregistered");
91
+ }
92
+ this.handlerRegistered = false;
93
+ }
94
+ if (this.waitingResolve) {
95
+ this.waitingResolve({
96
+ value: void 0,
97
+ done: true
98
+ });
99
+ this.waitingResolve = null;
100
+ }
101
+ }
102
+ enqueue(msg) {
103
+ if (this.closed) return;
104
+ if (this.waitingResolve) {
105
+ const resolve = this.waitingResolve;
106
+ this.waitingResolve = null;
107
+ resolve({ value: msg, done: false });
108
+ } else {
109
+ this.pendingMessages.push(msg);
110
+ }
111
+ }
112
+ [Symbol.asyncIterator]() {
113
+ return {
114
+ next: () => {
115
+ if (this.closed && this.pendingMessages.length === 0) {
116
+ return Promise.resolve({
117
+ value: void 0,
118
+ done: true
119
+ });
120
+ }
121
+ const pending = this.pendingMessages.shift();
122
+ if (pending) {
123
+ return Promise.resolve({ value: pending, done: false });
124
+ }
125
+ return new Promise((resolve) => {
126
+ this.waitingResolve = resolve;
127
+ });
128
+ },
129
+ return: () => {
130
+ this.close();
131
+ return Promise.resolve({
132
+ value: void 0,
133
+ done: true
134
+ });
135
+ }
136
+ };
137
+ }
138
+ }
139
+ const AGENT_STATE_MAP = {
140
+ initializing: pb.AgentState.AS_INITIALIZING,
141
+ idle: pb.AgentState.AS_IDLE,
142
+ listening: pb.AgentState.AS_LISTENING,
143
+ thinking: pb.AgentState.AS_THINKING,
144
+ speaking: pb.AgentState.AS_SPEAKING
145
+ };
146
+ const USER_STATE_MAP = {
147
+ speaking: pb.UserState.US_SPEAKING,
148
+ listening: pb.UserState.US_LISTENING,
149
+ away: pb.UserState.US_AWAY
150
+ };
151
+ function msToTimestamp(ms) {
152
+ return Timestamp.fromDate(new Date(ms));
153
+ }
154
+ function nowTimestamp() {
155
+ return Timestamp.fromDate(/* @__PURE__ */ new Date());
156
+ }
157
+ function chatItemToProto(item) {
158
+ switch (item.type) {
159
+ case "message": {
160
+ const msg = item;
161
+ const roleMap = {
162
+ developer: pb.ChatRole.DEVELOPER,
163
+ system: pb.ChatRole.SYSTEM,
164
+ user: pb.ChatRole.USER,
165
+ assistant: pb.ChatRole.ASSISTANT
166
+ };
167
+ const content = [];
168
+ for (const c of msg.content) {
169
+ if (typeof c === "string") {
170
+ content.push(new pb.ChatMessage_ChatContent({ payload: { case: "text", value: c } }));
171
+ }
172
+ }
173
+ const metricsReport = new pb.MetricsReport();
174
+ if (msg.metrics.transcriptionDelay !== void 0)
175
+ metricsReport.transcriptionDelay = msg.metrics.transcriptionDelay;
176
+ if (msg.metrics.endOfTurnDelay !== void 0)
177
+ metricsReport.endOfTurnDelay = msg.metrics.endOfTurnDelay;
178
+ if (msg.metrics.onUserTurnCompletedDelay !== void 0)
179
+ metricsReport.onUserTurnCompletedDelay = msg.metrics.onUserTurnCompletedDelay;
180
+ if (msg.metrics.llmNodeTtft !== void 0)
181
+ metricsReport.llmNodeTtft = msg.metrics.llmNodeTtft;
182
+ if (msg.metrics.ttsNodeTtfb !== void 0)
183
+ metricsReport.ttsNodeTtfb = msg.metrics.ttsNodeTtfb;
184
+ if (msg.metrics.e2eLatency !== void 0) metricsReport.e2eLatency = msg.metrics.e2eLatency;
185
+ const pbMsg = new pb.ChatMessage({
186
+ id: msg.id,
187
+ role: roleMap[msg.role] ?? pb.ChatRole.ASSISTANT,
188
+ content,
189
+ interrupted: msg.interrupted,
190
+ metrics: metricsReport,
191
+ createdAt: msToTimestamp(msg.createdAt)
192
+ });
193
+ if (msg.transcriptConfidence !== void 0) {
194
+ pbMsg.transcriptConfidence = msg.transcriptConfidence;
195
+ }
196
+ return new pb.ChatContext_ChatItem({ item: { case: "message", value: pbMsg } });
197
+ }
198
+ case "function_call": {
199
+ const fc = item;
200
+ return new pb.ChatContext_ChatItem({
201
+ item: {
202
+ case: "functionCall",
203
+ value: new pb.FunctionCall({
204
+ id: fc.id,
205
+ callId: fc.callId,
206
+ name: fc.name,
207
+ arguments: fc.args,
208
+ createdAt: msToTimestamp(fc.createdAt)
209
+ })
210
+ }
211
+ });
212
+ }
213
+ case "function_call_output": {
214
+ const fco = item;
215
+ return new pb.ChatContext_ChatItem({
216
+ item: {
217
+ case: "functionCallOutput",
218
+ value: new pb.FunctionCallOutput({
219
+ id: fco.id,
220
+ callId: fco.callId,
221
+ name: fco.name,
222
+ output: fco.output,
223
+ isError: fco.isError,
224
+ createdAt: msToTimestamp(fco.createdAt)
225
+ })
226
+ }
227
+ });
228
+ }
229
+ case "agent_handoff": {
230
+ const ah = item;
231
+ return new pb.ChatContext_ChatItem({
232
+ item: {
233
+ case: "agentHandoff",
234
+ value: new pb.AgentHandoff({
235
+ id: ah.id,
236
+ oldAgentId: ah.oldAgentId,
237
+ newAgentId: ah.newAgentId,
238
+ createdAt: msToTimestamp(ah.createdAt)
239
+ })
240
+ }
241
+ });
242
+ }
243
+ }
244
+ }
245
+ function sessionUsageToProto(usage) {
246
+ const modelUsages = [];
247
+ for (const mu of usage.modelUsage) {
248
+ switch (mu.type) {
249
+ case "llm_usage": {
250
+ const lu = mu;
251
+ modelUsages.push(
252
+ new pb.ModelUsage({
253
+ usage: {
254
+ case: "llm",
255
+ value: new pb.LLMModelUsage({
256
+ provider: lu.provider ?? "",
257
+ model: lu.model ?? "",
258
+ inputTokens: lu.inputTokens ?? 0,
259
+ inputCachedTokens: lu.inputCachedTokens ?? 0,
260
+ inputAudioTokens: lu.inputAudioTokens ?? 0,
261
+ inputCachedAudioTokens: lu.inputCachedAudioTokens ?? 0,
262
+ inputTextTokens: lu.inputTextTokens ?? 0,
263
+ inputCachedTextTokens: lu.inputCachedTextTokens ?? 0,
264
+ inputImageTokens: lu.inputImageTokens ?? 0,
265
+ inputCachedImageTokens: lu.inputCachedImageTokens ?? 0,
266
+ outputTokens: lu.outputTokens ?? 0,
267
+ outputAudioTokens: lu.outputAudioTokens ?? 0,
268
+ outputTextTokens: lu.outputTextTokens ?? 0,
269
+ sessionDuration: (lu.sessionDurationMs ?? 0) / 1e3
270
+ })
271
+ }
272
+ })
273
+ );
274
+ break;
275
+ }
276
+ case "tts_usage": {
277
+ const tu = mu;
278
+ modelUsages.push(
279
+ new pb.ModelUsage({
280
+ usage: {
281
+ case: "tts",
282
+ value: new pb.TTSModelUsage({
283
+ provider: tu.provider ?? "",
284
+ model: tu.model ?? "",
285
+ inputTokens: tu.inputTokens ?? 0,
286
+ outputTokens: tu.outputTokens ?? 0,
287
+ charactersCount: tu.charactersCount ?? 0,
288
+ audioDuration: (tu.audioDurationMs ?? 0) / 1e3
289
+ })
290
+ }
291
+ })
292
+ );
293
+ break;
294
+ }
295
+ case "stt_usage": {
296
+ const su = mu;
297
+ modelUsages.push(
298
+ new pb.ModelUsage({
299
+ usage: {
300
+ case: "stt",
301
+ value: new pb.STTModelUsage({
302
+ provider: su.provider ?? "",
303
+ model: su.model ?? "",
304
+ inputTokens: su.inputTokens ?? 0,
305
+ outputTokens: su.outputTokens ?? 0,
306
+ audioDuration: (su.audioDurationMs ?? 0) / 1e3
307
+ })
308
+ }
309
+ })
310
+ );
311
+ break;
312
+ }
313
+ case "interruption_usage": {
314
+ const iu = mu;
315
+ modelUsages.push(
316
+ new pb.ModelUsage({
317
+ usage: {
318
+ case: "interruption",
319
+ value: new pb.InterruptionModelUsage({
320
+ provider: iu.provider ?? "",
321
+ model: iu.model ?? "",
322
+ totalRequests: iu.totalRequests ?? 0
323
+ })
324
+ }
325
+ })
326
+ );
327
+ break;
328
+ }
329
+ }
330
+ }
331
+ return new pb.AgentSessionUsage({ modelUsage: modelUsages });
332
+ }
333
+ function toolNames(toolCtx) {
334
+ if (!toolCtx) return [];
335
+ return Object.keys(toolCtx);
336
+ }
337
+ function protoSerializeOptions(opts) {
338
+ var _a, _b;
339
+ return {
340
+ endpointing: JSON.stringify(((_a = opts.turnHandling) == null ? void 0 : _a.endpointing) ?? {}),
341
+ interruption: JSON.stringify(((_b = opts.turnHandling) == null ? void 0 : _b.interruption) ?? {}),
342
+ max_tool_steps: String(opts.maxToolSteps ?? 0),
343
+ user_away_timeout: String(opts.userAwayTimeout ?? ""),
344
+ preemptive_generation: String(opts.preemptiveGeneration ?? false),
345
+ use_tts_aligned_transcript: String(opts.useTtsAlignedTranscript ?? false)
346
+ };
347
+ }
348
+ class SessionHost {
349
+ transport;
350
+ session;
351
+ started = false;
352
+ eventsRegistered = false;
353
+ recvTask;
354
+ tasks = /* @__PURE__ */ new Set();
355
+ textInputCb;
356
+ constructor(transport) {
357
+ this.transport = transport;
358
+ }
359
+ registerSession(session) {
360
+ this.session = session;
361
+ if (!this.eventsRegistered) {
362
+ this.eventsRegistered = true;
363
+ session.on(AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);
364
+ session.on(AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);
365
+ session.on(AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);
366
+ session.on(AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);
367
+ session.on(AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);
368
+ session.on(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
369
+ session.on(AgentSessionEventTypes.OverlappingSpeech, this.onOverlappingSpeech);
370
+ session.on(AgentSessionEventTypes.Error, this.onHostError);
371
+ }
372
+ }
373
+ registerTextInput(textInputCb) {
374
+ this.textInputCb = textInputCb;
375
+ }
376
+ async start() {
377
+ if (this.started) return;
378
+ this.started = true;
379
+ await this.transport.start();
380
+ this.recvTask = Task.from(async () => this.recvLoop());
381
+ }
382
+ async close() {
383
+ if (!this.started) return;
384
+ this.started = false;
385
+ if (this.session && this.eventsRegistered) {
386
+ this.eventsRegistered = false;
387
+ this.session.off(AgentSessionEventTypes.AgentStateChanged, this.onAgentStateChanged);
388
+ this.session.off(AgentSessionEventTypes.UserStateChanged, this.onUserStateChanged);
389
+ this.session.off(AgentSessionEventTypes.ConversationItemAdded, this.onConversationItemAdded);
390
+ this.session.off(AgentSessionEventTypes.UserInputTranscribed, this.onUserInputTranscribed);
391
+ this.session.off(AgentSessionEventTypes.FunctionToolsExecuted, this.onFunctionToolsExecuted);
392
+ this.session.off(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
393
+ this.session.off(AgentSessionEventTypes.OverlappingSpeech, this.onOverlappingSpeech);
394
+ this.session.off(AgentSessionEventTypes.Error, this.onHostError);
395
+ }
396
+ if (this.recvTask) {
397
+ this.recvTask.cancel();
398
+ }
399
+ await Promise.allSettled([...this.tasks].map((task) => task.cancelAndWait()));
400
+ this.tasks.clear();
401
+ await this.transport.close();
402
+ }
403
+ async recvLoop() {
404
+ try {
405
+ for await (const msg of this.transport) {
406
+ if (msg.message.case === "request") {
407
+ if (this.session) {
408
+ this.trackTask(
409
+ Task.from(async () => this.handleRequestSafe(msg.message.value))
410
+ );
411
+ }
412
+ }
413
+ }
414
+ } catch (e) {
415
+ if (this.started) {
416
+ log().warn({ error: e }, "error processing session message");
417
+ }
418
+ }
419
+ }
420
+ sendEvent(event) {
421
+ const msg = new pb.AgentSessionMessage({
422
+ message: { case: "event", value: event }
423
+ });
424
+ this.trackTask(Task.from(async () => this.transport.sendMessage(msg)));
425
+ }
426
+ emitEvent(event, createdAt) {
427
+ this.sendEvent(
428
+ new pb.AgentSessionEvent({
429
+ createdAt: createdAt ? msToTimestamp(createdAt) : nowTimestamp(),
430
+ event
431
+ })
432
+ );
433
+ }
434
+ onAgentStateChanged = (event) => {
435
+ this.emitEvent(
436
+ {
437
+ case: "agentStateChanged",
438
+ value: new pb.AgentSessionEvent_AgentStateChanged({
439
+ oldState: AGENT_STATE_MAP[event.oldState],
440
+ newState: AGENT_STATE_MAP[event.newState]
441
+ })
442
+ },
443
+ event.createdAt
444
+ );
445
+ };
446
+ onUserStateChanged = (event) => {
447
+ this.emitEvent(
448
+ {
449
+ case: "userStateChanged",
450
+ value: new pb.AgentSessionEvent_UserStateChanged({
451
+ oldState: USER_STATE_MAP[event.oldState],
452
+ newState: USER_STATE_MAP[event.newState]
453
+ })
454
+ },
455
+ event.createdAt
456
+ );
457
+ };
458
+ onUserInputTranscribed = (event) => {
459
+ this.emitEvent(
460
+ {
461
+ case: "userInputTranscribed",
462
+ value: new pb.AgentSessionEvent_UserInputTranscribed({
463
+ transcript: event.transcript,
464
+ isFinal: event.isFinal
465
+ })
466
+ },
467
+ event.createdAt
468
+ );
469
+ };
470
+ onConversationItemAdded = (event) => {
471
+ this.emitEvent(
472
+ {
473
+ case: "conversationItemAdded",
474
+ value: new pb.AgentSessionEvent_ConversationItemAdded({
475
+ item: chatItemToProto(event.item)
476
+ })
477
+ },
478
+ event.createdAt
479
+ );
480
+ };
481
+ onFunctionToolsExecuted = (event) => {
482
+ const pbCalls = event.functionCalls.map(
483
+ (fc) => new pb.FunctionCall({ name: fc.name, arguments: fc.args, callId: fc.callId })
484
+ );
485
+ const pbOutputs = event.functionCallOutputs.filter((fco) => fco != null).map(
486
+ (fco) => new pb.FunctionCallOutput({
487
+ callId: fco.callId,
488
+ output: fco.output,
489
+ isError: fco.isError
490
+ })
491
+ );
492
+ this.emitEvent(
493
+ {
494
+ case: "functionToolsExecuted",
495
+ value: new pb.AgentSessionEvent_FunctionToolsExecuted({
496
+ functionCalls: pbCalls,
497
+ functionCallOutputs: pbOutputs
498
+ })
499
+ },
500
+ event.createdAt
501
+ );
502
+ };
503
+ onOverlappingSpeech = (event) => {
504
+ const value = new pb.AgentSessionEvent_OverlappingSpeech({
505
+ isInterruption: event.isInterruption,
506
+ detectionDelay: event.detectionDelayInS,
507
+ detectedAt: msToTimestamp(event.detectedAt)
508
+ });
509
+ if (event.overlapStartedAt != null) {
510
+ value.overlapStartedAt = msToTimestamp(event.overlapStartedAt);
511
+ }
512
+ this.emitEvent({ case: "overlappingSpeech", value });
513
+ };
514
+ onMetricsCollected = (event) => {
515
+ if (!this.session) return;
516
+ this.emitEvent(
517
+ {
518
+ case: "sessionUsageUpdated",
519
+ value: new pb.AgentSessionEvent_SessionUsageUpdated({
520
+ usage: sessionUsageToProto(this.session.usage)
521
+ })
522
+ },
523
+ event.createdAt
524
+ );
525
+ };
526
+ onHostError = (event) => {
527
+ this.emitEvent(
528
+ {
529
+ case: "error",
530
+ value: new pb.AgentSessionEvent_Error({
531
+ message: event.error ? String(event.error) : "Unknown error"
532
+ })
533
+ },
534
+ event.createdAt
535
+ );
536
+ };
537
+ async handleRequestSafe(req) {
538
+ try {
539
+ await this.handleRequest(req);
540
+ } catch (e) {
541
+ log().warn({ error: e, requestId: req.requestId }, "error handling session request");
542
+ try {
543
+ const resp = new pb.AgentSessionMessage({
544
+ message: {
545
+ case: "response",
546
+ value: new pb.SessionResponse({
547
+ requestId: req.requestId,
548
+ error: "internal error"
549
+ })
550
+ }
551
+ });
552
+ await this.transport.sendMessage(resp);
553
+ } catch (e2) {
554
+ log().debug({ error: e2 }, "failed to send error response");
555
+ }
556
+ }
557
+ }
558
+ async handleRequest(req) {
559
+ if (!this.session) return;
560
+ switch (req.request.case) {
561
+ case "ping":
562
+ return this.sendResponse(req.requestId, {
563
+ case: "pong",
564
+ value: new pb.SessionResponse_Pong()
565
+ });
566
+ case "getChatHistory":
567
+ return this.handleGetChatHistory(req.requestId);
568
+ case "getAgentInfo":
569
+ return this.handleGetAgentInfo(req.requestId);
570
+ case "runInput":
571
+ return this.handleRunInput(req.requestId, req.request.value);
572
+ case "getSessionState":
573
+ return this.handleGetSessionState(req.requestId);
574
+ case "getRtcStats":
575
+ return this.sendResponse(req.requestId, {
576
+ case: "getRtcStats",
577
+ value: new pb.SessionResponse_GetRTCStatsResponse({
578
+ publisherStats: [],
579
+ subscriberStats: []
580
+ })
581
+ });
582
+ case "getSessionUsage":
583
+ return this.handleGetSessionUsage(req.requestId);
584
+ }
585
+ }
586
+ async handleGetChatHistory(requestId) {
587
+ const items = this.session.history.items.map(chatItemToProto);
588
+ return this.sendResponse(requestId, {
589
+ case: "getChatHistory",
590
+ value: new pb.SessionResponse_GetChatHistoryResponse({ items })
591
+ });
592
+ }
593
+ async handleGetAgentInfo(requestId) {
594
+ const agent = this.session.currentAgent;
595
+ return this.sendResponse(requestId, {
596
+ case: "getAgentInfo",
597
+ value: new pb.SessionResponse_GetAgentInfoResponse({
598
+ id: agent.id,
599
+ instructions: agent.instructions,
600
+ tools: toolNames(agent.toolCtx),
601
+ chatCtx: agent.chatCtx.items.map(chatItemToProto)
602
+ })
603
+ });
604
+ }
605
+ async handleRunInput(requestId, input) {
606
+ const text = input.text;
607
+ let items = [];
608
+ let error;
609
+ if (text) {
610
+ if (this.textInputCb) {
611
+ const cbResult = this.textInputCb(this.session, { text });
612
+ if (cbResult instanceof Promise) {
613
+ await cbResult;
614
+ }
615
+ } else {
616
+ try {
617
+ await this.session.interrupt({ force: true }).await;
618
+ } catch {
619
+ }
620
+ const result = this.session.run({ userInput: text });
621
+ try {
622
+ await result.wait();
623
+ } catch (e) {
624
+ error = e instanceof Error ? e.message : String(e);
625
+ }
626
+ items = result.events.map((ev) => chatItemToProto(ev.item));
627
+ }
628
+ }
629
+ return this.sendResponse(
630
+ requestId,
631
+ {
632
+ case: "runInput",
633
+ value: new pb.SessionResponse_RunInputResponse({ items })
634
+ },
635
+ error
636
+ );
637
+ }
638
+ async handleGetSessionState(requestId) {
639
+ const agent = this.session.currentAgent;
640
+ const startedAt = this.session._startedAt ?? Date.now();
641
+ return this.sendResponse(requestId, {
642
+ case: "getSessionState",
643
+ value: new pb.SessionResponse_GetSessionStateResponse({
644
+ agentState: AGENT_STATE_MAP[this.session.agentState],
645
+ userState: USER_STATE_MAP[this.session.userState],
646
+ agentId: agent.id,
647
+ options: protoSerializeOptions({
648
+ turnHandling: this.session.sessionOptions.turnHandling,
649
+ maxToolSteps: this.session.sessionOptions.maxToolSteps,
650
+ userAwayTimeout: this.session.sessionOptions.userAwayTimeout,
651
+ preemptiveGeneration: this.session.sessionOptions.preemptiveGeneration,
652
+ useTtsAlignedTranscript: this.session.sessionOptions.useTtsAlignedTranscript
653
+ }),
654
+ createdAt: msToTimestamp(startedAt)
655
+ })
656
+ });
657
+ }
658
+ async handleGetSessionUsage(requestId) {
659
+ return this.sendResponse(requestId, {
660
+ case: "getSessionUsage",
661
+ value: new pb.SessionResponse_GetSessionUsageResponse({
662
+ usage: sessionUsageToProto(this.session.usage),
663
+ createdAt: nowTimestamp()
664
+ })
665
+ });
666
+ }
667
+ async sendResponse(requestId, response, error) {
668
+ await this.transport.sendMessage(
669
+ new pb.AgentSessionMessage({
670
+ message: {
671
+ case: "response",
672
+ value: new pb.SessionResponse({ requestId, response, error })
673
+ }
674
+ })
675
+ );
676
+ }
677
+ trackTask(task) {
678
+ this.tasks.add(task);
679
+ task.addDoneCallback(() => {
680
+ this.tasks.delete(task);
681
+ });
682
+ }
683
+ }
684
+ class RemoteSession extends EventEmitter {
685
+ transport;
686
+ started = false;
687
+ tasks = /* @__PURE__ */ new Set();
688
+ pendingRequests = /* @__PURE__ */ new Map();
689
+ recvTask;
690
+ _logger = log();
691
+ constructor(transport) {
692
+ super();
693
+ this.transport = transport;
694
+ }
695
+ static fromRoom(room, roomIO) {
696
+ const transport = new RoomSessionTransport(room, roomIO);
697
+ return new RemoteSession(transport);
698
+ }
699
+ async start() {
700
+ if (this.started) return;
701
+ this.started = true;
702
+ await this.transport.start();
703
+ this.recvTask = Task.from(async () => this.recvLoop());
704
+ }
705
+ async close() {
706
+ if (!this.started) return;
707
+ this.started = false;
708
+ if (this.recvTask) {
709
+ this.recvTask.cancel();
710
+ }
711
+ for (const pending of this.pendingRequests.values()) {
712
+ pending.reject(new Error("RemoteSession closed"));
713
+ }
714
+ this.pendingRequests.clear();
715
+ for (const task of this.tasks) {
716
+ task.cancel();
717
+ }
718
+ this.tasks.clear();
719
+ await this.transport.close();
720
+ }
721
+ async recvLoop() {
722
+ try {
723
+ for await (const msg of this.transport) {
724
+ switch (msg.message.case) {
725
+ case "event":
726
+ this.dispatchEvent(msg.message.value);
727
+ break;
728
+ case "response":
729
+ this.dispatchResponse(msg.message.value);
730
+ break;
731
+ }
732
+ }
733
+ } catch (e) {
734
+ if (this.started) {
735
+ this._logger.warn({ error: e }, "error in RemoteSession recv loop");
736
+ }
737
+ }
738
+ }
739
+ dispatchEvent(event) {
740
+ const ev = event.event;
741
+ switch (ev.case) {
742
+ case "agentStateChanged":
743
+ this.emit("agent_state_changed", ev.value);
744
+ break;
745
+ case "userStateChanged":
746
+ this.emit("user_state_changed", ev.value);
747
+ break;
748
+ case "userInputTranscribed":
749
+ this.emit("user_input_transcribed", ev.value);
750
+ break;
751
+ case "conversationItemAdded":
752
+ this.emit("conversation_item_added", ev.value);
753
+ break;
754
+ case "functionToolsExecuted":
755
+ this.emit("function_tools_executed", ev.value);
756
+ break;
757
+ case "overlappingSpeech":
758
+ this.emit("overlapping_speech", ev.value);
759
+ break;
760
+ case "sessionUsageUpdated":
761
+ this.emit("session_usage", ev.value);
762
+ break;
763
+ case "error":
764
+ this.emit("error", ev.value);
765
+ break;
766
+ }
767
+ }
768
+ dispatchResponse(response) {
769
+ const future = this.pendingRequests.get(response.requestId);
770
+ this.pendingRequests.delete(response.requestId);
771
+ if (future && !future.done) {
772
+ future.resolve(response);
773
+ }
774
+ }
775
+ async sendRequest(buildReq, timeout = 6e4) {
776
+ const requestId = shortuuid("req_");
777
+ const req = buildReq(requestId);
778
+ req.requestId = requestId;
779
+ const future = new Future();
780
+ this.pendingRequests.set(requestId, future);
781
+ const msg = new pb.AgentSessionMessage({
782
+ message: { case: "request", value: req }
783
+ });
784
+ await this.transport.sendMessage(msg);
785
+ const timer = setTimeout(() => {
786
+ if (!future.done) {
787
+ this.pendingRequests.delete(requestId);
788
+ future.reject(new Error("RemoteSession request timed out"));
789
+ }
790
+ }, timeout);
791
+ try {
792
+ const response = await future.await;
793
+ if (response.error) {
794
+ throw new Error(response.error);
795
+ }
796
+ return response;
797
+ } finally {
798
+ clearTimeout(timer);
799
+ }
800
+ }
801
+ async fetchSessionState() {
802
+ const resp = await this.sendRequest(
803
+ (id) => new pb.SessionRequest({
804
+ requestId: id,
805
+ request: { case: "getSessionState", value: new pb.SessionRequest_GetSessionState() }
806
+ })
807
+ );
808
+ if (resp.response.case !== "getSessionState") {
809
+ throw new Error("unexpected response type");
810
+ }
811
+ return resp.response.value;
812
+ }
813
+ async fetchChatHistory() {
814
+ const resp = await this.sendRequest(
815
+ (id) => new pb.SessionRequest({
816
+ requestId: id,
817
+ request: { case: "getChatHistory", value: new pb.SessionRequest_GetChatHistory() }
818
+ })
819
+ );
820
+ if (resp.response.case !== "getChatHistory") {
821
+ throw new Error("unexpected response type");
822
+ }
823
+ return resp.response.value;
824
+ }
825
+ async fetchAgentInfo() {
826
+ const resp = await this.sendRequest(
827
+ (id) => new pb.SessionRequest({
828
+ requestId: id,
829
+ request: { case: "getAgentInfo", value: new pb.SessionRequest_GetAgentInfo() }
830
+ })
831
+ );
832
+ if (resp.response.case !== "getAgentInfo") {
833
+ throw new Error("unexpected response type");
834
+ }
835
+ return resp.response.value;
836
+ }
837
+ async sendMessage(text, responseTimeout = 6e4) {
838
+ const resp = await this.sendRequest(
839
+ (id) => new pb.SessionRequest({
840
+ requestId: id,
841
+ request: { case: "runInput", value: new pb.SessionRequest_RunInput({ text }) }
842
+ }),
843
+ responseTimeout
844
+ );
845
+ if (resp.response.case !== "runInput") {
846
+ throw new Error("unexpected response type");
847
+ }
848
+ return resp.response.value;
849
+ }
850
+ async fetchRtcStats() {
851
+ const resp = await this.sendRequest(
852
+ (id) => new pb.SessionRequest({
853
+ requestId: id,
854
+ request: { case: "getRtcStats", value: new pb.SessionRequest_GetRTCStats() }
855
+ })
856
+ );
857
+ if (resp.response.case !== "getRtcStats") {
858
+ throw new Error("unexpected response type");
859
+ }
860
+ return resp.response.value;
861
+ }
862
+ async fetchSessionUsage() {
863
+ const resp = await this.sendRequest(
864
+ (id) => new pb.SessionRequest({
865
+ requestId: id,
866
+ request: { case: "getSessionUsage", value: new pb.SessionRequest_GetSessionUsage() }
867
+ })
868
+ );
869
+ if (resp.response.case !== "getSessionUsage") {
870
+ throw new Error("unexpected response type");
871
+ }
872
+ return resp.response.value;
873
+ }
874
+ trackTask(task) {
875
+ this.tasks.add(task);
876
+ task.addDoneCallback(() => {
877
+ this.tasks.delete(task);
878
+ });
879
+ }
880
+ }
881
+ export {
882
+ RemoteSession,
883
+ RoomSessionTransport,
884
+ SessionHost,
885
+ SessionTransport
886
+ };
887
+ //# sourceMappingURL=remote_session.js.map