@convex-dev/agent 0.5.0-alpha.1 → 0.6.0-alpha.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 (233) hide show
  1. package/README.md +32 -27
  2. package/dist/UIMessages.d.ts +46 -0
  3. package/dist/UIMessages.d.ts.map +1 -0
  4. package/dist/UIMessages.js +546 -0
  5. package/dist/UIMessages.js.map +1 -0
  6. package/dist/client/createTool.d.ts +129 -27
  7. package/dist/client/createTool.d.ts.map +1 -1
  8. package/dist/client/createTool.js +66 -12
  9. package/dist/client/createTool.js.map +1 -1
  10. package/dist/client/defaultComponent.d.ts +11 -0
  11. package/dist/client/defaultComponent.d.ts.map +1 -0
  12. package/dist/client/defaultComponent.js +7 -0
  13. package/dist/client/defaultComponent.js.map +1 -0
  14. package/dist/client/definePlaygroundAPI.d.ts +1323 -192
  15. package/dist/client/definePlaygroundAPI.d.ts.map +1 -1
  16. package/dist/client/definePlaygroundAPI.js +52 -28
  17. package/dist/client/definePlaygroundAPI.js.map +1 -1
  18. package/dist/client/files.d.ts +20 -7
  19. package/dist/client/files.d.ts.map +1 -1
  20. package/dist/client/files.js +68 -11
  21. package/dist/client/files.js.map +1 -1
  22. package/dist/client/index.d.ts +1056 -965
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/index.js +242 -748
  25. package/dist/client/index.js.map +1 -1
  26. package/dist/client/messages.d.ts +461 -0
  27. package/dist/client/messages.d.ts.map +1 -0
  28. package/dist/client/messages.js +106 -0
  29. package/dist/client/messages.js.map +1 -0
  30. package/dist/client/mockModel.d.ts +42 -0
  31. package/dist/client/mockModel.d.ts.map +1 -0
  32. package/dist/client/mockModel.js +175 -0
  33. package/dist/client/mockModel.js.map +1 -0
  34. package/dist/client/saveInputMessages.d.ts +20 -0
  35. package/dist/client/saveInputMessages.d.ts.map +1 -0
  36. package/dist/client/saveInputMessages.js +58 -0
  37. package/dist/client/saveInputMessages.js.map +1 -0
  38. package/dist/client/search.d.ts +346 -35
  39. package/dist/client/search.d.ts.map +1 -1
  40. package/dist/client/search.js +350 -39
  41. package/dist/client/search.js.map +1 -1
  42. package/dist/client/start.d.ts +84 -0
  43. package/dist/client/start.d.ts.map +1 -0
  44. package/dist/client/start.js +171 -0
  45. package/dist/client/start.js.map +1 -0
  46. package/dist/client/streamText.d.ts +46 -0
  47. package/dist/client/streamText.d.ts.map +1 -0
  48. package/dist/client/streamText.js +93 -0
  49. package/dist/client/streamText.js.map +1 -0
  50. package/dist/client/streaming.d.ts +3705 -32
  51. package/dist/client/streaming.d.ts.map +1 -1
  52. package/dist/client/streaming.js +141 -59
  53. package/dist/client/streaming.js.map +1 -1
  54. package/dist/client/threads.d.ts +46 -0
  55. package/dist/client/threads.d.ts.map +1 -0
  56. package/dist/client/threads.js +49 -0
  57. package/dist/client/threads.js.map +1 -0
  58. package/dist/client/types.d.ts +265 -128
  59. package/dist/client/types.d.ts.map +1 -1
  60. package/dist/client/utils.d.ts +4 -0
  61. package/dist/client/utils.d.ts.map +1 -0
  62. package/dist/client/utils.js +21 -0
  63. package/dist/client/utils.js.map +1 -0
  64. package/dist/component/_generated/api.d.ts +24 -2178
  65. package/dist/component/_generated/api.d.ts.map +1 -1
  66. package/dist/component/_generated/api.js +10 -1
  67. package/dist/component/_generated/api.js.map +1 -1
  68. package/dist/component/_generated/component.d.ts +3119 -0
  69. package/dist/component/_generated/component.d.ts.map +1 -0
  70. package/dist/component/_generated/component.js +11 -0
  71. package/dist/component/_generated/component.js.map +1 -0
  72. package/dist/component/_generated/dataModel.d.ts +4 -18
  73. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  74. package/dist/component/_generated/dataModel.js +11 -0
  75. package/dist/component/_generated/dataModel.js.map +1 -0
  76. package/dist/component/_generated/server.d.ts +10 -38
  77. package/dist/component/_generated/server.d.ts.map +1 -1
  78. package/dist/component/_generated/server.js +9 -5
  79. package/dist/component/_generated/server.js.map +1 -1
  80. package/dist/component/files.d.ts +16 -10
  81. package/dist/component/files.d.ts.map +1 -1
  82. package/dist/component/files.js +10 -2
  83. package/dist/component/files.js.map +1 -1
  84. package/dist/component/messages.d.ts +2553 -342
  85. package/dist/component/messages.d.ts.map +1 -1
  86. package/dist/component/messages.js +387 -154
  87. package/dist/component/messages.js.map +1 -1
  88. package/dist/component/schema.d.ts +5697 -3584
  89. package/dist/component/schema.d.ts.map +1 -1
  90. package/dist/component/schema.js +18 -41
  91. package/dist/component/schema.js.map +1 -1
  92. package/dist/component/streams.d.ts +35 -335
  93. package/dist/component/streams.d.ts.map +1 -1
  94. package/dist/component/streams.js +114 -73
  95. package/dist/component/streams.js.map +1 -1
  96. package/dist/component/threads.d.ts +16 -16
  97. package/dist/component/users.d.ts +4 -4
  98. package/dist/component/vector/index.d.ts +1 -1
  99. package/dist/component/vector/index.d.ts.map +1 -1
  100. package/dist/component/vector/index.js +1 -3
  101. package/dist/component/vector/index.js.map +1 -1
  102. package/dist/deltas.d.ts +43 -0
  103. package/dist/deltas.d.ts.map +1 -0
  104. package/dist/deltas.js +447 -0
  105. package/dist/deltas.js.map +1 -0
  106. package/dist/mapping.d.ts +20 -20
  107. package/dist/mapping.d.ts.map +1 -1
  108. package/dist/mapping.js +313 -96
  109. package/dist/mapping.js.map +1 -1
  110. package/dist/react/SmoothText.d.ts +5 -0
  111. package/dist/react/SmoothText.d.ts.map +1 -0
  112. package/dist/react/SmoothText.js +6 -0
  113. package/dist/react/SmoothText.js.map +1 -0
  114. package/dist/react/index.d.ts +5 -77
  115. package/dist/react/index.d.ts.map +1 -1
  116. package/dist/react/index.js +6 -160
  117. package/dist/react/index.js.map +1 -1
  118. package/dist/react/optimisticallySendMessage.d.ts +36 -3
  119. package/dist/react/optimisticallySendMessage.d.ts.map +1 -1
  120. package/dist/react/optimisticallySendMessage.js +35 -9
  121. package/dist/react/optimisticallySendMessage.js.map +1 -1
  122. package/dist/react/types.d.ts +4 -18
  123. package/dist/react/types.d.ts.map +1 -1
  124. package/dist/react/useDeltaStreams.d.ts +10 -0
  125. package/dist/react/useDeltaStreams.d.ts.map +1 -0
  126. package/dist/react/useDeltaStreams.js +101 -0
  127. package/dist/react/useDeltaStreams.js.map +1 -0
  128. package/dist/react/useSmoothText.d.ts +13 -12
  129. package/dist/react/useSmoothText.d.ts.map +1 -1
  130. package/dist/react/useSmoothText.js +32 -15
  131. package/dist/react/useSmoothText.js.map +1 -1
  132. package/dist/react/useStreamingUIMessages.d.ts +22 -0
  133. package/dist/react/useStreamingUIMessages.d.ts.map +1 -0
  134. package/dist/react/useStreamingUIMessages.js +92 -0
  135. package/dist/react/useStreamingUIMessages.js.map +1 -0
  136. package/dist/react/useThreadMessages.d.ts +104 -0
  137. package/dist/react/useThreadMessages.d.ts.map +1 -0
  138. package/dist/react/useThreadMessages.js +148 -0
  139. package/dist/react/useThreadMessages.js.map +1 -0
  140. package/dist/react/useUIMessages.d.ts +96 -0
  141. package/dist/react/useUIMessages.d.ts.map +1 -0
  142. package/dist/react/useUIMessages.js +108 -0
  143. package/dist/react/useUIMessages.js.map +1 -0
  144. package/dist/shared.d.ts +20 -4
  145. package/dist/shared.d.ts.map +1 -1
  146. package/dist/shared.js +45 -8
  147. package/dist/shared.js.map +1 -1
  148. package/dist/validators.d.ts +22981 -5666
  149. package/dist/validators.d.ts.map +1 -1
  150. package/dist/validators.js +245 -137
  151. package/dist/validators.js.map +1 -1
  152. package/package.json +98 -50
  153. package/src/UIMessages.combineUIMessages.test.ts +239 -0
  154. package/src/UIMessages.test.ts +273 -0
  155. package/src/UIMessages.ts +739 -0
  156. package/src/client/createTool.ts +293 -76
  157. package/src/client/defaultComponent.ts +17 -0
  158. package/src/client/definePlaygroundAPI.ts +67 -31
  159. package/src/client/files.ts +100 -20
  160. package/src/client/index.test.ts +40 -85
  161. package/src/client/index.ts +520 -1290
  162. package/src/client/messages.ts +237 -0
  163. package/src/client/mockModel.ts +245 -0
  164. package/src/client/saveInputMessages.test.ts +583 -0
  165. package/src/client/saveInputMessages.ts +101 -0
  166. package/src/client/search.test.ts +1207 -0
  167. package/src/client/search.ts +577 -70
  168. package/src/client/start.ts +310 -0
  169. package/src/client/streamText.ts +163 -0
  170. package/src/client/streaming.test.ts +186 -0
  171. package/src/client/streaming.ts +219 -97
  172. package/src/client/threads.ts +83 -0
  173. package/src/client/types.ts +368 -219
  174. package/src/client/utils.ts +27 -0
  175. package/src/component/_generated/api.ts +64 -0
  176. package/src/component/_generated/component.ts +4913 -0
  177. package/src/component/_generated/{server.d.ts → server.ts} +33 -21
  178. package/src/component/files.ts +11 -2
  179. package/src/component/messages.test.ts +195 -51
  180. package/src/component/messages.ts +490 -201
  181. package/src/component/schema.ts +20 -46
  182. package/src/component/setup.test.ts +7 -0
  183. package/src/component/streams.ts +184 -83
  184. package/src/component/users.test.ts +0 -1
  185. package/src/component/vector/index.ts +1 -3
  186. package/src/deltas.test.ts +626 -0
  187. package/src/deltas.ts +570 -0
  188. package/src/fromUIMessages.test.ts +497 -0
  189. package/src/mapping.test.ts +103 -6
  190. package/src/mapping.ts +422 -161
  191. package/src/react/SmoothText.tsx +9 -0
  192. package/src/react/index.ts +10 -230
  193. package/src/react/optimisticallySendMessage.ts +55 -12
  194. package/src/react/types.ts +6 -39
  195. package/src/react/useDeltaStreams.ts +154 -0
  196. package/src/react/useSmoothText.ts +56 -36
  197. package/src/react/useStreamingUIMessages.ts +143 -0
  198. package/src/react/useThreadMessages.ts +262 -0
  199. package/src/react/useUIMessages.test.ts +255 -0
  200. package/src/react/useUIMessages.ts +195 -0
  201. package/src/shared.ts +88 -12
  202. package/src/test.ts +18 -0
  203. package/src/toUIMessages.test.ts +1269 -0
  204. package/src/validators.test.ts +18 -19
  205. package/src/validators.ts +325 -185
  206. package/dist/client/_generated/_ignore.d.ts +0 -1
  207. package/dist/client/_generated/_ignore.d.ts.map +0 -1
  208. package/dist/client/_generated/_ignore.js +0 -3
  209. package/dist/client/_generated/_ignore.js.map +0 -1
  210. package/dist/client/listMessages.d.ts +0 -22
  211. package/dist/client/listMessages.d.ts.map +0 -1
  212. package/dist/client/listMessages.js +0 -25
  213. package/dist/client/listMessages.js.map +0 -1
  214. package/dist/package.json +0 -3
  215. package/dist/react/deltas.d.ts +0 -26
  216. package/dist/react/deltas.d.ts.map +0 -1
  217. package/dist/react/deltas.js +0 -384
  218. package/dist/react/deltas.js.map +0 -1
  219. package/dist/react/toUIMessages.d.ts +0 -15
  220. package/dist/react/toUIMessages.d.ts.map +0 -1
  221. package/dist/react/toUIMessages.js +0 -211
  222. package/dist/react/toUIMessages.js.map +0 -1
  223. package/src/client/listMessages.ts +0 -38
  224. package/src/component/_generated/api.d.ts +0 -2202
  225. package/src/component/_generated/api.js +0 -23
  226. package/src/component/_generated/server.js +0 -90
  227. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  228. package/src/react/deltas.test.ts +0 -315
  229. package/src/react/deltas.ts +0 -478
  230. package/src/react/toUIMessages.test.ts +0 -420
  231. package/src/react/toUIMessages.ts +0 -253
  232. package/src/vitest.config.ts +0 -7
  233. /package/src/component/_generated/{dataModel.d.ts → dataModel.ts} +0 -0
