@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.
Files changed (186) hide show
  1. package/README.md +23 -8
  2. package/dist/agent/src/agent/agent.js +176 -96
  3. package/dist/agent/src/agent/agentUtils.js +82 -59
  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/mcpServerManager.js +23 -24
  8. package/dist/agent/src/agent/nullAgentEventHandler.js +21 -0
  9. package/dist/agent/src/agent/nullPlatform.js +14 -0
  10. package/dist/agent/src/agent/openAILLMStreaming.js +26 -14
  11. package/dist/agent/src/agent/promptProvider.js +63 -0
  12. package/dist/agent/src/agent/repeatLLM.js +5 -5
  13. package/dist/agent/src/agent/sudoMcpServerManager.js +23 -21
  14. package/dist/agent/src/agent/tokenAuth.js +7 -7
  15. package/dist/agent/src/agent/tools.js +1 -1
  16. package/dist/agent/src/chat/client/chatClient.js +733 -0
  17. package/dist/agent/src/chat/client/connection.js +209 -0
  18. package/dist/agent/src/chat/client/connection.test.js +188 -0
  19. package/dist/agent/src/chat/client/constants.js +5 -0
  20. package/dist/agent/src/chat/client/index.js +15 -0
  21. package/dist/agent/src/chat/client/interfaces.js +2 -0
  22. package/dist/agent/src/chat/client/responseHandler.js +105 -0
  23. package/dist/agent/src/chat/client/sessionClient.js +331 -0
  24. package/dist/agent/src/chat/client/teamManager.js +2 -0
  25. package/dist/agent/src/chat/{apiKeyManager.js → data/apiKeyManager.js} +4 -0
  26. package/dist/agent/src/chat/data/dataModels.js +2 -0
  27. package/dist/agent/src/chat/data/database.js +749 -0
  28. package/dist/agent/src/chat/data/dbMcpServerConfigs.js +47 -0
  29. package/dist/agent/src/chat/protocol/connectionMessages.js +5 -0
  30. package/dist/agent/src/chat/protocol/constants.js +50 -0
  31. package/dist/agent/src/chat/protocol/errors.js +22 -0
  32. package/dist/agent/src/chat/protocol/messages.js +110 -0
  33. package/dist/agent/src/chat/server/chatContextManager.js +405 -0
  34. package/dist/agent/src/chat/server/connectionManager.js +352 -0
  35. package/dist/agent/src/chat/server/connectionManager.test.js +159 -0
  36. package/dist/agent/src/chat/server/conversation.js +198 -0
  37. package/dist/agent/src/chat/server/errorUtils.js +23 -0
  38. package/dist/agent/src/chat/server/openSession.js +869 -0
  39. package/dist/agent/src/chat/server/server.js +177 -0
  40. package/dist/agent/src/chat/server/sessionFileManager.js +161 -0
  41. package/dist/agent/src/chat/server/sessionRegistry.js +700 -0
  42. package/dist/agent/src/chat/server/sessionRegistry.test.js +97 -0
  43. package/dist/agent/src/chat/server/test-utils/mockFactories.js +307 -0
  44. package/dist/agent/src/chat/server/tools.js +243 -0
  45. package/dist/agent/src/chat/utils/agentSessionMap.js +66 -0
  46. package/dist/agent/src/chat/utils/approvalManager.js +85 -0
  47. package/dist/agent/src/{utils → chat/utils}/asyncLock.js +3 -3
  48. package/dist/agent/src/chat/{asyncQueue.js → utils/asyncQueue.js} +12 -2
  49. package/dist/agent/src/chat/utils/htmlToText.js +84 -0
  50. package/dist/agent/src/chat/utils/multiAsyncQueue.js +42 -0
  51. package/dist/agent/src/chat/utils/search.js +145 -0
  52. package/dist/agent/src/chat/utils/userResolver.js +46 -0
  53. package/dist/agent/src/chat/utils/websocket.js +16 -0
  54. package/dist/agent/src/test/agent.test.js +332 -0
  55. package/dist/agent/src/test/approvalManager.test.js +58 -0
  56. package/dist/agent/src/test/chatContextManager.test.js +392 -0
  57. package/dist/agent/src/test/clientServerConnection.test.js +158 -0
  58. package/dist/agent/src/test/compressingContextManager.test.js +65 -0
  59. package/dist/agent/src/test/context.test.js +83 -0
  60. package/dist/agent/src/test/conversation.test.js +89 -0
  61. package/dist/agent/src/test/db.test.js +271 -83
  62. package/dist/agent/src/test/dbMcpServerConfigs.test.js +72 -0
  63. package/dist/agent/src/test/dbTestTools.js +99 -0
  64. package/dist/agent/src/test/imageLoad.test.js +8 -7
  65. package/dist/agent/src/test/mcpServerManager.test.js +23 -20
  66. package/dist/agent/src/test/multiAsyncQueue.test.js +101 -0
  67. package/dist/agent/src/test/openaiStreaming.test.js +64 -35
  68. package/dist/agent/src/test/prompt.test.js +5 -4
  69. package/dist/agent/src/test/promptProvider.test.js +28 -0
  70. package/dist/agent/src/test/responseHandler.test.js +61 -0
  71. package/dist/agent/src/test/sudoMcpServerManager.test.js +24 -25
  72. package/dist/agent/src/test/testTools.js +109 -0
  73. package/dist/agent/src/test/tools.test.js +31 -0
  74. package/dist/agent/src/tool/agentChat.js +21 -10
  75. package/dist/agent/src/tool/agentMain.js +1 -1
  76. package/dist/agent/src/tool/chatMain.js +241 -58
  77. package/dist/agent/src/tool/commandPrompt.js +22 -17
  78. package/dist/agent/src/tool/files.js +20 -16
  79. package/dist/agent/src/tool/nodePlatform.js +47 -3
  80. package/dist/agent/src/tool/options.js +4 -4
  81. package/dist/agent/src/tool/prompt.js +19 -13
  82. package/eslint.config.mjs +14 -1
  83. package/package.json +14 -6
  84. package/scripts/chat_server +8 -0
  85. package/scripts/setup_chat +7 -2
  86. package/scripts/shutdown_chat_server +3 -0
  87. package/scripts/test_chat +135 -17
  88. package/src/agent/agent.ts +283 -138
  89. package/src/agent/agentUtils.ts +143 -108
  90. package/src/agent/compressingContextManager.ts +164 -0
  91. package/src/agent/context.ts +268 -0
  92. package/src/agent/dummyLLM.ts +76 -8
  93. package/src/agent/iAgentEventHandler.ts +54 -0
  94. package/src/agent/iplatform.ts +1 -0
  95. package/src/agent/mcpServerManager.ts +35 -31
  96. package/src/agent/nullAgentEventHandler.ts +20 -0
  97. package/src/agent/nullPlatform.ts +13 -0
  98. package/src/agent/openAILLMStreaming.ts +26 -13
  99. package/src/agent/promptProvider.ts +87 -0
  100. package/src/agent/repeatLLM.ts +5 -5
  101. package/src/agent/sudoMcpServerManager.ts +30 -29
  102. package/src/agent/tokenAuth.ts +7 -7
  103. package/src/agent/tools.ts +3 -1
  104. package/src/chat/client/chatClient.ts +900 -0
  105. package/src/chat/client/connection.test.ts +241 -0
  106. package/src/chat/client/connection.ts +276 -0
  107. package/src/chat/client/constants.ts +3 -0
  108. package/src/chat/client/index.ts +18 -0
  109. package/src/chat/client/interfaces.ts +34 -0
  110. package/src/chat/client/responseHandler.ts +131 -0
  111. package/src/chat/client/sessionClient.ts +443 -0
  112. package/src/chat/client/teamManager.ts +29 -0
  113. package/src/chat/{apiKeyManager.ts → data/apiKeyManager.ts} +6 -2
  114. package/src/chat/data/dataModels.ts +85 -0
  115. package/src/chat/data/database.ts +982 -0
  116. package/src/chat/data/dbMcpServerConfigs.ts +59 -0
  117. package/src/chat/protocol/connectionMessages.ts +49 -0
  118. package/src/chat/protocol/constants.ts +55 -0
  119. package/src/chat/protocol/errors.ts +16 -0
  120. package/src/chat/protocol/messages.ts +682 -0
  121. package/src/chat/server/README.md +127 -0
  122. package/src/chat/server/chatContextManager.ts +612 -0
  123. package/src/chat/server/connectionManager.test.ts +266 -0
  124. package/src/chat/server/connectionManager.ts +541 -0
  125. package/src/chat/server/conversation.ts +269 -0
  126. package/src/chat/server/errorUtils.ts +28 -0
  127. package/src/chat/server/openSession.ts +1332 -0
  128. package/src/chat/server/server.ts +177 -0
  129. package/src/chat/server/sessionFileManager.ts +239 -0
  130. package/src/chat/server/sessionRegistry.test.ts +138 -0
  131. package/src/chat/server/sessionRegistry.ts +1064 -0
  132. package/src/chat/server/test-utils/mockFactories.ts +422 -0
  133. package/src/chat/server/tools.ts +265 -0
  134. package/src/chat/utils/agentSessionMap.ts +76 -0
  135. package/src/chat/utils/approvalManager.ts +111 -0
  136. package/src/{utils → chat/utils}/asyncLock.ts +3 -3
  137. package/src/chat/{asyncQueue.ts → utils/asyncQueue.ts} +14 -3
  138. package/src/chat/utils/htmlToText.ts +61 -0
  139. package/src/chat/utils/multiAsyncQueue.ts +52 -0
  140. package/src/chat/utils/search.ts +139 -0
  141. package/src/chat/utils/userResolver.ts +48 -0
  142. package/src/chat/utils/websocket.ts +16 -0
  143. package/src/test/agent.test.ts +487 -0
  144. package/src/test/approvalManager.test.ts +73 -0
  145. package/src/test/chatContextManager.test.ts +521 -0
  146. package/src/test/clientServerConnection.test.ts +207 -0
  147. package/src/test/compressingContextManager.test.ts +82 -0
  148. package/src/test/context.test.ts +105 -0
  149. package/src/test/conversation.test.ts +109 -0
  150. package/src/test/db.test.ts +358 -89
  151. package/src/test/dbMcpServerConfigs.test.ts +112 -0
  152. package/src/test/dbTestTools.ts +153 -0
  153. package/src/test/imageLoad.test.ts +7 -6
  154. package/src/test/mcpServerManager.test.ts +21 -16
  155. package/src/test/multiAsyncQueue.test.ts +125 -0
  156. package/src/test/openaiStreaming.test.ts +71 -36
  157. package/src/test/prompt.test.ts +4 -3
  158. package/src/test/promptProvider.test.ts +33 -0
  159. package/src/test/responseHandler.test.ts +78 -0
  160. package/src/test/sudoMcpServerManager.test.ts +32 -30
  161. package/src/test/testTools.ts +146 -0
  162. package/src/test/tools.test.ts +39 -0
  163. package/src/tool/agentChat.ts +26 -12
  164. package/src/tool/agentMain.ts +1 -1
  165. package/src/tool/chatMain.ts +292 -100
  166. package/src/tool/commandPrompt.ts +28 -19
  167. package/src/tool/files.ts +25 -19
  168. package/src/tool/nodePlatform.ts +52 -3
  169. package/src/tool/options.ts +4 -2
  170. package/src/tool/prompt.ts +22 -15
  171. package/test_data/dummyllm_script_crash.json +32 -0
  172. package/test_data/frog.png.b64 +1 -0
  173. package/vitest.config.ts +39 -0
  174. package/dist/agent/src/chat/client.js +0 -349
  175. package/dist/agent/src/chat/conversationManager.js +0 -392
  176. package/dist/agent/src/chat/db.js +0 -209
  177. package/dist/agent/src/chat/frontendClient.js +0 -74
  178. package/dist/agent/src/chat/server.js +0 -158
  179. package/src/chat/client.ts +0 -455
  180. package/src/chat/conversationManager.ts +0 -595
  181. package/src/chat/db.ts +0 -290
  182. package/src/chat/frontendClient.ts +0 -123
  183. package/src/chat/messages.ts +0 -235
  184. package/src/chat/server.ts +0 -177
  185. /package/dist/agent/src/{chat/messages.js → agent/iAgentEventHandler.js} +0 -0
  186. /package/{frog.png → test_data/frog.png} +0 -0
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /// Abstraction of LLM messages (suitable for passing conversations to the
3
+ /// LLM) and SessionMessage (saved in the DB)
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.MESSAGE_INDEX_SUB_INCREMENT = exports.MESSAGE_INDEX_FULL_INCREMENT = exports.MESSAGE_INDEX_START_VALUE = void 0;
6
+ exports.sessionMessagesToNextIndex = sessionMessagesToNextIndex;
7
+ exports.sessionMessagesToLLMConversation = sessionMessagesToLLMConversation;
8
+ exports.sessionMessagesToChatMessages = sessionMessagesToChatMessages;
9
+ exports.llmUserMessageToUserMessageData = llmUserMessageToUserMessageData;
10
+ exports.userMessageToChatMessage = userMessageToChatMessage;
11
+ exports.chatToolResultMessageToSessionMessage = chatToolResultMessageToSessionMessage;
12
+ exports.chatUserMessageToSessionMessage = chatUserMessageToSessionMessage;
13
+ exports.chatAgentMessageToSessionMessage = chatAgentMessageToSessionMessage;
14
+ exports.chatMessagesToSessionMessages = chatMessagesToSessionMessages;
15
+ const assert_1 = require("assert");
16
+ const agent_1 = require("../../agent/agent");
17
+ const errors_1 = require("../protocol/errors");
18
+ exports.MESSAGE_INDEX_START_VALUE = 0;
19
+ exports.MESSAGE_INDEX_FULL_INCREMENT = 100;
20
+ exports.MESSAGE_INDEX_SUB_INCREMENT = 1;
21
+ // MESSAGE_INDEX_START_VALUE = N * MESSAGE_INDEX_FULL_INCREMENT
22
+ // <=> MESSAGE_INDEX_START_VALUE =
23
+ // floor(MESSAGE_INDEX_START_VALUE/MESSAGE_INDEX_FULL_INCREMENT)
24
+ // * MESSAGE_INDEX_FULL_INCREMENT
25
+ (0, assert_1.strict)(exports.MESSAGE_INDEX_START_VALUE ===
26
+ ((exports.MESSAGE_INDEX_START_VALUE / exports.MESSAGE_INDEX_FULL_INCREMENT) | 0) *
27
+ exports.MESSAGE_INDEX_FULL_INCREMENT);
28
+ /**
29
+ * Compute the next message index to assign. Note, this is non-trivial since
30
+ * we use a 'BIGINT with gaps' strategy to ensure that multi-part agent
31
+ * messages can be inserted into the conversation.
32
+ */
33
+ function sessionMessagesToNextIndex(sessionMessages) {
34
+ const numMessages = sessionMessages.length;
35
+ if (numMessages === 0) {
36
+ return exports.MESSAGE_INDEX_START_VALUE;
37
+ }
38
+ const lastIdx = sessionMessages[numMessages - 1].message_idx;
39
+ // We must compute lastIdx + 1 rounded up to the nearest
40
+ // MESSAGE_INDEX_FULL_INCREMENT
41
+ const numFullIncrements = (lastIdx + exports.MESSAGE_INDEX_FULL_INCREMENT) / exports.MESSAGE_INDEX_FULL_INCREMENT;
42
+ const floorNumFullIncrements = numFullIncrements | 0;
43
+ return floorNumFullIncrements * exports.MESSAGE_INDEX_FULL_INCREMENT;
44
+ }
45
+ /**
46
+ * The conversation history may be truncated. In this case, discard any
47
+ * messages which do not make sense (e.g. leading Agent messages). Inform the
48
+ * caller of the first messages to be included in the conversation, so it can
49
+ * request messages further back in history if required.
50
+ */
51
+ function sessionMessagesToLLMConversation(sessionMessages) {
52
+ const conversation = [];
53
+ let started = false;
54
+ let firstIndex = -1;
55
+ for (const msg of sessionMessages) {
56
+ if (!msg.is_for_llm) {
57
+ continue;
58
+ }
59
+ const llmMsg = msg.content;
60
+ // Skip leading messages which are not the users. Record the index of the
61
+ // first message we actually use.
62
+ if (!started) {
63
+ if (llmMsg.role !== "user") {
64
+ continue;
65
+ }
66
+ started = true;
67
+ firstIndex = msg.message_idx;
68
+ }
69
+ conversation.push(llmMsg);
70
+ }
71
+ return { firstIndex, conversation };
72
+ }
73
+ function sessionMessagesToChatMessages(sessionMessages, defaultUserUuid, session_id) {
74
+ const msgs = [];
75
+ for (const sm of sessionMessages) {
76
+ const ccmp = sm.content;
77
+ const message_idx = sm.message_idx;
78
+ switch (ccmp.role) {
79
+ case "developer":
80
+ throw new Error("developer messages not handled yet");
81
+ case "assistant":
82
+ (0, assert_1.strict)(!ccmp.audio);
83
+ if (ccmp.content) {
84
+ msgs.push({
85
+ type: "agent_msg",
86
+ message: ccmp,
87
+ message_idx,
88
+ session_id,
89
+ });
90
+ }
91
+ // TODO: do we want to convert tool calls etc?
92
+ break;
93
+ case "user":
94
+ {
95
+ const msg = userMessageToChatMessage(ccmp, message_idx, defaultUserUuid, session_id);
96
+ if (msg) {
97
+ msgs.push(msg);
98
+ }
99
+ }
100
+ break;
101
+ default:
102
+ break;
103
+ }
104
+ }
105
+ return msgs;
106
+ }
107
+ function llmUserMessageToUserMessageData(userMessage) {
108
+ if (typeof userMessage.content === "string") {
109
+ return {
110
+ message: userMessage.content,
111
+ };
112
+ }
113
+ let message = "";
114
+ let image = undefined;
115
+ for (const content of userMessage.content) {
116
+ switch (content.type) {
117
+ case "text":
118
+ message += content.text;
119
+ break;
120
+ case "image_url":
121
+ (0, assert_1.strict)(!image, "only one image per message supported");
122
+ image = content.image_url.url;
123
+ break;
124
+ case "input_audio":
125
+ throw new errors_1.ChatErrorMessage("userMessageToChatMessage: audio content not supported");
126
+ case "file":
127
+ throw new errors_1.ChatErrorMessage("userMessageToChatMessage: file content not supported");
128
+ default:
129
+ throw new errors_1.ChatErrorMessage("userMessageToChatMessage: unexpected content.type");
130
+ }
131
+ }
132
+ const finalMsg = {
133
+ message,
134
+ };
135
+ if (image) {
136
+ finalMsg.imageB64 = image;
137
+ }
138
+ return finalMsg;
139
+ }
140
+ function userMessageToChatMessage(userMessage, message_idx, defaultUserUuid, session_id) {
141
+ // The name on the message should be the uuid
142
+ const userMsgData = llmUserMessageToUserMessageData(userMessage);
143
+ if (!userMsgData) {
144
+ return undefined;
145
+ }
146
+ const user_uuid = userMessage.name || defaultUserUuid;
147
+ const msg = {
148
+ type: "user_msg",
149
+ message: userMsgData.message,
150
+ message_idx,
151
+ user_uuid,
152
+ session_id,
153
+ };
154
+ if (userMsgData.imageB64) {
155
+ msg.imageB64 = userMsgData.imageB64;
156
+ }
157
+ return msg;
158
+ }
159
+ function chatToolResultMessageToSessionMessage(chatMessage) {
160
+ return {
161
+ message_idx: chatMessage.message_idx,
162
+ is_for_llm: true,
163
+ content: chatMessage.result,
164
+ };
165
+ }
166
+ function chatUserMessageToSessionMessage(chatMessage) {
167
+ const userMsg = (0, agent_1.createUserMessage)(chatMessage.message, chatMessage.imageB64, chatMessage.user_uuid);
168
+ (0, assert_1.strict)(userMsg);
169
+ return {
170
+ message_idx: chatMessage.message_idx,
171
+ is_for_llm: true,
172
+ sender_uuid: chatMessage.user_uuid,
173
+ content: userMsg,
174
+ };
175
+ }
176
+ function chatAgentMessageToSessionMessage(chatMessage) {
177
+ return {
178
+ message_idx: chatMessage.message_idx,
179
+ is_for_llm: true,
180
+ content: chatMessage.message,
181
+ };
182
+ }
183
+ function chatMessagesToSessionMessages(chatMessages) {
184
+ return chatMessages.map((c) => {
185
+ switch (c.type) {
186
+ case "user_msg":
187
+ return chatUserMessageToSessionMessage(c);
188
+ case "agent_msg":
189
+ return chatAgentMessageToSessionMessage(c);
190
+ case "tool_call_result":
191
+ return chatToolResultMessageToSessionMessage(c);
192
+ default: {
193
+ const exhaustive = c;
194
+ return exhaustive;
195
+ }
196
+ }
197
+ });
198
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getErrorString = getErrorString;
4
+ /**
5
+ * Extract error string from an unknown error. Handles raw strings, `Error`
6
+ * objects, DB errors and falls back to outputting as String and JSON.
7
+ */
8
+ function getErrorString(err) {
9
+ if (typeof err === "string") {
10
+ return err;
11
+ }
12
+ if (err instanceof Error) {
13
+ // Generic Error. For now just send messages, don't close.
14
+ return "internal server error: " + err.message;
15
+ }
16
+ const dbErr = err;
17
+ if (dbErr.code && dbErr.details) {
18
+ return "db error: " + dbErr.details;
19
+ }
20
+ return (`unknown err (${typeof err}, ${String(err?.constructor?.name)}) ` +
21
+ JSON.stringify(err) +
22
+ "String(err)");
23
+ }