@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.
Files changed (249) hide show
  1. package/README.md +0 -6
  2. package/dist/aai.js +3 -0
  3. package/dist/cli.js +244 -245
  4. package/dist/sdk/_internal_types.d.ts +73 -0
  5. package/dist/sdk/_internal_types.d.ts.map +1 -0
  6. package/dist/sdk/_internal_types.js +24 -0
  7. package/dist/sdk/_internal_types.js.map +1 -0
  8. package/dist/sdk/_mock_ws.d.ts +105 -0
  9. package/dist/sdk/_mock_ws.d.ts.map +1 -0
  10. package/dist/sdk/_mock_ws.js +154 -0
  11. package/dist/sdk/_mock_ws.js.map +1 -0
  12. package/dist/sdk/_timeout.d.ts +14 -0
  13. package/dist/sdk/_timeout.d.ts.map +1 -0
  14. package/{sdk/_timeout.ts → dist/sdk/_timeout.js} +9 -9
  15. package/dist/sdk/_timeout.js.map +1 -0
  16. package/dist/sdk/builtin_tools.d.ts +33 -0
  17. package/dist/sdk/builtin_tools.d.ts.map +1 -0
  18. package/dist/sdk/builtin_tools.js +263 -0
  19. package/dist/sdk/builtin_tools.js.map +1 -0
  20. package/dist/sdk/capnweb.d.ts +69 -0
  21. package/dist/sdk/capnweb.d.ts.map +1 -0
  22. package/dist/sdk/capnweb.js +291 -0
  23. package/dist/sdk/capnweb.js.map +1 -0
  24. package/dist/sdk/define_agent.d.ts +36 -0
  25. package/dist/sdk/define_agent.d.ts.map +1 -0
  26. package/dist/sdk/define_agent.js +63 -0
  27. package/dist/sdk/define_agent.js.map +1 -0
  28. package/dist/sdk/direct_executor.d.ts +42 -0
  29. package/dist/sdk/direct_executor.d.ts.map +1 -0
  30. package/dist/sdk/direct_executor.js +143 -0
  31. package/dist/sdk/direct_executor.js.map +1 -0
  32. package/dist/sdk/kv.d.ts +123 -0
  33. package/dist/sdk/kv.d.ts.map +1 -0
  34. package/dist/sdk/kv.js +91 -0
  35. package/dist/sdk/kv.js.map +1 -0
  36. package/{sdk/mod.ts → dist/sdk/mod.d.ts} +2 -11
  37. package/dist/sdk/mod.d.ts.map +1 -0
  38. package/dist/sdk/mod.js +26 -0
  39. package/dist/sdk/mod.js.map +1 -0
  40. package/dist/sdk/protocol.d.ts +218 -0
  41. package/dist/sdk/protocol.d.ts.map +1 -0
  42. package/dist/sdk/protocol.js +140 -0
  43. package/dist/sdk/protocol.js.map +1 -0
  44. package/dist/sdk/runtime.d.ts +35 -0
  45. package/dist/sdk/runtime.d.ts.map +1 -0
  46. package/dist/sdk/runtime.js +46 -0
  47. package/dist/sdk/runtime.js.map +1 -0
  48. package/dist/sdk/s2s.d.ts +60 -0
  49. package/dist/sdk/s2s.d.ts.map +1 -0
  50. package/dist/sdk/s2s.js +171 -0
  51. package/dist/sdk/s2s.js.map +1 -0
  52. package/dist/sdk/server.d.ts +51 -0
  53. package/dist/sdk/server.d.ts.map +1 -0
  54. package/dist/sdk/server.js +145 -0
  55. package/dist/sdk/server.js.map +1 -0
  56. package/dist/sdk/session.d.ts +66 -0
  57. package/dist/sdk/session.d.ts.map +1 -0
  58. package/dist/sdk/session.js +324 -0
  59. package/dist/sdk/session.js.map +1 -0
  60. package/dist/sdk/system_prompt.d.ts +6 -0
  61. package/dist/sdk/system_prompt.d.ts.map +1 -0
  62. package/dist/sdk/system_prompt.js +35 -0
  63. package/dist/sdk/system_prompt.js.map +1 -0
  64. package/dist/sdk/types.d.ts +326 -0
  65. package/dist/sdk/types.d.ts.map +1 -0
  66. package/dist/sdk/types.js +38 -0
  67. package/dist/sdk/types.js.map +1 -0
  68. package/dist/sdk/vector.d.ts +90 -0
  69. package/dist/sdk/vector.d.ts.map +1 -0
  70. package/dist/sdk/vector.js +61 -0
  71. package/dist/sdk/vector.js.map +1 -0
  72. package/dist/sdk/winterc_server.d.ts +53 -0
  73. package/dist/sdk/winterc_server.d.ts.map +1 -0
  74. package/dist/sdk/winterc_server.js +82 -0
  75. package/dist/sdk/winterc_server.js.map +1 -0
  76. package/dist/sdk/worker_entry.d.ts +48 -0
  77. package/dist/sdk/worker_entry.d.ts.map +1 -0
  78. package/dist/sdk/worker_entry.js +67 -0
  79. package/dist/sdk/worker_entry.js.map +1 -0
  80. package/dist/sdk/worker_shim.d.ts +20 -0
  81. package/dist/sdk/worker_shim.d.ts.map +1 -0
  82. package/dist/sdk/worker_shim.js +132 -0
  83. package/dist/sdk/worker_shim.js.map +1 -0
  84. package/dist/sdk/ws_handler.d.ts +50 -0
  85. package/dist/sdk/ws_handler.d.ts.map +1 -0
  86. package/dist/sdk/ws_handler.js +156 -0
  87. package/dist/sdk/ws_handler.js.map +1 -0
  88. package/dist/ui/_components/app.d.ts +3 -0
  89. package/dist/ui/_components/app.d.ts.map +1 -0
  90. package/dist/ui/_components/app.js +14 -0
  91. package/dist/ui/_components/app.js.map +1 -0
  92. package/dist/ui/_components/chat_view.d.ts +3 -0
  93. package/dist/ui/_components/chat_view.d.ts.map +1 -0
  94. package/dist/ui/_components/chat_view.js +14 -0
  95. package/dist/ui/_components/chat_view.js.map +1 -0
  96. package/dist/ui/_components/controls.d.ts +2 -0
  97. package/dist/ui/_components/controls.d.ts.map +1 -0
  98. package/dist/ui/_components/controls.js +11 -0
  99. package/dist/ui/_components/controls.js.map +1 -0
  100. package/dist/ui/_components/error_banner.d.ts +7 -0
  101. package/dist/ui/_components/error_banner.d.ts.map +1 -0
  102. package/dist/ui/_components/error_banner.js +7 -0
  103. package/dist/ui/_components/error_banner.js.map +1 -0
  104. package/dist/ui/_components/message_bubble.d.ts +6 -0
  105. package/dist/ui/_components/message_bubble.d.ts.map +1 -0
  106. package/dist/ui/_components/message_bubble.js +9 -0
  107. package/dist/ui/_components/message_bubble.js.map +1 -0
  108. package/dist/ui/_components/message_list.d.ts +2 -0
  109. package/dist/ui/_components/message_list.d.ts.map +1 -0
  110. package/dist/ui/_components/message_list.js +48 -0
  111. package/dist/ui/_components/message_list.js.map +1 -0
  112. package/dist/ui/_components/state_indicator.d.ts +7 -0
  113. package/dist/ui/_components/state_indicator.d.ts.map +1 -0
  114. package/dist/ui/_components/state_indicator.js +5 -0
  115. package/dist/ui/_components/state_indicator.js.map +1 -0
  116. package/dist/ui/_components/thinking_indicator.d.ts +3 -0
  117. package/dist/ui/_components/thinking_indicator.d.ts.map +1 -0
  118. package/dist/ui/_components/thinking_indicator.js +8 -0
  119. package/dist/ui/_components/thinking_indicator.js.map +1 -0
  120. package/dist/ui/_components/tool_call_block.d.ts +6 -0
  121. package/dist/ui/_components/tool_call_block.d.ts.map +1 -0
  122. package/dist/ui/_components/tool_call_block.js +58 -0
  123. package/dist/ui/_components/tool_call_block.js.map +1 -0
  124. package/dist/ui/_components/tool_icons.d.ts +18 -0
  125. package/dist/ui/_components/tool_icons.d.ts.map +1 -0
  126. package/dist/ui/_components/tool_icons.js +26 -0
  127. package/dist/ui/_components/tool_icons.js.map +1 -0
  128. package/dist/ui/_components/transcript.d.ts +6 -0
  129. package/dist/ui/_components/transcript.d.ts.map +1 -0
  130. package/dist/ui/_components/transcript.js +8 -0
  131. package/dist/ui/_components/transcript.js.map +1 -0
  132. package/dist/ui/_dom_shim.d.ts +7 -0
  133. package/dist/ui/_dom_shim.d.ts.map +1 -0
  134. package/dist/ui/_dom_shim.js +21 -0
  135. package/dist/ui/_dom_shim.js.map +1 -0
  136. package/dist/ui/_test_utils.js +272 -0
  137. package/dist/ui/_test_utils.js.map +1 -0
  138. package/dist/ui/audio.d.ts +46 -0
  139. package/dist/ui/audio.d.ts.map +1 -0
  140. package/dist/ui/audio.js +130 -0
  141. package/dist/ui/audio.js.map +1 -0
  142. package/dist/ui/components.d.ts +36 -0
  143. package/dist/ui/components.d.ts.map +1 -0
  144. package/dist/ui/components.js +32 -0
  145. package/dist/ui/components.js.map +1 -0
  146. package/{ui/components_mod.ts → dist/ui/components_mod.d.ts} +3 -18
  147. package/dist/ui/components_mod.d.ts.map +1 -0
  148. package/dist/ui/components_mod.js +20 -0
  149. package/dist/ui/components_mod.js.map +1 -0
  150. package/dist/ui/mod.d.ts +21 -0
  151. package/dist/ui/mod.d.ts.map +1 -0
  152. package/{ui/mod.ts → dist/ui/mod.js} +3 -29
  153. package/dist/ui/mod.js.map +1 -0
  154. package/dist/ui/mount.d.ts +56 -0
  155. package/dist/ui/mount.d.ts.map +1 -0
  156. package/dist/ui/mount.js +60 -0
  157. package/dist/ui/mount.js.map +1 -0
  158. package/dist/ui/mount_context.d.ts +10 -0
  159. package/dist/ui/mount_context.d.ts.map +1 -0
  160. package/dist/ui/mount_context.js +10 -0
  161. package/dist/ui/mount_context.js.map +1 -0
  162. package/dist/ui/session.d.ts +91 -0
  163. package/dist/ui/session.d.ts.map +1 -0
  164. package/dist/ui/session.js +366 -0
  165. package/dist/ui/session.js.map +1 -0
  166. package/{ui/session_mod.ts → dist/ui/session_mod.d.ts} +2 -10
  167. package/dist/ui/session_mod.d.ts.map +1 -0
  168. package/dist/ui/session_mod.js +18 -0
  169. package/dist/ui/session_mod.js.map +1 -0
  170. package/dist/ui/signals.d.ts +61 -0
  171. package/dist/ui/signals.d.ts.map +1 -0
  172. package/dist/ui/signals.js +74 -0
  173. package/dist/ui/signals.js.map +1 -0
  174. package/dist/ui/types.d.ts +36 -0
  175. package/dist/ui/types.d.ts.map +1 -0
  176. package/dist/ui/types.js +4 -0
  177. package/dist/ui/types.js.map +1 -0
  178. package/package.json +103 -28
  179. package/sdk/_internal_types.ts +0 -89
  180. package/sdk/_mock_ws.ts +0 -172
  181. package/sdk/builtin_tools.ts +0 -309
  182. package/sdk/capnweb.ts +0 -341
  183. package/sdk/define_agent.ts +0 -70
  184. package/sdk/direct_executor.ts +0 -195
  185. package/sdk/kv.ts +0 -183
  186. package/sdk/protocol.ts +0 -313
  187. package/sdk/runtime.ts +0 -65
  188. package/sdk/s2s.ts +0 -271
  189. package/sdk/server.ts +0 -198
  190. package/sdk/session.ts +0 -438
  191. package/sdk/system_prompt.ts +0 -47
  192. package/sdk/types.ts +0 -406
  193. package/sdk/vector.ts +0 -133
  194. package/sdk/winterc_server.ts +0 -141
  195. package/sdk/worker_entry.ts +0 -99
  196. package/sdk/worker_shim.ts +0 -170
  197. package/sdk/ws_handler.ts +0 -190
  198. package/templates/_shared/.env.example +0 -5
  199. package/templates/_shared/package.json +0 -17
  200. package/templates/code-interpreter/agent.ts +0 -27
  201. package/templates/code-interpreter/client.tsx +0 -2
  202. package/templates/dispatch-center/agent.ts +0 -1536
  203. package/templates/dispatch-center/client.tsx +0 -504
  204. package/templates/embedded-assets/agent.ts +0 -49
  205. package/templates/embedded-assets/client.tsx +0 -2
  206. package/templates/embedded-assets/knowledge.json +0 -20
  207. package/templates/health-assistant/agent.ts +0 -160
  208. package/templates/health-assistant/client.tsx +0 -2
  209. package/templates/infocom-adventure/agent.ts +0 -164
  210. package/templates/infocom-adventure/client.tsx +0 -299
  211. package/templates/math-buddy/agent.ts +0 -21
  212. package/templates/math-buddy/client.tsx +0 -2
  213. package/templates/memory-agent/agent.ts +0 -74
  214. package/templates/memory-agent/client.tsx +0 -2
  215. package/templates/night-owl/agent.ts +0 -98
  216. package/templates/night-owl/client.tsx +0 -28
  217. package/templates/personal-finance/agent.ts +0 -26
  218. package/templates/personal-finance/client.tsx +0 -2
  219. package/templates/simple/agent.ts +0 -6
  220. package/templates/simple/client.tsx +0 -2
  221. package/templates/smart-research/agent.ts +0 -164
  222. package/templates/smart-research/client.tsx +0 -2
  223. package/templates/support/README.md +0 -62
  224. package/templates/support/agent.ts +0 -19
  225. package/templates/support/client.tsx +0 -2
  226. package/templates/travel-concierge/agent.ts +0 -29
  227. package/templates/travel-concierge/client.tsx +0 -2
  228. package/templates/web-researcher/agent.ts +0 -17
  229. package/templates/web-researcher/client.tsx +0 -2
  230. package/ui/_components/app.tsx +0 -37
  231. package/ui/_components/chat_view.tsx +0 -36
  232. package/ui/_components/controls.tsx +0 -32
  233. package/ui/_components/error_banner.tsx +0 -18
  234. package/ui/_components/message_bubble.tsx +0 -21
  235. package/ui/_components/message_list.tsx +0 -61
  236. package/ui/_components/state_indicator.tsx +0 -17
  237. package/ui/_components/thinking_indicator.tsx +0 -19
  238. package/ui/_components/tool_call_block.tsx +0 -110
  239. package/ui/_components/tool_icons.tsx +0 -101
  240. package/ui/_components/transcript.tsx +0 -20
  241. package/ui/audio.ts +0 -170
  242. package/ui/components.ts +0 -49
  243. package/ui/mount.tsx +0 -112
  244. package/ui/mount_context.ts +0 -19
  245. package/ui/session.ts +0 -456
  246. package/ui/signals.ts +0 -111
  247. package/ui/types.ts +0 -50
  248. package/ui/worklets/capture-processor.js +0 -62
  249. package/ui/worklets/playback-processor.js +0 -110
