@assistant-ui/react 0.15.28 → 0.15.30

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 (71) hide show
  1. package/dist/adapters/OpenAIRealtimeVoiceAdapter.d.ts +22 -0
  2. package/dist/adapters/OpenAIRealtimeVoiceAdapter.d.ts.map +1 -0
  3. package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +297 -0
  4. package/dist/adapters/OpenAIRealtimeVoiceAdapter.js.map +1 -0
  5. package/dist/context/stores/ThreadViewport.d.ts +8 -0
  6. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  7. package/dist/context/stores/ThreadViewport.js +24 -8
  8. package/dist/context/stores/ThreadViewport.js.map +1 -1
  9. package/dist/index.d.ts +2 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -2
  12. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +1 -1
  13. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  14. package/dist/mcp-apps/McpAppRenderer.js +5 -1
  15. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  16. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
  17. package/dist/model-context/frame/useAssistantFrameHost.js +67 -46
  18. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  19. package/dist/model-context/makeAssistantVisible.js +1 -1
  20. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  21. package/dist/primitives/composer/ComposerAddAttachment.js +28 -10
  22. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  23. package/dist/primitives/composer/ComposerInput.d.ts +4 -1
  24. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  25. package/dist/primitives/composer/ComposerInput.js +15 -2
  26. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  27. package/dist/primitives/composer/ComposerResume.d.ts +23 -0
  28. package/dist/primitives/composer/ComposerResume.d.ts.map +1 -0
  29. package/dist/primitives/composer/ComposerResume.js +34 -0
  30. package/dist/primitives/composer/ComposerResume.js.map +1 -0
  31. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -1
  32. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -1
  33. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +6 -2
  34. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  35. package/dist/primitives/composer/trigger/triggerSelectionResource.js +4 -1
  36. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  37. package/dist/primitives/composer.d.ts +1 -0
  38. package/dist/primitives/composer.d.ts.map +1 -1
  39. package/dist/primitives/composer.js +3 -1
  40. package/dist/primitives/composer.js.map +1 -1
  41. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  42. package/dist/primitives/thread/useThreadViewportAutoScroll.js +32 -292
  43. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  44. package/dist/unstable/useMentionAdapter.js +1 -1
  45. package/dist/utils/Primitive.d.ts +14 -14
  46. package/dist/utils/hooks/useOnResizeContent.js +1 -1
  47. package/package.json +5 -5
  48. package/src/adapters/OpenAIRealtimeVoiceAdapter.test.ts +748 -0
  49. package/src/adapters/OpenAIRealtimeVoiceAdapter.ts +388 -0
  50. package/src/context/stores/ThreadViewport.ts +36 -8
  51. package/src/index.ts +6 -0
  52. package/src/mcp-apps/McpAppRenderer.test.tsx +65 -0
  53. package/src/mcp-apps/McpAppRenderer.tsx +13 -2
  54. package/src/model-context/frame/useAssistantFrameHost.detach.test.tsx +145 -0
  55. package/src/model-context/frame/useAssistantFrameHost.reload.test.tsx +106 -0
  56. package/src/model-context/frame/useAssistantFrameHost.test.tsx +3 -1
  57. package/src/model-context/frame/useAssistantFrameHost.ts +72 -24
  58. package/src/model-context/makeAssistantVisible.test.tsx +25 -37
  59. package/src/primitives/composer/ComposerAddAttachment.test.tsx +1 -0
  60. package/src/primitives/composer/ComposerAddAttachment.thread-scope.test.tsx +202 -0
  61. package/src/primitives/composer/ComposerAddAttachment.ts +11 -1
  62. package/src/primitives/composer/ComposerInput.focus-on-run-start.test.tsx +130 -0
  63. package/src/primitives/composer/ComposerInput.tsx +30 -4
  64. package/src/primitives/composer/ComposerResume.ts +36 -0
  65. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +24 -0
  66. package/src/primitives/composer/trigger/triggerSelectionResource.ts +14 -3
  67. package/src/primitives/composer/useAuiState.composer.test.tsx +84 -0
  68. package/src/primitives/composer.ts +1 -0
  69. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +90 -0
  70. package/src/primitives/thread/useThreadViewportAutoScroll.ts +48 -486
  71. package/src/model-context/frame/AssistantFrame.test.ts +0 -400