@@ -0,0 +1,273 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { combineUIMessages } from "./UIMessages.js";
3
+
4
+ describe("combineUIMessages", () => {
5
+ it("combines messages spanning two pages correctly", () => {
6
+ const message1 = {
7
+ id: "msg1",
8
+ key: "msg1-key",
9
+ _creationTime: Date.now(),
10
+ order: 1,
11
+ stepOrder: 1,
12
+ status: "success" as const,
13
+ role: "assistant" as const,
14
+ text: "",
15
+ parts: [
16
+ {
17
+ type: "dynamic-tool" as const,
18
+ state: "input-available" as const,
19
+ toolCallId: "call_123",
20
+ toolName: "calculator",
21
+ input: { operation: "add", a: 2, b: 3 },
22
+ },
23
+ ],
24
+ };
25
+
26
+ const message2 = {
27
+ id: "msg2",
28
+ key: "msg2-key",
29
+ _creationTime: Date.now() + 1,
30
+ order: 1,
31
+ stepOrder: 2,
32
+ status: "success" as const,
33
+ role: "assistant" as const,
34
+ text: "The result is 5.",
35
+ parts: [
36
+ {
37
+ type: "tool-calculator" as const,
38
+ state: "output-available" as const,
39
+ toolCallId: "call_123",
40
+ input: { operation: "add", a: 2, b: 3 },
41
+ output: { result: 5 },
42
+ },
43
+ {
44
+ type: "text" as const,
45
+ text: "The result is 5.",
46
+ state: "done" as const,
47
+ },
48
+ ],
49
+ };
50
+
51
+ const combined = combineUIMessages([message1, message2]);
52
+
53
+ expect(combined).toHaveLength(1);
54
+ expect(combined[0].role).toBe("assistant");
55
+ expect(combined[0].text).toBe("The result is 5.");
56
+ expect(combined[0].parts).toHaveLength(2);
57
+
58
+ const toolPart = combined[0].parts.find(
59
+ (p) => p.type === "tool-calculator",
60
+ );
61
+ expect(toolPart).toMatchObject({
62
+ type: "tool-calculator",
63
+ state: "output-available",
64
+ toolCallId: "call_123",
65
+ input: { operation: "add", a: 2, b: 3 },
66
+ output: { result: 5 },
67
+ });
68
+
69
+ const textPart = combined[0].parts.find((p) => p.type === "text");
70
+ expect(textPart).toMatchObject({
71
+ type: "text",
72
+ text: "The result is 5.",
73
+ state: "done",
74
+ });
75
+ });
76
+
77
+ it("preserves separate messages with different roles", () => {
78
+ const userMessage = {
79
+ id: "user1",
80
+ key: "user1-key",
81
+ _creationTime: Date.now(),
82
+ order: 1,
83
+ stepOrder: 0,
84
+ status: "success" as const,
85
+ role: "user" as const,
86
+ text: "Calculate 2 + 3",
87
+ parts: [{ type: "text" as const, text: "Calculate 2 + 3" }],
88
+ };
89
+
90
+ const assistantMessage = {
91
+ id: "assistant1",
92
+ key: "assistant1-key",
93
+ _creationTime: Date.now() + 1,
94
+ order: 2,
95
+ stepOrder: 0,
96
+ status: "success" as const,
97
+ role: "assistant" as const,
98
+ text: "The result is 5.",
99
+ parts: [
100
+ {
101
+ type: "text" as const,
102
+ text: "The result is 5.",
103
+ state: "done" as const,
104
+ },
105
+ ],
106
+ };
107
+
108
+ const combined = combineUIMessages([userMessage, assistantMessage]);
109
+
110
+ expect(combined).toHaveLength(2);
111
+ expect(combined[0]).toEqual(userMessage);
112
+ expect(combined[1]).toEqual(assistantMessage);
113
+ });
114
+
115
+ it("combines multiple tool calls across pages", () => {
116
+ const message1 = {
117
+ id: "msg1",
118
+ key: "msg1-key",
119
+ _creationTime: Date.now(),
120
+ order: 1,
121
+ stepOrder: 1,
122
+ status: "success" as const,
123
+ role: "assistant" as const,
124
+ text: "",
125
+ parts: [
126
+ {
127
+ type: "dynamic-tool" as const,
128
+ state: "input-available" as const,
129
+ toolCallId: "call_1",
130
+ toolName: "calculator",
131
+ input: { operation: "add", a: 2, b: 3 },
132
+ },
133
+ {
134
+ type: "dynamic-tool" as const,
135
+ state: "input-available" as const,
136
+ toolCallId: "call_2",
137
+ toolName: "formatter",
138
+ input: { text: "result" },
139
+ },
140
+ ],
141
+ };
142
+
143
+ const message2 = {
144
+ id: "msg2",
145
+ key: "msg2-key",
146
+ _creationTime: Date.now() + 1,
147
+ order: 1,
148
+ stepOrder: 2,
149
+ status: "success" as const,
150
+ role: "assistant" as const,
151
+ text: "The formatted result is: 5",
152
+ parts: [
153
+ {
154
+ type: "tool-calculator" as const,
155
+ state: "output-available" as const,
156
+ toolCallId: "call_1",
157
+ input: { operation: "add", a: 2, b: 3 },
158
+ output: { result: 5 },
159
+ },
160
+ {
161
+ type: "tool-formatter" as const,
162
+ state: "output-available" as const,
163
+ toolCallId: "call_2",
164
+ input: { text: "result" },
165
+ output: { formatted: "The formatted result is: 5" },
166
+ },
167
+ {
168
+ type: "text" as const,
169
+ text: "The formatted result is: 5",
170
+ state: "done" as const,
171
+ },
172
+ ],
173
+ };
174
+
175
+ const combined = combineUIMessages([message1, message2]);
176
+
177
+ expect(combined).toHaveLength(1);
178
+ expect(combined[0].role).toBe("assistant");
179
+ expect(combined[0].text).toBe("The formatted result is: 5");
180
+ expect(combined[0].parts).toHaveLength(3);
181
+
182
+ const calculatorPart = combined[0].parts.find(
183
+ (p) =>
184
+ p.type === "tool-calculator" &&
185
+ "toolCallId" in p &&
186
+ p.toolCallId === "call_1",
187
+ );
188
+ expect(calculatorPart).toMatchObject({
189
+ type: "tool-calculator",
190
+ state: "output-available",
191
+ toolCallId: "call_1",
192
+ input: { operation: "add", a: 2, b: 3 },
193
+ output: { result: 5 },
194
+ });
195
+
196
+ const formatterPart = combined[0].parts.find(
197
+ (p) =>
198
+ p.type === "tool-formatter" &&
199
+ "toolCallId" in p &&
200
+ p.toolCallId === "call_2",
201
+ );
202
+ expect(formatterPart).toMatchObject({
203
+ type: "tool-formatter",
204
+ state: "output-available",
205
+ toolCallId: "call_2",
206
+ input: { text: "result" },
207
+ output: { formatted: "The formatted result is: 5" },
208
+ });
209
+ });
210
+
211
+ it("handles tool call without corresponding output", () => {
212
+ const message1 = {
213
+ id: "msg1",
214
+ key: "msg1-key",
215
+ _creationTime: Date.now(),
216
+ order: 1,
217
+ stepOrder: 1,
218
+ status: "success" as const,
219
+ role: "assistant" as const,
220
+ text: "",
221
+ parts: [
222
+ {
223
+ type: "dynamic-tool" as const,
224
+ state: "input-available" as const,
225
+ toolCallId: "call_orphan",
226
+ toolName: "calculator",
227
+ input: { operation: "add", a: 2, b: 3 },
228
+ },
229
+ ],
230
+ };
231
+
232
+ const message2 = {
233
+ id: "msg2",
234
+ key: "msg2-key",
235
+ _creationTime: Date.now() + 1,
236
+ order: 1,
237
+ stepOrder: 2,
238
+ status: "success" as const,
239
+ role: "assistant" as const,
240
+ text: "Still processing...",
241
+ parts: [
242
+ {
243
+ type: "text" as const,
244
+ text: "Still processing...",
245
+ state: "done" as const,
246
+ },
247
+ ],
248
+ };
249
+
250
+ const combined = combineUIMessages([message1, message2]);
251
+
252
+ expect(combined).toHaveLength(1);
253
+ expect(combined[0].role).toBe("assistant");
254
+ expect(combined[0].text).toBe("Still processing...");
255
+ expect(combined[0].parts).toHaveLength(2);
256
+
257
+ const toolPart = combined[0].parts.find((p) => p.type === "dynamic-tool");
258
+ expect(toolPart).toMatchObject({
259
+ type: "dynamic-tool",
260
+ state: "input-available",
261
+ toolCallId: "call_orphan",
262
+ toolName: "calculator",
263
+ input: { operation: "add", a: 2, b: 3 },
264
+ });
265
+
266
+ const textPart = combined[0].parts.find((p) => p.type === "text");
267
+ expect(textPart).toMatchObject({
268
+ type: "text",
269
+ text: "Still processing...",
270
+ state: "done",
271
+ });
272
+ });
273
+ });