@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.
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.d.ts +22 -0
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +297 -0
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.js.map +1 -0
- package/dist/context/stores/ThreadViewport.d.ts +8 -0
- package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
- package/dist/context/stores/ThreadViewport.js +24 -8
- package/dist/context/stores/ThreadViewport.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +1 -1
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +5 -1
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.js +67 -46
- package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
- package/dist/model-context/makeAssistantVisible.js +1 -1
- package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerAddAttachment.js +28 -10
- package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
- package/dist/primitives/composer/ComposerInput.d.ts +4 -1
- package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerInput.js +15 -2
- package/dist/primitives/composer/ComposerInput.js.map +1 -1
- package/dist/primitives/composer/ComposerResume.d.ts +23 -0
- package/dist/primitives/composer/ComposerResume.d.ts.map +1 -0
- package/dist/primitives/composer/ComposerResume.js +34 -0
- package/dist/primitives/composer/ComposerResume.js.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +6 -2
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +4 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
- package/dist/primitives/composer.d.ts +1 -0
- package/dist/primitives/composer.d.ts.map +1 -1
- package/dist/primitives/composer.js +3 -1
- package/dist/primitives/composer.js.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +32 -292
- package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
- package/dist/unstable/useMentionAdapter.js +1 -1
- package/dist/utils/Primitive.d.ts +14 -14
- package/dist/utils/hooks/useOnResizeContent.js +1 -1
- package/package.json +5 -5
- package/src/adapters/OpenAIRealtimeVoiceAdapter.test.ts +748 -0
- package/src/adapters/OpenAIRealtimeVoiceAdapter.ts +388 -0
- package/src/context/stores/ThreadViewport.ts +36 -8
- package/src/index.ts +6 -0
- package/src/mcp-apps/McpAppRenderer.test.tsx +65 -0
- package/src/mcp-apps/McpAppRenderer.tsx +13 -2
- package/src/model-context/frame/useAssistantFrameHost.detach.test.tsx +145 -0
- package/src/model-context/frame/useAssistantFrameHost.reload.test.tsx +106 -0
- package/src/model-context/frame/useAssistantFrameHost.test.tsx +3 -1
- package/src/model-context/frame/useAssistantFrameHost.ts +72 -24
- package/src/model-context/makeAssistantVisible.test.tsx +25 -37
- package/src/primitives/composer/ComposerAddAttachment.test.tsx +1 -0
- package/src/primitives/composer/ComposerAddAttachment.thread-scope.test.tsx +202 -0
- package/src/primitives/composer/ComposerAddAttachment.ts +11 -1
- package/src/primitives/composer/ComposerInput.focus-on-run-start.test.tsx +130 -0
- package/src/primitives/composer/ComposerInput.tsx +30 -4
- package/src/primitives/composer/ComposerResume.ts +36 -0
- package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +24 -0
- package/src/primitives/composer/trigger/triggerSelectionResource.ts +14 -3
- package/src/primitives/composer/useAuiState.composer.test.tsx +84 -0
- package/src/primitives/composer.ts +1 -0
- package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +90 -0
- package/src/primitives/thread/useThreadViewportAutoScroll.ts +48 -486
- 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":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/context/stores/ThreadViewport.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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:
|
|
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":"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"}
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EACL,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,0BAA0B,EAAE,yFAAsF;AAG3H,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EACV,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,iBAAiB,EACjB,gCAAgC,EAChC,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,0BAA0B,GAC3B,iCAA8B;AAC/B,YAAY,EACV,oCAAoC,EACpC,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,GACxB,iCAA8B;AAG/B,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,iFAA8E;AAChH,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EACL,2BAA2B;AAC3B,+GAA+G;AAC/G,uBAAuB,IAAI,gCAAgC;AAC3D,+GAA+G;AAC/G,oCAAoC,IAAI,6CAA6C;AACrF,+GAA+G;AAC/G,KAAK,8BAA8B,IAAI,uCAAuC,GAC/E,oFAAiF;AAClF,OAAO;AACL,+GAA+G;AAC/G,sBAAsB,IAAI,+BAA+B,GAC1D,gFAA6E;AAG9E,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,gEAA6D;AACvF,YAAY,EAAE,mBAAmB,EAAE,oEAAiE;AAGpG,OAAO,EAAE,0BAA0B,EAAE,wFAAqF;AAC1H,OAAO,EAAE,yBAAyB,EAAE,2EAAwE;AAC5G,YAAY,EACV,uBAAuB,EACvB,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,YAAY,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,mCAA0B;AAG1B,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,mBAAmB,EACnB,KAAK,eAAe,EACpB,mBAAmB,EACnB,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,EACL,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,EACzC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,iCAAiC,EACtC,KAAK,6BAA6B,EAClC,KAAK,mCAAmC,EACxC,KAAK,uCAAuC,EAC5C,KAAK,sCAAsC,EAC3C,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,iBAAiB,EACjB,KAAK,cAAc,GACpB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,iCAAiC,EACjC,mCAAmC,EACnC,gCAAgC,EAChC,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,GAClC,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,gDAA6C;AAG5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EACV,8BAA8B,EAC9B,qCAAqC,EACrC,kCAAkC,GACnC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,uDAAoD;AAEpF,OAAO,KAAK,kBAAkB,kCAA+B;AAC7D,OAAO,KAAK,sBAAsB,sCAAmC;AACrE,OAAO,KAAK,uBAAuB,uCAAoC;AACvE,OAAO,KAAK,mBAAmB,mCAAgC;AAC/D,OAAO,KAAK,qBAAqB,qCAAkC;AACnE,OAAO,KAAK,uBAAuB,uCAAoC;AACvE,OAAO,KAAK,iBAAiB,iCAA8B;AAC3D,OAAO,KAAK,kBAAkB,kCAA+B;AAC7D,OAAO,KAAK,oBAAoB,oCAAiC;AACjE,OAAO,KAAK,cAAc,8BAA2B;AACrD,OAAO,KAAK,gBAAgB,gCAA6B;AACzD,OAAO,KAAK,eAAe,+BAA4B;AACvD,OAAO,KAAK,mBAAmB,mCAAgC;AAC/D,OAAO,KAAK,mBAAmB,mCAAgC;AAC/D,OAAO,KAAK,uBAAuB,uCAAoC;AACvE,OAAO,KAAK,2BAA2B,2CAAwC;AAC/E,OAAO,KAAK,yBAAyB,yCAAsC;AAE3E,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACL,wBAAwB,EACxB,KAAK,SAAS,EACd,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,uDAAoD;AACjF,OAAO,EAAE,uBAAuB,EAAE,4DAAyD;AAC3F,OAAO,EAAE,oBAAoB,EAAE,yDAAsD;AACrF,OAAO,EAAE,kBAAkB,EAAE,uDAAoD;AACjF,OAAO,EAAE,mBAAmB,EAAE,wDAAqD;AACnF,OAAO,EAAE,kBAAkB,EAAE,uDAAoD;AACjF,OAAO,EAAE,2BAA2B,EAAE,2DAAwD;AAC9F,OAAO,EAAE,aAAa,EAAE,gDAA6C;AACrE,OAAO,EAAE,eAAe,EAAE,mCAAgC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,oCAAiC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,sCAAmC;AAChE,OAAO,EACL,iCAAiC,EACjC,KAAK,8BAA8B,EACnC,KAAK,qCAAqC,GAC3C,+CAA4C;AAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,oCAAiC;AAGzE,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,EAC5B,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,kCAAkC,EAClC,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,gCAAgC,EAChC,4BAA4B,EAC5B,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,GACV,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,oCAAiC;AAE9E,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,QAAQ,sBAAmB;AAGvC,OAAO,EACL,0BAA0B,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,GACvC,wCAAqC;AAGtC,OAAO,EACL,+BAA+B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,sCAAsC,GAC5C,6CAA0C;AAG3C,OAAO,EACL,iCAAiC,EACjC,KAAK,wCAAwC,GAC9C,+CAA4C;AAE7C,YAAY,EAAE,mBAAmB,EAAE,sBAAmB;AAGtD,OAAO;AACL,+GAA+G;AAC/G,4BAA4B,IAAI,qCAAqC;AACrE,+GAA+G;AAC/G,oCAAoC,IAAI,6CAA6C;AACrF,+GAA+G;AAC/G,6BAA6B,IAAI,sCAAsC;AACvE,+GAA+G;AAC/G,qCAAqC,IAAI,8CAA8C;AACvF,+GAA+G;AAC/G,yBAAyB,IAAI,kCAAkC;AAC/D,+GAA+G;AAC/G,iCAAiC,IAAI,0CAA0C;AAC/E,+GAA+G;AAC/G,KAAK,iBAAiB,IAAI,0BAA0B,EACpD,KAAK,YAAY,EACjB,KAAK,cAAc;AACnB,+GAA+G;AAC/G,KAAK,eAAe,IAAI,wBAAwB,GACjD,+CAAsC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACf,+CAAsC;AACvC,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AACjD,gDAAgD;AAChD,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC;AACrD,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,kCAAkC,GACnC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gCAAgC,EAChC,KAAK,6BAA6B,GACnC,8CAA2C;AAG5C,OAAO,EACL,yBAAyB,EACzB,mCAAmC,EACnC,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,GACtC,uCAAoC;AAErC,YAAY,EAAE,SAAS,EAAE,2BAAwB;AAGjD,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,8CAA2C;AAE5C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACtB,4BAAmB;AACpB,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,8BAA8B,GAC/B,4BAAmB;AACpB,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EACL,0BAA0B,EAC1B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,GACnC,+CAA4C;AAC7C,OAAO;AACL,+GAA+G;AAC/G,mBAAmB,IAAI,4BAA4B,GACpD,0CAAuC;AAGxC,YAAY,EACV,YAAY,EACZ,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iCAAiC,EACjC,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,SAAS,EACT,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|