@@ -0,0 +1,22 @@
1
+ import { type RealtimeVoiceAdapter } from "@assistant-ui/core";
2
+ /** Options for a browser WebRTC connection to OpenAI Realtime. */
3
+ export type OpenAIRealtimeVoiceAdapterOptions = {
4
+ /** Exchange the browser's SDP offer for an answer through your authenticated server. Keep the API key and session configuration on the server. */
5
+ exchangeSdp: (sdp: string, options: {
6
+ signal: AbortSignal;
7
+ }) => Promise<string>;
8
+ };
9
+ /**
10
+ * Connects browser microphone audio directly to OpenAI Realtime over WebRTC.
11
+ * Configure audio output, input transcription, and automatic turn detection on
12
+ * the server. Each connection starts a new conversation; existing thread history
13
+ * and assistant-ui tools are not sent to the voice model.
14
+ */
15
+ export declare class OpenAIRealtimeVoiceAdapter implements RealtimeVoiceAdapter {
16
+ private readonly options;
17
+ constructor(options: OpenAIRealtimeVoiceAdapterOptions);
18
+ connect(options: {
19
+ abortSignal?: AbortSignal;
20
+ }): RealtimeVoiceAdapter.Session;
21
+ }
22
+ //# sourceMappingURL=OpenAIRealtimeVoiceAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIRealtimeVoiceAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/OpenAIRealtimeVoiceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,kEAAkE;AAClE,MAAM,MAAM,iCAAiC,GAAG;IAC9C,kJAAkJ;IAClJ,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,KAC7B,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB,CAAC;AAOF;;;;;GAKG;AACH,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;gBAEhD,OAAO,EAAE,iCAAiC;IAItD,OAAO,CAAC,OAAO,EAAE;QACf,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,GAAG,oBAAoB,CAAC,OAAO;CAiWjC"}
@@ -0,0 +1,297 @@
1
+ import { createVoiceSession } from "@assistant-ui/core";
2
+ //#region src/adapters/OpenAIRealtimeVoiceAdapter.ts
3
+ const asRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
4
+ /**
5
+ * Connects browser microphone audio directly to OpenAI Realtime over WebRTC.
6
+ * Configure audio output, input transcription, and automatic turn detection on
7
+ * the server. Each connection starts a new conversation; existing thread history
8
+ * and assistant-ui tools are not sent to the voice model.
9
+ */
10
+ var OpenAIRealtimeVoiceAdapter = class {
11
+ options;
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ connect(options) {
16
+ return createVoiceSession(options, async (session) => {
17
+ if (typeof RTCPeerConnection === "undefined" || typeof document === "undefined" || typeof navigator === "undefined" || !navigator.mediaDevices?.getUserMedia) throw new Error("OpenAI Realtime voice requires a browser with WebRTC and microphone access.");
18
+ const controller = new AbortController();
19
+ const peer = new RTCPeerConnection();
20
+ const channel = peer.createDataChannel("oai-events");
21
+ const audio = document.createElement("audio");
22
+ audio.autoplay = true;
23
+ let microphone;
24
+ let muted = false;
25
+ let closed = false;
26
+ let generating = false;
27
+ let speaking = false;
28
+ let transcribing = false;
29
+ let volumeTimer;
30
+ let connectionTimer;
31
+ let assistantTranscript;
32
+ const transcriptQueue = [];
33
+ const pendingTranscripts = /* @__PURE__ */ new Map();
34
+ const flushTranscripts = () => {
35
+ while (transcriptQueue[0]?.ready) {
36
+ const item = transcriptQueue[0];
37
+ item.ready = false;
38
+ if (item.value?.isFinal !== false) transcriptQueue.shift();
39
+ if (item.value) session.emitTranscript(item.value);
40
+ }
41
+ };
42
+ const finishUserTranscript = (id, value) => {
43
+ const item = typeof id === "string" ? pendingTranscripts.get(id) : void 0;
44
+ if (item) {
45
+ item.ready = true;
46
+ item.value = value;
47
+ pendingTranscripts.delete(id);
48
+ } else if (value) transcriptQueue.push({
49
+ ready: true,
50
+ value
51
+ });
52
+ flushTranscripts();
53
+ };
54
+ const pending = /* @__PURE__ */ new Map();
55
+ const disconnect = () => {
56
+ if (closed) return;
57
+ closed = true;
58
+ controller.abort();
59
+ clearInterval(volumeTimer);
60
+ clearTimeout(connectionTimer);
61
+ for (const id of pending.keys()) settle(id, /* @__PURE__ */ new Error("OpenAI Realtime session disconnected before accepting the message."));
62
+ pendingTranscripts.clear();
63
+ transcriptQueue.length = 0;
64
+ channel.onopen = channel.onmessage = channel.onclose = channel.onerror = null;
65
+ peer.ontrack = peer.onconnectionstatechange = null;
66
+ for (const track of microphone?.getTracks() ?? []) track.stop();
67
+ audio.pause();
68
+ audio.srcObject = null;
69
+ channel.close();
70
+ peer.close();
71
+ };
72
+ const end = (reason, error) => {
73
+ session.end(reason, error);
74
+ disconnect();
75
+ };
76
+ const send = (event) => {
77
+ if (closed || channel.readyState !== "open") throw new Error("OpenAI Realtime session is not connected.");
78
+ channel.send(JSON.stringify(event));
79
+ };
80
+ const request = (id, event) => new Promise((resolve, reject) => {
81
+ const timer = setTimeout(() => {
82
+ reject(/* @__PURE__ */ new Error("OpenAI Realtime did not acknowledge the message."));
83
+ }, 1e4);
84
+ pending.set(id, {
85
+ resolve,
86
+ reject,
87
+ timer
88
+ });
89
+ send({
90
+ ...event,
91
+ event_id: id
92
+ });
93
+ }).finally(() => settle(id));
94
+ const settle = (id, error) => {
95
+ if (typeof id !== "string") return false;
96
+ const message = pending.get(id);
97
+ if (!message) return false;
98
+ clearTimeout(message.timer);
99
+ pending.delete(id);
100
+ if (error) message.reject(error);
101
+ else message.resolve();
102
+ return true;
103
+ };
104
+ const setSpeaking = (value) => {
105
+ speaking = value;
106
+ session.emitMode(value ? "speaking" : "listening");
107
+ };
108
+ channel.onmessage = ({ data }) => {
109
+ if (closed) return;
110
+ let event;
111
+ try {
112
+ event = asRecord(JSON.parse(data));
113
+ } catch {
114
+ return;
115
+ }
116
+ if (!event) return;
117
+ switch (event.type) {
118
+ case "session.created":
119
+ case "session.updated": {
120
+ const audio = asRecord(asRecord(event.session)?.audio);
121
+ const input = asRecord(audio?.input);
122
+ transcribing = asRecord(input?.transcription) !== void 0;
123
+ break;
124
+ }
125
+ case "input_audio_buffer.committed":
126
+ if (transcribing && typeof event.item_id === "string" && !pendingTranscripts.has(event.item_id)) {
127
+ const item = {
128
+ ready: false,
129
+ value: void 0
130
+ };
131
+ pendingTranscripts.set(event.item_id, item);
132
+ transcriptQueue.push(item);
133
+ }
134
+ break;
135
+ case "conversation.item.input_audio_transcription.completed":
136
+ if (typeof event.transcript === "string") finishUserTranscript(event.item_id, {
137
+ role: "user",
138
+ text: event.transcript,
139
+ isFinal: true
140
+ });
141
+ break;
142
+ case "response.output_audio_transcript.delta":
143
+ case "response.output_audio_transcript.done": {
144
+ if (typeof event.item_id !== "string") break;
145
+ const final = event.type === "response.output_audio_transcript.done";
146
+ const text = final ? event.transcript : event.delta;
147
+ if (typeof text !== "string") break;
148
+ if (assistantTranscript?.id !== event.item_id) {
149
+ assistantTranscript = {
150
+ id: event.item_id,
151
+ ready: false,
152
+ value: void 0
153
+ };
154
+ transcriptQueue.push(assistantTranscript);
155
+ }
156
+ assistantTranscript.ready = true;
157
+ assistantTranscript.value = {
158
+ role: "assistant",
159
+ text: final ? text : (assistantTranscript.value?.text ?? "") + text,
160
+ isFinal: final
161
+ };
162
+ flushTranscripts();
163
+ break;
164
+ }
165
+ case "response.created":
166
+ generating = true;
167
+ settle(asRecord(asRecord(event.response)?.metadata)?.aui_request_id);
168
+ break;
169
+ case "response.done": {
170
+ generating = false;
171
+ const response = asRecord(event.response);
172
+ if (assistantTranscript?.value?.isFinal === false) {
173
+ assistantTranscript.value = {
174
+ ...assistantTranscript.value,
175
+ isFinal: true
176
+ };
177
+ assistantTranscript.ready = true;
178
+ flushTranscripts();
179
+ }
180
+ if (response?.status === "failed") console.warn("OpenAI Realtime response failed.", response.status_details);
181
+ break;
182
+ }
183
+ case "output_audio_buffer.started":
184
+ setSpeaking(true);
185
+ break;
186
+ case "output_audio_buffer.stopped":
187
+ case "output_audio_buffer.cleared":
188
+ setSpeaking(false);
189
+ break;
190
+ case "conversation.item.added":
191
+ settle(asRecord(event.item)?.id);
192
+ break;
193
+ case "conversation.item.input_audio_transcription.failed":
194
+ finishUserTranscript(event.item_id);
195
+ console.warn("OpenAI Realtime transcription failed.", event.error);
196
+ break;
197
+ case "error": {
198
+ const error = asRecord(event.error);
199
+ if (error?.code === "response_cancel_not_active") break;
200
+ if (!settle(error?.event_id, new Error(typeof error?.message === "string" ? error.message : "OpenAI Realtime rejected the message."))) console.warn("OpenAI Realtime error.", event.error);
201
+ break;
202
+ }
203
+ }
204
+ };
205
+ channel.onopen = () => {
206
+ if (closed) return;
207
+ clearTimeout(connectionTimer);
208
+ session.setStatus({ type: "running" });
209
+ if (closed) return;
210
+ session.emitMode("listening");
211
+ if (closed) return;
212
+ volumeTimer = setInterval(() => {
213
+ peer.getStats().then((report) => {
214
+ if (closed) return;
215
+ let volume = 0;
216
+ report.forEach((stat) => {
217
+ if ((stat.type === "inbound-rtp" || !muted && stat.type === "media-source") && typeof stat.audioLevel === "number") volume = Math.max(volume, stat.audioLevel);
218
+ });
219
+ session.emitVolume(Math.min(1, volume));
220
+ }).catch(() => {});
221
+ }, 100);
222
+ };
223
+ channel.onclose = () => end("finished");
224
+ channel.onerror = () => end("error", /* @__PURE__ */ new Error("OpenAI Realtime data channel failed."));
225
+ peer.onconnectionstatechange = () => {
226
+ if (peer.connectionState === "failed") end("error", /* @__PURE__ */ new Error("OpenAI Realtime connection failed."));
227
+ else if (peer.connectionState === "closed") end("finished");
228
+ };
229
+ peer.ontrack = ({ track }) => {
230
+ if (closed || track.kind !== "audio") return;
231
+ audio.srcObject = new MediaStream([track]);
232
+ audio.play().catch((error) => end("error", error));
233
+ };
234
+ const start = async () => {
235
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
236
+ if (closed || session.isDisposed()) {
237
+ for (const track of stream.getTracks()) track.stop();
238
+ return;
239
+ }
240
+ microphone = stream;
241
+ for (const track of stream.getAudioTracks()) {
242
+ track.enabled = !muted;
243
+ peer.addTrack(track, stream);
244
+ }
245
+ connectionTimer = setTimeout(() => end("error", /* @__PURE__ */ new Error("OpenAI Realtime connection timed out.")), 3e4);
246
+ const offer = await peer.createOffer();
247
+ if (closed) return;
248
+ await peer.setLocalDescription(offer);
249
+ if (closed) return;
250
+ const answer = await this.options.exchangeSdp(offer.sdp, { signal: controller.signal });
251
+ if (closed) return;
252
+ await peer.setRemoteDescription({
253
+ type: "answer",
254
+ sdp: answer
255
+ });
256
+ };
257
+ start().catch((error) => end("error", error));
258
+ return {
259
+ disconnect,
260
+ mute: () => {
261
+ muted = true;
262
+ for (const track of microphone?.getAudioTracks() ?? []) track.enabled = false;
263
+ },
264
+ unmute: () => {
265
+ muted = false;
266
+ for (const track of microphone?.getAudioTracks() ?? []) track.enabled = true;
267
+ },
268
+ sendText: async (text) => {
269
+ if (generating) send({ type: "response.cancel" });
270
+ if (speaking) send({ type: "output_audio_buffer.clear" });
271
+ const id = crypto.randomUUID().replaceAll("-", "");
272
+ await request(id, {
273
+ type: "conversation.item.create",
274
+ item: {
275
+ id,
276
+ type: "message",
277
+ role: "user",
278
+ content: [{
279
+ type: "input_text",
280
+ text
281
+ }]
282
+ }
283
+ });
284
+ const responseId = crypto.randomUUID().replaceAll("-", "");
285
+ await request(responseId, {
286
+ type: "response.create",
287
+ response: { metadata: { aui_request_id: responseId } }
288
+ });
289
+ }
290
+ };
291
+ });
292
+ }
293
+ };
294
+ //#endregion
295
+ export { OpenAIRealtimeVoiceAdapter };
296
+
297
+ //# sourceMappingURL=OpenAIRealtimeVoiceAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIRealtimeVoiceAdapter.js","names":["createVoiceSession","RealtimeVoiceAdapter","OpenAIRealtimeVoiceAdapterOptions","exchangeSdp","sdp","options","signal","AbortSignal","Promise","asRecord","value","Record","Array","isArray","undefined","OpenAIRealtimeVoiceAdapter","constructor","connect","abortSignal","Session","session","RTCPeerConnection","document","navigator","mediaDevices","getUserMedia","Error","controller","AbortController","peer","channel","createDataChannel","audio","createElement","autoplay","microphone","MediaStream","muted","closed","generating","speaking","transcribing","volumeTimer","ReturnType","setInterval","connectionTimer","setTimeout","Transcript","ready","TranscriptItem","assistantTranscript","id","transcriptQueue","pendingTranscripts","Map","flushTranscripts","item","isFinal","shift","emitTranscript","finishUserTranscript","get","delete","push","pending","resolve","reject","error","timer","disconnect","abort","clearInterval","clearTimeout","keys","settle","clear","length","onopen","onmessage","onclose","onerror","ontrack","onconnectionstatechange","track","getTracks","stop","pause","srcObject","close","end","reason","send","event","readyState","JSON","stringify","request","set","event_id","finally","message","setSpeaking","emitMode","data","parse","type","input","transcription","item_id","has","transcript","role","text","final","delta","response","metadata","aui_request_id","status","console","warn","status_details","code","setStatus","getStats","then","report","volume","forEach","stat","audioLevel","Math","max","emitVolume","min","catch","connectionState","kind","play","start","stream","isDisposed","getAudioTracks","enabled","addTrack","offer","createOffer","setLocalDescription","answer","setRemoteDescription","mute","unmute","sendText","crypto","randomUUID","replaceAll","content","responseId"],"sources":["../../src/adapters/OpenAIRealtimeVoiceAdapter.ts"],"sourcesContent":["import {\n createVoiceSession,\n type RealtimeVoiceAdapter,\n} from \"@assistant-ui/core\";\n\n/** Options for a browser WebRTC connection to OpenAI Realtime. */\nexport type OpenAIRealtimeVoiceAdapterOptions = {\n /** Exchange the browser's SDP offer for an answer through your authenticated server. Keep the API key and session configuration on the server. */\n exchangeSdp: (\n sdp: string,\n options: { signal: AbortSignal },\n ) => Promise<string>;\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n\n/**\n * Connects browser microphone audio directly to OpenAI Realtime over WebRTC.\n * Configure audio output, input transcription, and automatic turn detection on\n * the server. Each connection starts a new conversation; existing thread history\n * and assistant-ui tools are not sent to the voice model.\n */\nexport class OpenAIRealtimeVoiceAdapter implements RealtimeVoiceAdapter {\n private readonly options: OpenAIRealtimeVoiceAdapterOptions;\n\n constructor(options: OpenAIRealtimeVoiceAdapterOptions) {\n this.options = options;\n }\n\n connect(options: {\n abortSignal?: AbortSignal;\n }): RealtimeVoiceAdapter.Session {\n return createVoiceSession(options, async (session) => {\n if (\n typeof RTCPeerConnection === \"undefined\" ||\n typeof document === \"undefined\" ||\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices?.getUserMedia\n ) {\n throw new Error(\n \"OpenAI Realtime voice requires a browser with WebRTC and microphone access.\",\n );\n }\n\n const controller = new AbortController();\n const peer = new RTCPeerConnection();\n const channel = peer.createDataChannel(\"oai-events\");\n const audio = document.createElement(\"audio\");\n audio.autoplay = true;\n let microphone: MediaStream | undefined;\n let muted = false;\n let closed = false;\n let generating = false;\n let speaking = false;\n let transcribing = false;\n let volumeTimer: ReturnType<typeof setInterval> | undefined;\n let connectionTimer: ReturnType<typeof setTimeout> | undefined;\n type Transcript = {\n ready: boolean;\n value: RealtimeVoiceAdapter.TranscriptItem | undefined;\n };\n let assistantTranscript: (Transcript & { id: string }) | undefined;\n const transcriptQueue: Transcript[] = [];\n const pendingTranscripts = new Map<string, Transcript>();\n const flushTranscripts = () => {\n while (transcriptQueue[0]?.ready) {\n const item = transcriptQueue[0];\n item.ready = false;\n if (item.value?.isFinal !== false) transcriptQueue.shift();\n if (item.value) session.emitTranscript(item.value);\n }\n };\n const finishUserTranscript = (\n id: unknown,\n value?: RealtimeVoiceAdapter.TranscriptItem,\n ) => {\n const item =\n typeof id === \"string\" ? pendingTranscripts.get(id) : undefined;\n if (item) {\n item.ready = true;\n item.value = value;\n pendingTranscripts.delete(id as string);\n } else if (value) transcriptQueue.push({ ready: true, value });\n flushTranscripts();\n };\n const pending = new Map<\n string,\n {\n resolve: () => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n const disconnect = () => {\n if (closed) return;\n closed = true;\n controller.abort();\n clearInterval(volumeTimer);\n clearTimeout(connectionTimer);\n for (const id of pending.keys())\n settle(\n id,\n new Error(\n \"OpenAI Realtime session disconnected before accepting the message.\",\n ),\n );\n pendingTranscripts.clear();\n transcriptQueue.length = 0;\n channel.onopen =\n channel.onmessage =\n channel.onclose =\n channel.onerror =\n null;\n peer.ontrack = peer.onconnectionstatechange = null;\n for (const track of microphone?.getTracks() ?? []) track.stop();\n audio.pause();\n audio.srcObject = null;\n channel.close();\n peer.close();\n };\n\n const end = (reason: \"finished\" | \"error\", error?: unknown) => {\n session.end(reason, error);\n disconnect();\n };\n\n const send = (event: Record<string, unknown>) => {\n if (closed || channel.readyState !== \"open\")\n throw new Error(\"OpenAI Realtime session is not connected.\");\n channel.send(JSON.stringify(event));\n };\n\n const request = (id: string, event: Record<string, unknown>) =>\n new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(\n new Error(\"OpenAI Realtime did not acknowledge the message.\"),\n );\n }, 10_000);\n pending.set(id, { resolve, reject, timer });\n send({ ...event, event_id: id });\n }).finally(() => settle(id));\n\n const settle = (id: unknown, error?: Error) => {\n if (typeof id !== \"string\") return false;\n const message = pending.get(id);\n if (!message) return false;\n clearTimeout(message.timer);\n pending.delete(id);\n if (error) message.reject(error);\n else message.resolve();\n return true;\n };\n\n const setSpeaking = (value: boolean) => {\n speaking = value;\n session.emitMode(value ? \"speaking\" : \"listening\");\n };\n\n channel.onmessage = ({ data }) => {\n if (closed) return;\n let event: Record<string, unknown> | undefined;\n try {\n event = asRecord(JSON.parse(data));\n } catch {\n return;\n }\n if (!event) return;\n switch (event.type) {\n case \"session.created\":\n case \"session.updated\": {\n const audio = asRecord(asRecord(event.session)?.audio);\n const input = asRecord(audio?.input);\n transcribing = asRecord(input?.transcription) !== undefined;\n break;\n }\n case \"input_audio_buffer.committed\":\n if (\n transcribing &&\n typeof event.item_id === \"string\" &&\n !pendingTranscripts.has(event.item_id)\n ) {\n const item = { ready: false, value: undefined };\n pendingTranscripts.set(event.item_id, item);\n transcriptQueue.push(item);\n }\n break;\n case \"conversation.item.input_audio_transcription.completed\":\n if (typeof event.transcript === \"string\")\n finishUserTranscript(event.item_id, {\n role: \"user\",\n text: event.transcript,\n isFinal: true,\n });\n break;\n case \"response.output_audio_transcript.delta\":\n case \"response.output_audio_transcript.done\": {\n if (typeof event.item_id !== \"string\") break;\n const final =\n event.type === \"response.output_audio_transcript.done\";\n const text = final ? event.transcript : event.delta;\n if (typeof text !== \"string\") break;\n if (assistantTranscript?.id !== event.item_id) {\n assistantTranscript = {\n id: event.item_id,\n ready: false,\n value: undefined,\n };\n transcriptQueue.push(assistantTranscript);\n }\n assistantTranscript.ready = true;\n assistantTranscript.value = {\n role: \"assistant\",\n text: final\n ? text\n : (assistantTranscript.value?.text ?? \"\") + text,\n isFinal: final,\n };\n flushTranscripts();\n break;\n }\n case \"response.created\":\n generating = true;\n settle(\n asRecord(asRecord(event.response)?.metadata)?.aui_request_id,\n );\n break;\n case \"response.done\": {\n generating = false;\n const response = asRecord(event.response);\n if (assistantTranscript?.value?.isFinal === false) {\n assistantTranscript.value = {\n ...assistantTranscript.value,\n isFinal: true,\n };\n assistantTranscript.ready = true;\n flushTranscripts();\n }\n if (response?.status === \"failed\")\n console.warn(\n \"OpenAI Realtime response failed.\",\n response.status_details,\n );\n break;\n }\n case \"output_audio_buffer.started\":\n setSpeaking(true);\n break;\n case \"output_audio_buffer.stopped\":\n case \"output_audio_buffer.cleared\":\n setSpeaking(false);\n break;\n case \"conversation.item.added\":\n settle(asRecord(event.item)?.id);\n break;\n case \"conversation.item.input_audio_transcription.failed\":\n finishUserTranscript(event.item_id);\n console.warn(\"OpenAI Realtime transcription failed.\", event.error);\n break;\n case \"error\": {\n const error = asRecord(event.error);\n if (error?.code === \"response_cancel_not_active\") break;\n if (\n !settle(\n error?.event_id,\n new Error(\n typeof error?.message === \"string\"\n ? error.message\n : \"OpenAI Realtime rejected the message.\",\n ),\n )\n )\n console.warn(\"OpenAI Realtime error.\", event.error);\n break;\n }\n }\n };\n channel.onopen = () => {\n if (closed) return;\n clearTimeout(connectionTimer);\n session.setStatus({ type: \"running\" });\n if (closed) return;\n session.emitMode(\"listening\");\n if (closed) return;\n volumeTimer = setInterval(() => {\n void peer\n .getStats()\n .then((report) => {\n if (closed) return;\n let volume = 0;\n report.forEach((stat) => {\n if (\n (stat.type === \"inbound-rtp\" ||\n (!muted && stat.type === \"media-source\")) &&\n typeof stat.audioLevel === \"number\"\n )\n volume = Math.max(volume, stat.audioLevel);\n });\n session.emitVolume(Math.min(1, volume));\n })\n .catch(() => {});\n }, 100);\n };\n channel.onclose = () => end(\"finished\");\n channel.onerror = () =>\n end(\"error\", new Error(\"OpenAI Realtime data channel failed.\"));\n peer.onconnectionstatechange = () => {\n if (peer.connectionState === \"failed\") {\n end(\"error\", new Error(\"OpenAI Realtime connection failed.\"));\n } else if (peer.connectionState === \"closed\") {\n end(\"finished\");\n }\n };\n peer.ontrack = ({ track }) => {\n if (closed || track.kind !== \"audio\") return;\n audio.srcObject = new MediaStream([track]);\n void audio.play().catch((error: unknown) => end(\"error\", error));\n };\n\n const start = async () => {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n if (closed || session.isDisposed()) {\n for (const track of stream.getTracks()) track.stop();\n return;\n }\n microphone = stream;\n for (const track of stream.getAudioTracks()) {\n track.enabled = !muted;\n peer.addTrack(track, stream);\n }\n connectionTimer = setTimeout(\n () =>\n end(\"error\", new Error(\"OpenAI Realtime connection timed out.\")),\n 30_000,\n );\n const offer = await peer.createOffer();\n if (closed) return;\n await peer.setLocalDescription(offer);\n if (closed) return;\n const answer = await this.options.exchangeSdp(offer.sdp!, {\n signal: controller.signal,\n });\n if (closed) return;\n await peer.setRemoteDescription({ type: \"answer\", sdp: answer });\n };\n void start().catch((error: unknown) => end(\"error\", error));\n\n return {\n disconnect,\n mute: () => {\n muted = true;\n for (const track of microphone?.getAudioTracks() ?? [])\n track.enabled = false;\n },\n unmute: () => {\n muted = false;\n for (const track of microphone?.getAudioTracks() ?? [])\n track.enabled = true;\n },\n sendText: async (text) => {\n if (generating) send({ type: \"response.cancel\" });\n if (speaking) send({ type: \"output_audio_buffer.clear\" });\n const id = crypto.randomUUID().replaceAll(\"-\", \"\");\n await request(id, {\n type: \"conversation.item.create\",\n item: {\n id,\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n });\n const responseId = crypto.randomUUID().replaceAll(\"-\", \"\");\n await request(responseId, {\n type: \"response.create\",\n response: { metadata: { aui_request_id: responseId } },\n });\n },\n };\n });\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { Unsubscribe } from "@assistant-ui/core";
2
+ import { type ThreadViewportAutoScroll, type ThreadViewportAutoScrollOptions } from "@assistant-ui/store/client";
3
+ import type { ReadonlyStore } from "../ReadonlyStore.js";
2
4
  export type SizeHandle = {
3
5
  /** Update the height */
4
6
  setHeight: (height: number) => void;
@@ -76,5 +78,11 @@ export type ThreadViewportStoreOptions = {
76
78
  visibleHeight?: string | undefined;
77
79
  } | undefined;
78
80
  };
