@alexkroman1/aai 0.8.7 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/{sdk/_internal_types.d.ts → _internal-types.d.ts} +0 -3
  2. package/dist/_internal-types.js +19 -0
  3. package/dist/{sdk/_mock_ws.d.ts → _mock-ws.d.ts} +16 -5
  4. package/dist/_mock-ws.js +158 -0
  5. package/dist/{sdk/_utils.d.ts → _utils.d.ts} +1 -2
  6. package/dist/_utils.js +8 -0
  7. package/dist/{sdk/builtin_tools.d.ts → builtin-tools.d.ts} +5 -8
  8. package/dist/builtin-tools.js +270 -0
  9. package/dist/{sdk/direct_executor.d.ts → direct-executor.d.ts} +3 -7
  10. package/dist/direct-executor.js +125 -0
  11. package/dist/{sdk/mod.d.ts → index.d.ts} +0 -4
  12. package/dist/index.js +2 -0
  13. package/dist/{sdk/kv.d.ts → kv.d.ts} +23 -20
  14. package/dist/kv.js +99 -0
  15. package/dist/{sdk/protocol.d.ts → protocol.d.ts} +67 -31
  16. package/dist/protocol.js +142 -0
  17. package/dist/runtime.d.ts +18 -0
  18. package/dist/runtime.js +16 -0
  19. package/dist/s2s.d.ts +110 -0
  20. package/dist/s2s.js +242 -0
  21. package/dist/{sdk/server.d.ts → server.d.ts} +3 -23
  22. package/dist/server.js +105 -0
  23. package/dist/{sdk/session.d.ts → session.d.ts} +4 -11
  24. package/dist/session.js +312 -0
  25. package/dist/tsdown.config.d.ts +2 -0
  26. package/dist/{sdk/types.d.ts → types.d.ts} +41 -25
  27. package/dist/types.js +139 -0
  28. package/dist/{sdk/vector.d.ts → vector.d.ts} +14 -15
  29. package/dist/vector.js +56 -0
  30. package/dist/{sdk/worker_entry.d.ts → worker-entry.d.ts} +2 -5
  31. package/dist/worker-entry.js +59 -0
  32. package/dist/{sdk/ws_handler.d.ts → ws-handler.d.ts} +10 -8
  33. package/dist/ws-handler.js +155 -0
  34. package/package.json +66 -149
  35. package/README.md +0 -34
  36. package/dist/aai.js +0 -3
  37. package/dist/cli/tsconfig.tsbuildinfo +0 -1
  38. package/dist/cli.js +0 -2811
  39. package/dist/sdk/_internal_types.d.ts.map +0 -1
  40. package/dist/sdk/_internal_types.js +0 -25
  41. package/dist/sdk/_internal_types.js.map +0 -1
  42. package/dist/sdk/_mock_ws.d.ts.map +0 -1
  43. package/dist/sdk/_mock_ws.js +0 -154
  44. package/dist/sdk/_mock_ws.js.map +0 -1
  45. package/dist/sdk/_render_check.d.ts +0 -10
  46. package/dist/sdk/_render_check.d.ts.map +0 -1
  47. package/dist/sdk/_render_check.js +0 -72
  48. package/dist/sdk/_render_check.js.map +0 -1
  49. package/dist/sdk/_utils.d.ts.map +0 -1
  50. package/dist/sdk/_utils.js +0 -7
  51. package/dist/sdk/_utils.js.map +0 -1
  52. package/dist/sdk/builtin_tools.d.ts.map +0 -1
  53. package/dist/sdk/builtin_tools.js +0 -309
  54. package/dist/sdk/builtin_tools.js.map +0 -1
  55. package/dist/sdk/capnweb.d.ts +0 -102
  56. package/dist/sdk/capnweb.d.ts.map +0 -1
  57. package/dist/sdk/capnweb.js +0 -219
  58. package/dist/sdk/capnweb.js.map +0 -1
  59. package/dist/sdk/define_agent.d.ts +0 -36
  60. package/dist/sdk/define_agent.d.ts.map +0 -1
  61. package/dist/sdk/define_agent.js +0 -71
  62. package/dist/sdk/define_agent.js.map +0 -1
  63. package/dist/sdk/direct_executor.d.ts.map +0 -1
  64. package/dist/sdk/direct_executor.js +0 -145
  65. package/dist/sdk/direct_executor.js.map +0 -1
  66. package/dist/sdk/host.d.ts +0 -59
  67. package/dist/sdk/host.d.ts.map +0 -1
  68. package/dist/sdk/host.js +0 -131
  69. package/dist/sdk/host.js.map +0 -1
  70. package/dist/sdk/kv.d.ts.map +0 -1
  71. package/dist/sdk/kv.js +0 -94
  72. package/dist/sdk/kv.js.map +0 -1
  73. package/dist/sdk/memory_tools.d.ts +0 -38
  74. package/dist/sdk/memory_tools.d.ts.map +0 -1
  75. package/dist/sdk/memory_tools.js +0 -77
  76. package/dist/sdk/memory_tools.js.map +0 -1
  77. package/dist/sdk/mod.d.ts.map +0 -1
  78. package/dist/sdk/mod.js +0 -27
  79. package/dist/sdk/mod.js.map +0 -1
  80. package/dist/sdk/protocol.d.ts.map +0 -1
  81. package/dist/sdk/protocol.js +0 -133
  82. package/dist/sdk/protocol.js.map +0 -1
  83. package/dist/sdk/runtime.d.ts +0 -36
  84. package/dist/sdk/runtime.d.ts.map +0 -1
  85. package/dist/sdk/runtime.js +0 -27
  86. package/dist/sdk/runtime.js.map +0 -1
  87. package/dist/sdk/s2s.d.ts +0 -74
  88. package/dist/sdk/s2s.d.ts.map +0 -1
  89. package/dist/sdk/s2s.js +0 -218
  90. package/dist/sdk/s2s.js.map +0 -1
  91. package/dist/sdk/server.d.ts.map +0 -1
  92. package/dist/sdk/server.js +0 -144
  93. package/dist/sdk/server.js.map +0 -1
  94. package/dist/sdk/session.d.ts.map +0 -1
  95. package/dist/sdk/session.js +0 -303
  96. package/dist/sdk/session.js.map +0 -1
  97. package/dist/sdk/system_prompt.d.ts +0 -6
  98. package/dist/sdk/system_prompt.d.ts.map +0 -1
  99. package/dist/sdk/system_prompt.js +0 -35
  100. package/dist/sdk/system_prompt.js.map +0 -1
  101. package/dist/sdk/tsconfig.tsbuildinfo +0 -1
  102. package/dist/sdk/types.d.ts.map +0 -1
  103. package/dist/sdk/types.js +0 -96
  104. package/dist/sdk/types.js.map +0 -1
  105. package/dist/sdk/vector.d.ts.map +0 -1
  106. package/dist/sdk/vector.js +0 -63
  107. package/dist/sdk/vector.js.map +0 -1
  108. package/dist/sdk/winterc_server.d.ts +0 -56
  109. package/dist/sdk/winterc_server.d.ts.map +0 -1
  110. package/dist/sdk/winterc_server.js +0 -77
  111. package/dist/sdk/winterc_server.js.map +0 -1
  112. package/dist/sdk/worker_entry.d.ts.map +0 -1
  113. package/dist/sdk/worker_entry.js +0 -68
  114. package/dist/sdk/worker_entry.js.map +0 -1
  115. package/dist/sdk/worker_shim.d.ts +0 -19
  116. package/dist/sdk/worker_shim.d.ts.map +0 -1
  117. package/dist/sdk/worker_shim.js +0 -141
  118. package/dist/sdk/worker_shim.js.map +0 -1
  119. package/dist/sdk/ws_handler.d.ts.map +0 -1
  120. package/dist/sdk/ws_handler.js +0 -158
  121. package/dist/sdk/ws_handler.js.map +0 -1
  122. package/dist/ui/_cn.d.ts +0 -5
  123. package/dist/ui/_cn.d.ts.map +0 -1
  124. package/dist/ui/_cn.js +0 -22
  125. package/dist/ui/_cn.js.map +0 -1
  126. package/dist/ui/_components/app.d.ts +0 -5
  127. package/dist/ui/_components/app.d.ts.map +0 -1
  128. package/dist/ui/_components/app.js +0 -12
  129. package/dist/ui/_components/app.js.map +0 -1
  130. package/dist/ui/_components/button.d.ts +0 -11
  131. package/dist/ui/_components/button.d.ts.map +0 -1
  132. package/dist/ui/_components/button.js +0 -17
  133. package/dist/ui/_components/button.js.map +0 -1
  134. package/dist/ui/_components/chat_view.d.ts +0 -5
  135. package/dist/ui/_components/chat_view.d.ts.map +0 -1
  136. package/dist/ui/_components/chat_view.js +0 -15
  137. package/dist/ui/_components/chat_view.js.map +0 -1
  138. package/dist/ui/_components/controls.d.ts +0 -4
  139. package/dist/ui/_components/controls.d.ts.map +0 -1
  140. package/dist/ui/_components/controls.js +0 -10
  141. package/dist/ui/_components/controls.js.map +0 -1
  142. package/dist/ui/_components/error_banner.d.ts +0 -8
  143. package/dist/ui/_components/error_banner.d.ts.map +0 -1
  144. package/dist/ui/_components/error_banner.js +0 -8
  145. package/dist/ui/_components/error_banner.js.map +0 -1
  146. package/dist/ui/_components/message_bubble.d.ts +0 -7
  147. package/dist/ui/_components/message_bubble.d.ts.map +0 -1
  148. package/dist/ui/_components/message_bubble.js +0 -11
  149. package/dist/ui/_components/message_bubble.js.map +0 -1
  150. package/dist/ui/_components/message_list.d.ts +0 -4
  151. package/dist/ui/_components/message_list.d.ts.map +0 -1
  152. package/dist/ui/_components/message_list.js +0 -45
  153. package/dist/ui/_components/message_list.js.map +0 -1
  154. package/dist/ui/_components/sidebar_layout.d.ts +0 -20
  155. package/dist/ui/_components/sidebar_layout.d.ts.map +0 -1
  156. package/dist/ui/_components/sidebar_layout.js +0 -19
  157. package/dist/ui/_components/sidebar_layout.js.map +0 -1
  158. package/dist/ui/_components/start_screen.d.ts +0 -25
  159. package/dist/ui/_components/start_screen.d.ts.map +0 -1
  160. package/dist/ui/_components/start_screen.js +0 -28
  161. package/dist/ui/_components/start_screen.js.map +0 -1
  162. package/dist/ui/_components/state_indicator.d.ts +0 -8
  163. package/dist/ui/_components/state_indicator.d.ts.map +0 -1
  164. package/dist/ui/_components/state_indicator.js +0 -6
  165. package/dist/ui/_components/state_indicator.js.map +0 -1
  166. package/dist/ui/_components/thinking_indicator.d.ts +0 -5
  167. package/dist/ui/_components/thinking_indicator.d.ts.map +0 -1
  168. package/dist/ui/_components/thinking_indicator.js +0 -10
  169. package/dist/ui/_components/thinking_indicator.js.map +0 -1
  170. package/dist/ui/_components/tool_call_block.d.ts +0 -7
  171. package/dist/ui/_components/tool_call_block.d.ts.map +0 -1
  172. package/dist/ui/_components/tool_call_block.js +0 -46
  173. package/dist/ui/_components/tool_call_block.js.map +0 -1
  174. package/dist/ui/_components/tool_icons.d.ts +0 -18
  175. package/dist/ui/_components/tool_icons.d.ts.map +0 -1
  176. package/dist/ui/_components/tool_icons.js +0 -26
  177. package/dist/ui/_components/tool_icons.js.map +0 -1
  178. package/dist/ui/_components/transcript.d.ts +0 -7
  179. package/dist/ui/_components/transcript.d.ts.map +0 -1
  180. package/dist/ui/_components/transcript.js +0 -9
  181. package/dist/ui/_components/transcript.js.map +0 -1
  182. package/dist/ui/_dom_shim.d.ts +0 -7
  183. package/dist/ui/_dom_shim.d.ts.map +0 -1
  184. package/dist/ui/_dom_shim.js +0 -21
  185. package/dist/ui/_dom_shim.js.map +0 -1
  186. package/dist/ui/_hooks.d.ts +0 -21
  187. package/dist/ui/_hooks.d.ts.map +0 -1
  188. package/dist/ui/_hooks.js +0 -35
  189. package/dist/ui/_hooks.js.map +0 -1
  190. package/dist/ui/_jsdom_setup.d.ts +0 -1
  191. package/dist/ui/_jsdom_setup.d.ts.map +0 -1
  192. package/dist/ui/_jsdom_setup.js +0 -6
  193. package/dist/ui/_jsdom_setup.js.map +0 -1
  194. package/dist/ui/_test_utils.js +0 -272
  195. package/dist/ui/_test_utils.js.map +0 -1
  196. package/dist/ui/audio.d.ts +0 -46
  197. package/dist/ui/audio.d.ts.map +0 -1
  198. package/dist/ui/audio.js +0 -130
  199. package/dist/ui/audio.js.map +0 -1
  200. package/dist/ui/components.d.ts +0 -14
  201. package/dist/ui/components.d.ts.map +0 -1
  202. package/dist/ui/components.js +0 -15
  203. package/dist/ui/components.js.map +0 -1
  204. package/dist/ui/components_mod.d.ts +0 -34
  205. package/dist/ui/components_mod.d.ts.map +0 -1
  206. package/dist/ui/components_mod.js +0 -32
  207. package/dist/ui/components_mod.js.map +0 -1
  208. package/dist/ui/mod.d.ts +0 -23
  209. package/dist/ui/mod.d.ts.map +0 -1
  210. package/dist/ui/mod.js +0 -22
  211. package/dist/ui/mod.js.map +0 -1
  212. package/dist/ui/mount.d.ts +0 -44
  213. package/dist/ui/mount.d.ts.map +0 -1
  214. package/dist/ui/mount.js +0 -61
  215. package/dist/ui/mount.js.map +0 -1
  216. package/dist/ui/mount_context.d.ts +0 -22
  217. package/dist/ui/mount_context.d.ts.map +0 -1
  218. package/dist/ui/mount_context.js +0 -10
  219. package/dist/ui/mount_context.js.map +0 -1
  220. package/dist/ui/session.d.ts +0 -96
  221. package/dist/ui/session.d.ts.map +0 -1
  222. package/dist/ui/session.js +0 -379
  223. package/dist/ui/session.js.map +0 -1
  224. package/dist/ui/session_mod.d.ts +0 -19
  225. package/dist/ui/session_mod.d.ts.map +0 -1
  226. package/dist/ui/session_mod.js +0 -18
  227. package/dist/ui/session_mod.js.map +0 -1
  228. package/dist/ui/signals.d.ts +0 -80
  229. package/dist/ui/signals.d.ts.map +0 -1
  230. package/dist/ui/signals.js +0 -137
  231. package/dist/ui/signals.js.map +0 -1
  232. package/dist/ui/tsconfig.tsbuildinfo +0 -1
  233. package/dist/ui/types.d.ts +0 -36
  234. package/dist/ui/types.d.ts.map +0 -1
  235. package/dist/ui/types.js +0 -4
  236. package/dist/ui/types.js.map +0 -1
  237. package/dist/ui/worklets/capture-processor.d.ts +0 -3
  238. package/dist/ui/worklets/capture-processor.d.ts.map +0 -1
  239. package/dist/ui/worklets/capture-processor.js +0 -61
  240. package/dist/ui/worklets/capture-processor.js.map +0 -1
  241. package/dist/ui/worklets/playback-processor.d.ts +0 -3
  242. package/dist/ui/worklets/playback-processor.d.ts.map +0 -1
  243. package/dist/ui/worklets/playback-processor.js +0 -109
  244. package/dist/ui/worklets/playback-processor.js.map +0 -1
  245. package/templates/.env +0 -1
  246. package/templates/_shared/.env.example +0 -5
  247. package/templates/_shared/CLAUDE.md +0 -1073
  248. package/templates/_shared/biome.json +0 -32
  249. package/templates/_shared/global.d.ts +0 -1
  250. package/templates/_shared/index.html +0 -16
  251. package/templates/_shared/package.json +0 -22
  252. package/templates/_shared/tsconfig.json +0 -16
  253. package/templates/code-interpreter/agent.ts +0 -27
  254. package/templates/code-interpreter/client.tsx +0 -3
  255. package/templates/dispatch-center/agent.ts +0 -1223
  256. package/templates/dispatch-center/client.tsx +0 -505
  257. package/templates/embedded-assets/agent.ts +0 -48
  258. package/templates/embedded-assets/client.tsx +0 -3
  259. package/templates/embedded-assets/knowledge.json +0 -20
  260. package/templates/health-assistant/agent.ts +0 -160
  261. package/templates/health-assistant/client.tsx +0 -3
  262. package/templates/infocom-adventure/agent.ts +0 -164
  263. package/templates/infocom-adventure/client.tsx +0 -300
  264. package/templates/math-buddy/agent.ts +0 -21
  265. package/templates/math-buddy/client.tsx +0 -3
  266. package/templates/memory-agent/agent.ts +0 -20
  267. package/templates/memory-agent/client.tsx +0 -3
  268. package/templates/night-owl/agent.ts +0 -98
  269. package/templates/night-owl/client.tsx +0 -12
  270. package/templates/personal-finance/agent.ts +0 -26
  271. package/templates/personal-finance/client.tsx +0 -3
  272. package/templates/pizza-ordering/agent.ts +0 -214
  273. package/templates/pizza-ordering/client.tsx +0 -264
  274. package/templates/simple/agent.ts +0 -6
  275. package/templates/simple/client.tsx +0 -3
  276. package/templates/smart-research/agent.ts +0 -164
  277. package/templates/smart-research/client.tsx +0 -3
  278. package/templates/solo-rpg/agent.ts +0 -1240
  279. package/templates/solo-rpg/client.tsx +0 -698
  280. package/templates/support/README.md +0 -62
  281. package/templates/support/agent.ts +0 -19
  282. package/templates/support/client.tsx +0 -3
  283. package/templates/travel-concierge/agent.ts +0 -29
  284. package/templates/travel-concierge/client.tsx +0 -3
  285. package/templates/tsconfig.json +0 -1
  286. package/templates/web-researcher/agent.ts +0 -17
  287. package/templates/web-researcher/client.tsx +0 -3
  288. package/ui/styles.css +0 -74
