@xalia/agent 0.5.8 → 0.6.1

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 (185) hide show
  1. package/README.md +23 -8
  2. package/dist/agent/src/agent/agent.js +173 -96
  3. package/dist/agent/src/agent/agentUtils.js +82 -53
  4. package/dist/agent/src/agent/compressingContextManager.js +102 -0
  5. package/dist/agent/src/agent/context.js +189 -0
  6. package/dist/agent/src/agent/dummyLLM.js +46 -5
  7. package/dist/agent/src/agent/iAgentEventHandler.js +2 -0
  8. package/dist/agent/src/agent/mcpServerManager.js +22 -23
  9. package/dist/agent/src/agent/nullAgentEventHandler.js +21 -0
  10. package/dist/agent/src/agent/nullPlatform.js +14 -0
  11. package/dist/agent/src/agent/openAILLMStreaming.js +12 -7
  12. package/dist/agent/src/agent/promptProvider.js +63 -0
  13. package/dist/agent/src/agent/repeatLLM.js +5 -5
  14. package/dist/agent/src/agent/sudoMcpServerManager.js +11 -9
  15. package/dist/agent/src/agent/tokenAuth.js +7 -7
  16. package/dist/agent/src/agent/tools.js +1 -1
  17. package/dist/agent/src/chat/client/chatClient.js +733 -0
  18. package/dist/agent/src/chat/client/connection.js +209 -0
  19. package/dist/agent/src/chat/client/connection.test.js +188 -0
  20. package/dist/agent/src/chat/client/constants.js +5 -0
  21. package/dist/agent/src/chat/client/index.js +15 -0
  22. package/dist/agent/src/chat/client/interfaces.js +2 -0
  23. package/dist/agent/src/chat/client/responseHandler.js +105 -0
  24. package/dist/agent/src/chat/client/sessionClient.js +331 -0
  25. package/dist/agent/src/chat/client/teamManager.js +2 -0
  26. package/dist/agent/src/chat/{apiKeyManager.js → data/apiKeyManager.js} +4 -0
  27. package/dist/agent/src/chat/data/dataModels.js +2 -0
  28. package/dist/agent/src/chat/data/database.js +749 -0
  29. package/dist/agent/src/chat/data/dbMcpServerConfigs.js +47 -0
  30. package/dist/agent/src/chat/protocol/connectionMessages.js +5 -0
  31. package/dist/agent/src/chat/protocol/constants.js +50 -0
  32. package/dist/agent/src/chat/protocol/errors.js +22 -0
  33. package/dist/agent/src/chat/protocol/messages.js +110 -0
  34. package/dist/agent/src/chat/server/chatContextManager.js +405 -0
  35. package/dist/agent/src/chat/server/connectionManager.js +352 -0
  36. package/dist/agent/src/chat/server/connectionManager.test.js +159 -0
  37. package/dist/agent/src/chat/server/conversation.js +198 -0
  38. package/dist/agent/src/chat/server/errorUtils.js +23 -0
  39. package/dist/agent/src/chat/server/openSession.js +869 -0
  40. package/dist/agent/src/chat/server/server.js +177 -0
  41. package/dist/agent/src/chat/server/sessionFileManager.js +161 -0
  42. package/dist/agent/src/chat/server/sessionRegistry.js +700 -0
  43. package/dist/agent/src/chat/server/sessionRegistry.test.js +97 -0
  44. package/dist/agent/src/chat/server/test-utils/mockFactories.js +307 -0
  45. package/dist/agent/src/chat/server/tools.js +243 -0
  46. package/dist/agent/src/chat/utils/agentSessionMap.js +66 -0
  47. package/dist/agent/src/chat/utils/approvalManager.js +85 -0
  48. package/dist/agent/src/{utils → chat/utils}/asyncLock.js +3 -3
  49. package/dist/agent/src/chat/{asyncQueue.js → utils/asyncQueue.js} +12 -2
  50. package/dist/agent/src/chat/utils/htmlToText.js +84 -0
  51. package/dist/agent/src/chat/utils/multiAsyncQueue.js +42 -0
  52. package/dist/agent/src/chat/utils/search.js +145 -0
  53. package/dist/agent/src/chat/utils/userResolver.js +46 -0
  54. package/dist/agent/src/chat/{websocket.js → utils/websocket.js} +2 -0
  55. package/dist/agent/src/test/agent.test.js +332 -0
  56. package/dist/agent/src/test/approvalManager.test.js +58 -0
  57. package/dist/agent/src/test/chatContextManager.test.js +392 -0
  58. package/dist/agent/src/test/clientServerConnection.test.js +158 -0
  59. package/dist/agent/src/test/compressingContextManager.test.js +65 -0
  60. package/dist/agent/src/test/context.test.js +83 -0
  61. package/dist/agent/src/test/conversation.test.js +89 -0
  62. package/dist/agent/src/test/db.test.js +262 -90
  63. package/dist/agent/src/test/dbMcpServerConfigs.test.js +72 -0
  64. package/dist/agent/src/test/dbTestTools.js +99 -0
  65. package/dist/agent/src/test/imageLoad.test.js +8 -7
  66. package/dist/agent/src/test/mcpServerManager.test.js +21 -18
  67. package/dist/agent/src/test/multiAsyncQueue.test.js +101 -0
  68. package/dist/agent/src/test/openaiStreaming.test.js +12 -11
  69. package/dist/agent/src/test/prompt.test.js +5 -4
  70. package/dist/agent/src/test/promptProvider.test.js +28 -0
  71. package/dist/agent/src/test/responseHandler.test.js +61 -0
  72. package/dist/agent/src/test/sudoMcpServerManager.test.js +14 -12
  73. package/dist/agent/src/test/testTools.js +109 -0
  74. package/dist/agent/src/test/tools.test.js +31 -0
  75. package/dist/agent/src/tool/agentChat.js +21 -10
  76. package/dist/agent/src/tool/agentMain.js +1 -1
  77. package/dist/agent/src/tool/chatMain.js +235 -58
  78. package/dist/agent/src/tool/commandPrompt.js +15 -9
  79. package/dist/agent/src/tool/files.js +20 -16
  80. package/dist/agent/src/tool/nodePlatform.js +47 -3
  81. package/dist/agent/src/tool/options.js +4 -4
  82. package/dist/agent/src/tool/prompt.js +19 -13
  83. package/eslint.config.mjs +14 -1
  84. package/package.json +14 -6
  85. package/scripts/chat_server +8 -0
  86. package/scripts/setup_chat +7 -2
  87. package/scripts/shutdown_chat_server +3 -0
  88. package/scripts/test_chat +135 -17
  89. package/src/agent/agent.ts +270 -135
  90. package/src/agent/agentUtils.ts +136 -95
  91. package/src/agent/compressingContextManager.ts +164 -0
  92. package/src/agent/context.ts +268 -0
  93. package/src/agent/dummyLLM.ts +76 -8
  94. package/src/agent/iAgentEventHandler.ts +54 -0
  95. package/src/agent/iplatform.ts +1 -0
  96. package/src/agent/mcpServerManager.ts +32 -30
  97. package/src/agent/nullAgentEventHandler.ts +20 -0
  98. package/src/agent/nullPlatform.ts +13 -0
  99. package/src/agent/openAILLMStreaming.ts +12 -6
  100. package/src/agent/promptProvider.ts +87 -0
  101. package/src/agent/repeatLLM.ts +5 -5
  102. package/src/agent/sudoMcpServerManager.ts +13 -11
  103. package/src/agent/tokenAuth.ts +7 -7
  104. package/src/agent/tools.ts +3 -1
  105. package/src/chat/client/chatClient.ts +900 -0
  106. package/src/chat/client/connection.test.ts +241 -0
  107. package/src/chat/client/connection.ts +276 -0
  108. package/src/chat/client/constants.ts +3 -0
  109. package/src/chat/client/index.ts +18 -0
  110. package/src/chat/client/interfaces.ts +34 -0
  111. package/src/chat/client/responseHandler.ts +131 -0
  112. package/src/chat/client/sessionClient.ts +443 -0
  113. package/src/chat/client/teamManager.ts +29 -0
  114. package/src/chat/{apiKeyManager.ts → data/apiKeyManager.ts} +6 -2
  115. package/src/chat/data/dataModels.ts +85 -0
  116. package/src/chat/data/database.ts +982 -0
  117. package/src/chat/data/dbMcpServerConfigs.ts +59 -0
  118. package/src/chat/protocol/connectionMessages.ts +49 -0
  119. package/src/chat/protocol/constants.ts +55 -0
  120. package/src/chat/protocol/errors.ts +16 -0
  121. package/src/chat/protocol/messages.ts +682 -0
  122. package/src/chat/server/README.md +127 -0
  123. package/src/chat/server/chatContextManager.ts +612 -0
  124. package/src/chat/server/connectionManager.test.ts +266 -0
  125. package/src/chat/server/connectionManager.ts +541 -0
  126. package/src/chat/server/conversation.ts +269 -0
  127. package/src/chat/server/errorUtils.ts +28 -0
  128. package/src/chat/server/openSession.ts +1332 -0
  129. package/src/chat/server/server.ts +177 -0
  130. package/src/chat/server/sessionFileManager.ts +239 -0
  131. package/src/chat/server/sessionRegistry.test.ts +138 -0
  132. package/src/chat/server/sessionRegistry.ts +1064 -0
  133. package/src/chat/server/test-utils/mockFactories.ts +422 -0
  134. package/src/chat/server/tools.ts +265 -0
  135. package/src/chat/utils/agentSessionMap.ts +76 -0
  136. package/src/chat/utils/approvalManager.ts +111 -0
  137. package/src/{utils → chat/utils}/asyncLock.ts +3 -3
  138. package/src/chat/{asyncQueue.ts → utils/asyncQueue.ts} +14 -3
  139. package/src/chat/utils/htmlToText.ts +61 -0
  140. package/src/chat/utils/multiAsyncQueue.ts +52 -0
  141. package/src/chat/utils/search.ts +139 -0
  142. package/src/chat/utils/userResolver.ts +48 -0
  143. package/src/chat/{websocket.ts → utils/websocket.ts} +2 -0
  144. package/src/test/agent.test.ts +487 -0
  145. package/src/test/approvalManager.test.ts +73 -0
  146. package/src/test/chatContextManager.test.ts +521 -0
  147. package/src/test/clientServerConnection.test.ts +207 -0
  148. package/src/test/compressingContextManager.test.ts +82 -0
  149. package/src/test/context.test.ts +105 -0
  150. package/src/test/conversation.test.ts +109 -0
  151. package/src/test/db.test.ts +351 -103
  152. package/src/test/dbMcpServerConfigs.test.ts +112 -0
  153. package/src/test/dbTestTools.ts +153 -0
  154. package/src/test/imageLoad.test.ts +7 -6
  155. package/src/test/mcpServerManager.test.ts +19 -14
  156. package/src/test/multiAsyncQueue.test.ts +125 -0
  157. package/src/test/openaiStreaming.test.ts +11 -10
  158. package/src/test/prompt.test.ts +4 -3
  159. package/src/test/promptProvider.test.ts +33 -0
  160. package/src/test/responseHandler.test.ts +78 -0
  161. package/src/test/sudoMcpServerManager.test.ts +22 -15
  162. package/src/test/testTools.ts +146 -0
  163. package/src/test/tools.test.ts +39 -0
  164. package/src/tool/agentChat.ts +26 -12
  165. package/src/tool/agentMain.ts +1 -1
  166. package/src/tool/chatMain.ts +283 -100
  167. package/src/tool/commandPrompt.ts +25 -9
  168. package/src/tool/files.ts +25 -19
  169. package/src/tool/nodePlatform.ts +52 -3
  170. package/src/tool/options.ts +4 -2
  171. package/src/tool/prompt.ts +22 -15
  172. package/test_data/dummyllm_script_crash.json +32 -0
  173. package/test_data/frog.png.b64 +1 -0
  174. package/vitest.config.ts +39 -0
  175. package/dist/agent/src/chat/client.js +0 -310
  176. package/dist/agent/src/chat/conversationManager.js +0 -502
  177. package/dist/agent/src/chat/db.js +0 -218
  178. package/dist/agent/src/chat/messages.js +0 -29
  179. package/dist/agent/src/chat/server.js +0 -158
  180. package/src/chat/client.ts +0 -445
  181. package/src/chat/conversationManager.ts +0 -730
  182. package/src/chat/db.ts +0 -304
  183. package/src/chat/messages.ts +0 -266
  184. package/src/chat/server.ts +0 -177
  185. /package/{frog.png → test_data/frog.png} +0 -0