81
+ type ViewportAutoScroll = {
82
+ controller: ThreadViewportAutoScroll;
83
+ getOptions: () => ThreadViewportAutoScrollOptions;
84
+ };
85
+ export declare const getThreadViewportAutoScroll: (store: ReadonlyStore<ThreadViewportState>) => ViewportAutoScroll;
79
86
  export declare const makeThreadViewportStore: (options?: ThreadViewportStoreOptions) => import("zustand").UseBoundStore<import("zustand").StoreApi<ThreadViewportState>>;
87
+ export {};
80
88
  //# sourceMappingURL=ThreadViewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/context/stores/ThreadViewport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/context/stores/ThreadViewport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,4BAAyB;AAEtD,MAAM,MAAM,UAAU,GAAG;IACvB,wBAAwB;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6BAA6B;IAC7B,UAAU,EAAE,WAAW,CAAC;CACzB,CAAC;AAwCF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACjC,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,gBAAgB,EAAE,CACzB,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,KAAK,IAAI,KAC3D,WAAW,CAAC;IAEjB,kGAAkG;IAClG,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEtC,yEAAyE;IACzE,QAAQ,CAAC,qBAAqB,EAAE;QAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,CAAC;IAEF,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE;QACf,4BAA4B;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,gEAAgE;QAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;QACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;KACrC,CAAC;IAEF,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,GAAG,IAAI,CAAC;IAET;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,GAAG,IAAI,CAAC;IAET,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,UAAU,CAAC;IAE5C,oGAAoG;IACpG,QAAQ,CAAC,oBAAoB,EAAE,MAAM,UAAU,CAAC;IAEhD,2CAA2C;IAC3C,QAAQ,CAAC,uBAAuB,EAAE,CAChC,OAAO,EAAE,WAAW,GAAG,IAAI,KACxB,WAAW,CAAC;IAEjB,uDAAuD;IACvD,QAAQ,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,WAAW,CAAC;IAE7E;;;;OAIG;IACH,QAAQ,CAAC,2BAA2B,EAAE,CACpC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KACrE,WAAW,CAAC;IAEjB,QAAQ,CAAC,gBAAgB,EAAE,CACzB,IAAI,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAClE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,qBAAqB,CAAC,EAClB;QACE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACpC,GACD,SAAS,CAAC;CACf,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,MAAM,+BAA+B,CAAC;CACnD,CAAC;AAOF,eAAO,MAAM,2BAA2B,GACtC,OAAO,aAAa,CAAC,mBAAmB,CAAC,uBACR,CAAC;AAEpC,eAAO,MAAM,uBAAuB,GAClC,UAAS,0BAA+B,qFAqHzC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { create } from "zustand";