@@ -0,0 +1,324 @@
1
+ // Copyright 2025 the AAI authors. MIT license.
2
+ /**
3
+ * S2S session — relays audio between the client and AssemblyAI's
4
+ * Speech-to-Speech API, intercepting only tool calls for local execution.
5
+ *
6
+ * Cross-runtime: accepts Logger, Metrics, and a WebSocket factory via
7
+ * dependency injection.
8
+ *
9
+ * @module
10
+ */
11
+ import { HOOK_TIMEOUT_MS } from "./protocol.js";
12
+ import { consoleLogger, noopMetrics } from "./runtime.js";
13
+ import { connectS2s, } from "./s2s.js";
14
+ import { buildSystemPrompt } from "./system_prompt.js";
15
+ export const _internals = {
16
+ connectS2s,
17
+ };
18
+ /** Create an S2S-backed session with the same interface as the STT+LLM+TTS session. */
19
+ export function createS2sSession(opts) {
20
+ const { id, agent, client, toolSchemas, apiKey, s2sConfig, executeTool, createWebSocket, hookInvoker, logger: log = consoleLogger, metrics = noopMetrics, } = opts;
21
+ const agentLabel = { agent };
22
+ const agentConfig = opts.skipGreeting ? { ...opts.agentConfig, greeting: "" } : opts.agentConfig;
23
+ // Build system prompt
24
+ const hasTools = toolSchemas.length > 0 || (agentConfig.builtinTools?.length ?? 0) > 0;
25
+ const systemPrompt = buildSystemPrompt(agentConfig, {
26
+ hasTools,
27
+ voice: true,
28
+ });
29
+ // toolSchemas already includes both agent-defined and builtin tools
30
+ const s2sTools = toolSchemas.map((ts) => ({
31
+ type: "function",
32
+ name: ts.name,
33
+ description: ts.description,
34
+ parameters: ts.parameters,
35
+ }));
36
+ let s2s = null;
37
+ const sessionAbort = new AbortController();
38
+ let audioReady = false;
39
+ let toolCallCount = 0;
40
+ let turnPromise = null;
41
+ let conversationMessages = [];
42
+ let s2sSessionId = null;
43
+ let pendingTools = [];
44
+ async function resolveTurnConfig() {
45
+ if (!hookInvoker)
46
+ return null;
47
+ try {
48
+ return await hookInvoker.resolveTurnConfig(id, HOOK_TIMEOUT_MS);
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ async function invokeHook(hook, ...args) {
55
+ if (!hookInvoker)
56
+ return;
57
+ try {
58
+ switch (hook) {
59
+ case "onConnect":
60
+ await hookInvoker.onConnect(id, HOOK_TIMEOUT_MS);
61
+ break;
62
+ case "onDisconnect":
63
+ await hookInvoker.onDisconnect(id, HOOK_TIMEOUT_MS);
64
+ break;
65
+ case "onTurn":
66
+ await hookInvoker.onTurn(id, args[0], HOOK_TIMEOUT_MS);
67
+ break;
68
+ case "onError":
69
+ await hookInvoker.onError(id, args[0], HOOK_TIMEOUT_MS);
70
+ break;
71
+ case "onStep":
72
+ await hookInvoker.onStep(id, args[0], HOOK_TIMEOUT_MS);
73
+ break;
74
+ }
75
+ }
76
+ catch (err) {
77
+ log.warn(`${hook} hook failed`, {
78
+ err: err instanceof Error ? err.message : String(err),
79
+ });
80
+ }
81
+ }
82
+ async function handleToolCall(detail) {
83
+ const { call_id, name, args: parsedArgs } = detail;
84
+ // Emit tool_call_start to client
85
+ client.event({
86
+ type: "tool_call_start",
87
+ toolCallId: call_id,
88
+ toolName: name,
89
+ args: parsedArgs,
90
+ });
91
+ // Resolve turn config for maxSteps / activeTools
92
+ const turnConfig = await resolveTurnConfig();
93
+ const maxSteps = turnConfig?.maxSteps ?? agentConfig.maxSteps;
94
+ toolCallCount++;
95
+ // Check maxSteps
96
+ if (maxSteps !== undefined && toolCallCount > maxSteps) {
97
+ log.info("maxSteps exceeded, refusing tool call", {
98
+ toolCallCount,
99
+ maxSteps,
100
+ });
101
+ pendingTools.push({
102
+ call_id,
103
+ result: "Maximum tool steps reached. Please respond to the user now.",
104
+ });
105
+ client.event({ type: "tool_call_done", toolCallId: call_id, result: "" });
106
+ return;
107
+ }
108
+ // Check activeTools filter
109
+ if (turnConfig?.activeTools && !turnConfig.activeTools.includes(name)) {
110
+ log.info("Tool filtered by activeTools", { name });
111
+ const errResult = JSON.stringify({
112
+ error: `Tool "${name}" is not available at this step.`,
113
+ });
114
+ pendingTools.push({ call_id, result: errResult });
115
+ client.event({
116
+ type: "tool_call_done",
117
+ toolCallId: call_id,
118
+ result: errResult,
119
+ });
120
+ return;
121
+ }
122
+ // Fire onStep hook
123
+ invokeHook("onStep", {
124
+ stepNumber: toolCallCount - 1,
125
+ toolCalls: [{ toolName: name, args: parsedArgs }],
126
+ text: "",
127
+ });
128
+ log.info("S2S tool call", { tool: name, call_id, args: parsedArgs, agent });
129
+ // Execute — all tools (custom + builtin) run via the executor
130
+ let result;
131
+ try {
132
+ result = await executeTool(name, parsedArgs, id, conversationMessages);
133
+ }
134
+ catch (err) {
135
+ const msg = err instanceof Error ? err.message : String(err);
136
+ log.error("Tool execution failed", { tool: name, error: msg });
137
+ result = JSON.stringify({ error: msg });
138
+ }
139
+ log.info("S2S tool result", {
140
+ tool: name,
141
+ call_id,
142
+ resultLength: result.length,
143
+ });
144
+ // Accumulate — don't send yet. Results are sent after reply.done.
145
+ pendingTools.push({ call_id, result });
146
+ client.event({ type: "tool_call_done", toolCallId: call_id, result });
147
+ }
148
+ async function connectAndSetup() {
149
+ try {
150
+ const handle = await _internals.connectS2s({
151
+ apiKey,
152
+ config: s2sConfig,
153
+ createWebSocket,
154
+ logger: log,
155
+ });
156
+ // Send session.update immediately on connect — before session.ready.
157
+ if (s2sSessionId) {
158
+ log.info("Attempting S2S session resume", {
159
+ session_id: s2sSessionId,
160
+ });
161
+ handle.resumeSession(s2sSessionId);
162
+ }
163
+ // Send config with greeting on initial connect.
164
+ // Audio may arrive before the client is ready — the client buffers it.
165
+ handle.updateSession({
166
+ system_prompt: systemPrompt,
167
+ tools: s2sTools,
168
+ ...(agentConfig.greeting ? { greeting: agentConfig.greeting } : {}),
169
+ });
170
+ handle.addEventListener("ready", ((e) => {
171
+ s2sSessionId = e.detail.session_id;
172
+ log.info("S2S session ready", { session_id: s2sSessionId });
173
+ }));
174
+ handle.addEventListener("session_expired", (() => {
175
+ log.info("S2S session expired, reconnecting fresh");
176
+ s2sSessionId = null;
177
+ handle.close();
178
+ }));
179
+ handle.addEventListener("speech_started", () => {
180
+ client.event({ type: "speech_started" });
181
+ });
182
+ handle.addEventListener("speech_stopped", () => {
183
+ client.event({ type: "speech_stopped" });
184
+ });
185
+ handle.addEventListener("user_transcript_delta", ((e) => {
186
+ client.event({
187
+ type: "transcript",
188
+ text: e.detail.text,
189
+ isFinal: false,
190
+ });
191
+ }));
192
+ handle.addEventListener("user_transcript", ((e) => {
193
+ const { text } = e.detail;
194
+ log.info("S2S user transcript", { text });
195
+ client.event({ type: "transcript", text, isFinal: true });
196
+ client.event({ type: "turn", text });
197
+ conversationMessages.push({ role: "user", content: text });
198
+ invokeHook("onTurn", text);
199
+ }));
200
+ handle.addEventListener("reply_started", () => {
201
+ toolCallCount = 0;
202
+ });
203
+ handle.addEventListener("audio", ((e) => {
204
+ client.playAudioChunk(e.detail.audio);
205
+ }));
206
+ handle.addEventListener("agent_transcript", ((e) => {
207
+ const { text } = e.detail;
208
+ client.event({ type: "chat", text });
209
+ conversationMessages.push({ role: "assistant", content: text });
210
+ }));
211
+ handle.addEventListener("tool_call", ((e) => {
212
+ const p = handleToolCall(e.detail).catch((err) => {
213
+ log.error("Tool call handler failed", {
214
+ err: err instanceof Error ? err.message : String(err),
215
+ });
216
+ });
217
+ const prev = turnPromise;
218
+ turnPromise = (prev ?? Promise.resolve())
219
+ .then(() => p)
220
+ .finally(() => {
221
+ turnPromise = null;
222
+ });
223
+ }));
224
+ handle.addEventListener("reply_done", ((e) => {
225
+ if (e.detail.status === "interrupted") {
226
+ log.info("S2S reply interrupted (barge-in)");
227
+ // Discard pending tool results on interruption.
228
+ pendingTools = [];
229
+ client.event({ type: "cancelled" });
230
+ }
231
+ else {
232
+ // Send all accumulated tool results after reply.done.
233
+ if (pendingTools.length > 0) {
234
+ for (const tool of pendingTools) {
235
+ s2s?.sendToolResult(tool.call_id, tool.result);
236
+ }
237
+ pendingTools = [];
238
+ }
239
+ else {
240
+ client.playAudioDone();
241
+ client.event({ type: "tts_done" });
242
+ }
243
+ }
244
+ }));
245
+ handle.addEventListener("error", ((e) => {
246
+ log.error("S2S error", {
247
+ code: e.detail.code,
248
+ message: e.detail.message,
249
+ });
250
+ client.event({
251
+ type: "error",
252
+ code: "internal",
253
+ message: e.detail.message,
254
+ });
255
+ }));
256
+ handle.addEventListener("close", () => {
257
+ log.info("S2S closed");
258
+ s2s = null;
259
+ if (!sessionAbort.signal.aborted) {
260
+ log.info("Attempting S2S reconnect");
261
+ connectAndSetup().catch((err) => {
262
+ const msg = err instanceof Error ? err.message : String(err);
263
+ log.error("S2S reconnect failed", { error: msg });
264
+ });
265
+ }
266
+ });
267
+ s2s = handle;
268
+ }
269
+ catch (err) {
270
+ const msg = err instanceof Error ? err.message : String(err);
271
+ log.error("S2S connect failed", { error: msg });
272
+ client.event({ type: "error", code: "internal", message: msg });
273
+ }
274
+ }
275
+ return {
276
+ async start() {
277
+ metrics.sessionsTotal.inc(agentLabel);
278
+ metrics.sessionsActive.inc(agentLabel);
279
+ invokeHook("onConnect");
280
+ await connectAndSetup();
281
+ },
282
+ async stop() {
283
+ if (sessionAbort.signal.aborted)
284
+ return;
285
+ sessionAbort.abort();
286
+ metrics.sessionsActive.dec(agentLabel);
287
+ if (turnPromise)
288
+ await turnPromise;
289
+ s2s?.close();
290
+ invokeHook("onDisconnect");
291
+ },
292
+ onAudio(data) {
293
+ s2s?.sendAudio(data);
294
+ },
295
+ onAudioReady() {
296
+ if (audioReady)
297
+ return;
298
+ audioReady = true;
299
+ // Greeting audio + transcript come from S2S automatically.
300
+ },
301
+ onCancel() {
302
+ // S2S handles barge-in natively.
303
+ client.event({ type: "cancelled" });
304
+ },
305
+ onReset() {
306
+ conversationMessages = [];
307
+ toolCallCount = 0;
308
+ pendingTools = [];
309
+ s2sSessionId = null;
310
+ s2s?.close();
311
+ // Reconnect happens via the close handler.
312
+ client.event({ type: "reset" });
313
+ },
314
+ onHistory(incoming) {
315
+ for (const msg of incoming) {
316
+ conversationMessages.push({ role: msg.role, content: msg.text });
317
+ }
318
+ },
319
+ waitForTurn() {
320
+ return turnPromise ?? Promise.resolve();
321
+ },
322
+ };
323
+ }
324
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../sdk/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AgentConfig } from "./_internal_types.ts";
2
+ export declare function buildSystemPrompt(config: AgentConfig, opts: {
3
+ hasTools: boolean;
4
+ voice?: boolean;
5
+ }): string;
6
+ //# sourceMappingURL=system_prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system_prompt.d.ts","sourceRoot":"","sources":["../../sdk/system_prompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAexD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CA0BR"}
@@ -0,0 +1,35 @@
1
+ // Copyright 2025 the AAI authors. MIT license.
2
+ import { DEFAULT_INSTRUCTIONS } from "./types.js";
3
+ const VOICE_RULES = "\n\nCRITICAL OUTPUT RULES — you MUST follow these for EVERY response:\n" +
4
+ "Your response will be spoken aloud by a TTS system and displayed as plain text.\n" +
5
+ "- NEVER use markdown: no **, no *, no _, no #, no `, no [](), no ---\n" +
6
+ "- NEVER use bullet points (-, *, •) or numbered lists (1., 2.)\n" +
7
+ "- NEVER use code blocks or inline code\n" +
8
+ "- NEVER mention tools, search, APIs, or technical failures to the user. " +
9
+ "If a tool returns no results, just answer naturally without explaining why.\n" +
10
+ "- Write exactly as you would say it out loud to a friend\n" +
11
+ '- Use short conversational sentences. To list things, say "First," "Next," "Finally,"\n' +
12
+ "- Keep responses concise — 1 to 3 sentences max";
13
+ export function buildSystemPrompt(config, opts) {
14
+ const { hasTools } = opts;
15
+ const agentInstructions = config.instructions
16
+ ? `\n\nAgent-Specific Instructions:\n${config.instructions}`
17
+ : "";
18
+ const toolPreamble = hasTools
19
+ ? "\n\nWhen you decide to use a tool, ALWAYS say a brief natural phrase BEFORE the tool call " +
20
+ '(e.g. "Let me look that up" or "One moment while I check"). ' +
21
+ "This fills silence while the tool executes. Keep preambles to one short sentence."
22
+ : "";
23
+ const today = new Date().toLocaleDateString("en-US", {
24
+ weekday: "long",
25
+ year: "numeric",
26
+ month: "long",
27
+ day: "numeric",
28
+ });
29
+ return (DEFAULT_INSTRUCTIONS +
30
+ `\n\nToday's date is ${today}.` +
31
+ agentInstructions +
32
+ toolPreamble +
33
+ (opts?.voice ? VOICE_RULES : ""));
34
+ }
35
+ //# sourceMappingURL=system_prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system_prompt.js","sourceRoot":"","sources":["../../sdk/system_prompt.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAG/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,GACf,yEAAyE;IACzE,mFAAmF;IACnF,wEAAwE;IACxE,kEAAkE;IAClE,0CAA0C;IAC1C,0EAA0E;IAC1E,+EAA+E;IAC/E,4DAA4D;IAC5D,yFAAyF;IACzF,iDAAiD,CAAC;AAEpD,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,IAA4C;IAE5C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY;QAC3C,CAAC,CAAC,qCAAqC,MAAM,CAAC,YAAY,EAAE;QAC5D,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,4FAA4F;YAC5F,8DAA8D;YAC9D,mFAAmF;QACrF,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACnD,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,OAAO,CACL,oBAAoB;QACpB,uBAAuB,KAAK,GAAG;QAC/B,iBAAiB;QACjB,YAAY;QACZ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CACjC,CAAC;AACJ,CAAC"}