@jait/gateway 0.1.285 → 0.1.286

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 (78) hide show
  1. package/dist/config.d.ts +4 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +2 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +25 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/server.d.ts +1 -0
  9. package/dist/server.d.ts.map +1 -1
  10. package/dist/server.js +10 -0
  11. package/dist/server.js.map +1 -1
  12. package/dist/voice-assistant/service.d.ts +30 -0
  13. package/dist/voice-assistant/service.d.ts.map +1 -0
  14. package/dist/voice-assistant/service.js +281 -0
  15. package/dist/voice-assistant/service.js.map +1 -0
  16. package/dist/voice-assistant/tools.d.ts +41 -0
  17. package/dist/voice-assistant/tools.d.ts.map +1 -0
  18. package/dist/voice-assistant/tools.js +295 -0
  19. package/dist/voice-assistant/tools.js.map +1 -0
  20. package/dist/ws.d.ts.map +1 -1
  21. package/dist/ws.js +2 -0
  22. package/dist/ws.js.map +1 -1
  23. package/package.json +1 -1
  24. package/web-dist/assets/{_basePickBy-iKHSAv9J.js → _basePickBy-Dt11w-UC.js} +1 -1
  25. package/web-dist/assets/{_baseUniq-DMeT0pJj.js → _baseUniq-DVAr7SJu.js} +1 -1
  26. package/web-dist/assets/{arc-CGqtn5e9.js → arc-90Z9yuIN.js} +1 -1
  27. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CfDUNvKd.js → architectureDiagram-2XIMDMQ5-MarAYffA.js} +1 -1
  28. package/web-dist/assets/{blockDiagram-WCTKOSBZ-DGTIDF2n.js → blockDiagram-WCTKOSBZ-Dl-rzMj6.js} +1 -1
  29. package/web-dist/assets/{c4Diagram-IC4MRINW-DLJ_8zRP.js → c4Diagram-IC4MRINW-BxvJshEq.js} +1 -1
  30. package/web-dist/assets/channel-DCOoQL1e.js +1 -0
  31. package/web-dist/assets/{chunk-4BX2VUAB-B1XVFqID.js → chunk-4BX2VUAB-BZodPdZB.js} +1 -1
  32. package/web-dist/assets/{chunk-55IACEB6-DPRSsuyS.js → chunk-55IACEB6-DsJa9Fl7.js} +1 -1
  33. package/web-dist/assets/{chunk-FMBD7UC4-BYVMDPXy.js → chunk-FMBD7UC4-9SI0RLVt.js} +1 -1
  34. package/web-dist/assets/{chunk-JSJVCQXG-Cw9QARvp.js → chunk-JSJVCQXG-8enyVIhY.js} +1 -1
  35. package/web-dist/assets/{chunk-KX2RTZJC-CdsXoqTv.js → chunk-KX2RTZJC-BxYSjoqG.js} +1 -1
  36. package/web-dist/assets/{chunk-NQ4KR5QH-B9TGfzNG.js → chunk-NQ4KR5QH-DjUGRmtQ.js} +1 -1
  37. package/web-dist/assets/{chunk-QZHKN3VN-DnIelMmh.js → chunk-QZHKN3VN-C-S7EuKw.js} +1 -1
  38. package/web-dist/assets/{chunk-WL4C6EOR-B7rDWqqK.js → chunk-WL4C6EOR-TZD3VA-e.js} +1 -1
  39. package/web-dist/assets/classDiagram-VBA2DB6C-CKMPWi0F.js +1 -0
  40. package/web-dist/assets/classDiagram-v2-RAHNMMFH-CKMPWi0F.js +1 -0
  41. package/web-dist/assets/clone-Ct2oMpiv.js +1 -0
  42. package/web-dist/assets/{cose-bilkent-S5V4N54A-CFZXcxJ8.js → cose-bilkent-S5V4N54A-CwbcPw0Q.js} +1 -1
  43. package/web-dist/assets/{dagre-KLK3FWXG-U3J3AQYl.js → dagre-KLK3FWXG-BwlehdAG.js} +1 -1
  44. package/web-dist/assets/{diagram-E7M64L7V-B3xMDzyO.js → diagram-E7M64L7V-BHspPU95.js} +1 -1
  45. package/web-dist/assets/{diagram-IFDJBPK2-DX6eykyv.js → diagram-IFDJBPK2-BKBCxJi5.js} +1 -1
  46. package/web-dist/assets/{diagram-P4PSJMXO-IYL1yCXF.js → diagram-P4PSJMXO-BjgKaYTg.js} +1 -1
  47. package/web-dist/assets/{erDiagram-INFDFZHY-XAnpSjmF.js → erDiagram-INFDFZHY-ZNI2GkJ5.js} +1 -1
  48. package/web-dist/assets/{flowDiagram-PKNHOUZH-DmIQjuwF.js → flowDiagram-PKNHOUZH-BdyYzUn9.js} +1 -1
  49. package/web-dist/assets/{ganttDiagram-A5KZAMGK-C0HvwzKb.js → ganttDiagram-A5KZAMGK-DboZnezG.js} +1 -1
  50. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-C9fBjque.js → gitGraphDiagram-K3NZZRJ6-D5dT6HX-.js} +1 -1
  51. package/web-dist/assets/{graph-BsUOCCiq.js → graph-hTzGKK6i.js} +1 -1
  52. package/web-dist/assets/index-C3wZUjWs.css +32 -0
  53. package/web-dist/assets/{index-CsxEtnuR.js → index-D621karP.js} +601 -455
  54. package/web-dist/assets/{infoDiagram-LFFYTUFH-Bgj0YmBs.js → infoDiagram-LFFYTUFH-CBR-06mO.js} +1 -1
  55. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-Bi4W8qsd.js → ishikawaDiagram-PHBUUO56-mbAr3q3q.js} +1 -1
  56. package/web-dist/assets/{journeyDiagram-4ABVD52K-BOeR5DGC.js → journeyDiagram-4ABVD52K-CdrhXamX.js} +1 -1
  57. package/web-dist/assets/{kanban-definition-K7BYSVSG-BZQAw3zY.js → kanban-definition-K7BYSVSG-Cez5HygS.js} +1 -1
  58. package/web-dist/assets/{layout-CV-vePE7.js → layout-VEz5Njht.js} +1 -1
  59. package/web-dist/assets/{linear-cNCjBUyl.js → linear-pMGrAwFm.js} +1 -1
  60. package/web-dist/assets/{mindmap-definition-YRQLILUH-DgP0-yhh.js → mindmap-definition-YRQLILUH-B93Thm7D.js} +1 -1
  61. package/web-dist/assets/{pieDiagram-SKSYHLDU-3PQI6gKL.js → pieDiagram-SKSYHLDU-BG0vlryQ.js} +1 -1
  62. package/web-dist/assets/{quadrantDiagram-337W2JSQ-wZBUcM9U.js → quadrantDiagram-337W2JSQ-Cbf3tLiP.js} +1 -1
  63. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-DsDylirs.js → requirementDiagram-Z7DCOOCP-w8Huz3LQ.js} +1 -1
  64. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-qSCxyZGK.js → sankeyDiagram-WA2Y5GQK-Cgtd89IX.js} +1 -1
  65. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-W2UjBOuu.js → sequenceDiagram-2WXFIKYE-BZBX-EKp.js} +1 -1
  66. package/web-dist/assets/{stateDiagram-RAJIS63D-Bfy7DB0r.js → stateDiagram-RAJIS63D-DdSb-5G9.js} +1 -1
  67. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-B4jq8mjX.js +1 -0
  68. package/web-dist/assets/{timeline-definition-YZTLITO2--CHHDyOZ.js → timeline-definition-YZTLITO2-BsANl_xc.js} +1 -1
  69. package/web-dist/assets/{treemap-KZPCXAKY-ZQLFTfSZ.js → treemap-KZPCXAKY-0aW_1A69.js} +1 -1
  70. package/web-dist/assets/{vennDiagram-LZ73GAT5-Bh75zo1O.js → vennDiagram-LZ73GAT5-DNYw3p43.js} +1 -1
  71. package/web-dist/assets/{xychartDiagram-JWTSCODW-CYXFCyTo.js → xychartDiagram-JWTSCODW-42oguRWB.js} +1 -1
  72. package/web-dist/index.html +2 -2
  73. package/web-dist/assets/channel-BI2fCn1L.js +0 -1
  74. package/web-dist/assets/classDiagram-VBA2DB6C-BirRGMr3.js +0 -1
  75. package/web-dist/assets/classDiagram-v2-RAHNMMFH-BirRGMr3.js +0 -1
  76. package/web-dist/assets/clone-CNBtoui7.js +0 -1
  77. package/web-dist/assets/index-DLnxug6y.css +0 -32
  78. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-i02ov9wx.js +0 -1
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Voice-assistant service — bridges the browser to OpenAI's Realtime API.
3
+ *
4
+ * Architecture:
5
+ * Browser ←WebSocket→ Gateway ←WebSocket→ OpenAI Realtime API
6
+ *
7
+ * The gateway sits in the middle, relaying audio in both directions and
8
+ * intercepting function calls to execute them locally with full Jait access.
9
+ * This is a GLOBAL session — not tied to any workspace.
10
+ */
11
+ import { WebSocketServer, WebSocket } from "ws";
12
+ import { getVoiceToolSchemas, executeVoiceTool } from "./tools.js";
13
+ export class VoiceAssistantService {
14
+ wss;
15
+ deps;
16
+ constructor(deps) {
17
+ this.deps = deps;
18
+ this.wss = new WebSocketServer({ noServer: true });
19
+ this.wss.on("connection", (ws, req) => {
20
+ this.handleConnection(ws, req).catch((err) => {
21
+ console.error("[voice-assistant] Connection handler error:", err);
22
+ try {
23
+ ws.close(1011, "Internal error");
24
+ }
25
+ catch { }
26
+ });
27
+ });
28
+ }
29
+ /** Handle HTTP → WebSocket upgrade for the /ws/voice-assistant path. */
30
+ handleUpgrade(request, socket, head) {
31
+ this.wss.handleUpgrade(request, socket, head, (ws) => {
32
+ this.wss.emit("connection", ws, request);
33
+ });
34
+ }
35
+ async handleConnection(clientWs, req) {
36
+ // ── Auth ──────────────────────────────────────────────────
37
+ const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
38
+ const token = url.searchParams.get("token") ?? "";
39
+ const user = await this.deps.verifyToken(token);
40
+ if (!user) {
41
+ send(clientWs, { type: "error", message: "Unauthorized" });
42
+ clientWs.close(4001, "Unauthorized");
43
+ return;
44
+ }
45
+ // ── Validate OpenAI key ──────────────────────────────────
46
+ const apiKey = this.deps.config.openaiApiKey;
47
+ if (!apiKey) {
48
+ send(clientWs, { type: "error", message: "OpenAI API key not configured" });
49
+ clientWs.close(4002, "Not configured");
50
+ return;
51
+ }
52
+ console.log(`[voice-assistant] ${user.username} connected`);
53
+ // ── Connect to OpenAI Realtime API ───────────────────────
54
+ const model = this.deps.config.realtimeModel;
55
+ const openaiUrl = `wss://api.openai.com/v1/realtime?model=${encodeURIComponent(model)}`;
56
+ let openaiWs;
57
+ try {
58
+ openaiWs = new WebSocket(openaiUrl, {
59
+ headers: {
60
+ "Authorization": `Bearer ${apiKey}`,
61
+ },
62
+ });
63
+ }
64
+ catch (err) {
65
+ send(clientWs, { type: "error", message: `Failed to connect to OpenAI: ${err}` });
66
+ clientWs.close(4003, "OpenAI connection failed");
67
+ return;
68
+ }
69
+ let openaiReady = false;
70
+ let responseInProgress = false;
71
+ // ── OpenAI → Gateway → Browser ───────────────────────────
72
+ openaiWs.on("open", () => {
73
+ openaiReady = true;
74
+ console.log(`[voice-assistant] OpenAI Realtime connected (model: ${model})`);
75
+ // Configure the session
76
+ const sessionUpdate = {
77
+ type: "session.update",
78
+ session: {
79
+ type: "realtime",
80
+ instructions: this.buildInstructions(user.username),
81
+ tools: getVoiceToolSchemas(),
82
+ tool_choice: "auto",
83
+ },
84
+ };
85
+ openaiWs.send(JSON.stringify(sessionUpdate));
86
+ send(clientWs, { type: "session.started" });
87
+ send(clientWs, { type: "status", status: "listening" });
88
+ });
89
+ openaiWs.on("message", async (raw) => {
90
+ let event;
91
+ try {
92
+ event = JSON.parse(typeof raw === "string" ? raw : raw.toString());
93
+ }
94
+ catch {
95
+ return;
96
+ }
97
+ // Debug: log all events from OpenAI
98
+ if (event.type !== "response.audio.delta") {
99
+ console.log(`[voice-assistant] OpenAI event: ${event.type}`, event.type === "error" ? event.error : "");
100
+ }
101
+ switch (event.type) {
102
+ // ── Audio from assistant ──────────────────────────────
103
+ case "response.audio.delta":
104
+ case "response.output_audio.delta":
105
+ responseInProgress = true;
106
+ send(clientWs, { type: "audio", data: event.delta });
107
+ send(clientWs, { type: "status", status: "speaking" });
108
+ break;
109
+ case "response.audio.done":
110
+ case "response.output_audio.done":
111
+ responseInProgress = false;
112
+ send(clientWs, { type: "audio.done" });
113
+ send(clientWs, { type: "status", status: "listening" });
114
+ break;
115
+ // ── Transcription ────────────────────────────────────
116
+ case "conversation.item.input_audio_transcription.completed":
117
+ send(clientWs, { type: "transcript", role: "user", text: event.transcript ?? "", final: true });
118
+ break;
119
+ case "response.audio_transcript.delta":
120
+ case "response.output_audio_transcript.delta":
121
+ send(clientWs, { type: "transcript", role: "assistant", text: event.delta ?? "", final: false });
122
+ break;
123
+ case "response.audio_transcript.done":
124
+ case "response.output_audio_transcript.done":
125
+ send(clientWs, { type: "transcript", role: "assistant", text: event.transcript ?? "", final: true });
126
+ break;
127
+ // ── Function calls ───────────────────────────────────
128
+ case "response.function_call_arguments.done": {
129
+ const callId = event.call_id;
130
+ const fnName = event.name;
131
+ let fnArgs = {};
132
+ try {
133
+ fnArgs = JSON.parse(event.arguments ?? "{}");
134
+ }
135
+ catch { }
136
+ send(clientWs, { type: "tool_call", name: fnName, status: "running" });
137
+ send(clientWs, { type: "status", status: "thinking" });
138
+ const result = await executeVoiceTool(fnName, fnArgs, this.deps);
139
+ send(clientWs, { type: "tool_call", name: fnName, status: "completed", result });
140
+ // Send function output back to OpenAI
141
+ openaiWs.send(JSON.stringify({
142
+ type: "conversation.item.create",
143
+ item: {
144
+ type: "function_call_output",
145
+ call_id: callId,
146
+ output: result,
147
+ },
148
+ }));
149
+ // Ask OpenAI to continue
150
+ openaiWs.send(JSON.stringify({ type: "response.create" }));
151
+ break;
152
+ }
153
+ // ── Errors ───────────────────────────────────────────
154
+ case "error": {
155
+ const errMsg = event.error?.message ?? "OpenAI error";
156
+ // Suppress harmless "no active response" from cancel attempts
157
+ if (errMsg.includes("no active response"))
158
+ break;
159
+ console.error("[voice-assistant] OpenAI error:", event.error);
160
+ send(clientWs, { type: "error", message: errMsg });
161
+ break;
162
+ }
163
+ // ── Interruption (server VAD detected user speech) ───
164
+ case "input_audio_buffer.speech_started":
165
+ // User started speaking — cancel only if assistant is actively responding
166
+ if (responseInProgress) {
167
+ openaiWs.send(JSON.stringify({ type: "response.cancel" }));
168
+ send(clientWs, { type: "audio.interrupt" });
169
+ responseInProgress = false;
170
+ }
171
+ send(clientWs, { type: "status", status: "listening" });
172
+ break;
173
+ case "input_audio_buffer.speech_stopped":
174
+ // Server VAD detected end of speech — response will be created automatically
175
+ break;
176
+ case "response.cancelled":
177
+ responseInProgress = false;
178
+ send(clientWs, { type: "status", status: "listening" });
179
+ break;
180
+ case "response.done":
181
+ responseInProgress = false;
182
+ send(clientWs, { type: "status", status: "listening" });
183
+ break;
184
+ default:
185
+ // Ignore other events (session.created, session.updated, etc.)
186
+ break;
187
+ }
188
+ });
189
+ openaiWs.on("close", (code, reason) => {
190
+ console.log(`[voice-assistant] OpenAI disconnected: ${code} ${reason}`);
191
+ send(clientWs, { type: "error", message: "OpenAI session ended" });
192
+ clientWs.close(1000, "OpenAI disconnected");
193
+ });
194
+ openaiWs.on("error", (err) => {
195
+ console.error("[voice-assistant] OpenAI WS error:", err);
196
+ send(clientWs, { type: "error", message: `OpenAI connection error: ${err.message}` });
197
+ });
198
+ // ── Browser → Gateway → OpenAI ───────────────────────────
199
+ let audioChunkCount = 0;
200
+ clientWs.on("message", (raw) => {
201
+ if (!openaiReady)
202
+ return;
203
+ let msg;
204
+ try {
205
+ msg = JSON.parse(typeof raw === "string" ? raw : raw.toString());
206
+ }
207
+ catch {
208
+ return;
209
+ }
210
+ switch (msg.type) {
211
+ case "audio":
212
+ audioChunkCount++;
213
+ if (audioChunkCount <= 3 || audioChunkCount % 50 === 0) {
214
+ console.log(`[voice-assistant] Audio chunk #${audioChunkCount} (${msg.data.length} base64 chars)`);
215
+ }
216
+ openaiWs.send(JSON.stringify({
217
+ type: "input_audio_buffer.append",
218
+ audio: msg.data,
219
+ }));
220
+ break;
221
+ case "commit":
222
+ openaiWs.send(JSON.stringify({ type: "input_audio_buffer.commit" }));
223
+ break;
224
+ case "stop":
225
+ openaiWs.send(JSON.stringify({ type: "input_audio_buffer.clear" }));
226
+ openaiWs.close(1000, "User ended session");
227
+ break;
228
+ }
229
+ });
230
+ // ── Cleanup ──────────────────────────────────────────────
231
+ clientWs.on("close", () => {
232
+ console.log(`[voice-assistant] ${user.username} disconnected`);
233
+ if (openaiWs.readyState === WebSocket.OPEN || openaiWs.readyState === WebSocket.CONNECTING) {
234
+ openaiWs.close(1000, "Client disconnected");
235
+ }
236
+ });
237
+ clientWs.on("error", () => {
238
+ try {
239
+ openaiWs.close();
240
+ }
241
+ catch { }
242
+ });
243
+ }
244
+ buildInstructions(username) {
245
+ return `# Persona
246
+ You are Jait — a personal AI assistant, similar to JARVIS from Iron Man.
247
+ You are the voice interface for the Jait workspace management system.
248
+ The user's name is ${username}.
249
+
250
+ # Voice Behavior
251
+ - Keep responses SHORT and conversational — you're speaking out loud, not writing an essay.
252
+ - Use clear, natural sentences. Avoid bullet lists, markdown, or code blocks in speech.
253
+ - Be direct, efficient, and slightly witty when appropriate.
254
+ - For simple facts (time, weather), answer in one sentence.
255
+ - For complex tool results, summarise the key points.
256
+
257
+ # System Integration
258
+ You have direct access to the Jait system through function calls:
259
+ - jait_system_status — check what's active
260
+ - list_sessions, list_workspaces, list_threads — see what's open
261
+ - send_to_agent — delegate coding tasks to CLI agents
262
+ - search_memory, save_memory — recall and store information
263
+ - search_web — look up current events, news, facts
264
+ - get_weather — weather by city
265
+ - get_time_and_date — current time
266
+ - get_system_info — host computer resources
267
+
268
+ # Important Rules
269
+ - For ANY factual question about current events or time-sensitive information, ALWAYS use search_web first.
270
+ - When the user tells you personal information, use save_memory to remember it.
271
+ - Before answering questions about past interactions, use search_memory.
272
+ - When the user asks you to code or fix something, use send_to_agent.
273
+ - You can respond in the user's language — detect it from their speech.`;
274
+ }
275
+ }
276
+ function send(ws, msg) {
277
+ if (ws.readyState === WebSocket.OPEN) {
278
+ ws.send(JSON.stringify(msg));
279
+ }
280
+ }
281
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/voice-assistant/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Voice-assistant tool definitions for OpenAI Realtime API function calling.
3
+ *
4
+ * Each tool is defined as an OpenAI-compatible function schema plus a local
5
+ * executor that runs inside the gateway with full access to Jait services.
6
+ */
7
+ import type { SessionService } from "../services/sessions.js";
8
+ import type { ThreadService } from "../services/threads.js";
9
+ import type { WorkspaceService } from "../services/workspaces.js";
10
+ import type { MemoryService } from "../memory/contracts.js";
11
+ import type { ToolRegistry } from "../tools/registry.js";
12
+ import type { ToolContext, ToolResult } from "../tools/contracts.js";
13
+ import type { ProviderRegistry } from "../providers/registry.js";
14
+ import type { AppConfig } from "../config.js";
15
+ export interface VoiceToolDeps {
16
+ config: AppConfig;
17
+ sessionService?: SessionService;
18
+ threadService?: ThreadService;
19
+ workspaceService?: WorkspaceService;
20
+ memoryService?: MemoryService;
21
+ toolRegistry?: ToolRegistry;
22
+ providerRegistry?: ProviderRegistry;
23
+ toolExecutor?: (name: string, input: unknown, ctx: ToolContext) => Promise<ToolResult>;
24
+ }
25
+ /** OpenAI function-calling tool schema */
26
+ export interface RealtimeToolDef {
27
+ type: "function";
28
+ name: string;
29
+ description: string;
30
+ parameters: Record<string, unknown>;
31
+ }
32
+ /** A voice-assistant tool: schema + executor */
33
+ export interface VoiceTool {
34
+ schema: RealtimeToolDef;
35
+ execute: (args: Record<string, unknown>, deps: VoiceToolDeps) => Promise<string>;
36
+ }
37
+ /** Get all tool schemas (for session.update → tools). */
38
+ export declare function getVoiceToolSchemas(): RealtimeToolDef[];
39
+ /** Execute a tool by name. Returns the string result for the function_call_output. */
40
+ export declare function executeVoiceTool(name: string, args: Record<string, unknown>, deps: VoiceToolDeps): Promise<string>;
41
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/voice-assistant/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACxF;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClF;AA+QD,yDAAyD;AACzD,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAEvD;AAED,sFAAsF;AACtF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CAQjB"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Voice-assistant tool definitions for OpenAI Realtime API function calling.
3
+ *
4
+ * Each tool is defined as an OpenAI-compatible function schema plus a local
5
+ * executor that runs inside the gateway with full access to Jait services.
6
+ */
7
+ import { hostname, platform, cpus, totalmem, freemem } from "node:os";
8
+ // ── Tool implementations ────────────────────────────────────────
9
+ const getTimeAndDate = {
10
+ schema: {
11
+ type: "function",
12
+ name: "get_time_and_date",
13
+ description: "Get the current date, time, and day of the week. Use when the user asks what time or date it is.",
14
+ parameters: { type: "object", properties: {}, required: [] },
15
+ },
16
+ execute: async () => {
17
+ const now = new Date();
18
+ return `Current date and time: ${now.toLocaleDateString("en-US", { weekday: "long", year: "numeric", month: "long", day: "numeric" })} at ${now.toLocaleTimeString("en-US")}`;
19
+ },
20
+ };
21
+ const getSystemInfo = {
22
+ schema: {
23
+ type: "function",
24
+ name: "get_system_info",
25
+ description: "Get host computer information: OS, CPU, memory usage. Use when the user asks about system resources.",
26
+ parameters: { type: "object", properties: {}, required: [] },
27
+ },
28
+ execute: async () => {
29
+ const totalGB = (totalmem() / 1073741824).toFixed(1);
30
+ const freeGB = (freemem() / 1073741824).toFixed(1);
31
+ const usedGB = ((totalmem() - freemem()) / 1073741824).toFixed(1);
32
+ return JSON.stringify({
33
+ hostname: hostname(),
34
+ platform: platform(),
35
+ cpus: cpus().length,
36
+ cpuModel: cpus()[0]?.model ?? "unknown",
37
+ memoryTotalGB: totalGB,
38
+ memoryUsedGB: usedGB,
39
+ memoryFreeGB: freeGB,
40
+ });
41
+ },
42
+ };
43
+ const systemStatus = {
44
+ schema: {
45
+ type: "function",
46
+ name: "jait_system_status",
47
+ description: "Get the Jait system status: active sessions, workspaces, running threads. Use when the user asks what's going on or the system state.",
48
+ parameters: { type: "object", properties: {}, required: [] },
49
+ },
50
+ execute: async (_args, deps) => {
51
+ const sessions = deps.sessionService?.list?.(undefined, undefined, 10) ?? [];
52
+ const threads = deps.threadService?.list?.(undefined, 50) ?? [];
53
+ const running = deps.threadService?.listRunning?.() ?? [];
54
+ return JSON.stringify({
55
+ activeSessions: Array.isArray(sessions) ? sessions.length : 0,
56
+ runningThreads: Array.isArray(running) ? running.length : 0,
57
+ totalThreads: Array.isArray(threads) ? threads.length : 0,
58
+ });
59
+ },
60
+ };
61
+ const listSessions = {
62
+ schema: {
63
+ type: "function",
64
+ name: "list_sessions",
65
+ description: "List recent Jait chat sessions with titles and IDs. Use when the user asks what conversations are open.",
66
+ parameters: { type: "object", properties: {}, required: [] },
67
+ },
68
+ execute: async (_args, deps) => {
69
+ const sessions = deps.sessionService?.list?.(undefined, undefined, 10) ?? [];
70
+ if (!Array.isArray(sessions) || sessions.length === 0)
71
+ return "No active sessions found.";
72
+ return sessions.map((s) => `- ${s.name ?? "Untitled"} (id: ${s.id})`).join("\n");
73
+ },
74
+ };
75
+ const listWorkspaces = {
76
+ schema: {
77
+ type: "function",
78
+ name: "list_workspaces",
79
+ description: "List configured Jait workspaces. Use when the user asks about their projects or workspaces.",
80
+ parameters: { type: "object", properties: {}, required: [] },
81
+ },
82
+ execute: async (_args, deps) => {
83
+ const workspaces = deps.workspaceService?.list?.() ?? [];
84
+ if (!Array.isArray(workspaces) || workspaces.length === 0)
85
+ return "No workspaces configured.";
86
+ return workspaces.map((w) => `- ${w.title ?? w.rootPath ?? "Unknown"} (id: ${w.id})`).join("\n");
87
+ },
88
+ };
89
+ const listThreads = {
90
+ schema: {
91
+ type: "function",
92
+ name: "list_threads",
93
+ description: "List agent threads (Claude Code, Codex, Gemini CLI, etc.) with status. Use when the user asks about running agents or tasks.",
94
+ parameters: { type: "object", properties: {}, required: [] },
95
+ },
96
+ execute: async (_args, deps) => {
97
+ const threads = deps.threadService?.list?.(undefined, 10) ?? [];
98
+ if (!Array.isArray(threads) || threads.length === 0)
99
+ return "No agent threads found.";
100
+ return threads.map((t) => `- [${t.status}] ${t.title ?? "Untitled"} (${t.providerId})`).join("\n");
101
+ },
102
+ };
103
+ const searchMemory = {
104
+ schema: {
105
+ type: "function",
106
+ name: "search_memory",
107
+ description: "Search Jait's memory for relevant context about a topic. Use when the user asks you to recall something or when you need context about past interactions.",
108
+ parameters: {
109
+ type: "object",
110
+ properties: {
111
+ query: { type: "string", description: "The topic or question to search for" },
112
+ },
113
+ required: ["query"],
114
+ },
115
+ },
116
+ execute: async (args, deps) => {
117
+ if (!deps.memoryService)
118
+ return "Memory service not available.";
119
+ const query = String(args["query"] ?? "");
120
+ if (!query)
121
+ return "No search query provided.";
122
+ try {
123
+ const results = await deps.memoryService.search(query, 5);
124
+ if (!results.length)
125
+ return `No memories found about: ${query}`;
126
+ return results.map((r) => `- ${r.content.slice(0, 200)}`).join("\n");
127
+ }
128
+ catch {
129
+ return "Memory search failed.";
130
+ }
131
+ },
132
+ };
133
+ const saveMemory = {
134
+ schema: {
135
+ type: "function",
136
+ name: "save_memory",
137
+ description: "Save information to Jait's long-term memory. Use when the user tells you something to remember (preferences, names, facts).",
138
+ parameters: {
139
+ type: "object",
140
+ properties: {
141
+ content: { type: "string", description: "The information to remember" },
142
+ },
143
+ required: ["content"],
144
+ },
145
+ },
146
+ execute: async (args, deps) => {
147
+ if (!deps.memoryService)
148
+ return "Memory service not available.";
149
+ const content = String(args["content"] ?? "");
150
+ if (!content)
151
+ return "Nothing to save.";
152
+ try {
153
+ await deps.memoryService.save({
154
+ scope: "workspace",
155
+ content,
156
+ source: { type: "voice-assistant", id: "voice", surface: "voice" },
157
+ });
158
+ return "Saved to memory.";
159
+ }
160
+ catch {
161
+ return "Failed to save memory.";
162
+ }
163
+ },
164
+ };
165
+ const sendToThread = {
166
+ schema: {
167
+ type: "function",
168
+ name: "send_to_agent",
169
+ description: "Send a task to a CLI coding agent (Claude Code, Codex, Gemini CLI, Copilot). Creates a new thread. Use when the user wants to delegate a coding or automation task.",
170
+ parameters: {
171
+ type: "object",
172
+ properties: {
173
+ message: { type: "string", description: "The task description" },
174
+ provider: {
175
+ type: "string",
176
+ description: "Which agent to use",
177
+ enum: ["claude-code", "codex", "gemini", "copilot"],
178
+ },
179
+ },
180
+ required: ["message"],
181
+ },
182
+ },
183
+ execute: async (args, deps) => {
184
+ if (!deps.threadService)
185
+ return "Thread service not available.";
186
+ const message = String(args["message"] ?? "");
187
+ const provider = String(args["provider"] ?? "claude-code");
188
+ if (!message)
189
+ return "No task provided.";
190
+ try {
191
+ const thread = deps.threadService.create({
192
+ title: message.slice(0, 80),
193
+ providerId: provider,
194
+ });
195
+ return `Thread created: ${thread.id} with ${provider}. Task: "${message.slice(0, 100)}"`;
196
+ }
197
+ catch (e) {
198
+ return `Failed to create thread: ${e}`;
199
+ }
200
+ },
201
+ };
202
+ const searchWeb = {
203
+ schema: {
204
+ type: "function",
205
+ name: "search_web",
206
+ description: "Search the web for current information, news, or facts. Use for any factual question about current events, recent news, or anything that changes over time.",
207
+ parameters: {
208
+ type: "object",
209
+ properties: {
210
+ query: { type: "string", description: "The search query" },
211
+ },
212
+ required: ["query"],
213
+ },
214
+ },
215
+ execute: async (args, deps) => {
216
+ const query = String(args["query"] ?? "");
217
+ if (!query)
218
+ return "No search query provided.";
219
+ if (!deps.toolExecutor)
220
+ return "Tool executor not available.";
221
+ try {
222
+ const result = await deps.toolExecutor("web.search", { query }, {
223
+ sessionId: "voice-assistant",
224
+ actionId: `va-${Date.now()}`,
225
+ workspaceRoot: "",
226
+ requestedBy: "voice-assistant",
227
+ apiKeys: { openai: deps.config.openaiApiKey },
228
+ });
229
+ return result.ok ? String(result.data ?? result.message).slice(0, 3000) : `Search failed: ${result.message}`;
230
+ }
231
+ catch (e) {
232
+ return `Web search failed: ${e}`;
233
+ }
234
+ },
235
+ };
236
+ const getWeather = {
237
+ schema: {
238
+ type: "function",
239
+ name: "get_weather",
240
+ description: "Get current weather for a city. Use when the user asks about the weather.",
241
+ parameters: {
242
+ type: "object",
243
+ properties: {
244
+ city: { type: "string", description: "City name" },
245
+ },
246
+ required: ["city"],
247
+ },
248
+ },
249
+ execute: async (args) => {
250
+ const city = String(args["city"] ?? "");
251
+ if (!city)
252
+ return "No city provided.";
253
+ try {
254
+ const res = await fetch(`https://wttr.in/${encodeURIComponent(city)}?format=3`);
255
+ if (!res.ok)
256
+ return `Could not fetch weather for ${city}.`;
257
+ return (await res.text()).trim();
258
+ }
259
+ catch {
260
+ return `Failed to get weather for ${city}.`;
261
+ }
262
+ },
263
+ };
264
+ // ── Registry ────────────────────────────────────────────────────
265
+ const ALL_TOOLS = [
266
+ getTimeAndDate,
267
+ getSystemInfo,
268
+ systemStatus,
269
+ listSessions,
270
+ listWorkspaces,
271
+ listThreads,
272
+ searchMemory,
273
+ saveMemory,
274
+ sendToThread,
275
+ searchWeb,
276
+ getWeather,
277
+ ];
278
+ const toolMap = new Map(ALL_TOOLS.map((t) => [t.schema.name, t]));
279
+ /** Get all tool schemas (for session.update → tools). */
280
+ export function getVoiceToolSchemas() {
281
+ return ALL_TOOLS.map((t) => t.schema);
282
+ }
283
+ /** Execute a tool by name. Returns the string result for the function_call_output. */
284
+ export async function executeVoiceTool(name, args, deps) {
285
+ const tool = toolMap.get(name);
286
+ if (!tool)
287
+ return `Unknown tool: ${name}`;
288
+ try {
289
+ return await tool.execute(args, deps);
290
+ }
291
+ catch (e) {
292
+ return `Tool error: ${e}`;
293
+ }
294
+ }
295
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/voice-assistant/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA2BtE,mEAAmE;AAEnE,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,kGAAkG;QAC/G,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,0BAA0B,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,OAAO,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;IAChL,CAAC;CACF,CAAC;AAEF,MAAM,aAAa,GAAc;IAC/B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,sGAAsG;QACnH,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,QAAQ,EAAE,QAAQ,EAAE;YACpB,QAAQ,EAAE,QAAQ,EAAE;YACpB,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;YACvC,aAAa,EAAE,OAAO;YACtB,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uIAAuI;QACpJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7D,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,yGAAyG;QACtH,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,2BAA2B,CAAC;QAC1F,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6FAA6F;QAC1G,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,2BAA2B,CAAC;QAC9F,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxG,CAAC;CACF,CAAC;AAEF,MAAM,WAAW,GAAc;IAC7B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,8HAA8H;QAC3I,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7D;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,yBAAyB,CAAC;QACtF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAC5B,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,IAAI,UAAU,KAAK,CAAC,CAAC,UAAU,GAAG,CAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,2JAA2J;QACxK,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;aAC9E;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,+BAA+B,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,2BAA2B,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,4BAA4B,KAAK,EAAE,CAAC;YAChE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,uBAAuB,CAAC;QACjC,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,GAAc;IAC5B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,6HAA6H;QAC1I,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,+BAA+B,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,kBAAkB,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,WAAW;gBAClB,OAAO;gBACP,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;aACnE,CAAC,CAAC;YACH,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,wBAAwB,CAAC;QAClC,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,qKAAqK;QAClL,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAChE,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oBAAoB;oBACjC,IAAI,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;iBACpD;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,+BAA+B,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO;YAAE,OAAO,mBAAmB,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBACvC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3B,UAAU,EAAE,QAAe;aAC5B,CAAC,CAAC;YACH,OAAO,mBAAmB,MAAM,CAAC,EAAE,SAAS,QAAQ,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;QAC3F,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,4BAA4B,CAAC,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,SAAS,GAAc;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6JAA6J;QAC1K,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;aAC3D;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,2BAA2B,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,8BAA8B,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC9D,SAAS,EAAE,iBAAiB;gBAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;gBAC5B,aAAa,EAAE,EAAE;gBACjB,WAAW,EAAE,iBAAiB;gBAC9B,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/G,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,sBAAsB,CAAC,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,GAAc;IAC5B,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,2EAA2E;QACxF,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;aACnD;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,mBAAmB,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,+BAA+B,IAAI,GAAG,CAAC;YAC3D,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,6BAA6B,IAAI,GAAG,CAAC;QAC9C,CAAC;IACH,CAAC;CACF,CAAC;AAEF,mEAAmE;AAEnE,MAAM,SAAS,GAAgB;IAC7B,cAAc;IACd,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,WAAW;IACX,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;CACX,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAErF,yDAAyD;AACzD,MAAM,UAAU,mBAAmB;IACjC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,IAA6B,EAC7B,IAAmB;IAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,iBAAiB,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,eAAe,CAAC,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}