@@ -1,379 +0,0 @@
1
- // Copyright 2025 the AAI authors. MIT license.
2
- import { batch, signal } from "@preact/signals";
3
- import { errorMessage } from "../sdk/_utils.js";
4
- /**
5
- * Handles server→client messages and updates reactive Preact signals
6
- * accordingly (state transitions, transcripts, messages, audio playback).
7
- */
8
- /** @internal Exported for testing only. */
9
- export class ClientHandler {
10
- #state;
11
- #messages;
12
- #toolCalls;
13
- #userUtterance;
14
- #agentUtterance;
15
- #error;
16
- #voiceIO;
17
- /** Incremented on each turn boundary — stale async callbacks compare against this. */
18
- #generation = 0;
19
- constructor(opts) {
20
- this.#state = opts.state;
21
- this.#messages = opts.messages;
22
- this.#toolCalls = opts.toolCalls;
23
- this.#userUtterance = opts.userUtterance;
24
- this.#agentUtterance = opts.agentUtterance;
25
- this.#error = opts.error;
26
- this.#voiceIO = opts.voiceIO;
27
- }
28
- /** Single entry point for all server→client session events. */
29
- event(e) {
30
- switch (e.type) {
31
- case "speech_started":
32
- this.#userUtterance.value = "";
33
- break;
34
- case "speech_stopped":
35
- // VAD detected end of speech — processing will follow.
36
- break;
37
- case "transcript":
38
- this.#userUtterance.value = e.text;
39
- break;
40
- case "turn":
41
- this.#generation++;
42
- batch(() => {
43
- this.#userUtterance.value = null;
44
- this.#messages.value = [...this.#messages.value, { role: "user", text: e.text }];
45
- this.#state.value = "thinking";
46
- });
47
- break;
48
- case "chat_delta":
49
- this.#agentUtterance.value = this.#agentUtterance.value
50
- ? `${this.#agentUtterance.value} ${e.text}`
51
- : e.text;
52
- break;
53
- case "chat":
54
- batch(() => {
55
- this.#agentUtterance.value = null;
56
- this.#messages.value = [...this.#messages.value, { role: "assistant", text: e.text }];
57
- });
58
- break;
59
- case "tool_call_start":
60
- this.#toolCalls.value = [
61
- ...this.#toolCalls.value,
62
- {
63
- toolCallId: e.toolCallId,
64
- toolName: e.toolName,
65
- args: e.args,
66
- status: "pending",
67
- afterMessageIndex: this.#messages.value.length - 1,
68
- },
69
- ];
70
- break;
71
- case "tool_call_done": {
72
- const tcs = this.#toolCalls.value;
73
- const idx = tcs.findIndex((tc) => tc.toolCallId === e.toolCallId);
74
- if (idx !== -1) {
75
- const updated = [...tcs];
76
- const existing = updated[idx];
77
- if (existing)
78
- updated[idx] = { ...existing, status: "done", result: e.result };
79
- this.#toolCalls.value = updated;
80
- }
81
- break;
82
- }
83
- case "tts_done":
84
- // No-audio turns (empty LLM result) still use this event
85
- // to transition back to listening. Audio turns signal via stream end.
86
- this.#state.value = "listening";
87
- break;
88
- case "cancelled":
89
- this.#generation++;
90
- this.#voiceIO()?.flush();
91
- batch(() => {
92
- this.#userUtterance.value = null;
93
- this.#agentUtterance.value = null;
94
- this.#state.value = "listening";
95
- });
96
- break;
97
- case "reset": {
98
- this.#generation++;
99
- this.#voiceIO()?.flush();
100
- batch(() => {
101
- this.#messages.value = [];
102
- this.#toolCalls.value = [];
103
- this.#userUtterance.value = null;
104
- this.#agentUtterance.value = null;
105
- this.#error.value = null;
106
- this.#state.value = "listening";
107
- });
108
- break;
109
- }
110
- case "error":
111
- console.error("Agent error:", e.message);
112
- batch(() => {
113
- this.#error.value = {
114
- code: e.code,
115
- message: e.message,
116
- };
117
- this.#state.value = "error";
118
- });
119
- break;
120
- }
121
- }
122
- playAudioChunk(chunk) {
123
- if (this.#state.value === "error")
124
- return;
125
- if (this.#state.value !== "speaking") {
126
- this.#state.value = "speaking";
127
- }
128
- this.#voiceIO()?.enqueue(chunk.buffer);
129
- }
130
- playAudioDone() {
131
- const gen = this.#generation;
132
- const io = this.#voiceIO();
133
- if (io) {
134
- void io
135
- .done()
136
- .then(() => {
137
- if (this.#generation !== gen)
138
- return;
139
- this.#state.value = "listening";
140
- })
141
- .catch(() => { });
142
- }
143
- else {
144
- this.#state.value = "listening";
145
- }
146
- }
147
- /**
148
- * Dispatch an incoming WebSocket message (text or binary).
149
- *
150
- * Returns the parsed config if the message is a `config` message,
151
- * otherwise `null`.
152
- */
153
- handleMessage(data) {
154
- // Binary frame → raw PCM16 TTS audio
155
- if (data instanceof ArrayBuffer) {
156
- this.playAudioChunk(new Uint8Array(data));
157
- return null;
158
- }
159
- // Text frame → JSON message
160
- let msg;
161
- try {
162
- msg = JSON.parse(data);
163
- }
164
- catch {
165
- return null;
166
- }
167
- if (msg.type === "config") {
168
- const { type: _, ...config } = msg;
169
- return config;
170
- }
171
- if (msg.type === "audio_done") {
172
- this.playAudioDone();
173
- return null;
174
- }
175
- // All other messages are ClientEvent
176
- this.event(msg);
177
- return null;
178
- }
179
- }
180
- /**
181
- * Create a voice session that connects to an AAI server via WebSocket.
182
- *
183
- * Uses plain JSON text frames and binary audio frames for communication.
184
- *
185
- * @param options - Session configuration including the platform server URL.
186
- * @returns A {@linkcode VoiceSession} handle for controlling the session.
187
- */
188
- export function createVoiceSession(options) {
189
- const state = signal("disconnected");
190
- const messages = signal([]);
191
- const toolCalls = signal([]);
192
- const userUtterance = signal(null);
193
- const agentUtterance = signal(null);
194
- const error = signal(null);
195
- const disconnected = signal(null);
196
- let ws = null;
197
- let voiceIO = null;
198
- let connectionController = null;
199
- let hasConnected = false;
200
- let audioSetupInFlight = false;
201
- function cleanupAudio() {
202
- audioSetupInFlight = false;
203
- void voiceIO?.close();
204
- voiceIO = null;
205
- }
206
- function resetState() {
207
- batch(() => {
208
- messages.value = [];
209
- toolCalls.value = [];
210
- userUtterance.value = null;
211
- agentUtterance.value = null;
212
- error.value = null;
213
- });
214
- }
215
- function send(msg) {
216
- if (ws && ws.readyState === WebSocket.OPEN) {
217
- ws.send(JSON.stringify(msg));
218
- }
219
- }
220
- function sendBinary(data) {
221
- if (ws && ws.readyState === WebSocket.OPEN) {
222
- ws.send(data);
223
- }
224
- }
225
- async function handleReady(msg) {
226
- if (audioSetupInFlight)
227
- return;
228
- audioSetupInFlight = true;
229
- try {
230
- const [{ createVoiceIO }, captureWorklet, playbackWorklet] = await Promise.all([
231
- import("./audio.js"),
232
- import("./worklets/capture-processor.js").then((m) => m.default),
233
- import("./worklets/playback-processor.js").then((m) => m.default),
234
- ]);
235
- const io = await createVoiceIO({
236
- sttSampleRate: msg.sampleRate,
237
- ttsSampleRate: msg.ttsSampleRate,
238
- captureWorkletSrc: captureWorklet,
239
- playbackWorkletSrc: playbackWorklet,
240
- onMicData: (pcm16) => {
241
- // Always stream audio — S2S handles VAD natively.
242
- try {
243
- sendBinary(pcm16);
244
- }
245
- catch {
246
- /* connection may be closed */
247
- }
248
- },
249
- });
250
- if (!ws || ws.readyState !== WebSocket.OPEN) {
251
- io.close();
252
- return;
253
- }
254
- voiceIO = io;
255
- send({ type: "audio_ready" });
256
- state.value = "listening";
257
- }
258
- catch (err) {
259
- if (!ws || ws.readyState !== WebSocket.OPEN)
260
- return;
261
- batch(() => {
262
- error.value = {
263
- code: "audio",
264
- message: `Microphone access failed: ${errorMessage(err)}`,
265
- };
266
- state.value = "error";
267
- });
268
- }
269
- finally {
270
- audioSetupInFlight = false;
271
- }
272
- }
273
- function connect(opts) {
274
- disconnected.value = null;
275
- state.value = "connecting";
276
- connectionController?.abort();
277
- cleanupAudio();
278
- ws?.close();
279
- ws = null;
280
- const controller = new AbortController();
281
- connectionController = controller;
282
- const { signal: sig } = controller;
283
- if (opts?.signal) {
284
- opts.signal.addEventListener("abort", () => disconnect(), {
285
- signal: sig,
286
- });
287
- }
288
- const base = options.platformUrl;
289
- const wsUrl = new URL("websocket", base.endsWith("/") ? base : `${base}/`);
290
- wsUrl.protocol = wsUrl.protocol === "https:" ? "wss:" : "ws:";
291
- if (hasConnected)
292
- wsUrl.searchParams.set("resume", "1");
293
- const socket = new WebSocket(wsUrl.toString());
294
- socket.binaryType = "arraybuffer";
295
- ws = socket;
296
- const handler = new ClientHandler({
297
- state,
298
- messages,
299
- toolCalls,
300
- userUtterance,
301
- agentUtterance,
302
- error,
303
- voiceIO: () => voiceIO,
304
- });
305
- socket.addEventListener("open", () => {
306
- state.value = "ready";
307
- }, { signal: sig });
308
- socket.addEventListener("message", (event) => {
309
- const msgEvent = event;
310
- const config = handler.handleMessage(msgEvent.data);
311
- if (config) {
312
- const isReconnect = hasConnected;
313
- hasConnected = true;
314
- void handleReady(config);
315
- // Send history if reconnecting
316
- if (isReconnect && messages.value.length > 0) {
317
- send({
318
- type: "history",
319
- messages: messages.value.map((m) => ({
320
- role: m.role,
321
- text: m.text,
322
- })),
323
- });
324
- }
325
- }
326
- }, { signal: sig });
327
- socket.addEventListener("close", () => {
328
- if (sig.aborted) {
329
- return;
330
- }
331
- controller.abort();
332
- disconnected.value = { intentional: false };
333
- cleanupAudio();
334
- state.value = "disconnected";
335
- }, { signal: sig });
336
- }
337
- function cancel() {
338
- voiceIO?.flush();
339
- state.value = "listening";
340
- send({ type: "cancel" });
341
- }
342
- function reset() {
343
- voiceIO?.flush();
344
- if (ws && ws.readyState === WebSocket.OPEN) {
345
- send({ type: "reset" });
346
- return;
347
- }
348
- resetState();
349
- disconnect();
350
- connect();
351
- }
352
- function disconnect() {
353
- connectionController?.abort();
354
- connectionController = null;
355
- cleanupAudio();
356
- ws?.close();
357
- ws = null;
358
- state.value = "disconnected";
359
- disconnected.value = { intentional: true };
360
- }
361
- return {
362
- state,
363
- messages,
364
- toolCalls,
365
- userUtterance,
366
- agentUtterance,
367
- error,
368
- disconnected,
369
- connect,
370
- cancel,
371
- resetState,
372
- reset,
373
- disconnect,
374
- [Symbol.dispose]() {
375
- disconnect();
376
- },
377
- };
378
- }
379
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../ui/session.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * WebSocket session management for AAI voice agents.
3
- *
4
- * Provides the low-level voice session without any Preact/UI dependencies.
5
- *
6
- * @example
7
- * ```ts
8
- * import { createVoiceSession } from "@aai/ui/session";
9
- *
10
- * const session = createVoiceSession({ platformUrl: "https://example.com" });
11
- * session.connect();
12
- * ```
13
- *
14
- * @module
15
- */
16
- export type { VoiceSession } from "./session.ts";
17
- export { createVoiceSession } from "./session.ts";
18
- export type { AgentState, Message, SessionError, SessionErrorCode, SessionOptions, ToolCallInfo, } from "./types.ts";
19
- //# sourceMappingURL=session_mod.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session_mod.d.ts","sourceRoot":"","sources":["../../ui/session_mod.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EACV,UAAU,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -1,18 +0,0 @@
1
- // Copyright 2025 the AAI authors. MIT license.
2
- /**
3
- * WebSocket session management for AAI voice agents.
4
- *
5
- * Provides the low-level voice session without any Preact/UI dependencies.
6
- *
7
- * @example
8
- * ```ts
9
- * import { createVoiceSession } from "@aai/ui/session";
10
- *
11
- * const session = createVoiceSession({ platformUrl: "https://example.com" });
12
- * session.connect();
13
- * ```
14
- *
15
- * @module
16
- */
17
- export { createVoiceSession } from "./session.js";
18
- //# sourceMappingURL=session_mod.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session_mod.js","sourceRoot":"","sources":["../../ui/session_mod.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,80 +0,0 @@
1
- import { type Signal } from "@preact/signals";
2
- import type { ComponentChildren, JSX, RefObject } from "preact";
3
- import type { VoiceSession } from "./session.ts";
4
- import type { ToolCallInfo } from "./types.ts";
5
- /**
6
- * Reactive session controls wrapping a {@linkcode VoiceSession} with Preact signals.
7
- *
8
- * Components access reactive data via `session` (e.g. `session.state`,
9
- * `session.messages`). UI-only state (`started`, `running`) and actions
10
- * (`start`, `toggle`, `reset`) live directly on this object.
11
- */
12
- export type SessionSignals = {
13
- /** The underlying voice session — all reactive data lives here. */
14
- session: VoiceSession;
15
- /** Whether the session has been started by the user. */
16
- started: Signal<boolean>;
17
- /** Whether the session is currently running (connected or connecting). */
18
- running: Signal<boolean>;
19
- /** Dispose the reactive effect that tracks error state. */
20
- dispose(): void;
21
- /** Start the session for the first time (sets `started` and `running`). */
22
- start(): void;
23
- /** Toggle between connected and disconnected states. */
24
- toggle(): void;
25
- /** Reset the session: clear state and reconnect. */
26
- reset(): void;
27
- /** Alias for {@linkcode dispose} for use with `using`. */
28
- [Symbol.dispose](): void;
29
- };
30
- /**
31
- * Wrap a {@linkcode VoiceSession} in Preact signals for reactive UI binding.
32
- *
33
- * Creates higher-level controls (start, toggle, reset) on top of the raw
34
- * session, and automatically sets `running` to `false` when the session
35
- * enters an error state.
36
- *
37
- * @param session - The voice session to wrap.
38
- * @returns A {@linkcode SessionSignals} object for use in Preact components.
39
- */
40
- export declare function createSessionControls(session: VoiceSession): SessionSignals;
41
- /**
42
- * Preact context provider that makes session signals available to descendant
43
- * components via {@linkcode useSession}.
44
- *
45
- * @param props - Provider props.
46
- * @param props.value - The session signals to provide.
47
- * @param props.children - Child components that may consume the context.
48
- * @returns A Preact VNode wrapping children in the session context.
49
- */
50
- export declare function SessionProvider({ value, children, }: {
51
- value: SessionSignals;
52
- children?: ComponentChildren;
53
- }): JSX.Element;
54
- /**
55
- * Hook to access session signals from within a {@linkcode SessionProvider}.
56
- *
57
- * @returns The {@linkcode SessionSignals} from the nearest provider.
58
- * @throws {Error} If called outside of a `SessionProvider`.
59
- */
60
- export declare function useSession(): SessionSignals;
61
- /**
62
- * Hook that fires a callback exactly once for each newly completed tool call.
63
- *
64
- * Handles deduplication internally — safe to use with `useState` setters
65
- * without worrying about duplicates. The `result` argument is the parsed
66
- * JSON result from the tool (or the raw string if parsing fails).
67
- *
68
- * Automatically resets tracking when the session is reset (toolCalls cleared).
69
- *
70
- * @param callback - Called once per completed tool call with the tool name,
71
- * parsed result, and full {@linkcode ToolCallInfo}.
72
- */
73
- export declare function useToolResult(callback: (toolName: string, result: unknown, toolCall: ToolCallInfo) => void): void;
74
- /**
75
- * Auto-scroll a container to the bottom when messages, tool calls,
76
- * or utterances change. Returns a ref to attach to a sentinel `<div>`
77
- * at the bottom of the scrollable area.
78
- */
79
- export declare function useAutoScroll(): RefObject<HTMLDivElement>;
80
- //# sourceMappingURL=signals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../ui/signals.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,MAAM,EAA2B,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,mEAAmE;IACnE,OAAO,EAAE,YAAY,CAAC;IACtB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,2DAA2D;IAC3D,OAAO,IAAI,IAAI,CAAC;IAChB,2EAA2E;IAC3E,KAAK,IAAI,IAAI,CAAC;IACd,wDAAwD;IACxD,MAAM,IAAI,IAAI,CAAC;IACf,oDAAoD;IACpD,KAAK,IAAI,IAAI,CAAC;IACd,0DAA0D;IAC1D,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAoC3E;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B,GAAG,GAAG,CAAC,OAAO,CAEd;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAI3C;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,GAC5E,IAAI,CAqBN;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAAC,cAAc,CAAC,CAazD"}
@@ -1,137 +0,0 @@
1
- // Copyright 2025 the AAI authors. MIT license.
2
- import { batch, effect, signal, useSignalEffect } from "@preact/signals";
3
- import { createContext, h } from "preact";
4
- import { useContext, useEffect, useRef } from "preact/hooks";
5
- /**
6
- * Wrap a {@linkcode VoiceSession} in Preact signals for reactive UI binding.
7
- *
8
- * Creates higher-level controls (start, toggle, reset) on top of the raw
9
- * session, and automatically sets `running` to `false` when the session
10
- * enters an error state.
11
- *
12
- * @param session - The voice session to wrap.
13
- * @returns A {@linkcode SessionSignals} object for use in Preact components.
14
- */
15
- export function createSessionControls(session) {
16
- const started = signal(false);
17
- const running = signal(true);
18
- const dispose = effect(() => {
19
- if (session.state.value === "error")
20
- running.value = false;
21
- });
22
- return {
23
- session,
24
- started,
25
- running,
26
- dispose,
27
- start() {
28
- batch(() => {
29
- started.value = true;
30
- running.value = true;
31
- });
32
- session.connect();
33
- },
34
- toggle() {
35
- if (running.value) {
36
- session.cancel();
37
- session.disconnect();
38
- }
39
- else {
40
- session.connect();
41
- }
42
- running.value = !running.value;
43
- },
44
- reset() {
45
- session.reset();
46
- },
47
- [Symbol.dispose]() {
48
- dispose();
49
- },
50
- };
51
- }
52
- const Ctx = createContext(null);
53
- /**
54
- * Preact context provider that makes session signals available to descendant
55
- * components via {@linkcode useSession}.
56
- *
57
- * @param props - Provider props.
58
- * @param props.value - The session signals to provide.
59
- * @param props.children - Child components that may consume the context.
60
- * @returns A Preact VNode wrapping children in the session context.
61
- */
62
- export function SessionProvider({ value, children, }) {
63
- return h(Ctx.Provider, { value }, children);
64
- }
65
- /**
66
- * Hook to access session signals from within a {@linkcode SessionProvider}.
67
- *
68
- * @returns The {@linkcode SessionSignals} from the nearest provider.
69
- * @throws {Error} If called outside of a `SessionProvider`.
70
- */
71
- export function useSession() {
72
- const ctx = useContext(Ctx);
73
- if (!ctx)
74
- throw new Error("Hook useSession() requires a SessionProvider");
75
- return ctx;
76
- }
77
- function tryParseJSON(str) {
78
- try {
79
- return JSON.parse(str);
80
- }
81
- catch {
82
- return str;
83
- }
84
- }
85
- /**
86
- * Hook that fires a callback exactly once for each newly completed tool call.
87
- *
88
- * Handles deduplication internally — safe to use with `useState` setters
89
- * without worrying about duplicates. The `result` argument is the parsed
90
- * JSON result from the tool (or the raw string if parsing fails).
91
- *
92
- * Automatically resets tracking when the session is reset (toolCalls cleared).
93
- *
94
- * @param callback - Called once per completed tool call with the tool name,
95
- * parsed result, and full {@linkcode ToolCallInfo}.
96
- */
97
- export function useToolResult(callback) {
98
- const { session } = useSession();
99
- const seenRef = useRef(new Set());
100
- const cbRef = useRef(callback);
101
- cbRef.current = callback;
102
- useEffect(() => {
103
- return effect(() => {
104
- const toolCalls = session.toolCalls.value;
105
- if (toolCalls.length === 0) {
106
- seenRef.current.clear();
107
- return;
108
- }
109
- for (const tc of toolCalls) {
110
- if (tc.status !== "done" || !tc.result)
111
- continue;
112
- if (seenRef.current.has(tc.toolCallId))
113
- continue;
114
- seenRef.current.add(tc.toolCallId);
115
- cbRef.current(tc.toolName, tryParseJSON(tc.result), tc);
116
- }
117
- });
118
- }, [session]);
119
- }
120
- /**
121
- * Auto-scroll a container to the bottom when messages, tool calls,
122
- * or utterances change. Returns a ref to attach to a sentinel `<div>`
123
- * at the bottom of the scrollable area.
124
- */
125
- export function useAutoScroll() {
126
- const { session } = useSession();
127
- const ref = useRef(null);
128
- useSignalEffect(() => {
129
- session.messages.value;
130
- session.toolCalls.value;
131
- session.userUtterance.value;
132
- session.agentUtterance.value;
133
- ref.current?.scrollIntoView({ behavior: "smooth" });
134
- });
135
- return ref;
136
- }
137
- //# sourceMappingURL=signals.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../ui/signals.ts"],"names":[],"mappings":"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"}