3
3
  import { notifyEventListeners } from "@assistant-ui/core/internal";
4
+ import { createThreadViewportAutoScroll } from "@assistant-ui/store/client";
4
5
  //#region src/context/stores/ThreadViewport.ts
5
6
  const createSizeRegistry = (onChange) => {
6
7
  const entries = /* @__PURE__ */ new Map();
@@ -26,6 +27,8 @@ const createSizeRegistry = (onChange) => {
26
27
  };
27
28
  } };
28
29
  };
30
+ const viewportAutoScroll = /* @__PURE__ */ new WeakMap();
31
+ const getThreadViewportAutoScroll = (store) => viewportAutoScroll.get(store);
29
32
  const makeThreadViewportStore = (options = {}) => {
30
33
  const scrollToBottomListeners = /* @__PURE__ */ new Set();
31
34
  const viewportRegistry = createSizeRegistry((total) => {
@@ -34,12 +37,24 @@ const makeThreadViewportStore = (options = {}) => {
34
37
  viewport: total
35
38
  } });
36
39
  });
37
- const insetRegistry = createSizeRegistry((total) => {
38
- store.setState({ height: {
39
- ...store.getState().height,
40
- inset: total
41
- } });
42
- });
40
+ const autoScroll = {
41
+ getOptions: () => ({
42
+ autoScroll: options.turnAnchor !== "top",
43
+ scrollToBottomOnInitialize: true,
44
+ scrollToBottomOnRunStart: options.turnAnchor !== "top",
45
+ scrollToBottomOnThreadSwitch: true
46
+ }),
47
+ controller: createThreadViewportAutoScroll({
48
+ getOptions: () => autoScroll.getOptions(),
49
+ onAtBottomChange: (isAtBottom) => store.setState({ isAtBottom }),
50
+ onContentInsetChange: (inset) => {
51
+ store.setState({ height: {
52
+ ...store.getState().height,
53
+ inset
54
+ } });
55
+ }
56
+ })
57
+ };
43
58
  const registerElementSlot = (key, element) => {
44
59
  store.setState({ element: {
45
60
  ...store.getState().element,
@@ -81,7 +96,7 @@ const makeThreadViewportStore = (options = {}) => {
81
96
  targetConfig: null,
82
97
  topAnchorTurn: null,
83
98
  registerViewport: viewportRegistry.register,
84
- registerContentInset: insetRegistry.register,
99
+ registerContentInset: autoScroll.controller.registerContentInset,
85
100
  registerViewportElement: (element) => registerElementSlot("viewport", element),
86
101
  registerAnchorElement: (element) => registerElementSlot("anchor", element),
87
102
  registerAnchorTargetElement: (element, config) => {
@@ -107,9 +122,10 @@ const makeThreadViewportStore = (options = {}) => {
107
122
  store.setState({ topAnchorTurn });
108
123
  }
109
124
  }));
125
+ viewportAutoScroll.set(store, autoScroll);
110
126
  return store;
111
127
  };
112
128
  //#endregion
113
- export { makeThreadViewportStore };
129
+ export { getThreadViewportAutoScroll, makeThreadViewportStore };
114
130
 
115
131
  //# sourceMappingURL=ThreadViewport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.js","names":["create","Unsubscribe","notifyEventListeners","SizeHandle","setHeight","height","unregister","SizeRegistry","register","createSizeRegistry","onChange","total","entries","Map","recalculate","values","id","Symbol","set","get","delete","ThreadViewportState","isAtBottom","scrollToBottom","config","behavior","ScrollBehavior","onScrollToBottom","callback","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","viewport","inset","element","HTMLElement","anchor","target","targetConfig","topAnchorTurn","anchorId","targetId","registerViewport","registerContentInset","registerViewportElement","registerAnchorElement","registerAnchorTargetElement","setTopAnchorTurn","turn","ThreadViewportStoreOptions","makeThreadViewportStore","options","scrollToBottomListeners","Set","viewportRegistry","store","setState","getState","insetRegistry","registerElementSlot","key","add"],"sources":["../../../src/context/stores/ThreadViewport.ts"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { notifyEventListeners } from \"@assistant-ui/core/internal\";\n\nexport type SizeHandle = {\n /** Update the height */\n setHeight: (height: number) => void;\n /** Unregister this handle */\n unregister: Unsubscribe;\n};\n\ntype SizeRegistry = {\n register: () => SizeHandle;\n};\n\nconst createSizeRegistry = (\n onChange: (total: number) => void,\n): SizeRegistry => {\n const entries = new Map<symbol, number>();\n\n const recalculate = () => {\n let total = 0;\n for (const height of entries.values()) {\n total += height;\n }\n onChange(total);\n };\n\n return {\n register: () => {\n const id = Symbol();\n entries.set(id, 0);\n\n return {\n setHeight: (height: number) => {\n if (entries.get(id) !== height) {\n entries.set(id, height);\n recalculate();\n }\n },\n unregister: () => {\n entries.delete(id);\n recalculate();\n },\n };\n },\n };\n};\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: (config?: {\n behavior?: ScrollBehavior | undefined;\n }) => void;\n readonly onScrollToBottom: (\n callback: ({ behavior }: { behavior: ScrollBehavior }) => void,\n ) => Unsubscribe;\n\n /** Controls scroll anchoring: \"top\" anchors user messages at top, \"bottom\" is classic behavior */\n readonly turnAnchor: \"top\" | \"bottom\";\n\n /** Clamps tall user messages so the assistant response stays in view. */\n readonly topAnchorMessageClamp: {\n readonly tallerThan: string;\n readonly visibleHeight: string;\n };\n\n /** Raw height values from registered elements */\n readonly height: {\n /** Total viewport height */\n readonly viewport: number;\n /** Total content inset height (footer, anchor message, etc.) */\n readonly inset: number;\n };\n\n /** Current DOM elements used for geometry-based top anchoring */\n readonly element: {\n readonly viewport: HTMLElement | null;\n readonly anchor: HTMLElement | null;\n readonly target: HTMLElement | null;\n };\n\n /** Numeric clamp configuration for the active top-anchor target message */\n readonly targetConfig: {\n readonly tallerThan: number;\n readonly visibleHeight: number;\n } | null;\n\n /**\n * The current top-anchor turn activated in this viewport session.\n * History-loaded messages do not populate this; it is set when a run creates\n * a live user/assistant pair and remains after the run completes.\n */\n readonly topAnchorTurn: {\n readonly anchorId: string;\n readonly targetId: string;\n } | null;\n\n /** Register a viewport and get a handle to update its height */\n readonly registerViewport: () => SizeHandle;\n\n /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */\n readonly registerContentInset: () => SizeHandle;\n\n /** Register the scroll viewport element */\n readonly registerViewportElement: (\n element: HTMLElement | null,\n ) => Unsubscribe;\n\n /** Register the current anchor user message element */\n readonly registerAnchorElement: (element: HTMLElement | null) => Unsubscribe;\n\n /**\n * Register the current top-anchor target (last assistant response) element\n * along with its numeric clamp configuration. When unregistered, both\n * `element.target` and `targetConfig` clear together.\n */\n readonly registerAnchorTargetElement: (\n element: HTMLElement | null,\n config?: { readonly tallerThan: number; readonly visibleHeight: number },\n ) => Unsubscribe;\n\n readonly setTopAnchorTurn: (\n turn: { readonly anchorId: string; readonly targetId: string } | null,\n ) => void;\n};\n\nexport type ThreadViewportStoreOptions = {\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n topAnchorMessageClamp?:\n | {\n tallerThan?: string | undefined;\n visibleHeight?: string | undefined;\n }\n | undefined;\n};\n\nexport const makeThreadViewportStore = (\n options: ThreadViewportStoreOptions = {},\n) => {\n const scrollToBottomListeners = new Set<\n (config: { behavior: ScrollBehavior }) => void\n >();\n\n const viewportRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n viewport: total,\n },\n });\n });\n const insetRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n inset: total,\n },\n });\n });\n const registerElementSlot = (\n key: \"viewport\" | \"anchor\",\n element: HTMLElement | null,\n ) => {\n store.setState({\n element: {\n ...store.getState().element,\n [key]: element,\n },\n });\n\n return () => {\n if (store.getState().element[key] !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n [key]: null,\n },\n });\n };\n };\n\n const store = create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: ({ behavior = \"auto\" } = {}) => {\n notifyEventListeners(\n scrollToBottomListeners,\n () => ({ behavior }),\n \"Thread viewport\",\n );\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n\n turnAnchor: options.turnAnchor ?? \"bottom\",\n topAnchorMessageClamp: {\n tallerThan: options.topAnchorMessageClamp?.tallerThan ?? \"10em\",\n visibleHeight: options.topAnchorMessageClamp?.visibleHeight ?? \"6em\",\n },\n\n height: {\n viewport: 0,\n inset: 0,\n },\n element: {\n viewport: null,\n anchor: null,\n target: null,\n },\n targetConfig: null,\n topAnchorTurn: null,\n\n registerViewport: viewportRegistry.register,\n registerContentInset: insetRegistry.register,\n registerViewportElement: (element) =>\n registerElementSlot(\"viewport\", element),\n registerAnchorElement: (element) => registerElementSlot(\"anchor\", element),\n registerAnchorTargetElement: (element, config) => {\n store.setState({\n element: {\n ...store.getState().element,\n target: element,\n },\n targetConfig: element && config ? config : null,\n });\n\n return () => {\n if (store.getState().element.target !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n target: null,\n },\n targetConfig: null,\n });\n };\n },\n setTopAnchorTurn: (topAnchorTurn) => {\n store.setState({ topAnchorTurn });\n },\n }));\n\n return store;\n};\n"],"mappings":";;;;AAiBA,MAAMS,sBACJC,aACiB;CACjB,MAAME,0BAAU,IAAIC,IAAoB;CAExC,MAAMC,oBAAoB;EACxB,IAAIH,QAAQ;EACZ,KAAK,MAAMN,UAAUO,QAAQG,OAAO,GAClCJ,SAASN;EAEXK,SAASC,KAAK;CAChB;CAEA,OAAO,EACLH,gBAAgB;EACd,MAAMQ,KAAKC,OAAO;EAClBL,QAAQM,IAAIF,IAAI,CAAC;EAEjB,OAAO;GACLZ,YAAYC,WAAmB;IAC7B,IAAIO,QAAQO,IAAIH,EAAE,MAAMX,QAAQ;KAC9BO,QAAQM,IAAIF,IAAIX,MAAM;KACtBS,YAAY;IACd;GACF;GACAR,kBAAkB;IAChBM,QAAQQ,OAAOJ,EAAE;IACjBF,YAAY;GACd;EACF;CACF,EACF;AACF;AA0FA,MAAaqC,2BACXC,UAAsC,CAAC,MACpC;CACH,MAAMC,0CAA0B,IAAIC,IAElC;CAEF,MAAMC,mBAAmB9C,oBAAoBE,UAAU;EACrD6C,MAAMC,SAAS,EACbpD,QAAQ;GACN,GAAGmD,MAAME,SAAS,CAAC,CAACrD;GACpB4B,UAAUtB;EACZ,EACF,CAAC;CACH,CAAC;CACD,MAAMgD,gBAAgBlD,oBAAoBE,UAAU;EAClD6C,MAAMC,SAAS,EACbpD,QAAQ;GACN,GAAGmD,MAAME,SAAS,CAAC,CAACrD;GACpB6B,OAAOvB;EACT,EACF,CAAC;CACH,CAAC;CACD,MAAMiD,uBACJC,KACA1B,YACG;EACHqB,MAAMC,SAAS,EACbtB,SAAS;GACP,GAAGqB,MAAME,SAAS,CAAC,CAACvB;IACnB0B,MAAM1B;EACT,EACF,CAAC;EAED,aAAa;GACX,IAAIqB,MAAME,SAAS,CAAC,CAACvB,QAAQ0B,SAAS1B,SAAS;GAC/CqB,MAAMC,SAAS,EACbtB,SAAS;IACP,GAAGqB,MAAME,SAAS,CAAC,CAACvB;KACnB0B,MAAM;GACT,EACF,CAAC;EACH;CACF;CAEA,MAAML,QAAQxD,cAAmC;EAC/CsB,YAAY;EACZC,iBAAiB,EAAEE,WAAW,WAAW,CAAC,MAAM;GAC9CvB,qBACEmD,gCACO,EAAE5B,SAAS,IAClB,iBACF;EACF;EACAE,mBAAmBC,aAAa;GAC9ByB,wBAAwBS,IAAIlC,QAAQ;GACpC,aAAa;IACXyB,wBAAwBjC,OAAOQ,QAAQ;GACzC;EACF;EAEAC,YAAYuB,QAAQvB,cAAc;EAClCC,uBAAuB;GACrBC,YAAYqB,QAAQtB,uBAAuBC,cAAc;GACzDC,eAAeoB,QAAQtB,uBAAuBE,iBAAiB;EACjE;EAEA3B,QAAQ;GACN4B,UAAU;GACVC,OAAO;EACT;EACAC,SAAS;GACPF,UAAU;GACVI,QAAQ;GACRC,QAAQ;EACV;EACAC,cAAc;EACdC,eAAe;EAEfG,kBAAkBY,iBAAiB/C;EACnCoC,sBAAsBe,cAAcnD;EACpCqC,0BAA0BV,YACxByB,oBAAoB,YAAYzB,OAAO;EACzCW,wBAAwBX,YAAYyB,oBAAoB,UAAUzB,OAAO;EACzEY,8BAA8BZ,SAASX,WAAW;GAChDgC,MAAMC,SAAS;IACbtB,SAAS;KACP,GAAGqB,MAAME,SAAS,CAAC,CAACvB;KACpBG,QAAQH;IACV;IACAI,cAAcJ,WAAWX,SAASA,SAAS;GAC7C,CAAC;GAED,aAAa;IACX,IAAIgC,MAAME,SAAS,CAAC,CAACvB,QAAQG,WAAWH,SAAS;IACjDqB,MAAMC,SAAS;KACbtB,SAAS;MACP,GAAGqB,MAAME,SAAS,CAAC,CAACvB;MACpBG,QAAQ;KACV;KACAC,cAAc;IAChB,CAAC;GACH;EACF;EACAS,mBAAmBR,kBAAkB;GACnCgB,MAAMC,SAAS,EAAEjB,cAAc,CAAC;EAClC;CACF,EAAE;CAEF,OAAOgB;AACT"}
1
+ {"version":3,"file":"ThreadViewport.js","names":["create","Unsubscribe","notifyEventListeners","createThreadViewportAutoScroll","ThreadViewportAutoScroll","ThreadViewportAutoScrollOptions","ReadonlyStore","SizeHandle","setHeight","height","unregister","SizeRegistry","register","createSizeRegistry","onChange","total","entries","Map","recalculate","values","id","Symbol","set","get","delete","ThreadViewportState","isAtBottom","scrollToBottom","config","behavior","ScrollBehavior","onScrollToBottom","callback","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","viewport","inset","element","HTMLElement","anchor","target","targetConfig","topAnchorTurn","anchorId","targetId","registerViewport","registerContentInset","registerViewportElement","registerAnchorElement","registerAnchorTargetElement","setTopAnchorTurn","turn","ThreadViewportStoreOptions","ViewportAutoScroll","controller","getOptions","viewportAutoScroll","WeakMap","getThreadViewportAutoScroll","store","makeThreadViewportStore","options","scrollToBottomListeners","Set","viewportRegistry","setState","getState","autoScroll","scrollToBottomOnInitialize","scrollToBottomOnRunStart","scrollToBottomOnThreadSwitch","onAtBottomChange","onContentInsetChange","registerElementSlot","key","add"],"sources":["../../../src/context/stores/ThreadViewport.ts"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { notifyEventListeners } from \"@assistant-ui/core/internal\";\nimport {\n createThreadViewportAutoScroll,\n type ThreadViewportAutoScroll,\n type ThreadViewportAutoScrollOptions,\n} from \"@assistant-ui/store/client\";\nimport type { ReadonlyStore } from \"../ReadonlyStore\";\n\nexport type SizeHandle = {\n /** Update the height */\n setHeight: (height: number) => void;\n /** Unregister this handle */\n unregister: Unsubscribe;\n};\n\ntype SizeRegistry = {\n register: () => SizeHandle;\n};\n\nconst createSizeRegistry = (\n onChange: (total: number) => void,\n): SizeRegistry => {\n const entries = new Map<symbol, number>();\n\n const recalculate = () => {\n let total = 0;\n for (const height of entries.values()) {\n total += height;\n }\n onChange(total);\n };\n\n return {\n register: () => {\n const id = Symbol();\n entries.set(id, 0);\n\n return {\n setHeight: (height: number) => {\n if (entries.get(id) !== height) {\n entries.set(id, height);\n recalculate();\n }\n },\n unregister: () => {\n entries.delete(id);\n recalculate();\n },\n };\n },\n };\n};\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: (config?: {\n behavior?: ScrollBehavior | undefined;\n }) => void;\n readonly onScrollToBottom: (\n callback: ({ behavior }: { behavior: ScrollBehavior }) => void,\n ) => Unsubscribe;\n\n /** Controls scroll anchoring: \"top\" anchors user messages at top, \"bottom\" is classic behavior */\n readonly turnAnchor: \"top\" | \"bottom\";\n\n /** Clamps tall user messages so the assistant response stays in view. */\n readonly topAnchorMessageClamp: {\n readonly tallerThan: string;\n readonly visibleHeight: string;\n };\n\n /** Raw height values from registered elements */\n readonly height: {\n /** Total viewport height */\n readonly viewport: number;\n /** Total content inset height (footer, anchor message, etc.) */\n readonly inset: number;\n };\n\n /** Current DOM elements used for geometry-based top anchoring */\n readonly element: {\n readonly viewport: HTMLElement | null;\n readonly anchor: HTMLElement | null;\n readonly target: HTMLElement | null;\n };\n\n /** Numeric clamp configuration for the active top-anchor target message */\n readonly targetConfig: {\n readonly tallerThan: number;\n readonly visibleHeight: number;\n } | null;\n\n /**\n * The current top-anchor turn activated in this viewport session.\n * History-loaded messages do not populate this; it is set when a run creates\n * a live user/assistant pair and remains after the run completes.\n */\n readonly topAnchorTurn: {\n readonly anchorId: string;\n readonly targetId: string;\n } | null;\n\n /** Register a viewport and get a handle to update its height */\n readonly registerViewport: () => SizeHandle;\n\n /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */\n readonly registerContentInset: () => SizeHandle;\n\n /** Register the scroll viewport element */\n readonly registerViewportElement: (\n element: HTMLElement | null,\n ) => Unsubscribe;\n\n /** Register the current anchor user message element */\n readonly registerAnchorElement: (element: HTMLElement | null) => Unsubscribe;\n\n /**\n * Register the current top-anchor target (last assistant response) element\n * along with its numeric clamp configuration. When unregistered, both\n * `element.target` and `targetConfig` clear together.\n */\n readonly registerAnchorTargetElement: (\n element: HTMLElement | null,\n config?: { readonly tallerThan: number; readonly visibleHeight: number },\n ) => Unsubscribe;\n\n readonly setTopAnchorTurn: (\n turn: { readonly anchorId: string; readonly targetId: string } | null,\n ) => void;\n};\n\nexport type ThreadViewportStoreOptions = {\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n topAnchorMessageClamp?:\n | {\n tallerThan?: string | undefined;\n visibleHeight?: string | undefined;\n }\n | undefined;\n};\n\ntype ViewportAutoScroll = {\n controller: ThreadViewportAutoScroll;\n getOptions: () => ThreadViewportAutoScrollOptions;\n};\n\nconst viewportAutoScroll = new WeakMap<\n ReadonlyStore<ThreadViewportState>,\n ViewportAutoScroll\n>();\n\nexport const getThreadViewportAutoScroll = (\n store: ReadonlyStore<ThreadViewportState>,\n) => viewportAutoScroll.get(store)!;\n\nexport const makeThreadViewportStore = (\n options: ThreadViewportStoreOptions = {},\n) => {\n const scrollToBottomListeners = new Set<\n (config: { behavior: ScrollBehavior }) => void\n >();\n\n const viewportRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n viewport: total,\n },\n });\n });\n const autoScroll: ViewportAutoScroll = {\n getOptions: () => ({\n autoScroll: options.turnAnchor !== \"top\",\n scrollToBottomOnInitialize: true,\n scrollToBottomOnRunStart: options.turnAnchor !== \"top\",\n scrollToBottomOnThreadSwitch: true,\n }),\n controller: createThreadViewportAutoScroll({\n getOptions: () => autoScroll.getOptions(),\n onAtBottomChange: (isAtBottom) => store.setState({ isAtBottom }),\n onContentInsetChange: (inset) => {\n store.setState({ height: { ...store.getState().height, inset } });\n },\n }),\n };\n const registerElementSlot = (\n key: \"viewport\" | \"anchor\",\n element: HTMLElement | null,\n ) => {\n store.setState({\n element: {\n ...store.getState().element,\n [key]: element,\n },\n });\n\n return () => {\n if (store.getState().element[key] !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n [key]: null,\n },\n });\n };\n };\n\n const store = create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: ({ behavior = \"auto\" } = {}) => {\n notifyEventListeners(\n scrollToBottomListeners,\n () => ({ behavior }),\n \"Thread viewport\",\n );\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n\n turnAnchor: options.turnAnchor ?? \"bottom\",\n topAnchorMessageClamp: {\n tallerThan: options.topAnchorMessageClamp?.tallerThan ?? \"10em\",\n visibleHeight: options.topAnchorMessageClamp?.visibleHeight ?? \"6em\",\n },\n\n height: {\n viewport: 0,\n inset: 0,\n },\n element: {\n viewport: null,\n anchor: null,\n target: null,\n },\n targetConfig: null,\n topAnchorTurn: null,\n\n registerViewport: viewportRegistry.register,\n registerContentInset: autoScroll.controller.registerContentInset,\n registerViewportElement: (element) =>\n registerElementSlot(\"viewport\", element),\n registerAnchorElement: (element) => registerElementSlot(\"anchor\", element),\n registerAnchorTargetElement: (element, config) => {\n store.setState({\n element: {\n ...store.getState().element,\n target: element,\n },\n targetConfig: element && config ? config : null,\n });\n\n return () => {\n if (store.getState().element.target !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n target: null,\n },\n targetConfig: null,\n });\n };\n },\n setTopAnchorTurn: (topAnchorTurn) => {\n store.setState({ topAnchorTurn });\n },\n }));\n\n viewportAutoScroll.set(store, autoScroll);\n return store;\n};\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, CompositeAtt
9
9
  export { CloudFileAttachmentAdapter } from "./legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.js";
10
10
  export type { RealtimeVoiceAdapter } from "@assistant-ui/core";
11
11
  export { createVoiceSession } from "@assistant-ui/core";
12
+ export { OpenAIRealtimeVoiceAdapter, type OpenAIRealtimeVoiceAdapterOptions, } from "./adapters/OpenAIRealtimeVoiceAdapter.js";
12
13
  export type { VoiceSessionControls, VoiceSessionHelpers, VoiceSessionState, } from "@assistant-ui/core";
13
14
  export { useVoiceState, useVoiceVolume, useVoiceControls, } from "@assistant-ui/core/react";
14
15
  export type { FeedbackAdapter } from "@assistant-ui/core";
@@ -50,7 +51,7 @@ export type { ExportedMessageRepositoryItem } from "@assistant-ui/core";
50
51
  export { ExportedMessageRepository } from "@assistant-ui/core";
51
52
  export * from "./context/index.js";
52
53
  export { makeAssistantTool, type AssistantTool, makeAssistantToolUI, type AssistantToolUI, makeAssistantDataUI, type AssistantDataUI, useAssistantTool, type AssistantToolProps, useAssistantToolUI, type AssistantToolUIProps, useAssistantDataUI, type AssistantDataUIProps, useAssistantInstructions, useAssistantContext, type AssistantContextConfig, useInlineRender, type Toolkit, type ToolDefinition, type ToolCallText, type ToolkitDefinition, type ToolkitDefinitionEntry, defineToolkit, stubTool, externalTool, useAuiToolOverrides, hitl, hitlTool, humanTool, providerTool, type ProviderToolConfig, defineMcpToolkit, type McpToolkitEntry, type McpToolkitDefinition, type McpToolkitToolConfig, Tools, DataRenderers, Interactables, useAssistantInteractable, type AssistantInteractableProps, useInteractableState, unstable_Interactables, unstable_useInteractable, type Unstable_InteractableConfig, type Unstable_InferInteractableState, type Unstable_InteractableVersionInfo, unstable_useInteractableState, unstable_useInteractableVersions, unstable_interactableTool, type Unstable_InteractableToolConfig, type Unstable_InteractableToolRenderProps, type Unstable_InteractableStateSchema, type Unstable_InteractablesState, type Unstable_InteractableDefinition, type Unstable_InteractableRegistration, type Unstable_InteractablesMethods, type Unstable_InteractablePersistedState, type Unstable_InteractablePersistenceAdapter, type Unstable_InteractablePersistenceStatus, type Unstable_InteractablesClientSchema, type Unstable_InteractablesConfig, useToolArgsStatus, type ToolArgsStatus, } from "@assistant-ui/core/react";
53
- export type { ModelContext, ModelContextProvider, LanguageModelConfig, LanguageModelV1CallSettings, } from "@assistant-ui/core";
54
+ export type { ModelContext, ModelContextOptions, ModelContextProvider, SystemPart, LanguageModelConfig, LanguageModelV1CallSettings, } from "@assistant-ui/core";
54
55
  export { mergeModelContexts } from "@assistant-ui/core";
55
56
  export { unstable_getInteractableSnapshots, unstable_formatInteractableSnapshot, unstable_getInteractableVersions, type Unstable_InteractableSnapshotEntry, type Unstable_InteractableVersion, } from "@assistant-ui/core";
56
57
  export type { Tool } from "assistant-stream";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}