@xalia/agent 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -8
- package/dist/agent/src/agent/agent.js +176 -96
- package/dist/agent/src/agent/agentUtils.js +82 -59
- 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/mcpServerManager.js +23 -24
- 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 +26 -14
- 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 +23 -21
- 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/utils/websocket.js +16 -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 +271 -83
- 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 +23 -20
- package/dist/agent/src/test/multiAsyncQueue.test.js +101 -0
- package/dist/agent/src/test/openaiStreaming.test.js +64 -35
- 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 +24 -25
- 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 +241 -58
- package/dist/agent/src/tool/commandPrompt.js +22 -17
- 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 +283 -138
- package/src/agent/agentUtils.ts +143 -108
- 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 +35 -31
- package/src/agent/nullAgentEventHandler.ts +20 -0
- package/src/agent/nullPlatform.ts +13 -0
- package/src/agent/openAILLMStreaming.ts +26 -13
- package/src/agent/promptProvider.ts +87 -0
- package/src/agent/repeatLLM.ts +5 -5
- package/src/agent/sudoMcpServerManager.ts +30 -29
- 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/utils/websocket.ts +16 -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 +358 -89
- 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 +21 -16
- package/src/test/multiAsyncQueue.test.ts +125 -0
- package/src/test/openaiStreaming.test.ts +71 -36
- 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 +32 -30
- 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 +292 -100
- package/src/tool/commandPrompt.ts +28 -19
- 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 -349
- package/dist/agent/src/chat/conversationManager.js +0 -392
- package/dist/agent/src/chat/db.js +0 -209
- package/dist/agent/src/chat/frontendClient.js +0 -74
- package/dist/agent/src/chat/server.js +0 -158
- package/src/chat/client.ts +0 -455
- package/src/chat/conversationManager.ts +0 -595
- package/src/chat/db.ts +0 -290
- package/src/chat/frontendClient.ts +0 -123
- package/src/chat/messages.ts +0 -235
- package/src/chat/server.ts +0 -177
- /package/dist/agent/src/{chat/messages.js → agent/iAgentEventHandler.js} +0 -0
- /package/{frog.png → test_data/frog.png} +0 -0
package/src/chat/server.ts
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// -*- typescript -*-
|
|
3
|
-
|
|
4
|
-
import type * as supabase from "../../../supabase/database.types";
|
|
5
|
-
import * as dotenv from "dotenv";
|
|
6
|
-
import { getLogger } from "@xalia/xmcp/sdk";
|
|
7
|
-
import * as ws from "ws";
|
|
8
|
-
import { IncomingMessage } from "http";
|
|
9
|
-
import { parse } from "url";
|
|
10
|
-
import { ConversationManager } from "./conversationManager";
|
|
11
|
-
import { Database, UserData, resolveCompoundName } from "./db";
|
|
12
|
-
import { ApiKeyManager } from "./apiKeyManager";
|
|
13
|
-
import { ParsedUrlQuery } from "querystring";
|
|
14
|
-
|
|
15
|
-
dotenv.config();
|
|
16
|
-
|
|
17
|
-
const logger = getLogger();
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Try as id, then by user/name and return the AgentProfile uuid.
|
|
21
|
-
*/
|
|
22
|
-
async function resolveAgentProfileId(
|
|
23
|
-
db: Database,
|
|
24
|
-
userData: UserData,
|
|
25
|
-
agentProfileIdentifier: string
|
|
26
|
-
): Promise<string | undefined> {
|
|
27
|
-
let ap = await db.getSavedAgentProfileById(agentProfileIdentifier);
|
|
28
|
-
logger.debug(`[resolveAgentProfileId]: by id: {JSON.stringify(ap)}`);
|
|
29
|
-
if (ap) {
|
|
30
|
-
return agentProfileIdentifier;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
ap = await db.getSavedAgentProfileByName(
|
|
34
|
-
userData.uuid,
|
|
35
|
-
agentProfileIdentifier
|
|
36
|
-
);
|
|
37
|
-
logger.debug(`[resolveAgentProfileId]: by name: {JSON.stringify(ap)}`);
|
|
38
|
-
if (ap) {
|
|
39
|
-
return ap.uuid;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
logger.debug("[resolveAgentProfileId]: agent profile not found");
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async function resolveSessionIdFromIdentifier(
|
|
47
|
-
db: Database,
|
|
48
|
-
userData: UserData,
|
|
49
|
-
sessionIdentifier: string
|
|
50
|
-
): Promise<string | undefined> {
|
|
51
|
-
let session: supabase.Tables<"sessions"> | undefined = undefined;
|
|
52
|
-
const compound = resolveCompoundName(sessionIdentifier);
|
|
53
|
-
if (typeof compound === "string") {
|
|
54
|
-
// Interpret as an id, or as a number under the current user.
|
|
55
|
-
session = await db.getSessionById(compound);
|
|
56
|
-
if (!session) {
|
|
57
|
-
session = await db.getSessionByName(userData.uuid, compound);
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
session = await db.getSessionByName(compound[0], compound[1]);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return session?.uuid;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Expect parameters to be either:
|
|
68
|
-
* session_id - uuid, name, user/name
|
|
69
|
-
* agent_profile_id (optional) - uuid, name
|
|
70
|
-
*
|
|
71
|
-
* If session_idd resolves to an existing session, it is used (and
|
|
72
|
-
* agent_profile_id is ignored). Otherwise, session_id is used as the name of
|
|
73
|
-
* a new session to create using `agent_profile_id`. The session UUID is
|
|
74
|
-
* returned in either case.
|
|
75
|
-
*/
|
|
76
|
-
async function findOrCreateSession(
|
|
77
|
-
db: Database,
|
|
78
|
-
userData: UserData,
|
|
79
|
-
query: ParsedUrlQuery
|
|
80
|
-
): Promise<string | undefined> {
|
|
81
|
-
logger.debug(`[findOrCreateSession]: query: ${JSON.stringify(query)}`);
|
|
82
|
-
if (!query.session_id || typeof query.session_id !== "string") {
|
|
83
|
-
throw "session_id invalid or not present";
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const sessionId = await resolveSessionIdFromIdentifier(
|
|
87
|
-
db,
|
|
88
|
-
userData,
|
|
89
|
-
query.session_id
|
|
90
|
-
);
|
|
91
|
-
if (sessionId) {
|
|
92
|
-
return sessionId;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const agentProfileIdParam = query.agent_profile_id;
|
|
96
|
-
logger.debug(`[findOrCreateSession]: agent: ${agentProfileIdParam}`);
|
|
97
|
-
if (!agentProfileIdParam) {
|
|
98
|
-
throw "no existing session, and no agent_profile_id given";
|
|
99
|
-
}
|
|
100
|
-
if (typeof agentProfileIdParam !== "string") {
|
|
101
|
-
throw "no existing session and invalid agent_profile_id";
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
logger.debug(`[findOrCreateSession]: creating session: ${query.session_id}`);
|
|
105
|
-
const agentProfileId = await resolveAgentProfileId(
|
|
106
|
-
db,
|
|
107
|
-
userData,
|
|
108
|
-
agentProfileIdParam
|
|
109
|
-
);
|
|
110
|
-
logger.debug(
|
|
111
|
-
`[findOrCreateSession]: resolved agentProfileId: ${agentProfileId}`
|
|
112
|
-
);
|
|
113
|
-
if (!agentProfileId) {
|
|
114
|
-
throw `no agent profile: ${agentProfileIdParam}`;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return db.createSession(userData.uuid, query.session_id, agentProfileId);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export async function runServer(
|
|
121
|
-
port: number,
|
|
122
|
-
supabaseUrl: string,
|
|
123
|
-
supabaseKey: string,
|
|
124
|
-
llmUrl: string,
|
|
125
|
-
xmcpUrl: string
|
|
126
|
-
): Promise<ws.Server> {
|
|
127
|
-
return new Promise((r, _e) => {
|
|
128
|
-
const wss = new ws.Server({ port });
|
|
129
|
-
const db = new Database(supabaseUrl, supabaseKey);
|
|
130
|
-
const apiKeyManager = new ApiKeyManager(db);
|
|
131
|
-
const cm = new ConversationManager(db, llmUrl, xmcpUrl);
|
|
132
|
-
|
|
133
|
-
wss.on("connection", async (ws: ws.WebSocket, req: IncomingMessage) => {
|
|
134
|
-
try {
|
|
135
|
-
logger.info(`[server] connection: ${req}`);
|
|
136
|
-
|
|
137
|
-
// Check header
|
|
138
|
-
|
|
139
|
-
logger.info(`[server] headers: ${JSON.stringify(req.headers)}`);
|
|
140
|
-
const apiKey = req.headers["sec-websocket-protocol"];
|
|
141
|
-
if (!apiKey) {
|
|
142
|
-
throw "empty api key";
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const userData = await apiKeyManager.verifyApiKey(apiKey);
|
|
146
|
-
if (!userData) {
|
|
147
|
-
throw "invalid api key";
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Get sessionId
|
|
151
|
-
|
|
152
|
-
const { query } = parse(req.url || "", true);
|
|
153
|
-
const sessionId = await findOrCreateSession(db, userData, query);
|
|
154
|
-
logger.debug(`resolved session id: ${sessionId}`);
|
|
155
|
-
if (!sessionId) {
|
|
156
|
-
throw "failed to find/create session";
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Associate the ws, username with the conversation
|
|
160
|
-
|
|
161
|
-
await cm.join(sessionId, apiKey, apiKey, userData, ws);
|
|
162
|
-
} catch (e) {
|
|
163
|
-
if (typeof e === "string") {
|
|
164
|
-
logger.warn(`[server]: error: ${e}`);
|
|
165
|
-
ws.close(4000, e);
|
|
166
|
-
} else {
|
|
167
|
-
logger.error(`other error: ${JSON.stringify(e)}`);
|
|
168
|
-
throw e;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
logger.info(`[server] started: ws://localhost:${port}/`);
|
|
174
|
-
|
|
175
|
-
r(wss);
|
|
176
|
-
});
|
|
177
|
-
}
|
|
File without changes
|
|
File without changes
|