@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.
- package/README.md +23 -8
- package/dist/agent/src/agent/agent.js +173 -96
- package/dist/agent/src/agent/agentUtils.js +82 -53
- package/dist/agent/src/agent/compressingContextManager.js +102 -0
- package/dist/agent/src/agent/context.js +189 -0
- package/dist/agent/src/agent/dummyLLM.js +46 -5
- package/dist/agent/src/agent/iAgentEventHandler.js +2 -0
- package/dist/agent/src/agent/mcpServerManager.js +22 -23
- package/dist/agent/src/agent/nullAgentEventHandler.js +21 -0
- package/dist/agent/src/agent/nullPlatform.js +14 -0
- package/dist/agent/src/agent/openAILLMStreaming.js +12 -7
- package/dist/agent/src/agent/promptProvider.js +63 -0
- package/dist/agent/src/agent/repeatLLM.js +5 -5
- package/dist/agent/src/agent/sudoMcpServerManager.js +11 -9
- package/dist/agent/src/agent/tokenAuth.js +7 -7
- package/dist/agent/src/agent/tools.js +1 -1
- package/dist/agent/src/chat/client/chatClient.js +733 -0
- package/dist/agent/src/chat/client/connection.js +209 -0
- package/dist/agent/src/chat/client/connection.test.js +188 -0
- package/dist/agent/src/chat/client/constants.js +5 -0
- package/dist/agent/src/chat/client/index.js +15 -0
- package/dist/agent/src/chat/client/interfaces.js +2 -0
- package/dist/agent/src/chat/client/responseHandler.js +105 -0
- package/dist/agent/src/chat/client/sessionClient.js +331 -0
- package/dist/agent/src/chat/client/teamManager.js +2 -0
- package/dist/agent/src/chat/{apiKeyManager.js → data/apiKeyManager.js} +4 -0
- package/dist/agent/src/chat/data/dataModels.js +2 -0
- package/dist/agent/src/chat/data/database.js +749 -0
- package/dist/agent/src/chat/data/dbMcpServerConfigs.js +47 -0
- package/dist/agent/src/chat/protocol/connectionMessages.js +5 -0
- package/dist/agent/src/chat/protocol/constants.js +50 -0
- package/dist/agent/src/chat/protocol/errors.js +22 -0
- package/dist/agent/src/chat/protocol/messages.js +110 -0
- package/dist/agent/src/chat/server/chatContextManager.js +405 -0
- package/dist/agent/src/chat/server/connectionManager.js +352 -0
- package/dist/agent/src/chat/server/connectionManager.test.js +159 -0
- package/dist/agent/src/chat/server/conversation.js +198 -0
- package/dist/agent/src/chat/server/errorUtils.js +23 -0
- package/dist/agent/src/chat/server/openSession.js +869 -0
- package/dist/agent/src/chat/server/server.js +177 -0
- package/dist/agent/src/chat/server/sessionFileManager.js +161 -0
- package/dist/agent/src/chat/server/sessionRegistry.js +700 -0
- package/dist/agent/src/chat/server/sessionRegistry.test.js +97 -0
- package/dist/agent/src/chat/server/test-utils/mockFactories.js +307 -0
- package/dist/agent/src/chat/server/tools.js +243 -0
- package/dist/agent/src/chat/utils/agentSessionMap.js +66 -0
- package/dist/agent/src/chat/utils/approvalManager.js +85 -0
- package/dist/agent/src/{utils → chat/utils}/asyncLock.js +3 -3
- package/dist/agent/src/chat/{asyncQueue.js → utils/asyncQueue.js} +12 -2
- package/dist/agent/src/chat/utils/htmlToText.js +84 -0
- package/dist/agent/src/chat/utils/multiAsyncQueue.js +42 -0
- package/dist/agent/src/chat/utils/search.js +145 -0
- package/dist/agent/src/chat/utils/userResolver.js +46 -0
- package/dist/agent/src/chat/{websocket.js → utils/websocket.js} +2 -0
- package/dist/agent/src/test/agent.test.js +332 -0
- package/dist/agent/src/test/approvalManager.test.js +58 -0
- package/dist/agent/src/test/chatContextManager.test.js +392 -0
- package/dist/agent/src/test/clientServerConnection.test.js +158 -0
- package/dist/agent/src/test/compressingContextManager.test.js +65 -0
- package/dist/agent/src/test/context.test.js +83 -0
- package/dist/agent/src/test/conversation.test.js +89 -0
- package/dist/agent/src/test/db.test.js +262 -90
- package/dist/agent/src/test/dbMcpServerConfigs.test.js +72 -0
- package/dist/agent/src/test/dbTestTools.js +99 -0
- package/dist/agent/src/test/imageLoad.test.js +8 -7
- package/dist/agent/src/test/mcpServerManager.test.js +21 -18
- package/dist/agent/src/test/multiAsyncQueue.test.js +101 -0
- package/dist/agent/src/test/openaiStreaming.test.js +12 -11
- package/dist/agent/src/test/prompt.test.js +5 -4
- package/dist/agent/src/test/promptProvider.test.js +28 -0
- package/dist/agent/src/test/responseHandler.test.js +61 -0
- package/dist/agent/src/test/sudoMcpServerManager.test.js +14 -12
- package/dist/agent/src/test/testTools.js +109 -0
- package/dist/agent/src/test/tools.test.js +31 -0
- package/dist/agent/src/tool/agentChat.js +21 -10
- package/dist/agent/src/tool/agentMain.js +1 -1
- package/dist/agent/src/tool/chatMain.js +235 -58
- package/dist/agent/src/tool/commandPrompt.js +15 -9
- package/dist/agent/src/tool/files.js +20 -16
- package/dist/agent/src/tool/nodePlatform.js +47 -3
- package/dist/agent/src/tool/options.js +4 -4
- package/dist/agent/src/tool/prompt.js +19 -13
- package/eslint.config.mjs +14 -1
- package/package.json +14 -6
- package/scripts/chat_server +8 -0
- package/scripts/setup_chat +7 -2
- package/scripts/shutdown_chat_server +3 -0
- package/scripts/test_chat +135 -17
- package/src/agent/agent.ts +270 -135
- package/src/agent/agentUtils.ts +136 -95
- package/src/agent/compressingContextManager.ts +164 -0
- package/src/agent/context.ts +268 -0
- package/src/agent/dummyLLM.ts +76 -8
- package/src/agent/iAgentEventHandler.ts +54 -0
- package/src/agent/iplatform.ts +1 -0
- package/src/agent/mcpServerManager.ts +32 -30
- package/src/agent/nullAgentEventHandler.ts +20 -0
- package/src/agent/nullPlatform.ts +13 -0
- package/src/agent/openAILLMStreaming.ts +12 -6
- package/src/agent/promptProvider.ts +87 -0
- package/src/agent/repeatLLM.ts +5 -5
- package/src/agent/sudoMcpServerManager.ts +13 -11
- package/src/agent/tokenAuth.ts +7 -7
- package/src/agent/tools.ts +3 -1
- package/src/chat/client/chatClient.ts +900 -0
- package/src/chat/client/connection.test.ts +241 -0
- package/src/chat/client/connection.ts +276 -0
- package/src/chat/client/constants.ts +3 -0
- package/src/chat/client/index.ts +18 -0
- package/src/chat/client/interfaces.ts +34 -0
- package/src/chat/client/responseHandler.ts +131 -0
- package/src/chat/client/sessionClient.ts +443 -0
- package/src/chat/client/teamManager.ts +29 -0
- package/src/chat/{apiKeyManager.ts → data/apiKeyManager.ts} +6 -2
- package/src/chat/data/dataModels.ts +85 -0
- package/src/chat/data/database.ts +982 -0
- package/src/chat/data/dbMcpServerConfigs.ts +59 -0
- package/src/chat/protocol/connectionMessages.ts +49 -0
- package/src/chat/protocol/constants.ts +55 -0
- package/src/chat/protocol/errors.ts +16 -0
- package/src/chat/protocol/messages.ts +682 -0
- package/src/chat/server/README.md +127 -0
- package/src/chat/server/chatContextManager.ts +612 -0
- package/src/chat/server/connectionManager.test.ts +266 -0
- package/src/chat/server/connectionManager.ts +541 -0
- package/src/chat/server/conversation.ts +269 -0
- package/src/chat/server/errorUtils.ts +28 -0
- package/src/chat/server/openSession.ts +1332 -0
- package/src/chat/server/server.ts +177 -0
- package/src/chat/server/sessionFileManager.ts +239 -0
- package/src/chat/server/sessionRegistry.test.ts +138 -0
- package/src/chat/server/sessionRegistry.ts +1064 -0
- package/src/chat/server/test-utils/mockFactories.ts +422 -0
- package/src/chat/server/tools.ts +265 -0
- package/src/chat/utils/agentSessionMap.ts +76 -0
- package/src/chat/utils/approvalManager.ts +111 -0
- package/src/{utils → chat/utils}/asyncLock.ts +3 -3
- package/src/chat/{asyncQueue.ts → utils/asyncQueue.ts} +14 -3
- package/src/chat/utils/htmlToText.ts +61 -0
- package/src/chat/utils/multiAsyncQueue.ts +52 -0
- package/src/chat/utils/search.ts +139 -0
- package/src/chat/utils/userResolver.ts +48 -0
- package/src/chat/{websocket.ts → utils/websocket.ts} +2 -0
- package/src/test/agent.test.ts +487 -0
- package/src/test/approvalManager.test.ts +73 -0
- package/src/test/chatContextManager.test.ts +521 -0
- package/src/test/clientServerConnection.test.ts +207 -0
- package/src/test/compressingContextManager.test.ts +82 -0
- package/src/test/context.test.ts +105 -0
- package/src/test/conversation.test.ts +109 -0
- package/src/test/db.test.ts +351 -103
- package/src/test/dbMcpServerConfigs.test.ts +112 -0
- package/src/test/dbTestTools.ts +153 -0
- package/src/test/imageLoad.test.ts +7 -6
- package/src/test/mcpServerManager.test.ts +19 -14
- package/src/test/multiAsyncQueue.test.ts +125 -0
- package/src/test/openaiStreaming.test.ts +11 -10
- package/src/test/prompt.test.ts +4 -3
- package/src/test/promptProvider.test.ts +33 -0
- package/src/test/responseHandler.test.ts +78 -0
- package/src/test/sudoMcpServerManager.test.ts +22 -15
- package/src/test/testTools.ts +146 -0
- package/src/test/tools.test.ts +39 -0
- package/src/tool/agentChat.ts +26 -12
- package/src/tool/agentMain.ts +1 -1
- package/src/tool/chatMain.ts +283 -100
- package/src/tool/commandPrompt.ts +25 -9
- package/src/tool/files.ts +25 -19
- package/src/tool/nodePlatform.ts +52 -3
- package/src/tool/options.ts +4 -2
- package/src/tool/prompt.ts +22 -15
- package/test_data/dummyllm_script_crash.json +32 -0
- package/test_data/frog.png.b64 +1 -0
- package/vitest.config.ts +39 -0
- package/dist/agent/src/chat/client.js +0 -310
- package/dist/agent/src/chat/conversationManager.js +0 -502
- package/dist/agent/src/chat/db.js +0 -218
- package/dist/agent/src/chat/messages.js +0 -29
- package/dist/agent/src/chat/server.js +0 -158
- package/src/chat/client.ts +0 -445
- package/src/chat/conversationManager.ts +0 -730
- package/src/chat/db.ts +0 -304
- package/src/chat/messages.ts +0 -266
- package/src/chat/server.ts +0 -177
- /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
|
+
}
|