openai 7.13.0 → 7.14.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 (330) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/client.d.mts +3 -0
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +3 -0
  5. package/client.d.ts.map +1 -1
  6. package/client.js +3 -0
  7. package/client.js.map +1 -1
  8. package/client.mjs +3 -0
  9. package/client.mjs.map +1 -1
  10. package/helpers/live.d.mts +2 -0
  11. package/helpers/live.d.mts.map +1 -0
  12. package/helpers/live.d.ts +2 -0
  13. package/helpers/live.d.ts.map +1 -0
  14. package/helpers/live.js +6 -0
  15. package/helpers/live.js.map +1 -0
  16. package/helpers/live.mjs +2 -0
  17. package/helpers/live.mjs.map +1 -0
  18. package/lib/live/transcript-grouper.d.mts +96 -0
  19. package/lib/live/transcript-grouper.d.mts.map +1 -0
  20. package/lib/live/transcript-grouper.d.ts +96 -0
  21. package/lib/live/transcript-grouper.d.ts.map +1 -0
  22. package/lib/live/transcript-grouper.js +223 -0
  23. package/lib/live/transcript-grouper.js.map +1 -0
  24. package/lib/live/transcript-grouper.mjs +219 -0
  25. package/lib/live/transcript-grouper.mjs.map +1 -0
  26. package/lib/live/transcript-grouping.d.mts +49 -0
  27. package/lib/live/transcript-grouping.d.mts.map +1 -0
  28. package/lib/live/transcript-grouping.d.ts +49 -0
  29. package/lib/live/transcript-grouping.d.ts.map +1 -0
  30. package/lib/live/transcript-grouping.js +287 -0
  31. package/lib/live/transcript-grouping.js.map +1 -0
  32. package/lib/live/transcript-grouping.mjs +283 -0
  33. package/lib/live/transcript-grouping.mjs.map +1 -0
  34. package/lib/live/webrtc.d.mts +13 -0
  35. package/lib/live/webrtc.d.mts.map +1 -0
  36. package/lib/live/webrtc.d.ts +13 -0
  37. package/lib/live/webrtc.d.ts.map +1 -0
  38. package/lib/live/webrtc.js +16 -0
  39. package/lib/live/webrtc.js.map +1 -0
  40. package/lib/live/webrtc.mjs +10 -0
  41. package/lib/live/webrtc.mjs.map +1 -0
  42. package/lib/realtime/webrtc.d.mts +13 -0
  43. package/lib/realtime/webrtc.d.mts.map +1 -0
  44. package/lib/realtime/webrtc.d.ts +13 -0
  45. package/lib/realtime/webrtc.d.ts.map +1 -0
  46. package/lib/realtime/webrtc.js +16 -0
  47. package/lib/realtime/webrtc.js.map +1 -0
  48. package/lib/realtime/webrtc.mjs +10 -0
  49. package/lib/realtime/webrtc.mjs.map +1 -0
  50. package/lib/webrtc/connection.d.mts +40 -0
  51. package/lib/webrtc/connection.d.mts.map +1 -0
  52. package/lib/webrtc/connection.d.ts +40 -0
  53. package/lib/webrtc/connection.d.ts.map +1 -0
  54. package/lib/webrtc/connection.js +228 -0
  55. package/lib/webrtc/connection.js.map +1 -0
  56. package/lib/webrtc/connection.mjs +224 -0
  57. package/lib/webrtc/connection.mjs.map +1 -0
  58. package/lib/webrtc/data-channel.d.mts +32 -0
  59. package/lib/webrtc/data-channel.d.mts.map +1 -0
  60. package/lib/webrtc/data-channel.d.ts +32 -0
  61. package/lib/webrtc/data-channel.d.ts.map +1 -0
  62. package/lib/webrtc/data-channel.js +125 -0
  63. package/lib/webrtc/data-channel.js.map +1 -0
  64. package/lib/webrtc/data-channel.mjs +121 -0
  65. package/lib/webrtc/data-channel.mjs.map +1 -0
  66. package/lib/webrtc/errors.d.mts +19 -0
  67. package/lib/webrtc/errors.d.mts.map +1 -0
  68. package/lib/webrtc/errors.d.ts +19 -0
  69. package/lib/webrtc/errors.d.ts.map +1 -0
  70. package/lib/webrtc/errors.js +18 -0
  71. package/lib/webrtc/errors.js.map +1 -0
  72. package/lib/webrtc/errors.mjs +14 -0
  73. package/lib/webrtc/errors.mjs.map +1 -0
  74. package/lib/webrtc/subscriptions.d.mts +13 -0
  75. package/lib/webrtc/subscriptions.d.mts.map +1 -0
  76. package/lib/webrtc/subscriptions.d.ts +13 -0
  77. package/lib/webrtc/subscriptions.d.ts.map +1 -0
  78. package/lib/webrtc/subscriptions.js +62 -0
  79. package/lib/webrtc/subscriptions.js.map +1 -0
  80. package/lib/webrtc/subscriptions.mjs +58 -0
  81. package/lib/webrtc/subscriptions.mjs.map +1 -0
  82. package/lib/webrtc/types.d.mts +99 -0
  83. package/lib/webrtc/types.d.mts.map +1 -0
  84. package/lib/webrtc/types.d.ts +99 -0
  85. package/lib/webrtc/types.d.ts.map +1 -0
  86. package/lib/webrtc/types.js +3 -0
  87. package/lib/webrtc/types.js.map +1 -0
  88. package/lib/webrtc/types.mjs +2 -0
  89. package/lib/webrtc/types.mjs.map +1 -0
  90. package/live/webrtc.d.mts +3 -0
  91. package/live/webrtc.d.mts.map +1 -0
  92. package/live/webrtc.d.ts +3 -0
  93. package/live/webrtc.d.ts.map +1 -0
  94. package/live/webrtc.js +8 -0
  95. package/live/webrtc.js.map +1 -0
  96. package/live/webrtc.mjs +2 -0
  97. package/live/webrtc.mjs.map +1 -0
  98. package/package.json +11 -1
  99. package/realtime/webrtc.d.mts +3 -0
  100. package/realtime/webrtc.d.mts.map +1 -0
  101. package/realtime/webrtc.d.ts +3 -0
  102. package/realtime/webrtc.d.ts.map +1 -0
  103. package/realtime/webrtc.js +8 -0
  104. package/realtime/webrtc.js.map +1 -0
  105. package/realtime/webrtc.mjs +2 -0
  106. package/realtime/webrtc.mjs.map +1 -0
  107. package/resources/beta/responses/responses.d.mts +48 -0
  108. package/resources/beta/responses/responses.d.mts.map +1 -1
  109. package/resources/beta/responses/responses.d.ts +48 -0
  110. package/resources/beta/responses/responses.d.ts.map +1 -1
  111. package/resources/beta/responses/responses.js.map +1 -1
  112. package/resources/beta/responses/responses.mjs.map +1 -1
  113. package/resources/conversations/items.d.mts +16 -0
  114. package/resources/conversations/items.d.mts.map +1 -1
  115. package/resources/conversations/items.d.ts +16 -0
  116. package/resources/conversations/items.d.ts.map +1 -1
  117. package/resources/index.d.mts +1 -0
  118. package/resources/index.d.mts.map +1 -1
  119. package/resources/index.d.ts +1 -0
  120. package/resources/index.d.ts.map +1 -1
  121. package/resources/index.js +3 -1
  122. package/resources/index.js.map +1 -1
  123. package/resources/index.mjs +1 -0
  124. package/resources/index.mjs.map +1 -1
  125. package/resources/live/forks/forks.d.mts +110 -0
  126. package/resources/live/forks/forks.d.mts.map +1 -0
  127. package/resources/live/forks/forks.d.ts +110 -0
  128. package/resources/live/forks/forks.d.ts.map +1 -0
  129. package/resources/live/forks/forks.js +9 -0
  130. package/resources/live/forks/forks.js.map +1 -0
  131. package/resources/live/forks/forks.mjs +5 -0
  132. package/resources/live/forks/forks.mjs.map +1 -0
  133. package/resources/live/forks/index.d.mts +4 -0
  134. package/resources/live/forks/index.d.mts.map +1 -0
  135. package/resources/live/forks/index.d.ts +4 -0
  136. package/resources/live/forks/index.d.ts.map +1 -0
  137. package/resources/live/forks/index.js +7 -0
  138. package/resources/live/forks/index.js.map +1 -0
  139. package/resources/live/forks/index.mjs +3 -0
  140. package/resources/live/forks/index.mjs.map +1 -0
  141. package/resources/live/forks/internal-base.d.mts +73 -0
  142. package/resources/live/forks/internal-base.d.mts.map +1 -0
  143. package/resources/live/forks/internal-base.d.ts +73 -0
  144. package/resources/live/forks/internal-base.d.ts.map +1 -0
  145. package/resources/live/forks/internal-base.js +49 -0
  146. package/resources/live/forks/internal-base.js.map +1 -0
  147. package/resources/live/forks/internal-base.mjs +43 -0
  148. package/resources/live/forks/internal-base.mjs.map +1 -0
  149. package/resources/live/forks/ws-base.d.mts +109 -0
  150. package/resources/live/forks/ws-base.d.mts.map +1 -0
  151. package/resources/live/forks/ws-base.d.ts +109 -0
  152. package/resources/live/forks/ws-base.d.ts.map +1 -0
  153. package/resources/live/forks/ws-base.js +476 -0
  154. package/resources/live/forks/ws-base.js.map +1 -0
  155. package/resources/live/forks/ws-base.mjs +472 -0
  156. package/resources/live/forks/ws-base.mjs.map +1 -0
  157. package/resources/live/forks/ws.d.mts +13 -0
  158. package/resources/live/forks/ws.d.mts.map +1 -0
  159. package/resources/live/forks/ws.d.ts +13 -0
  160. package/resources/live/forks/ws.d.ts.map +1 -0
  161. package/resources/live/forks/ws.js +34 -0
  162. package/resources/live/forks/ws.js.map +1 -0
  163. package/resources/live/forks/ws.mjs +29 -0
  164. package/resources/live/forks/ws.mjs.map +1 -0
  165. package/resources/live/forks.d.mts +2 -0
  166. package/resources/live/forks.d.mts.map +1 -0
  167. package/resources/live/forks.d.ts +2 -0
  168. package/resources/live/forks.d.ts.map +1 -0
  169. package/resources/live/forks.js +6 -0
  170. package/resources/live/forks.js.map +1 -0
  171. package/resources/live/forks.mjs +3 -0
  172. package/resources/live/forks.mjs.map +1 -0
  173. package/resources/live/index.d.mts +7 -0
  174. package/resources/live/index.d.mts.map +1 -0
  175. package/resources/live/index.d.ts +7 -0
  176. package/resources/live/index.d.ts.map +1 -0
  177. package/resources/live/index.js +13 -0
  178. package/resources/live/index.js.map +1 -0
  179. package/resources/live/index.mjs +6 -0
  180. package/resources/live/index.mjs.map +1 -0
  181. package/resources/live/internal-base.d.mts +71 -0
  182. package/resources/live/internal-base.d.mts.map +1 -0
  183. package/resources/live/internal-base.d.ts +71 -0
  184. package/resources/live/internal-base.d.ts.map +1 -0
  185. package/resources/live/internal-base.js +48 -0
  186. package/resources/live/internal-base.js.map +1 -0
  187. package/resources/live/internal-base.mjs +42 -0
  188. package/resources/live/internal-base.mjs.map +1 -0
  189. package/resources/live/live.d.mts +1864 -0
  190. package/resources/live/live.d.mts.map +1 -0
  191. package/resources/live/live.d.ts +1864 -0
  192. package/resources/live/live.d.ts.map +1 -0
  193. package/resources/live/live.js +40 -0
  194. package/resources/live/live.js.map +1 -0
  195. package/resources/live/live.mjs +35 -0
  196. package/resources/live/live.mjs.map +1 -0
  197. package/resources/live/sessions.d.mts +254 -0
  198. package/resources/live/sessions.d.mts.map +1 -0
  199. package/resources/live/sessions.d.ts +254 -0
  200. package/resources/live/sessions.d.ts.map +1 -0
  201. package/resources/live/sessions.js +118 -0
  202. package/resources/live/sessions.js.map +1 -0
  203. package/resources/live/sessions.mjs +114 -0
  204. package/resources/live/sessions.mjs.map +1 -0
  205. package/resources/live/sideband/index.d.mts +4 -0
  206. package/resources/live/sideband/index.d.mts.map +1 -0
  207. package/resources/live/sideband/index.d.ts +4 -0
  208. package/resources/live/sideband/index.d.ts.map +1 -0
  209. package/resources/live/sideband/index.js +7 -0
  210. package/resources/live/sideband/index.js.map +1 -0
  211. package/resources/live/sideband/index.mjs +3 -0
  212. package/resources/live/sideband/index.mjs.map +1 -0
  213. package/resources/live/sideband/internal-base.d.mts +73 -0
  214. package/resources/live/sideband/internal-base.d.mts.map +1 -0
  215. package/resources/live/sideband/internal-base.d.ts +73 -0
  216. package/resources/live/sideband/internal-base.d.ts.map +1 -0
  217. package/resources/live/sideband/internal-base.js +49 -0
  218. package/resources/live/sideband/internal-base.js.map +1 -0
  219. package/resources/live/sideband/internal-base.mjs +43 -0
  220. package/resources/live/sideband/internal-base.mjs.map +1 -0
  221. package/resources/live/sideband/sideband.d.mts +25 -0
  222. package/resources/live/sideband/sideband.d.mts.map +1 -0
  223. package/resources/live/sideband/sideband.d.ts +25 -0
  224. package/resources/live/sideband/sideband.d.ts.map +1 -0
  225. package/resources/live/sideband/sideband.js +9 -0
  226. package/resources/live/sideband/sideband.js.map +1 -0
  227. package/resources/live/sideband/sideband.mjs +5 -0
  228. package/resources/live/sideband/sideband.mjs.map +1 -0
  229. package/resources/live/sideband/ws-base.d.mts +114 -0
  230. package/resources/live/sideband/ws-base.d.mts.map +1 -0
  231. package/resources/live/sideband/ws-base.d.ts +114 -0
  232. package/resources/live/sideband/ws-base.d.ts.map +1 -0
  233. package/resources/live/sideband/ws-base.js +476 -0
  234. package/resources/live/sideband/ws-base.js.map +1 -0
  235. package/resources/live/sideband/ws-base.mjs +472 -0
  236. package/resources/live/sideband/ws-base.mjs.map +1 -0
  237. package/resources/live/sideband/ws.d.mts +13 -0
  238. package/resources/live/sideband/ws.d.mts.map +1 -0
  239. package/resources/live/sideband/ws.d.ts +13 -0
  240. package/resources/live/sideband/ws.d.ts.map +1 -0
  241. package/resources/live/sideband/ws.js +34 -0
  242. package/resources/live/sideband/ws.js.map +1 -0
  243. package/resources/live/sideband/ws.mjs +29 -0
  244. package/resources/live/sideband/ws.mjs.map +1 -0
  245. package/resources/live/sideband.d.mts +2 -0
  246. package/resources/live/sideband.d.mts.map +1 -0
  247. package/resources/live/sideband.d.ts +2 -0
  248. package/resources/live/sideband.d.ts.map +1 -0
  249. package/resources/live/sideband.js +6 -0
  250. package/resources/live/sideband.js.map +1 -0
  251. package/resources/live/sideband.mjs +3 -0
  252. package/resources/live/sideband.mjs.map +1 -0
  253. package/resources/live/ws-base.d.mts +106 -0
  254. package/resources/live/ws-base.d.mts.map +1 -0
  255. package/resources/live/ws-base.d.ts +106 -0
  256. package/resources/live/ws-base.d.ts.map +1 -0
  257. package/resources/live/ws-base.js +476 -0
  258. package/resources/live/ws-base.js.map +1 -0
  259. package/resources/live/ws-base.mjs +472 -0
  260. package/resources/live/ws-base.mjs.map +1 -0
  261. package/resources/live/ws.d.mts +13 -0
  262. package/resources/live/ws.d.mts.map +1 -0
  263. package/resources/live/ws.d.ts +13 -0
  264. package/resources/live/ws.d.ts.map +1 -0
  265. package/resources/live/ws.js +34 -0
  266. package/resources/live/ws.js.map +1 -0
  267. package/resources/live/ws.mjs +29 -0
  268. package/resources/live/ws.mjs.map +1 -0
  269. package/resources/live.d.mts +2 -0
  270. package/resources/live.d.mts.map +1 -0
  271. package/resources/live.d.ts +2 -0
  272. package/resources/live.d.ts.map +1 -0
  273. package/resources/live.js +6 -0
  274. package/resources/live.js.map +1 -0
  275. package/resources/live.mjs +3 -0
  276. package/resources/live.mjs.map +1 -0
  277. package/resources/responses/responses.d.mts +48 -0
  278. package/resources/responses/responses.d.mts.map +1 -1
  279. package/resources/responses/responses.d.ts +48 -0
  280. package/resources/responses/responses.d.ts.map +1 -1
  281. package/resources/responses/responses.js.map +1 -1
  282. package/resources/responses/responses.mjs.map +1 -1
  283. package/resources/webhooks/webhooks.d.mts +72 -5
  284. package/resources/webhooks/webhooks.d.mts.map +1 -1
  285. package/resources/webhooks/webhooks.d.ts +72 -5
  286. package/resources/webhooks/webhooks.d.ts.map +1 -1
  287. package/src/client.ts +5 -0
  288. package/src/helpers/live.ts +8 -0
  289. package/src/lib/live/transcript-grouper.ts +303 -0
  290. package/src/lib/live/transcript-grouping.ts +362 -0
  291. package/src/lib/live/webrtc.ts +23 -0
  292. package/src/lib/realtime/webrtc.ts +20 -0
  293. package/src/lib/webrtc/connection.ts +309 -0
  294. package/src/lib/webrtc/data-channel.ts +144 -0
  295. package/src/lib/webrtc/errors.ts +38 -0
  296. package/src/lib/webrtc/subscriptions.ts +62 -0
  297. package/src/lib/webrtc/types.ts +109 -0
  298. package/src/live/webrtc.ts +10 -0
  299. package/src/realtime/webrtc.ts +10 -0
  300. package/src/resources/beta/responses/responses.ts +60 -0
  301. package/src/resources/conversations/items.ts +20 -0
  302. package/src/resources/index.ts +1 -0
  303. package/src/resources/live/api.md +87 -0
  304. package/src/resources/live/forks/forks.ts +169 -0
  305. package/src/resources/live/forks/index.ts +5 -0
  306. package/src/resources/live/forks/internal-base.ts +107 -0
  307. package/src/resources/live/forks/ws-base.ts +611 -0
  308. package/src/resources/live/forks/ws.ts +46 -0
  309. package/src/resources/live/forks.ts +3 -0
  310. package/src/resources/live/index.ts +20 -0
  311. package/src/resources/live/internal-base.ts +104 -0
  312. package/src/resources/live/live.ts +2296 -0
  313. package/src/resources/live/sessions.ts +337 -0
  314. package/src/resources/live/sideband/index.ts +10 -0
  315. package/src/resources/live/sideband/internal-base.ts +107 -0
  316. package/src/resources/live/sideband/sideband.ts +58 -0
  317. package/src/resources/live/sideband/ws-base.ts +621 -0
  318. package/src/resources/live/sideband/ws.ts +46 -0
  319. package/src/resources/live/sideband.ts +3 -0
  320. package/src/resources/live/ws-base.ts +607 -0
  321. package/src/resources/live/ws.ts +42 -0
  322. package/src/resources/live.ts +3 -0
  323. package/src/resources/responses/responses.ts +60 -0
  324. package/src/resources/webhooks/api.md +1 -0
  325. package/src/resources/webhooks/webhooks.ts +82 -3
  326. package/src/version.ts +1 -1
  327. package/version.d.mts +1 -1
  328. package/version.d.ts +1 -1
  329. package/version.js +1 -1
  330. package/version.mjs +1 -1
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TranscriptGrouper = void 0;
4
+ const EventEmitter_1 = require("../../core/EventEmitter.js");
5
+ const error_1 = require("../../core/error.js");
6
+ const transcript_grouping_1 = require("./transcript-grouping.js");
7
+ const SETTLE_MS = 50;
8
+ const MAX_TIMEOUT_MS = 2147483647;
9
+ let nextGrouperId = 0;
10
+ function normalizeTranscript(event) {
11
+ const { event_id: id, delta: text, start_ms: startMs, end_ms: endMs } = event;
12
+ const speaker = event.type === 'session.input_transcript.delta' ? 'user' : 'assistant';
13
+ if (typeof id !== 'string' ||
14
+ !id ||
15
+ typeof text !== 'string' ||
16
+ !Number.isSafeInteger(startMs) ||
17
+ startMs < 0 ||
18
+ !Number.isSafeInteger(endMs) ||
19
+ endMs < startMs) {
20
+ throw new error_1.OpenAIError('Invalid Live transcript delta: expected an event ID, text, and a nonnegative timed interval');
21
+ }
22
+ return { id, speaker, text, startMs, endMs, receivedAt: performance.now() };
23
+ }
24
+ function optionsWithDefaults(options) {
25
+ const resolved = {
26
+ minTurnSeparationMs: options.minTurnSeparationMs ?? 500,
27
+ assistantSilenceMs: options.assistantSilenceMs ?? 2000,
28
+ backchannelMaxDurationMs: options.backchannelMaxDurationMs ?? 1000,
29
+ backchannelIsolationMs: options.backchannelIsolationMs ?? 2000,
30
+ };
31
+ for (const [name, value] of Object.entries(resolved)) {
32
+ if (!Number.isFinite(value) || value < 0 || value > MAX_TIMEOUT_MS) {
33
+ throw new error_1.OpenAIError(`${name} must be a finite number between 0 and ${MAX_TIMEOUT_MS}`);
34
+ }
35
+ }
36
+ return { ...resolved, additionalAcknowledgments: options.additionalAcknowledgments ?? [] };
37
+ }
38
+ /**
39
+ * Groups public Live transcript events using speaker and
40
+ * backchannel heuristics. Raw events remain available on your transport.
41
+ *
42
+ * Only session.input_transcript.delta, session.output_transcript.delta and session.closed are
43
+ * consumed. No audio, engine frames, server turn events or internal end markers
44
+ * are required. Ambiguous speaker changes settle for at most 50 ms. When source
45
+ * time stops arriving, a monotonic local clock supplies a best-effort inactivity
46
+ * fallback. Delayed delivery can therefore change grouping; this is not VAD,
47
+ * playback tracking, or a lossless transcript (some backchannels are suppressed).
48
+ *
49
+ * Create one instance per session. Call close() on transport loss or teardown;
50
+ * the grouper never owns or closes your transport and does not reconnect it.
51
+ */
52
+ // oxlint-disable-next-line unicorn/prefer-event-target -- This is the SDK's browser-compatible typed emitter, not node:events.
53
+ class TranscriptGrouper extends EventEmitter_1.EventEmitter {
54
+ /** Create a grouper with speaker-based defaults. Invalid timing options throw OpenAIError. */
55
+ constructor(options = {}) {
56
+ super();
57
+ this.seenIds = new Set();
58
+ this.pending = [];
59
+ this.closed = false;
60
+ this.dispatching = false;
61
+ this.updates = [];
62
+ this.grouping = new transcript_grouping_1.TranscriptGrouping(optionsWithDefaults(options), `segment_${nextGrouperId}`);
63
+ nextGrouperId += 1;
64
+ }
65
+ /**
66
+ * Consume one public Live event. Duplicate transcript event IDs and unrelated
67
+ * event types are ignored. Empty text does not count as speech activity.
68
+ * Malformed transcript fields or use after close() throw OpenAIError.
69
+ */
70
+ push(event) {
71
+ if (this.closed) {
72
+ throw new error_1.OpenAIError('Cannot push events after closing the transcript grouper');
73
+ }
74
+ if (event.type === 'session.closed') {
75
+ this.finish('session_closed');
76
+ return;
77
+ }
78
+ if (event.type !== 'session.input_transcript.delta' && event.type !== 'session.output_transcript.delta') {
79
+ return;
80
+ }
81
+ const fragment = normalizeTranscript(event);
82
+ const { id, startMs, endMs, speaker } = fragment;
83
+ if (this.seenIds.has(id)) {
84
+ return;
85
+ }
86
+ this.seenIds.add(id);
87
+ if (!fragment.text) {
88
+ return;
89
+ }
90
+ const updates = [];
91
+ const [pending] = this.pending;
92
+ if (pending && pending.startMs === startMs && pending.endMs === endMs) {
93
+ this.pending.push(fragment);
94
+ if (this.pending.some((part) => part.speaker !== speaker)) {
95
+ updates.push(...this.flushPending());
96
+ }
97
+ }
98
+ else {
99
+ updates.push(...this.flushPending());
100
+ if (this.grouping.speaker === speaker) {
101
+ updates.push(...this.commit([fragment]));
102
+ }
103
+ else {
104
+ this.pending.push(fragment);
105
+ }
106
+ }
107
+ this.schedule();
108
+ this.dispatch(updates);
109
+ }
110
+ /**
111
+ * Flush buffered text according to the grouping policy, finalize all emitted
112
+ * segments, and cancel timers. Idempotent; further push() calls fail. Does not
113
+ * close the transport. Invoke before discarding the grouper at session teardown.
114
+ */
115
+ close() {
116
+ this.finish('manual');
117
+ }
118
+ finish(reason) {
119
+ if (this.closed) {
120
+ return;
121
+ }
122
+ this.closed = true;
123
+ this.clearTimer();
124
+ const updates = this.flushPending();
125
+ updates.push(...this.grouping.close(this.sourceNow(), reason));
126
+ this.seenIds.clear();
127
+ this.dispatch(updates);
128
+ }
129
+ commit(fragments) {
130
+ const [first] = fragments;
131
+ if (!first) {
132
+ return [];
133
+ }
134
+ const updates = [];
135
+ if (this.lastStartMs !== undefined && first.startMs < this.lastStartMs) {
136
+ updates.push(...this.grouping.close(this.sourceNow(), 'timestamp_reset'));
137
+ this.anchor = undefined;
138
+ }
139
+ this.lastStartMs = first.startMs;
140
+ // Overlapping intervals can end before earlier ones. Preserve the source
141
+ // high-water mark while restarting local inactivity on newly received text.
142
+ this.anchor = {
143
+ sourceMs: Math.max(this.anchor?.sourceMs ?? 0, first.endMs),
144
+ receivedAt: first.receivedAt,
145
+ };
146
+ for (const part of fragments) {
147
+ this.anchor.sourceMs = Math.max(this.anchor.sourceMs, part.endMs);
148
+ this.anchor.receivedAt = Math.max(this.anchor.receivedAt, part.receivedAt);
149
+ }
150
+ updates.push(...this.grouping.process(fragments));
151
+ return updates;
152
+ }
153
+ flushPending() {
154
+ const { pending } = this;
155
+ this.pending = [];
156
+ return this.commit(pending);
157
+ }
158
+ sourceNow() {
159
+ return this.anchor ? this.anchor.sourceMs + Math.max(0, performance.now() - this.anchor.receivedAt) : 0;
160
+ }
161
+ clearTimer() {
162
+ if (this.timer !== undefined) {
163
+ clearTimeout(this.timer);
164
+ }
165
+ this.timer = undefined;
166
+ }
167
+ schedule() {
168
+ this.clearTimer();
169
+ if (this.closed) {
170
+ return;
171
+ }
172
+ const [pending] = this.pending;
173
+ const deadline = this.grouping.deadline();
174
+ // Settle newly arrived text before applying an older inactivity deadline.
175
+ let delay;
176
+ if (pending) {
177
+ delay = pending.receivedAt + SETTLE_MS - performance.now();
178
+ }
179
+ else if (deadline !== undefined) {
180
+ delay = deadline - this.sourceNow();
181
+ }
182
+ if (delay === undefined) {
183
+ return;
184
+ }
185
+ this.timer = setTimeout(() => {
186
+ this.timer = undefined;
187
+ const updates = this.flushPending();
188
+ updates.push(...this.grouping.advance(this.sourceNow()));
189
+ this.schedule();
190
+ this.dispatch(updates);
191
+ }, Math.min(MAX_TIMEOUT_MS, Math.max(0, Math.ceil(delay))));
192
+ const timer = this.timer;
193
+ if (typeof timer === 'object' &&
194
+ timer !== null &&
195
+ 'unref' in timer &&
196
+ typeof timer.unref === 'function') {
197
+ timer.unref();
198
+ }
199
+ }
200
+ dispatch(updates) {
201
+ this.updates.push(...updates);
202
+ if (this.dispatching) {
203
+ return;
204
+ }
205
+ this.dispatching = true;
206
+ try {
207
+ while (this.updates.length) {
208
+ const update = this.updates.shift();
209
+ if (update?.type === 'updated') {
210
+ this._emit('segment.updated', update.segment);
211
+ }
212
+ else if (update) {
213
+ this._emit('segment.closed', { segment: update.segment, reason: update.reason });
214
+ }
215
+ }
216
+ }
217
+ finally {
218
+ this.dispatching = false;
219
+ }
220
+ }
221
+ }
222
+ exports.TranscriptGrouper = TranscriptGrouper;
223
+ //# sourceMappingURL=transcript-grouper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-grouper.js","sourceRoot":"","sources":["../../src/lib/live/transcript-grouper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ import { EventEmitter } from "../../core/EventEmitter.mjs";
2
+ import { OpenAIError } from "../../core/error.mjs";
3
+ import { TranscriptGrouping } from "./transcript-grouping.mjs";
4
+ const SETTLE_MS = 50;
5
+ const MAX_TIMEOUT_MS = 2147483647;
6
+ let nextGrouperId = 0;
7
+ function normalizeTranscript(event) {
8
+ const { event_id: id, delta: text, start_ms: startMs, end_ms: endMs } = event;
9
+ const speaker = event.type === 'session.input_transcript.delta' ? 'user' : 'assistant';
10
+ if (typeof id !== 'string' ||
11
+ !id ||
12
+ typeof text !== 'string' ||
13
+ !Number.isSafeInteger(startMs) ||
14
+ startMs < 0 ||
15
+ !Number.isSafeInteger(endMs) ||
16
+ endMs < startMs) {
17
+ throw new OpenAIError('Invalid Live transcript delta: expected an event ID, text, and a nonnegative timed interval');
18
+ }
19
+ return { id, speaker, text, startMs, endMs, receivedAt: performance.now() };
20
+ }
21
+ function optionsWithDefaults(options) {
22
+ const resolved = {
23
+ minTurnSeparationMs: options.minTurnSeparationMs ?? 500,
24
+ assistantSilenceMs: options.assistantSilenceMs ?? 2000,
25
+ backchannelMaxDurationMs: options.backchannelMaxDurationMs ?? 1000,
26
+ backchannelIsolationMs: options.backchannelIsolationMs ?? 2000,
27
+ };
28
+ for (const [name, value] of Object.entries(resolved)) {
29
+ if (!Number.isFinite(value) || value < 0 || value > MAX_TIMEOUT_MS) {
30
+ throw new OpenAIError(`${name} must be a finite number between 0 and ${MAX_TIMEOUT_MS}`);
31
+ }
32
+ }
33
+ return { ...resolved, additionalAcknowledgments: options.additionalAcknowledgments ?? [] };
34
+ }
35
+ /**
36
+ * Groups public Live transcript events using speaker and
37
+ * backchannel heuristics. Raw events remain available on your transport.
38
+ *
39
+ * Only session.input_transcript.delta, session.output_transcript.delta and session.closed are
40
+ * consumed. No audio, engine frames, server turn events or internal end markers
41
+ * are required. Ambiguous speaker changes settle for at most 50 ms. When source
42
+ * time stops arriving, a monotonic local clock supplies a best-effort inactivity
43
+ * fallback. Delayed delivery can therefore change grouping; this is not VAD,
44
+ * playback tracking, or a lossless transcript (some backchannels are suppressed).
45
+ *
46
+ * Create one instance per session. Call close() on transport loss or teardown;
47
+ * the grouper never owns or closes your transport and does not reconnect it.
48
+ */
49
+ // oxlint-disable-next-line unicorn/prefer-event-target -- This is the SDK's browser-compatible typed emitter, not node:events.
50
+ export class TranscriptGrouper extends EventEmitter {
51
+ /** Create a grouper with speaker-based defaults. Invalid timing options throw OpenAIError. */
52
+ constructor(options = {}) {
53
+ super();
54
+ this.seenIds = new Set();
55
+ this.pending = [];
56
+ this.closed = false;
57
+ this.dispatching = false;
58
+ this.updates = [];
59
+ this.grouping = new TranscriptGrouping(optionsWithDefaults(options), `segment_${nextGrouperId}`);
60
+ nextGrouperId += 1;
61
+ }
62
+ /**
63
+ * Consume one public Live event. Duplicate transcript event IDs and unrelated
64
+ * event types are ignored. Empty text does not count as speech activity.
65
+ * Malformed transcript fields or use after close() throw OpenAIError.
66
+ */
67
+ push(event) {
68
+ if (this.closed) {
69
+ throw new OpenAIError('Cannot push events after closing the transcript grouper');
70
+ }
71
+ if (event.type === 'session.closed') {
72
+ this.finish('session_closed');
73
+ return;
74
+ }
75
+ if (event.type !== 'session.input_transcript.delta' && event.type !== 'session.output_transcript.delta') {
76
+ return;
77
+ }
78
+ const fragment = normalizeTranscript(event);
79
+ const { id, startMs, endMs, speaker } = fragment;
80
+ if (this.seenIds.has(id)) {
81
+ return;
82
+ }
83
+ this.seenIds.add(id);
84
+ if (!fragment.text) {
85
+ return;
86
+ }
87
+ const updates = [];
88
+ const [pending] = this.pending;
89
+ if (pending && pending.startMs === startMs && pending.endMs === endMs) {
90
+ this.pending.push(fragment);
91
+ if (this.pending.some((part) => part.speaker !== speaker)) {
92
+ updates.push(...this.flushPending());
93
+ }
94
+ }
95
+ else {
96
+ updates.push(...this.flushPending());
97
+ if (this.grouping.speaker === speaker) {
98
+ updates.push(...this.commit([fragment]));
99
+ }
100
+ else {
101
+ this.pending.push(fragment);
102
+ }
103
+ }
104
+ this.schedule();
105
+ this.dispatch(updates);
106
+ }
107
+ /**
108
+ * Flush buffered text according to the grouping policy, finalize all emitted
109
+ * segments, and cancel timers. Idempotent; further push() calls fail. Does not
110
+ * close the transport. Invoke before discarding the grouper at session teardown.
111
+ */
112
+ close() {
113
+ this.finish('manual');
114
+ }
115
+ finish(reason) {
116
+ if (this.closed) {
117
+ return;
118
+ }
119
+ this.closed = true;
120
+ this.clearTimer();
121
+ const updates = this.flushPending();
122
+ updates.push(...this.grouping.close(this.sourceNow(), reason));
123
+ this.seenIds.clear();
124
+ this.dispatch(updates);
125
+ }
126
+ commit(fragments) {
127
+ const [first] = fragments;
128
+ if (!first) {
129
+ return [];
130
+ }
131
+ const updates = [];
132
+ if (this.lastStartMs !== undefined && first.startMs < this.lastStartMs) {
133
+ updates.push(...this.grouping.close(this.sourceNow(), 'timestamp_reset'));
134
+ this.anchor = undefined;
135
+ }
136
+ this.lastStartMs = first.startMs;
137
+ // Overlapping intervals can end before earlier ones. Preserve the source
138
+ // high-water mark while restarting local inactivity on newly received text.
139
+ this.anchor = {
140
+ sourceMs: Math.max(this.anchor?.sourceMs ?? 0, first.endMs),
141
+ receivedAt: first.receivedAt,
142
+ };
143
+ for (const part of fragments) {
144
+ this.anchor.sourceMs = Math.max(this.anchor.sourceMs, part.endMs);
145
+ this.anchor.receivedAt = Math.max(this.anchor.receivedAt, part.receivedAt);
146
+ }
147
+ updates.push(...this.grouping.process(fragments));
148
+ return updates;
149
+ }
150
+ flushPending() {
151
+ const { pending } = this;
152
+ this.pending = [];
153
+ return this.commit(pending);
154
+ }
155
+ sourceNow() {
156
+ return this.anchor ? this.anchor.sourceMs + Math.max(0, performance.now() - this.anchor.receivedAt) : 0;
157
+ }
158
+ clearTimer() {
159
+ if (this.timer !== undefined) {
160
+ clearTimeout(this.timer);
161
+ }
162
+ this.timer = undefined;
163
+ }
164
+ schedule() {
165
+ this.clearTimer();
166
+ if (this.closed) {
167
+ return;
168
+ }
169
+ const [pending] = this.pending;
170
+ const deadline = this.grouping.deadline();
171
+ // Settle newly arrived text before applying an older inactivity deadline.
172
+ let delay;
173
+ if (pending) {
174
+ delay = pending.receivedAt + SETTLE_MS - performance.now();
175
+ }
176
+ else if (deadline !== undefined) {
177
+ delay = deadline - this.sourceNow();
178
+ }
179
+ if (delay === undefined) {
180
+ return;
181
+ }
182
+ this.timer = setTimeout(() => {
183
+ this.timer = undefined;
184
+ const updates = this.flushPending();
185
+ updates.push(...this.grouping.advance(this.sourceNow()));
186
+ this.schedule();
187
+ this.dispatch(updates);
188
+ }, Math.min(MAX_TIMEOUT_MS, Math.max(0, Math.ceil(delay))));
189
+ const timer = this.timer;
190
+ if (typeof timer === 'object' &&
191
+ timer !== null &&
192
+ 'unref' in timer &&
193
+ typeof timer.unref === 'function') {
194
+ timer.unref();
195
+ }
196
+ }
197
+ dispatch(updates) {
198
+ this.updates.push(...updates);
199
+ if (this.dispatching) {
200
+ return;
201
+ }
202
+ this.dispatching = true;
203
+ try {
204
+ while (this.updates.length) {
205
+ const update = this.updates.shift();
206
+ if (update?.type === 'updated') {
207
+ this._emit('segment.updated', update.segment);
208
+ }
209
+ else if (update) {
210
+ this._emit('segment.closed', { segment: update.segment, reason: update.reason });
211
+ }
212
+ }
213
+ }
214
+ finally {
215
+ this.dispatching = false;
216
+ }
217
+ }
218
+ }
219
+ //# sourceMappingURL=transcript-grouper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-grouper.mjs","sourceRoot":"","sources":["../../src/lib/live/transcript-grouper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { TranscriptGrouperOptions, TranscriptSegment, TranscriptSegmentCloseReason } from "./transcript-grouper.mjs";
2
+ export interface TranscriptFragment {
3
+ speaker: 'user' | 'assistant';
4
+ text: string;
5
+ startMs: number;
6
+ endMs: number;
7
+ }
8
+ export type GroupingUpdate = {
9
+ type: 'updated';
10
+ segment: TranscriptSegment;
11
+ } | {
12
+ type: 'closed';
13
+ segment: TranscriptSegment;
14
+ reason: TranscriptSegmentCloseReason;
15
+ };
16
+ /** The v2 grouping policy, driven by timed public text rather than engine frames. */
17
+ export declare class TranscriptGrouping {
18
+ private current;
19
+ private buffered;
20
+ private lastId;
21
+ private nextId;
22
+ private lastAssistantEnd;
23
+ private readonly options;
24
+ private readonly idPrefix;
25
+ private readonly acknowledgments;
26
+ constructor(options: Required<TranscriptGrouperOptions>, idPrefix: string);
27
+ get speaker(): TranscriptFragment['speaker'] | undefined;
28
+ process(fragments: readonly TranscriptFragment[]): GroupingUpdate[];
29
+ advance(timeMs: number, hasIncomingUser?: boolean): GroupingUpdate[];
30
+ deadline(): number | undefined;
31
+ close(timeMs: number, reason: TranscriptSegmentCloseReason): GroupingUpdate[];
32
+ private ingest;
33
+ private newTurn;
34
+ private static append;
35
+ private buffer;
36
+ private promote;
37
+ private finishCurrent;
38
+ private finish;
39
+ private emit;
40
+ private static snapshot;
41
+ private mightBeBackchannel;
42
+ private userContinued;
43
+ private recentAssistant;
44
+ private keepBackchannel;
45
+ private maybeDropBackchannel;
46
+ private standaloneAcknowledgment;
47
+ private possibleAcknowledgment;
48
+ }
49
+ //# sourceMappingURL=transcript-grouping.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-grouping.d.mts","sourceRoot":"","sources":["../../src/lib/live/transcript-grouping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,4BAA4B,EAC7B,iCAA6B;AAE9B,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAuCzF,qFAAqF;AACrF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM;IASzE,IAAI,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,GAAG,SAAS,CAEvD;IAED,OAAO,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,GAAG,cAAc,EAAE;IAgCnE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,UAAQ,GAAG,cAAc,EAAE;IAsBlE,QAAQ,IAAI,MAAM,GAAG,SAAS;IAqB9B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,GAAG,cAAc,EAAE;IAa7E,OAAO,CAAC,MAAM;IA2Cd,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,MAAM,CAAC,QAAQ;IAWvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,sBAAsB;CAQ/B"}
@@ -0,0 +1,49 @@
1
+ import type { TranscriptGrouperOptions, TranscriptSegment, TranscriptSegmentCloseReason } from "./transcript-grouper.js";
2
+ export interface TranscriptFragment {
3
+ speaker: 'user' | 'assistant';
4
+ text: string;
5
+ startMs: number;
6
+ endMs: number;
7
+ }
8
+ export type GroupingUpdate = {
9
+ type: 'updated';
10
+ segment: TranscriptSegment;
11
+ } | {
12
+ type: 'closed';
13
+ segment: TranscriptSegment;
14
+ reason: TranscriptSegmentCloseReason;
15
+ };
16
+ /** The v2 grouping policy, driven by timed public text rather than engine frames. */
17
+ export declare class TranscriptGrouping {
18
+ private current;
19
+ private buffered;
20
+ private lastId;
21
+ private nextId;
22
+ private lastAssistantEnd;
23
+ private readonly options;
24
+ private readonly idPrefix;
25
+ private readonly acknowledgments;
26
+ constructor(options: Required<TranscriptGrouperOptions>, idPrefix: string);
27
+ get speaker(): TranscriptFragment['speaker'] | undefined;
28
+ process(fragments: readonly TranscriptFragment[]): GroupingUpdate[];
29
+ advance(timeMs: number, hasIncomingUser?: boolean): GroupingUpdate[];
30
+ deadline(): number | undefined;
31
+ close(timeMs: number, reason: TranscriptSegmentCloseReason): GroupingUpdate[];
32
+ private ingest;
33
+ private newTurn;
34
+ private static append;
35
+ private buffer;
36
+ private promote;
37
+ private finishCurrent;
38
+ private finish;
39
+ private emit;
40
+ private static snapshot;
41
+ private mightBeBackchannel;
42
+ private userContinued;
43
+ private recentAssistant;
44
+ private keepBackchannel;
45
+ private maybeDropBackchannel;
46
+ private standaloneAcknowledgment;
47
+ private possibleAcknowledgment;
48
+ }
49
+ //# sourceMappingURL=transcript-grouping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-grouping.d.ts","sourceRoot":"","sources":["../../src/lib/live/transcript-grouping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,4BAA4B,EAC7B,gCAA6B;AAE9B,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAuCzF,qFAAqF;AACrF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM;IASzE,IAAI,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,GAAG,SAAS,CAEvD;IAED,OAAO,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,GAAG,cAAc,EAAE;IAgCnE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,UAAQ,GAAG,cAAc,EAAE;IAsBlE,QAAQ,IAAI,MAAM,GAAG,SAAS;IAqB9B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,GAAG,cAAc,EAAE;IAa7E,OAAO,CAAC,MAAM;IA2Cd,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,MAAM,CAAC,QAAQ;IAWvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,sBAAsB;CAQ/B"}