@alexkroman1/aai 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -6
- package/dist/aai.js +3 -0
- package/dist/cli.js +244 -245
- package/dist/sdk/_internal_types.d.ts +73 -0
- package/dist/sdk/_internal_types.d.ts.map +1 -0
- package/dist/sdk/_internal_types.js +24 -0
- package/dist/sdk/_internal_types.js.map +1 -0
- package/dist/sdk/_mock_ws.d.ts +105 -0
- package/dist/sdk/_mock_ws.d.ts.map +1 -0
- package/dist/sdk/_mock_ws.js +154 -0
- package/dist/sdk/_mock_ws.js.map +1 -0
- package/dist/sdk/_timeout.d.ts +14 -0
- package/dist/sdk/_timeout.d.ts.map +1 -0
- package/{sdk/_timeout.ts → dist/sdk/_timeout.js} +9 -9
- package/dist/sdk/_timeout.js.map +1 -0
- package/dist/sdk/builtin_tools.d.ts +33 -0
- package/dist/sdk/builtin_tools.d.ts.map +1 -0
- package/dist/sdk/builtin_tools.js +263 -0
- package/dist/sdk/builtin_tools.js.map +1 -0
- package/dist/sdk/capnweb.d.ts +69 -0
- package/dist/sdk/capnweb.d.ts.map +1 -0
- package/dist/sdk/capnweb.js +291 -0
- package/dist/sdk/capnweb.js.map +1 -0
- package/dist/sdk/define_agent.d.ts +36 -0
- package/dist/sdk/define_agent.d.ts.map +1 -0
- package/dist/sdk/define_agent.js +63 -0
- package/dist/sdk/define_agent.js.map +1 -0
- package/dist/sdk/direct_executor.d.ts +42 -0
- package/dist/sdk/direct_executor.d.ts.map +1 -0
- package/dist/sdk/direct_executor.js +143 -0
- package/dist/sdk/direct_executor.js.map +1 -0
- package/dist/sdk/kv.d.ts +123 -0
- package/dist/sdk/kv.d.ts.map +1 -0
- package/dist/sdk/kv.js +91 -0
- package/dist/sdk/kv.js.map +1 -0
- package/{sdk/mod.ts → dist/sdk/mod.d.ts} +2 -11
- package/dist/sdk/mod.d.ts.map +1 -0
- package/dist/sdk/mod.js +26 -0
- package/dist/sdk/mod.js.map +1 -0
- package/dist/sdk/protocol.d.ts +218 -0
- package/dist/sdk/protocol.d.ts.map +1 -0
- package/dist/sdk/protocol.js +140 -0
- package/dist/sdk/protocol.js.map +1 -0
- package/dist/sdk/runtime.d.ts +35 -0
- package/dist/sdk/runtime.d.ts.map +1 -0
- package/dist/sdk/runtime.js +46 -0
- package/dist/sdk/runtime.js.map +1 -0
- package/dist/sdk/s2s.d.ts +60 -0
- package/dist/sdk/s2s.d.ts.map +1 -0
- package/dist/sdk/s2s.js +171 -0
- package/dist/sdk/s2s.js.map +1 -0
- package/dist/sdk/server.d.ts +51 -0
- package/dist/sdk/server.d.ts.map +1 -0
- package/dist/sdk/server.js +145 -0
- package/dist/sdk/server.js.map +1 -0
- package/dist/sdk/session.d.ts +66 -0
- package/dist/sdk/session.d.ts.map +1 -0
- package/dist/sdk/session.js +324 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/system_prompt.d.ts +6 -0
- package/dist/sdk/system_prompt.d.ts.map +1 -0
- package/dist/sdk/system_prompt.js +35 -0
- package/dist/sdk/system_prompt.js.map +1 -0
- package/dist/sdk/types.d.ts +326 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +38 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/vector.d.ts +90 -0
- package/dist/sdk/vector.d.ts.map +1 -0
- package/dist/sdk/vector.js +61 -0
- package/dist/sdk/vector.js.map +1 -0
- package/dist/sdk/winterc_server.d.ts +53 -0
- package/dist/sdk/winterc_server.d.ts.map +1 -0
- package/dist/sdk/winterc_server.js +82 -0
- package/dist/sdk/winterc_server.js.map +1 -0
- package/dist/sdk/worker_entry.d.ts +48 -0
- package/dist/sdk/worker_entry.d.ts.map +1 -0
- package/dist/sdk/worker_entry.js +67 -0
- package/dist/sdk/worker_entry.js.map +1 -0
- package/dist/sdk/worker_shim.d.ts +20 -0
- package/dist/sdk/worker_shim.d.ts.map +1 -0
- package/dist/sdk/worker_shim.js +132 -0
- package/dist/sdk/worker_shim.js.map +1 -0
- package/dist/sdk/ws_handler.d.ts +50 -0
- package/dist/sdk/ws_handler.d.ts.map +1 -0
- package/dist/sdk/ws_handler.js +156 -0
- package/dist/sdk/ws_handler.js.map +1 -0
- package/dist/ui/_components/app.d.ts +3 -0
- package/dist/ui/_components/app.d.ts.map +1 -0
- package/dist/ui/_components/app.js +14 -0
- package/dist/ui/_components/app.js.map +1 -0
- package/dist/ui/_components/chat_view.d.ts +3 -0
- package/dist/ui/_components/chat_view.d.ts.map +1 -0
- package/dist/ui/_components/chat_view.js +14 -0
- package/dist/ui/_components/chat_view.js.map +1 -0
- package/dist/ui/_components/controls.d.ts +2 -0
- package/dist/ui/_components/controls.d.ts.map +1 -0
- package/dist/ui/_components/controls.js +11 -0
- package/dist/ui/_components/controls.js.map +1 -0
- package/dist/ui/_components/error_banner.d.ts +7 -0
- package/dist/ui/_components/error_banner.d.ts.map +1 -0
- package/dist/ui/_components/error_banner.js +7 -0
- package/dist/ui/_components/error_banner.js.map +1 -0
- package/dist/ui/_components/message_bubble.d.ts +6 -0
- package/dist/ui/_components/message_bubble.d.ts.map +1 -0
- package/dist/ui/_components/message_bubble.js +9 -0
- package/dist/ui/_components/message_bubble.js.map +1 -0
- package/dist/ui/_components/message_list.d.ts +2 -0
- package/dist/ui/_components/message_list.d.ts.map +1 -0
- package/dist/ui/_components/message_list.js +48 -0
- package/dist/ui/_components/message_list.js.map +1 -0
- package/dist/ui/_components/state_indicator.d.ts +7 -0
- package/dist/ui/_components/state_indicator.d.ts.map +1 -0
- package/dist/ui/_components/state_indicator.js +5 -0
- package/dist/ui/_components/state_indicator.js.map +1 -0
- package/dist/ui/_components/thinking_indicator.d.ts +3 -0
- package/dist/ui/_components/thinking_indicator.d.ts.map +1 -0
- package/dist/ui/_components/thinking_indicator.js +8 -0
- package/dist/ui/_components/thinking_indicator.js.map +1 -0
- package/dist/ui/_components/tool_call_block.d.ts +6 -0
- package/dist/ui/_components/tool_call_block.d.ts.map +1 -0
- package/dist/ui/_components/tool_call_block.js +58 -0
- package/dist/ui/_components/tool_call_block.js.map +1 -0
- package/dist/ui/_components/tool_icons.d.ts +18 -0
- package/dist/ui/_components/tool_icons.d.ts.map +1 -0
- package/dist/ui/_components/tool_icons.js +26 -0
- package/dist/ui/_components/tool_icons.js.map +1 -0
- package/dist/ui/_components/transcript.d.ts +6 -0
- package/dist/ui/_components/transcript.d.ts.map +1 -0
- package/dist/ui/_components/transcript.js +8 -0
- package/dist/ui/_components/transcript.js.map +1 -0
- package/dist/ui/_dom_shim.d.ts +7 -0
- package/dist/ui/_dom_shim.d.ts.map +1 -0
- package/dist/ui/_dom_shim.js +21 -0
- package/dist/ui/_dom_shim.js.map +1 -0
- package/dist/ui/_test_utils.js +272 -0
- package/dist/ui/_test_utils.js.map +1 -0
- package/dist/ui/audio.d.ts +46 -0
- package/dist/ui/audio.d.ts.map +1 -0
- package/dist/ui/audio.js +130 -0
- package/dist/ui/audio.js.map +1 -0
- package/dist/ui/components.d.ts +36 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +32 -0
- package/dist/ui/components.js.map +1 -0
- package/{ui/components_mod.ts → dist/ui/components_mod.d.ts} +3 -18
- package/dist/ui/components_mod.d.ts.map +1 -0
- package/dist/ui/components_mod.js +20 -0
- package/dist/ui/components_mod.js.map +1 -0
- package/dist/ui/mod.d.ts +21 -0
- package/dist/ui/mod.d.ts.map +1 -0
- package/{ui/mod.ts → dist/ui/mod.js} +3 -29
- package/dist/ui/mod.js.map +1 -0
- package/dist/ui/mount.d.ts +56 -0
- package/dist/ui/mount.d.ts.map +1 -0
- package/dist/ui/mount.js +60 -0
- package/dist/ui/mount.js.map +1 -0
- package/dist/ui/mount_context.d.ts +10 -0
- package/dist/ui/mount_context.d.ts.map +1 -0
- package/dist/ui/mount_context.js +10 -0
- package/dist/ui/mount_context.js.map +1 -0
- package/dist/ui/session.d.ts +91 -0
- package/dist/ui/session.d.ts.map +1 -0
- package/dist/ui/session.js +366 -0
- package/dist/ui/session.js.map +1 -0
- package/{ui/session_mod.ts → dist/ui/session_mod.d.ts} +2 -10
- package/dist/ui/session_mod.d.ts.map +1 -0
- package/dist/ui/session_mod.js +18 -0
- package/dist/ui/session_mod.js.map +1 -0
- package/dist/ui/signals.d.ts +61 -0
- package/dist/ui/signals.d.ts.map +1 -0
- package/dist/ui/signals.js +74 -0
- package/dist/ui/signals.js.map +1 -0
- package/dist/ui/types.d.ts +36 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +4 -0
- package/dist/ui/types.js.map +1 -0
- package/package.json +103 -28
- package/sdk/_internal_types.ts +0 -89
- package/sdk/_mock_ws.ts +0 -172
- package/sdk/builtin_tools.ts +0 -309
- package/sdk/capnweb.ts +0 -341
- package/sdk/define_agent.ts +0 -70
- package/sdk/direct_executor.ts +0 -195
- package/sdk/kv.ts +0 -183
- package/sdk/protocol.ts +0 -313
- package/sdk/runtime.ts +0 -65
- package/sdk/s2s.ts +0 -271
- package/sdk/server.ts +0 -198
- package/sdk/session.ts +0 -438
- package/sdk/system_prompt.ts +0 -47
- package/sdk/types.ts +0 -406
- package/sdk/vector.ts +0 -133
- package/sdk/winterc_server.ts +0 -141
- package/sdk/worker_entry.ts +0 -99
- package/sdk/worker_shim.ts +0 -170
- package/sdk/ws_handler.ts +0 -190
- package/templates/_shared/.env.example +0 -5
- package/templates/_shared/package.json +0 -17
- package/templates/code-interpreter/agent.ts +0 -27
- package/templates/code-interpreter/client.tsx +0 -2
- package/templates/dispatch-center/agent.ts +0 -1536
- package/templates/dispatch-center/client.tsx +0 -504
- package/templates/embedded-assets/agent.ts +0 -49
- package/templates/embedded-assets/client.tsx +0 -2
- package/templates/embedded-assets/knowledge.json +0 -20
- package/templates/health-assistant/agent.ts +0 -160
- package/templates/health-assistant/client.tsx +0 -2
- package/templates/infocom-adventure/agent.ts +0 -164
- package/templates/infocom-adventure/client.tsx +0 -299
- package/templates/math-buddy/agent.ts +0 -21
- package/templates/math-buddy/client.tsx +0 -2
- package/templates/memory-agent/agent.ts +0 -74
- package/templates/memory-agent/client.tsx +0 -2
- package/templates/night-owl/agent.ts +0 -98
- package/templates/night-owl/client.tsx +0 -28
- package/templates/personal-finance/agent.ts +0 -26
- package/templates/personal-finance/client.tsx +0 -2
- package/templates/simple/agent.ts +0 -6
- package/templates/simple/client.tsx +0 -2
- package/templates/smart-research/agent.ts +0 -164
- package/templates/smart-research/client.tsx +0 -2
- package/templates/support/README.md +0 -62
- package/templates/support/agent.ts +0 -19
- package/templates/support/client.tsx +0 -2
- package/templates/travel-concierge/agent.ts +0 -29
- package/templates/travel-concierge/client.tsx +0 -2
- package/templates/web-researcher/agent.ts +0 -17
- package/templates/web-researcher/client.tsx +0 -2
- package/ui/_components/app.tsx +0 -37
- package/ui/_components/chat_view.tsx +0 -36
- package/ui/_components/controls.tsx +0 -32
- package/ui/_components/error_banner.tsx +0 -18
- package/ui/_components/message_bubble.tsx +0 -21
- package/ui/_components/message_list.tsx +0 -61
- package/ui/_components/state_indicator.tsx +0 -17
- package/ui/_components/thinking_indicator.tsx +0 -19
- package/ui/_components/tool_call_block.tsx +0 -110
- package/ui/_components/tool_icons.tsx +0 -101
- package/ui/_components/transcript.tsx +0 -20
- package/ui/audio.ts +0 -170
- package/ui/components.ts +0 -49
- package/ui/mount.tsx +0 -112
- package/ui/mount_context.ts +0 -19
- package/ui/session.ts +0 -456
- package/ui/signals.ts +0 -111
- package/ui/types.ts +0 -50
- package/ui/worklets/capture-processor.js +0 -62
- package/ui/worklets/playback-processor.js +0 -110
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
import { signal } from "@preact/signals";
|
|
3
|
+
import { render } from "preact";
|
|
4
|
+
import { vi } from "vitest";
|
|
5
|
+
import { DOMParser, installDomShim } from "./_dom_shim.js";
|
|
6
|
+
import { createVoiceSession } from "./session.js";
|
|
7
|
+
import { createSessionControls } from "./signals.js";
|
|
8
|
+
export { installMockWebSocket, MockWebSocket } from "../sdk/_mock_ws.js";
|
|
9
|
+
import { installMockWebSocket } from "../sdk/_mock_ws.js";
|
|
10
|
+
export function delay(ms) {
|
|
11
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
12
|
+
}
|
|
13
|
+
const HTML = `<!DOCTYPE html><html><head></head><body><div id="app"></div></body></html>`;
|
|
14
|
+
const g = globalThis;
|
|
15
|
+
export function setupDOM() {
|
|
16
|
+
installDomShim();
|
|
17
|
+
const doc = new DOMParser().parseFromString(HTML, "text/html");
|
|
18
|
+
g.document = doc;
|
|
19
|
+
return doc;
|
|
20
|
+
}
|
|
21
|
+
export function getContainer() {
|
|
22
|
+
return globalThis.document.querySelector("#app");
|
|
23
|
+
}
|
|
24
|
+
// Ensure document exists at import time for modules that need DOM globals.
|
|
25
|
+
setupDOM();
|
|
26
|
+
export function flush() {
|
|
27
|
+
return new Promise((r) => queueMicrotask(r));
|
|
28
|
+
}
|
|
29
|
+
export function installMockLocation(origin = "http://localhost:3000") {
|
|
30
|
+
const had = "location" in globalThis;
|
|
31
|
+
if (!had)
|
|
32
|
+
g.location = { origin };
|
|
33
|
+
return {
|
|
34
|
+
restore() {
|
|
35
|
+
if (!had)
|
|
36
|
+
delete g.location;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export class MockMediaStreamTrack {
|
|
41
|
+
stopped = false;
|
|
42
|
+
stop() {
|
|
43
|
+
this.stopped = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class MockMediaStream {
|
|
47
|
+
#tracks = [new MockMediaStreamTrack()];
|
|
48
|
+
getTracks() {
|
|
49
|
+
return this.#tracks;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class MockMessagePort {
|
|
53
|
+
onmessage = null;
|
|
54
|
+
posted = [];
|
|
55
|
+
postMessage(data, _transfer) {
|
|
56
|
+
this.posted.push(data);
|
|
57
|
+
}
|
|
58
|
+
simulateMessage(data) {
|
|
59
|
+
this.onmessage?.(new MessageEvent("message", { data }));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class MockAudioWorkletNode {
|
|
63
|
+
port = new MockMessagePort();
|
|
64
|
+
connected = [];
|
|
65
|
+
name;
|
|
66
|
+
options;
|
|
67
|
+
constructor(_ctx, name, options) {
|
|
68
|
+
this.name = name;
|
|
69
|
+
this.options = options;
|
|
70
|
+
}
|
|
71
|
+
connect(dest) {
|
|
72
|
+
this.connected.push(dest);
|
|
73
|
+
}
|
|
74
|
+
disconnect() { }
|
|
75
|
+
}
|
|
76
|
+
export class MockAudioNode {
|
|
77
|
+
connected = [];
|
|
78
|
+
connect(dest) {
|
|
79
|
+
this.connected.push(dest);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class MockGainNode extends MockAudioNode {
|
|
83
|
+
gain = {
|
|
84
|
+
value: 1,
|
|
85
|
+
setTargetAtTime(value, _startTime, _tc) {
|
|
86
|
+
this.value = value;
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export class MockAudioContext {
|
|
91
|
+
sampleRate;
|
|
92
|
+
state = "running";
|
|
93
|
+
currentTime = 0;
|
|
94
|
+
destination = new MockAudioNode();
|
|
95
|
+
audioWorklet = {
|
|
96
|
+
modules: [],
|
|
97
|
+
addModule(url) {
|
|
98
|
+
this.modules.push(url);
|
|
99
|
+
return Promise.resolve();
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
closed = false;
|
|
103
|
+
constructor(opts) {
|
|
104
|
+
this.sampleRate = opts?.sampleRate ?? 44100;
|
|
105
|
+
}
|
|
106
|
+
resume() {
|
|
107
|
+
return Promise.resolve();
|
|
108
|
+
}
|
|
109
|
+
createMediaStreamSource(_stream) {
|
|
110
|
+
return new MockAudioNode();
|
|
111
|
+
}
|
|
112
|
+
createGain() {
|
|
113
|
+
return new MockGainNode();
|
|
114
|
+
}
|
|
115
|
+
close() {
|
|
116
|
+
this.closed = true;
|
|
117
|
+
this.state = "closed";
|
|
118
|
+
return Promise.resolve();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Install Web Audio API mocks on globalThis and run `fn`.
|
|
123
|
+
* All mocks are restored after `fn` completes.
|
|
124
|
+
*/
|
|
125
|
+
export function withAudioMocks(fn) {
|
|
126
|
+
return async () => {
|
|
127
|
+
const origAudioContext = globalThis.AudioContext;
|
|
128
|
+
const origAudioWorkletNode = globalThis.AudioWorkletNode;
|
|
129
|
+
const nav = g.navigator;
|
|
130
|
+
const origGetUserMedia = nav?.mediaDevices?.getUserMedia;
|
|
131
|
+
let _lastContext;
|
|
132
|
+
const _workletNodes = [];
|
|
133
|
+
g.AudioContext = class extends MockAudioContext {
|
|
134
|
+
constructor(opts) {
|
|
135
|
+
super(opts);
|
|
136
|
+
_lastContext = this;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
g.AudioWorkletNode = class extends MockAudioWorkletNode {
|
|
140
|
+
constructor(ctx, name, options) {
|
|
141
|
+
super(ctx, name, options);
|
|
142
|
+
_workletNodes.push(this);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
if (!nav.mediaDevices)
|
|
146
|
+
nav.mediaDevices = {};
|
|
147
|
+
nav.mediaDevices.getUserMedia = () => Promise.resolve(new MockMediaStream());
|
|
148
|
+
try {
|
|
149
|
+
await fn({
|
|
150
|
+
lastContext: () => _lastContext,
|
|
151
|
+
workletNodes: () => _workletNodes,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
globalThis.AudioContext = origAudioContext;
|
|
156
|
+
globalThis.AudioWorkletNode = origAudioWorkletNode;
|
|
157
|
+
if (origGetUserMedia) {
|
|
158
|
+
nav.mediaDevices.getUserMedia = origGetUserMedia;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function findWorkletNode(nodes, name) {
|
|
164
|
+
const node = nodes.find((n) => n.name === name);
|
|
165
|
+
if (!node)
|
|
166
|
+
throw new Error(`No worklet node named "${name}"`);
|
|
167
|
+
return node;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Set up a DOM + FakeTime environment, run `fn`, then clean up.
|
|
171
|
+
* Used by component tests that need a container and timer control.
|
|
172
|
+
*/
|
|
173
|
+
export function withDOM(fn) {
|
|
174
|
+
return async () => {
|
|
175
|
+
vi.useFakeTimers();
|
|
176
|
+
setupDOM();
|
|
177
|
+
const container = getContainer();
|
|
178
|
+
try {
|
|
179
|
+
await fn(container);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
render(null, container);
|
|
183
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
184
|
+
vi.useRealTimers();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Set up DOM + mock WebSocket, run `fn`, then clean up.
|
|
190
|
+
* Used by mount tests.
|
|
191
|
+
*/
|
|
192
|
+
export function withMountEnv(fn) {
|
|
193
|
+
return async () => {
|
|
194
|
+
setupDOM();
|
|
195
|
+
const mock = installMockWebSocket();
|
|
196
|
+
try {
|
|
197
|
+
await fn(mock);
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
const app = globalThis.document.querySelector("#app");
|
|
201
|
+
if (app)
|
|
202
|
+
render(null, app);
|
|
203
|
+
await delay(0);
|
|
204
|
+
mock.restore();
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Set up mock WebSocket + location + session + signals, run `fn`, clean up.
|
|
210
|
+
* Used by signals tests.
|
|
211
|
+
*/
|
|
212
|
+
export function withSignalsEnv(fn) {
|
|
213
|
+
return async () => {
|
|
214
|
+
const mock = installMockWebSocket();
|
|
215
|
+
const loc = installMockLocation();
|
|
216
|
+
const session = createVoiceSession({
|
|
217
|
+
platformUrl: "http://localhost:3000",
|
|
218
|
+
});
|
|
219
|
+
const signals = createSessionControls(session);
|
|
220
|
+
try {
|
|
221
|
+
await fn({
|
|
222
|
+
mock,
|
|
223
|
+
session,
|
|
224
|
+
signals,
|
|
225
|
+
async connect() {
|
|
226
|
+
session.connect();
|
|
227
|
+
await flush();
|
|
228
|
+
},
|
|
229
|
+
send(msg) {
|
|
230
|
+
mock.lastWs.simulateMessage(JSON.stringify(msg));
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
mock.restore();
|
|
236
|
+
loc.restore();
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export function createMockSignals(overrides) {
|
|
241
|
+
const mockSession = {
|
|
242
|
+
state: signal(overrides?.state ?? "disconnected"),
|
|
243
|
+
messages: signal(overrides?.messages ?? []),
|
|
244
|
+
toolCalls: signal([]),
|
|
245
|
+
userUtterance: signal(overrides?.userUtterance ?? null),
|
|
246
|
+
error: signal(overrides?.error ?? null),
|
|
247
|
+
disconnected: signal(null),
|
|
248
|
+
connect() { },
|
|
249
|
+
cancel() { },
|
|
250
|
+
resetState() { },
|
|
251
|
+
reset() { },
|
|
252
|
+
disconnect() { },
|
|
253
|
+
[Symbol.dispose]() { },
|
|
254
|
+
};
|
|
255
|
+
const signals = {
|
|
256
|
+
session: mockSession,
|
|
257
|
+
started: signal(overrides?.started ?? false),
|
|
258
|
+
running: signal(overrides?.running ?? true),
|
|
259
|
+
dispose() { },
|
|
260
|
+
[Symbol.dispose]() { },
|
|
261
|
+
start() {
|
|
262
|
+
signals.started.value = true;
|
|
263
|
+
signals.running.value = true;
|
|
264
|
+
},
|
|
265
|
+
toggle() {
|
|
266
|
+
signals.running.value = !signals.running.value;
|
|
267
|
+
},
|
|
268
|
+
reset() { },
|
|
269
|
+
};
|
|
270
|
+
return signals;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=_test_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_test_utils.js","sourceRoot":"","sources":["../../ui/_test_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Configuration for creating a {@linkcode VoiceIO} instance. */
|
|
2
|
+
export type VoiceIOOptions = {
|
|
3
|
+
/** Sample rate in Hz expected by the STT engine (e.g. 16000). */
|
|
4
|
+
sttSampleRate: number;
|
|
5
|
+
/** Sample rate in Hz used by the TTS engine (e.g. 22050). */
|
|
6
|
+
ttsSampleRate: number;
|
|
7
|
+
/** Source URL or data URI for the capture AudioWorklet processor. */
|
|
8
|
+
captureWorkletSrc: string;
|
|
9
|
+
/** Source URL or data URI for the playback AudioWorklet processor. */
|
|
10
|
+
playbackWorkletSrc: string;
|
|
11
|
+
/** Callback invoked with buffered PCM16 microphone data to send to the server. */
|
|
12
|
+
onMicData: (pcm16: ArrayBuffer) => void;
|
|
13
|
+
/** Callback invoked with the current playback position in samples. */
|
|
14
|
+
onPlaybackProgress?: (samplesPlayed: number) => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Audio I/O interface for voice capture and playback.
|
|
18
|
+
*
|
|
19
|
+
* Manages microphone capture via an AudioWorklet, resampling to the STT
|
|
20
|
+
* sample rate, and TTS audio playback through a second AudioWorklet. Implements
|
|
21
|
+
* {@linkcode AsyncDisposable} for resource cleanup.
|
|
22
|
+
*/
|
|
23
|
+
export type VoiceIO = AsyncDisposable & {
|
|
24
|
+
/** Enqueue a PCM16 audio buffer for playback through the TTS pipeline. */
|
|
25
|
+
enqueue(pcm16Buffer: ArrayBuffer): void;
|
|
26
|
+
/** Signal that all TTS audio for the current turn has been enqueued.
|
|
27
|
+
* Resolves when the worklet has finished playing all buffered audio. */
|
|
28
|
+
done(): Promise<void>;
|
|
29
|
+
/** Immediately stop playback and discard any buffered TTS audio. */
|
|
30
|
+
flush(): void;
|
|
31
|
+
/** Release all audio resources (microphone, AudioContext, worklets). */
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Create a {@linkcode VoiceIO} instance that captures microphone audio and
|
|
36
|
+
* plays back TTS audio using the Web Audio API.
|
|
37
|
+
*
|
|
38
|
+
* The AudioContext runs at the TTS sample rate for playback fidelity.
|
|
39
|
+
* Captured audio is resampled to the STT rate when the rates differ.
|
|
40
|
+
*
|
|
41
|
+
* @param opts - Voice I/O configuration options.
|
|
42
|
+
* @returns A promise that resolves to a {@linkcode VoiceIO} handle.
|
|
43
|
+
* @throws If microphone access is denied or AudioWorklet registration fails.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createVoiceIO(opts: VoiceIOOptions): Promise<VoiceIO>;
|
|
46
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../ui/audio.ts"],"names":[],"mappings":"AAGA,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG;IAC3B,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,eAAe,GAAG;IACtC,0EAA0E;IAC1E,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IACxC;6EACyE;IACzE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;IACd,wEAAwE;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAMF;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoH1E"}
|
package/dist/ui/audio.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
import { MIC_BUFFER_SECONDS } from "./types.js";
|
|
3
|
+
async function loadWorklet(ctx, source) {
|
|
4
|
+
await ctx.audioWorklet.addModule(source);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Create a {@linkcode VoiceIO} instance that captures microphone audio and
|
|
8
|
+
* plays back TTS audio using the Web Audio API.
|
|
9
|
+
*
|
|
10
|
+
* The AudioContext runs at the TTS sample rate for playback fidelity.
|
|
11
|
+
* Captured audio is resampled to the STT rate when the rates differ.
|
|
12
|
+
*
|
|
13
|
+
* @param opts - Voice I/O configuration options.
|
|
14
|
+
* @returns A promise that resolves to a {@linkcode VoiceIO} handle.
|
|
15
|
+
* @throws If microphone access is denied or AudioWorklet registration fails.
|
|
16
|
+
*/
|
|
17
|
+
export async function createVoiceIO(opts) {
|
|
18
|
+
const { sttSampleRate, ttsSampleRate, captureWorkletSrc, playbackWorkletSrc, onMicData } = opts;
|
|
19
|
+
// Use TTS rate for the context — playback fidelity is more perceptible.
|
|
20
|
+
// Capture path resamples to STT rate if they differ.
|
|
21
|
+
const contextRate = ttsSampleRate;
|
|
22
|
+
const ctx = new AudioContext({
|
|
23
|
+
sampleRate: contextRate,
|
|
24
|
+
latencyHint: "playback",
|
|
25
|
+
});
|
|
26
|
+
await ctx.resume();
|
|
27
|
+
// Single AudioContext owns both capture and playback — required for AEC.
|
|
28
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
29
|
+
audio: {
|
|
30
|
+
sampleRate: contextRate,
|
|
31
|
+
echoCancellation: true,
|
|
32
|
+
noiseSuppression: true,
|
|
33
|
+
autoGainControl: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
await Promise.all([loadWorklet(ctx, captureWorkletSrc), loadWorklet(ctx, playbackWorkletSrc)]);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
for (const t of stream.getTracks())
|
|
41
|
+
t.stop();
|
|
42
|
+
await ctx.close().catch(() => { });
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
const mic = ctx.createMediaStreamSource(stream);
|
|
46
|
+
const capNode = new AudioWorkletNode(ctx, "capture-processor", {
|
|
47
|
+
channelCount: 1,
|
|
48
|
+
channelCountMode: "explicit",
|
|
49
|
+
processorOptions: { contextRate, sttSampleRate },
|
|
50
|
+
});
|
|
51
|
+
mic.connect(capNode);
|
|
52
|
+
// Worklet outputs PCM16 at the STT rate — just batch and send.
|
|
53
|
+
const chunkSizeBytes = Math.floor(sttSampleRate * MIC_BUFFER_SECONDS) * 2;
|
|
54
|
+
const capBuf = new Uint8Array(chunkSizeBytes * 2);
|
|
55
|
+
let capOffset = 0;
|
|
56
|
+
capNode.port.postMessage({ event: "start" });
|
|
57
|
+
capNode.port.onmessage = (e) => {
|
|
58
|
+
if (e.data.event !== "chunk")
|
|
59
|
+
return;
|
|
60
|
+
const chunk = new Uint8Array(e.data.buffer);
|
|
61
|
+
capBuf.set(chunk, capOffset);
|
|
62
|
+
capOffset += chunk.byteLength;
|
|
63
|
+
if (capOffset >= chunkSizeBytes) {
|
|
64
|
+
onMicData(capBuf.slice(0, capOffset).buffer);
|
|
65
|
+
capOffset = 0;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
let playNode = null;
|
|
69
|
+
let onPlaybackStop = null;
|
|
70
|
+
const lifecycle = new AbortController();
|
|
71
|
+
const { onPlaybackProgress } = opts;
|
|
72
|
+
function ensurePlayNode() {
|
|
73
|
+
if (playNode)
|
|
74
|
+
return playNode;
|
|
75
|
+
const node = new AudioWorkletNode(ctx, "playback-processor", {
|
|
76
|
+
processorOptions: { sampleRate: contextRate },
|
|
77
|
+
});
|
|
78
|
+
node.connect(ctx.destination);
|
|
79
|
+
node.port.onmessage = (e) => {
|
|
80
|
+
if (e.data.event === "stop") {
|
|
81
|
+
node.disconnect();
|
|
82
|
+
if (playNode === node)
|
|
83
|
+
playNode = null;
|
|
84
|
+
onPlaybackStop?.();
|
|
85
|
+
onPlaybackStop = null;
|
|
86
|
+
}
|
|
87
|
+
else if (e.data.event === "progress") {
|
|
88
|
+
onPlaybackProgress?.(e.data.readPos);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
playNode = node;
|
|
92
|
+
return node;
|
|
93
|
+
}
|
|
94
|
+
const io = {
|
|
95
|
+
enqueue(pcm16Buffer) {
|
|
96
|
+
if (lifecycle.signal.aborted)
|
|
97
|
+
return;
|
|
98
|
+
if (pcm16Buffer.byteLength === 0)
|
|
99
|
+
return;
|
|
100
|
+
const node = ensurePlayNode();
|
|
101
|
+
node.port.postMessage({ event: "write", buffer: new Uint8Array(pcm16Buffer) }, [pcm16Buffer]);
|
|
102
|
+
},
|
|
103
|
+
done() {
|
|
104
|
+
if (!playNode)
|
|
105
|
+
return Promise.resolve();
|
|
106
|
+
return new Promise((resolve) => {
|
|
107
|
+
onPlaybackStop = resolve;
|
|
108
|
+
playNode.port.postMessage({ event: "done" });
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
flush() {
|
|
112
|
+
if (playNode)
|
|
113
|
+
playNode.port.postMessage({ event: "interrupt" });
|
|
114
|
+
},
|
|
115
|
+
async close() {
|
|
116
|
+
if (lifecycle.signal.aborted)
|
|
117
|
+
return;
|
|
118
|
+
lifecycle.abort();
|
|
119
|
+
capNode.port.postMessage({ event: "stop" });
|
|
120
|
+
for (const t of stream.getTracks())
|
|
121
|
+
t.stop();
|
|
122
|
+
await ctx.close().catch(() => { });
|
|
123
|
+
},
|
|
124
|
+
async [Symbol.asyncDispose]() {
|
|
125
|
+
await io.close();
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
return io;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../ui/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preact UI components for the voice agent interface.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from _components/ with explicit type annotations so JSR can
|
|
5
|
+
* generate .d.ts without needing to analyze source files.
|
|
6
|
+
*/
|
|
7
|
+
import type { Signal } from "@preact/signals";
|
|
8
|
+
import type * as preact from "preact";
|
|
9
|
+
import type { AgentState, Message, SessionError, ToolCallInfo } from "./types.ts";
|
|
10
|
+
/** Displays the current agent state as a colored indicator. */
|
|
11
|
+
export declare const StateIndicator: (props: {
|
|
12
|
+
state: Signal<AgentState>;
|
|
13
|
+
}) => preact.JSX.Element;
|
|
14
|
+
/** Displays an error message banner when an error is present. */
|
|
15
|
+
export declare const ErrorBanner: (props: {
|
|
16
|
+
error: Signal<SessionError | null>;
|
|
17
|
+
}) => preact.JSX.Element | null;
|
|
18
|
+
/** Renders a single chat message bubble. */
|
|
19
|
+
export declare const MessageBubble: (props: {
|
|
20
|
+
message: Message;
|
|
21
|
+
}) => preact.JSX.Element;
|
|
22
|
+
/** Renders a collapsible tool call block. */
|
|
23
|
+
export declare const ToolCallBlock: (props: {
|
|
24
|
+
toolCall: ToolCallInfo;
|
|
25
|
+
}) => preact.JSX.Element;
|
|
26
|
+
/** Displays the live user utterance from STT/VAD. */
|
|
27
|
+
export declare const Transcript: (props: {
|
|
28
|
+
userUtterance: Signal<string | null>;
|
|
29
|
+
}) => preact.JSX.Element | null;
|
|
30
|
+
/** Animated indicator shown while the agent is processing. */
|
|
31
|
+
export declare const ThinkingIndicator: () => preact.JSX.Element;
|
|
32
|
+
/** Full chat view showing messages, transcript, and thinking state. */
|
|
33
|
+
export declare const ChatView: () => preact.JSX.Element;
|
|
34
|
+
/** Default top-level app component with start screen and chat view. */
|
|
35
|
+
export declare const App: () => preact.JSX.Element;
|
|
36
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../ui/components.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAStC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElF,+DAA+D;AAC/D,eAAO,MAAM,cAAc,EAAE,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;CAAE,KAAK,MAAM,CAAC,GAAG,CAAC,OACjE,CAAC;AAElB,iEAAiE;AACjE,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,EAAE;IAChC,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CACpC,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,IAAmB,CAAC;AAE/C,4CAA4C;AAC5C,eAAO,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK,MAAM,CAAC,GAAG,CAAC,OAAwB,CAAC;AAEjG,6CAA6C;AAC7C,eAAO,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,KAAK,MAAM,CAAC,GAAG,CAAC,OAC9D,CAAC;AAEjB,qDAAqD;AACrD,eAAO,MAAM,UAAU,EAAE,CAAC,KAAK,EAAE;IAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtC,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,IAAkB,CAAC;AAE9C,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,OAA4B,CAAC;AAE9E,uEAAuE;AACvE,eAAO,MAAM,QAAQ,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,OAAmB,CAAC;AAE5D,uEAAuE;AACvE,eAAO,MAAM,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,OAAc,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
/**
|
|
3
|
+
* Preact UI components for the voice agent interface.
|
|
4
|
+
*
|
|
5
|
+
* Re-exports from _components/ with explicit type annotations so JSR can
|
|
6
|
+
* generate .d.ts without needing to analyze source files.
|
|
7
|
+
*/
|
|
8
|
+
import { App as _App } from "./_components/app.js";
|
|
9
|
+
import { ChatView as _ChatView } from "./_components/chat_view.js";
|
|
10
|
+
import { ErrorBanner as _ErrorBanner } from "./_components/error_banner.js";
|
|
11
|
+
import { MessageBubble as _MessageBubble } from "./_components/message_bubble.js";
|
|
12
|
+
import { StateIndicator as _StateIndicator } from "./_components/state_indicator.js";
|
|
13
|
+
import { ThinkingIndicator as _ThinkingIndicator } from "./_components/thinking_indicator.js";
|
|
14
|
+
import { ToolCallBlock as _ToolCallBlock } from "./_components/tool_call_block.js";
|
|
15
|
+
import { Transcript as _Transcript } from "./_components/transcript.js";
|
|
16
|
+
/** Displays the current agent state as a colored indicator. */
|
|
17
|
+
export const StateIndicator = _StateIndicator;
|
|
18
|
+
/** Displays an error message banner when an error is present. */
|
|
19
|
+
export const ErrorBanner = _ErrorBanner;
|
|
20
|
+
/** Renders a single chat message bubble. */
|
|
21
|
+
export const MessageBubble = _MessageBubble;
|
|
22
|
+
/** Renders a collapsible tool call block. */
|
|
23
|
+
export const ToolCallBlock = _ToolCallBlock;
|
|
24
|
+
/** Displays the live user utterance from STT/VAD. */
|
|
25
|
+
export const Transcript = _Transcript;
|
|
26
|
+
/** Animated indicator shown while the agent is processing. */
|
|
27
|
+
export const ThinkingIndicator = _ThinkingIndicator;
|
|
28
|
+
/** Full chat view showing messages, transcript, and thinking state. */
|
|
29
|
+
export const ChatView = _ChatView;
|
|
30
|
+
/** Default top-level app component with start screen and chat view. */
|
|
31
|
+
export const App = _App;
|
|
32
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../ui/components.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;GAKG;AAIH,OAAO,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,sBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,4BAA6B,CAAC;AACpE,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,+BAAgC,CAAC;AAC7E,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iCAAkC,CAAC;AACnF,OAAO,EAAE,cAAc,IAAI,eAAe,EAAE,MAAM,kCAAmC,CAAC;AACtF,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,qCAAsC,CAAC;AAC/F,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,kCAAmC,CAAC;AACpF,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,6BAA8B,CAAC;AAGzE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GACzB,eAAe,CAAC;AAElB,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAEU,YAAY,CAAC;AAE/C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAwD,cAAc,CAAC;AAEjG,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GACxB,cAAc,CAAC;AAEjB,qDAAqD;AACrD,MAAM,CAAC,MAAM,UAAU,GAEW,WAAW,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAA6B,kBAAkB,CAAC;AAE9E,uEAAuE;AACvE,MAAM,CAAC,MAAM,QAAQ,GAA6B,SAAS,CAAC;AAE5D,uEAAuE;AACvE,MAAM,CAAC,MAAM,GAAG,GAA6B,IAAI,CAAC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// Copyright 2025 the AAI authors. MIT license.
|
|
2
1
|
/**
|
|
3
2
|
* Preact UI components for AAI voice agents.
|
|
4
3
|
*
|
|
@@ -13,25 +12,11 @@
|
|
|
13
12
|
*
|
|
14
13
|
* @module
|
|
15
14
|
*/
|
|
16
|
-
|
|
17
|
-
export {
|
|
18
|
-
App,
|
|
19
|
-
ChatView,
|
|
20
|
-
ErrorBanner,
|
|
21
|
-
MessageBubble,
|
|
22
|
-
StateIndicator,
|
|
23
|
-
ThinkingIndicator,
|
|
24
|
-
ToolCallBlock,
|
|
25
|
-
Transcript,
|
|
26
|
-
} from "./components.ts";
|
|
15
|
+
export { App, ChatView, ErrorBanner, MessageBubble, StateIndicator, ThinkingIndicator, ToolCallBlock, Transcript, } from "./components.ts";
|
|
27
16
|
export type { MountHandle, MountOptions, MountTheme } from "./mount.tsx";
|
|
28
|
-
|
|
29
17
|
export { mount } from "./mount.tsx";
|
|
30
18
|
export type { MountConfig } from "./mount_context.ts";
|
|
31
19
|
export { useMountConfig } from "./mount_context.ts";
|
|
32
20
|
export type { SessionSignals } from "./signals.ts";
|
|
33
|
-
export {
|
|
34
|
-
|
|
35
|
-
SessionProvider,
|
|
36
|
-
useSession,
|
|
37
|
-
} from "./signals.ts";
|
|
21
|
+
export { createSessionControls, SessionProvider, useSession, } from "./signals.ts";
|
|
22
|
+
//# sourceMappingURL=components_mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components_mod.d.ts","sourceRoot":"","sources":["../../ui/components_mod.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,GAAG,EACH,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,UAAU,GACX,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
/**
|
|
3
|
+
* Preact UI components for AAI voice agents.
|
|
4
|
+
*
|
|
5
|
+
* Provides ready-made components, session context, and mount helpers.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { App, mount } from "@aai/ui/components";
|
|
10
|
+
*
|
|
11
|
+
* mount(App, { target: "#app" });
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
export { App, ChatView, ErrorBanner, MessageBubble, StateIndicator, ThinkingIndicator, ToolCallBlock, Transcript, } from "./components.js";
|
|
17
|
+
export { mount } from "./mount.js";
|
|
18
|
+
export { useMountConfig } from "./mount_context.js";
|
|
19
|
+
export { createSessionControls, SessionProvider, useSession, } from "./signals.js";
|
|
20
|
+
//# sourceMappingURL=components_mod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components_mod.js","sourceRoot":"","sources":["../../ui/components_mod.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,GAAG,EACH,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAa,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,UAAU,GACX,MAAM,cAAc,CAAC"}
|
package/dist/ui/mod.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser client library for AAI voice agents.
|
|
3
|
+
*
|
|
4
|
+
* Provides WebSocket session management, audio capture/playback,
|
|
5
|
+
* and Preact UI components. For narrower imports, use the sub-path exports:
|
|
6
|
+
*
|
|
7
|
+
* - `@aai/ui/session` — WebSocket session only (no Preact dependency)
|
|
8
|
+
* - `@aai/ui/components` — Preact components, mount helpers, and signals
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import { App, mount } from "@aai/ui";
|
|
13
|
+
*
|
|
14
|
+
* mount(App, { target: "#app" });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
export { App, ChatView, createSessionControls, ErrorBanner, MessageBubble, type MountConfig, type MountHandle, type MountOptions, type MountTheme, mount, SessionProvider, type SessionSignals, StateIndicator, ThinkingIndicator, Transcript, useMountConfig, useSession, } from "./components_mod.ts";
|
|
20
|
+
export { type AgentState, createVoiceSession, type Message, type SessionError, type SessionErrorCode, type SessionOptions, type VoiceSession, } from "./session_mod.ts";
|
|
21
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../ui/mod.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,GAAG,EACH,QAAQ,EACR,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,EACL,eAAe,EACf,KAAK,cAAc,EACnB,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,UAAU,EACf,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
|