@@ -0,0 +1,682 @@
1
+ import {
2
+ ChatCompletionMessageParam,
3
+ ChatCompletionAssistantMessageParam,
4
+ ChatCompletionToolMessageParam,
5
+ ChatCompletionMessageToolCall,
6
+ } from "openai/resources.mjs";
7
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
8
+
9
+ import {
10
+ AgentPreferences,
11
+ McpServerBrief,
12
+ McpServerConfiguration,
13
+ SavedAgentProfile,
14
+ } from "@xalia/xmcp/sdk";
15
+ import {
16
+ TeamRole,
17
+ SessionData,
18
+ TeamInfo,
19
+ TeamParticipant,
20
+ UserMessageData,
21
+ } from "../data/dataModels";
22
+
23
+ interface ClientToServerBase {
24
+ type: string;
25
+ client_message_id: string; // TODO: hide by putting on ClientToServer?
26
+ }
27
+
28
+ // Session-level messages all have a `session_id`
29
+ interface ClientSessionMessageBase extends ClientToServerBase {
30
+ session_id: string;
31
+ }
32
+
33
+ //
34
+ // Session-management messages
35
+ //
36
+
37
+ export type ClientControlAgentProfileCreate = {
38
+ type: "control_agent_profile_create";
39
+ title: string;
40
+ user_uuid?: string | undefined;
41
+ team_uuid?: string | undefined;
42
+ template_name?: string | undefined;
43
+ };
44
+
45
+ export type ClientControlAgentProfileDelete = {
46
+ type: "control_agent_profile_delete";
47
+ agent_profile_uuid: string;
48
+ };
49
+
50
+ /**
51
+ * Create a new team with initial members.
52
+ * Initial_members doesn't need to include the owner.
53
+ */
54
+ export type ClientControlTeamCreate = {
55
+ type: "control_team_create";
56
+ team_name: string;
57
+ initial_members: Array<string>;
58
+ } & ClientToServerBase;
59
+
60
+ /**
61
+ * Request list of available sessions for the user
62
+ */
63
+ export type ClientControlGetSessionList = {
64
+ type: "control_get_session_list";
65
+ } & ClientToServerBase;
66
+
67
+ /**
68
+ * Create a new session
69
+ */
70
+ export type ClientControlSessionCreate = {
71
+ type: "control_session_create";
72
+ title: string;
73
+ agent_profile_id?: string;
74
+ team_id?: string;
75
+ } & ClientToServerBase;
76
+
77
+ /**
78
+ * Join an existing session
79
+ * Note: Uses target_session_id to avoid conflict with session_id: never
80
+ * from base
81
+ */
82
+ export type ClientControlSessionJoin = {
83
+ type: "control_session_join";
84
+ target_session_id: string;
85
+ } & ClientToServerBase;
86
+
87
+ /**
88
+ * Delete a session
89
+ */
90
+ export type ClientControlSessionDelete = {
91
+ type: "control_session_delete";
92
+ target_session_id: string;
93
+ } & ClientToServerBase;
94
+
95
+ /**
96
+ * Add a user to a team
97
+ */
98
+ export type ClientControlAddTeamUser = {
99
+ type: "control_add_team_user";
100
+ user_uuid_or_email: string;
101
+ target_team_id: string;
102
+ } & ClientToServerBase;
103
+
104
+ /**
105
+ * Remove a user from a team
106
+ */
107
+ export type ClientControlRemoveTeamUser = {
108
+ type: "control_remove_team_user";
109
+ user_uuid_or_email: string;
110
+ target_team_id: string;
111
+ } & ClientToServerBase;
112
+
113
+ export type ClientControlMessage =
114
+ | ClientControlAgentProfileCreate
115
+ | ClientControlAgentProfileDelete
116
+ | ClientControlGetSessionList
117
+ | ClientControlSessionCreate
118
+ | ClientControlSessionJoin
119
+ | ClientControlTeamCreate
120
+ | ClientControlSessionDelete
121
+ | ClientControlAddTeamUser
122
+ | ClientControlRemoveTeamUser;
123
+
124
+ //
125
+ // Messages for specific sessions
126
+ //
127
+
128
+ export type ClientUserMessage = {
129
+ type: "msg";
130
+ } & UserMessageData;
131
+
132
+ export type ClientSetWorkspace = {
133
+ type: "set_workspace";
134
+ } & UserMessageData;
135
+
136
+ export type ClientAddMcpServer = {
137
+ type: "add_mcp_server";
138
+ server_name: string;
139
+ enable_all: boolean;
140
+ };
141
+
142
+ export type ClientRemoveMcpServer = {
143
+ type: "remove_mcp_server";
144
+ server_name: string;
145
+ };
146
+
147
+ export type ClientEnableMcpServerTool = {
148
+ type: "enable_mcp_server_tool";
149
+ server_name: string;
150
+ tool: string;
151
+ };
152
+
153
+ export type ClientDisableMcpServerTool = {
154
+ type: "disable_mcp_server_tool";
155
+ server_name: string;
156
+ tool: string;
157
+ };
158
+
159
+ export type ClientEnableAllMcpServerTools = {
160
+ type: "enable_all_mcp_server_tools";
161
+ server_name: string;
162
+ };
163
+
164
+ export type ClientDisableAllMcpServerTools = {
165
+ type: "disable_all_mcp_server_tools";
166
+ server_name: string;
167
+ };
168
+
169
+ export type ClientToolCallApprovalResult = {
170
+ type: "tool_call_approval_result";
171
+ id: string;
172
+ result: boolean;
173
+ auto_approve: boolean;
174
+ };
175
+
176
+ export type ClientSetAutoApproval = {
177
+ type: "set_auto_approval";
178
+ server_name: string;
179
+ tool: string;
180
+ auto_approve: boolean;
181
+ };
182
+
183
+ export type ClientSetSystemPrompt = {
184
+ type: "set_system_prompt";
185
+ system_prompt: string;
186
+ };
187
+
188
+ export type ClientSetModel = {
189
+ type: "set_model";
190
+ model: string;
191
+ };
192
+
193
+ export type ClientSetMcpServerConfig = {
194
+ type: "set_mcp_server_config";
195
+ server_name: string;
196
+ config?: McpServerConfiguration;
197
+ };
198
+
199
+ export type ClientSessionMessageData =
200
+ | ClientUserMessage
201
+ | ClientSetWorkspace
202
+ | ClientAddMcpServer
203
+ | ClientRemoveMcpServer
204
+ | ClientEnableMcpServerTool
205
+ | ClientDisableMcpServerTool
206
+ | ClientEnableAllMcpServerTools
207
+ | ClientDisableAllMcpServerTools
208
+ | ClientToolCallApprovalResult
209
+ | ClientSetAutoApproval
210
+ | ClientSetSystemPrompt
211
+ | ClientSetModel
212
+ | ClientSetMcpServerConfig;
213
+
214
+ export type ClientSessionMessage = ClientSessionMessageBase &
215
+ ClientSessionMessageData;
216
+
217
+ //
218
+ // Client Message Union Types
219
+ //
220
+
221
+ export type ClientToServer = ClientControlMessage | ClientSessionMessage;
222
+
223
+ export function isClientControlMessage(
224
+ message: ClientToServer
225
+ ): message is ClientControlMessage {
226
+ const msg = message as ClientControlMessage;
227
+ switch (msg.type) {
228
+ case "control_agent_profile_create":
229
+ case "control_agent_profile_delete":
230
+ case "control_get_session_list":
231
+ case "control_session_create":
232
+ case "control_session_delete":
233
+ case "control_session_join":
234
+ case "control_team_create":
235
+ case "control_add_team_user":
236
+ case "control_remove_team_user":
237
+ return true;
238
+ default: {
239
+ const _: never = msg;
240
+ return false;
241
+ }
242
+ }
243
+ }
244
+
245
+ // TODO: factor this as above
246
+
247
+ /**
248
+ * Base interface for messages from server to client scoped to a session
249
+ */
250
+ interface ServerSessionMessage {
251
+ session_id: string;
252
+ }
253
+
254
+ /**
255
+ * Base interface for connection-level server responses needing correlation
256
+ */
257
+ interface ControlResponseMessage {
258
+ client_message_id: string; // Echo back client's message ID for correlation
259
+ }
260
+
261
+ ///
262
+ /// Server -> Client Messages
263
+ ///
264
+
265
+ /**
266
+ * Error in response to an invalid request from the client
267
+ * with a sesion scoped.
268
+ */
269
+ export type ServerSessionError = {
270
+ type: "session_error";
271
+ message: string;
272
+ client_message_id?: string;
273
+ } & ServerSessionMessage;
274
+
275
+ /**
276
+ * Session info can be requested normally, or when the client is
277
+ * joining a session or creating a new session.
278
+ */
279
+ export type ServerSessionInfo = {
280
+ type: "session_info";
281
+ owner_uuid: string;
282
+ title: string;
283
+ saved_agent_profile: SavedAgentProfile;
284
+ workspace: UserMessageData | undefined;
285
+ updated_at: string;
286
+ participants: TeamParticipant[];
287
+ mcp_server_briefs: McpServerBrief[];
288
+ agent_preferences: AgentPreferences;
289
+ client_message_id: string;
290
+ team_uuid: string | undefined;
291
+ } & ServerSessionMessage;
292
+
293
+ /**
294
+ * (from server) Chat history
295
+ */
296
+ export type ServerHistory = {
297
+ type: "history";
298
+ /// Conversation history in the form we expect. The `name` attribute of
299
+ /// `ChatCompletionUserMessageParam` (role: "user") holds the original
300
+ /// message sender.
301
+ messages: ChatCompletionMessageParam[];
302
+ } & ServerSessionMessage;
303
+
304
+ /**
305
+ * Message from the server, informing us of a message in the chat history
306
+ */
307
+ export type ServerUserMessage = {
308
+ type: "user_msg";
309
+ user_uuid: string;
310
+ message_idx: number;
311
+ } & UserMessageData &
312
+ ServerSessionMessage;
313
+
314
+ export type ServerAgentMessage = {
315
+ type: "agent_msg";
316
+ message: ChatCompletionAssistantMessageParam;
317
+ message_idx: number;
318
+ } & ServerSessionMessage;
319
+
320
+ export type ServerAgentMessageChunk = {
321
+ type: "agent_msg_chunk";
322
+ message: string;
323
+ message_idx: number;
324
+ end: boolean;
325
+ } & ServerSessionMessage;
326
+
327
+ //
328
+ // Notifications
329
+ ///
330
+
331
+ export type ServerUserJoined = {
332
+ type: "user_joined";
333
+ user_uuid: string;
334
+ user_name: string;
335
+ } & ServerSessionMessage;
336
+
337
+ export type ServerUserLeft = {
338
+ type: "user_left";
339
+ user_uuid: string;
340
+ } & ServerSessionMessage;
341
+
342
+ export type ServerSessionUpdate = {
343
+ type: "session_update";
344
+ title?: string;
345
+ participants?: TeamParticipant[];
346
+ } & ServerSessionMessage;
347
+
348
+ // Note: ChatCompletionMessageToolCall contains the tool call id so we don't
349
+ // need an extra id field.
350
+ export type ServerToolCall = {
351
+ type: "tool_call";
352
+ tool_call: ChatCompletionMessageToolCall;
353
+ } & ServerSessionMessage;
354
+
355
+ export type ServerToolCallApprovalResult = {
356
+ type: "tool_call_approval_result";
357
+ id: string;
358
+ result: boolean;
359
+ } & ServerSessionMessage;
360
+
361
+ export type ServerToolCallResult = {
362
+ type: "tool_call_result";
363
+ message_idx: number;
364
+ result: ChatCompletionToolMessageParam;
365
+ } & ServerSessionMessage;
366
+
367
+ export type ServerToolAutoApprovalSet = {
368
+ type: "tool_auto_approval_set";
369
+ server_name: string;
370
+ tool: string;
371
+ auto_approve: boolean;
372
+ } & ServerSessionMessage;
373
+
374
+ // TODO: include mcp server name
375
+
376
+ export type ServerAuthenticationStarted = {
377
+ type: "authentication_started";
378
+ url: string;
379
+ } & ServerSessionMessage;
380
+
381
+ // TODO: include richer results (success/failure/timeout)
382
+
383
+ export type ServerAuthenticationFinished = {
384
+ type: "authentication_finished";
385
+ url: string;
386
+ result: boolean;
387
+ } & ServerSessionMessage;
388
+
389
+ export type ServerUserTyping = {
390
+ type: "user_typing";
391
+ user_uuid: string;
392
+ } & ServerSessionMessage;
393
+
394
+ export type ServerToClientNotifications =
395
+ | ServerUserJoined
396
+ | ServerUserLeft
397
+ | ServerSessionUpdate
398
+ | ServerToolAutoApprovalSet
399
+ | ServerToolCall
400
+ | ServerToolCallApprovalResult
401
+ | ServerToolCallResult
402
+ | ServerAuthenticationStarted
403
+ | ServerAuthenticationFinished
404
+ | ServerUserTyping;
405
+
406
+ //
407
+ // state updates
408
+ //
409
+
410
+ /**
411
+ * A new team has been created.
412
+ * The members array contains the members of the team.
413
+ * The members array contains undefined for failed lookups.
414
+ */
415
+ export type ServerMcpServerAdded = {
416
+ type: "mcp_server_added";
417
+ server_name: string;
418
+ tools: Tool[];
419
+ enabled_tools: string[];
420
+ } & ServerSessionMessage;
421
+
422
+ export type ServerMcpServerRemoved = {
423
+ type: "mcp_server_removed";
424
+ server_name: string;
425
+ } & ServerSessionMessage;
426
+
427
+ export type ServerMcpServerToolEnabled = {
428
+ type: "mcp_server_tool_enabled";
429
+ server_name: string;
430
+ tool: string;
431
+ } & ServerSessionMessage;
432
+
433
+ export type ServerMcpServerToolDisabled = {
434
+ type: "mcp_server_tool_disabled";
435
+ server_name: string;
436
+ tool: string;
437
+ } & ServerSessionMessage;
438
+
439
+ export type ServerSystemPromptUpdated = {
440
+ type: "system_prompt_updated";
441
+ system_prompt: string;
442
+ } & ServerSessionMessage;
443
+
444
+ export type ServerModelUpdated = {
445
+ type: "model_updated";
446
+ model: string;
447
+ } & ServerSessionMessage;
448
+
449
+ export type ServerUserAdded = {
450
+ type: "user_added";
451
+ user_uuid: string;
452
+ nickname: string;
453
+ email: string;
454
+ role: TeamRole;
455
+ } & ServerSessionMessage;
456
+
457
+ export type ServerUserRemoved = {
458
+ type: "user_removed";
459
+ user_uuid: string;
460
+ } & ServerSessionMessage;
461
+
462
+ export type ServerToClientStateUpdate =
463
+ | ServerMcpServerAdded
464
+ | ServerMcpServerRemoved
465
+ | ServerMcpServerToolEnabled
466
+ | ServerMcpServerToolDisabled
467
+ | ServerSystemPromptUpdated
468
+ | ServerModelUpdated
469
+ | ServerUserAdded
470
+ | ServerUserRemoved;
471
+
472
+ //
473
+ // actions
474
+ //
475
+
476
+ export type ServerAuthenticate = {
477
+ type: "authenticate";
478
+ url: string;
479
+ display_name: string;
480
+ } & ServerSessionMessage;
481
+
482
+ export type ServerApproveToolCall = {
483
+ type: "approve_tool_call";
484
+ id: string;
485
+ tool_call: ChatCompletionMessageToolCall;
486
+ } & ServerSessionMessage;
487
+
488
+ export type ServerRenderHTML = {
489
+ type: "render_html";
490
+ html: string;
491
+ } & ServerSessionMessage;
492
+
493
+ export type ServerToClientActions =
494
+ | ServerAuthenticate
495
+ | ServerApproveToolCall
496
+ | ServerRenderHTML;
497
+
498
+ //
499
+ // Control-level messages (session management)
500
+ //
501
+
502
+ export type ServerControlAgentProfileCreated = {
503
+ type: "control_agent_profile_created";
504
+ profile: SavedAgentProfile;
505
+ };
506
+
507
+ export type ServerControlAgentProfileDeleted = {
508
+ type: "control_agent_profile_deleted";
509
+ profile_uuid: string;
510
+ };
511
+
512
+ /**
513
+ * A new team has been created.
514
+ * The members array contains the members of the team.
515
+ * The members array contains undefined for failed lookups.
516
+ */
517
+ export type ServerControlTeamCreated = {
518
+ type: "control_team_created";
519
+ team_uuid: string;
520
+ team_owner_uuid: string;
521
+ team_name: string;
522
+ members: Array<TeamParticipant>;
523
+ failed_lookups: Array<string>;
524
+ };
525
+
526
+ /**
527
+ * List of available sessions for user
528
+ */
529
+ export type ServerControlSessionList = {
530
+ type: "control_session_list";
531
+ user_sessions: Array<SessionData>;
532
+ user_agents: Array<SavedAgentProfile>;
533
+ team_sessions: Array<TeamInfo>;
534
+ } & ControlResponseMessage;
535
+
536
+ /**
537
+ * Confirmation of session leave, for example,
538
+ * a user is kicked from a session.
539
+ */
540
+ export type ServerControlSessionLeft = {
541
+ type: "control_session_left";
542
+ session_id: string;
543
+ } & ControlResponseMessage;
544
+
545
+ /**
546
+ * Confirmation of session delete.
547
+ */
548
+ export type ServerControlSessionDeleted = {
549
+ type: "control_session_deleted";
550
+ session_id: string;
551
+ agent_profile_uuid: string;
552
+ team_uuid?: string;
553
+ } & ControlResponseMessage;
554
+
555
+ /**
556
+ * Connection-level errors
557
+ * Error in response to an invalid request from the client
558
+ * with a connection scoped.
559
+ */
560
+ export type ServerControlError = {
561
+ type: "control_error";
562
+ message: string;
563
+ client_message_id?: string;
564
+ };
565
+
566
+ export type ServerControlMessage =
567
+ | ServerControlSessionList
568
+ | ServerControlSessionLeft
569
+ | ServerControlSessionDeleted
570
+ | ServerControlAgentProfileCreated
571
+ | ServerControlAgentProfileDeleted
572
+ | ServerControlTeamCreated
573
+ | ServerControlError;
574
+
575
+ export type ServerSessionScopedMessage =
576
+ | ServerSessionError
577
+ | ServerSessionInfo
578
+ | ServerUserMessage
579
+ | ServerAgentMessage
580
+ | ServerAgentMessageChunk
581
+ | ServerToClientNotifications
582
+ | ServerToClientStateUpdate
583
+ | ServerToClientActions;
584
+
585
+ export type ServerToClient = ServerControlMessage | ServerSessionScopedMessage;
586
+
587
+ //
588
+ // Type guard helper functions
589
+ //
590
+
591
+ export function isServerControlMessage(
592
+ message: ServerToClient
593
+ ): message is ServerControlMessage {
594
+ const msg = message as ServerControlMessage;
595
+ switch (msg.type) {
596
+ case "control_agent_profile_created":
597
+ case "control_agent_profile_deleted":
598
+ case "control_session_list":
599
+ case "control_session_left":
600
+ case "control_session_deleted":
601
+ case "control_team_created":
602
+ case "control_error":
603
+ return true;
604
+ default: {
605
+ const _: never = msg;
606
+ return false;
607
+ }
608
+ }
609
+ }
610
+
611
+ /**
612
+ * Type guard to check if a ServerToClient message is a session-scoped message
613
+ */
614
+ export function isServerSessionScopedMessage(
615
+ message: ServerToClient
616
+ ): message is ServerSessionScopedMessage {
617
+ const msg = message as ServerSessionScopedMessage;
618
+ switch (msg.type) {
619
+ case "session_error":
620
+ case "session_info":
621
+ case "user_msg":
622
+ case "agent_msg":
623
+ case "agent_msg_chunk":
624
+ case "user_joined":
625
+ case "user_left":
626
+ case "session_update":
627
+ case "tool_auto_approval_set":
628
+ case "tool_call":
629
+ case "tool_call_approval_result":
630
+ case "tool_call_result":
631
+ case "authentication_started":
632
+ case "authentication_finished":
633
+ case "user_typing":
634
+ case "mcp_server_added":
635
+ case "mcp_server_removed":
636
+ case "mcp_server_tool_enabled":
637
+ case "mcp_server_tool_disabled":
638
+ case "system_prompt_updated":
639
+ case "model_updated":
640
+ case "user_added":
641
+ case "user_removed":
642
+ case "authenticate":
643
+ case "approve_tool_call":
644
+ case "render_html":
645
+ return true;
646
+ default: {
647
+ const _: never = msg;
648
+ return false;
649
+ }
650
+ }
651
+ }
652
+
653
+ export function decodeAssistantMessageParam(
654
+ msg: ChatCompletionAssistantMessageParam
655
+ ): string {
656
+ let text = "";
657
+
658
+ if (msg.audio) {
659
+ throw new Error("decodeAssistantMessageParam; audio unimplemented");
660
+ }
661
+
662
+ if (msg.content) {
663
+ if (typeof msg.content === "string") {
664
+ text = msg.content;
665
+ } else if (msg.content instanceof Array) {
666
+ for (const c of msg.content) {
667
+ switch (c.type) {
668
+ case "text":
669
+ text += c.text;
670
+ break;
671
+ case "refusal":
672
+ text += c.refusal;
673
+ break;
674
+ default:
675
+ throw Error("unexpected AssistantMessageParam.content entry");
676
+ }
677
+ }
678
+ }
679
+ }
680
+
681
+ return text;
682
+ }