@convex-dev/agent 0.5.0-alpha.1 → 0.6.0-alpha.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 (235) hide show
  1. package/MIGRATION.md +153 -0
  2. package/README.md +32 -27
  3. package/dist/UIMessages.d.ts +46 -0
  4. package/dist/UIMessages.d.ts.map +1 -0
  5. package/dist/UIMessages.js +546 -0
  6. package/dist/UIMessages.js.map +1 -0
  7. package/dist/client/createTool.d.ts +126 -27
  8. package/dist/client/createTool.d.ts.map +1 -1
  9. package/dist/client/createTool.js +67 -12
  10. package/dist/client/createTool.js.map +1 -1
  11. package/dist/client/defaultComponent.d.ts +11 -0
  12. package/dist/client/defaultComponent.d.ts.map +1 -0
  13. package/dist/client/defaultComponent.js +7 -0
  14. package/dist/client/defaultComponent.js.map +1 -0
  15. package/dist/client/definePlaygroundAPI.d.ts +1335 -204
  16. package/dist/client/definePlaygroundAPI.d.ts.map +1 -1
  17. package/dist/client/definePlaygroundAPI.js +52 -28
  18. package/dist/client/definePlaygroundAPI.js.map +1 -1
  19. package/dist/client/files.d.ts +20 -7
  20. package/dist/client/files.d.ts.map +1 -1
  21. package/dist/client/files.js +68 -11
  22. package/dist/client/files.js.map +1 -1
  23. package/dist/client/index.d.ts +1116 -978
  24. package/dist/client/index.d.ts.map +1 -1
  25. package/dist/client/index.js +332 -747
  26. package/dist/client/index.js.map +1 -1
  27. package/dist/client/messages.d.ts +461 -0
  28. package/dist/client/messages.d.ts.map +1 -0
  29. package/dist/client/messages.js +106 -0
  30. package/dist/client/messages.js.map +1 -0
  31. package/dist/client/mockModel.d.ts +42 -0
  32. package/dist/client/mockModel.d.ts.map +1 -0
  33. package/dist/client/mockModel.js +182 -0
  34. package/dist/client/mockModel.js.map +1 -0
  35. package/dist/client/saveInputMessages.d.ts +20 -0
  36. package/dist/client/saveInputMessages.d.ts.map +1 -0
  37. package/dist/client/saveInputMessages.js +58 -0
  38. package/dist/client/saveInputMessages.js.map +1 -0
  39. package/dist/client/search.d.ts +350 -39
  40. package/dist/client/search.d.ts.map +1 -1
  41. package/dist/client/search.js +350 -39
  42. package/dist/client/search.js.map +1 -1
  43. package/dist/client/start.d.ts +84 -0
  44. package/dist/client/start.d.ts.map +1 -0
  45. package/dist/client/start.js +185 -0
  46. package/dist/client/start.js.map +1 -0
  47. package/dist/client/streamText.d.ts +46 -0
  48. package/dist/client/streamText.d.ts.map +1 -0
  49. package/dist/client/streamText.js +117 -0
  50. package/dist/client/streamText.js.map +1 -0
  51. package/dist/client/streaming.d.ts +3716 -32
  52. package/dist/client/streaming.d.ts.map +1 -1
  53. package/dist/client/streaming.js +161 -59
  54. package/dist/client/streaming.js.map +1 -1
  55. package/dist/client/threads.d.ts +46 -0
  56. package/dist/client/threads.d.ts.map +1 -0
  57. package/dist/client/threads.js +49 -0
  58. package/dist/client/threads.js.map +1 -0
  59. package/dist/client/types.d.ts +266 -128
  60. package/dist/client/types.d.ts.map +1 -1
  61. package/dist/client/utils.d.ts +4 -0
  62. package/dist/client/utils.d.ts.map +1 -0
  63. package/dist/client/utils.js +21 -0
  64. package/dist/client/utils.js.map +1 -0
  65. package/dist/component/_generated/api.d.ts +24 -2178
  66. package/dist/component/_generated/api.d.ts.map +1 -1
  67. package/dist/component/_generated/api.js +10 -1
  68. package/dist/component/_generated/api.js.map +1 -1
  69. package/dist/component/_generated/component.d.ts +3120 -0
  70. package/dist/component/_generated/component.d.ts.map +1 -0
  71. package/dist/component/_generated/component.js +11 -0
  72. package/dist/component/_generated/component.js.map +1 -0
  73. package/dist/component/_generated/dataModel.d.ts +4 -18
  74. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  75. package/dist/component/_generated/dataModel.js +11 -0
  76. package/dist/component/_generated/dataModel.js.map +1 -0
  77. package/dist/component/_generated/server.d.ts +10 -38
  78. package/dist/component/_generated/server.d.ts.map +1 -1
  79. package/dist/component/_generated/server.js +9 -5
  80. package/dist/component/_generated/server.js.map +1 -1
  81. package/dist/component/files.d.ts +16 -10
  82. package/dist/component/files.d.ts.map +1 -1
  83. package/dist/component/files.js +10 -2
  84. package/dist/component/files.js.map +1 -1
  85. package/dist/component/messages.d.ts +2578 -366
  86. package/dist/component/messages.d.ts.map +1 -1
  87. package/dist/component/messages.js +397 -154
  88. package/dist/component/messages.js.map +1 -1
  89. package/dist/component/schema.d.ts +5697 -3584
  90. package/dist/component/schema.d.ts.map +1 -1
  91. package/dist/component/schema.js +18 -41
  92. package/dist/component/schema.js.map +1 -1
  93. package/dist/component/streams.d.ts +39 -339
  94. package/dist/component/streams.d.ts.map +1 -1
  95. package/dist/component/streams.js +114 -73
  96. package/dist/component/streams.js.map +1 -1
  97. package/dist/component/threads.d.ts +13 -13
  98. package/dist/component/users.d.ts +7 -7
  99. package/dist/component/vector/index.d.ts +1 -1
  100. package/dist/component/vector/index.d.ts.map +1 -1
  101. package/dist/component/vector/index.js +1 -3
  102. package/dist/component/vector/index.js.map +1 -1
  103. package/dist/deltas.d.ts +43 -0
  104. package/dist/deltas.d.ts.map +1 -0
  105. package/dist/deltas.js +446 -0
  106. package/dist/deltas.js.map +1 -0
  107. package/dist/mapping.d.ts +38 -20
  108. package/dist/mapping.d.ts.map +1 -1
  109. package/dist/mapping.js +365 -97
  110. package/dist/mapping.js.map +1 -1
  111. package/dist/react/SmoothText.d.ts +5 -0
  112. package/dist/react/SmoothText.d.ts.map +1 -0
  113. package/dist/react/SmoothText.js +6 -0
  114. package/dist/react/SmoothText.js.map +1 -0
  115. package/dist/react/index.d.ts +5 -77
  116. package/dist/react/index.d.ts.map +1 -1
  117. package/dist/react/index.js +6 -160
  118. package/dist/react/index.js.map +1 -1
  119. package/dist/react/optimisticallySendMessage.d.ts +36 -3
  120. package/dist/react/optimisticallySendMessage.d.ts.map +1 -1
  121. package/dist/react/optimisticallySendMessage.js +35 -9
  122. package/dist/react/optimisticallySendMessage.js.map +1 -1
  123. package/dist/react/types.d.ts +4 -18
  124. package/dist/react/types.d.ts.map +1 -1
  125. package/dist/react/useDeltaStreams.d.ts +10 -0
  126. package/dist/react/useDeltaStreams.d.ts.map +1 -0
  127. package/dist/react/useDeltaStreams.js +106 -0
  128. package/dist/react/useDeltaStreams.js.map +1 -0
  129. package/dist/react/useSmoothText.d.ts +13 -12
  130. package/dist/react/useSmoothText.d.ts.map +1 -1
  131. package/dist/react/useSmoothText.js +32 -15
  132. package/dist/react/useSmoothText.js.map +1 -1
  133. package/dist/react/useStreamingUIMessages.d.ts +22 -0
  134. package/dist/react/useStreamingUIMessages.d.ts.map +1 -0
  135. package/dist/react/useStreamingUIMessages.js +92 -0
  136. package/dist/react/useStreamingUIMessages.js.map +1 -0
  137. package/dist/react/useThreadMessages.d.ts +104 -0
  138. package/dist/react/useThreadMessages.d.ts.map +1 -0
  139. package/dist/react/useThreadMessages.js +148 -0
  140. package/dist/react/useThreadMessages.js.map +1 -0
  141. package/dist/react/useUIMessages.d.ts +96 -0
  142. package/dist/react/useUIMessages.d.ts.map +1 -0
  143. package/dist/react/useUIMessages.js +108 -0
  144. package/dist/react/useUIMessages.js.map +1 -0
  145. package/dist/shared.d.ts +20 -4
  146. package/dist/shared.d.ts.map +1 -1
  147. package/dist/shared.js +45 -8
  148. package/dist/shared.js.map +1 -1
  149. package/dist/validators.d.ts +22981 -5666
  150. package/dist/validators.d.ts.map +1 -1
  151. package/dist/validators.js +245 -137
  152. package/dist/validators.js.map +1 -1
  153. package/package.json +101 -51
  154. package/src/UIMessages.combineUIMessages.test.ts +239 -0
  155. package/src/UIMessages.test.ts +273 -0
  156. package/src/UIMessages.ts +739 -0
  157. package/src/client/approval.test.ts +350 -0
  158. package/src/client/createTool.ts +291 -76
  159. package/src/client/defaultComponent.ts +17 -0
  160. package/src/client/definePlaygroundAPI.ts +67 -31
  161. package/src/client/files.ts +100 -20
  162. package/src/client/index.test.ts +40 -85
  163. package/src/client/index.ts +638 -1289
  164. package/src/client/messages.ts +237 -0
  165. package/src/client/mockModel.ts +252 -0
  166. package/src/client/saveInputMessages.test.ts +583 -0
  167. package/src/client/saveInputMessages.ts +101 -0
  168. package/src/client/search.test.ts +1207 -0
  169. package/src/client/search.ts +581 -70
  170. package/src/client/start.ts +327 -0
  171. package/src/client/streamText.ts +187 -0
  172. package/src/client/streaming.test.ts +186 -0
  173. package/src/client/streaming.ts +241 -97
  174. package/src/client/threads.ts +83 -0
  175. package/src/client/types.ts +370 -219
  176. package/src/client/utils.ts +27 -0
  177. package/src/component/_generated/api.ts +64 -0
  178. package/src/component/_generated/component.ts +4902 -0
  179. package/src/component/_generated/{server.d.ts → server.ts} +33 -21
  180. package/src/component/files.ts +11 -2
  181. package/src/component/messages.test.ts +195 -51
  182. package/src/component/messages.ts +500 -201
  183. package/src/component/schema.ts +20 -46
  184. package/src/component/setup.test.ts +7 -0
  185. package/src/component/streams.ts +184 -83
  186. package/src/component/users.test.ts +0 -1
  187. package/src/component/vector/index.ts +1 -3
  188. package/src/deltas.test.ts +626 -0
  189. package/src/deltas.ts +569 -0
  190. package/src/fromUIMessages.test.ts +497 -0
  191. package/src/mapping.test.ts +180 -6
  192. package/src/mapping.ts +479 -162
  193. package/src/react/SmoothText.tsx +9 -0
  194. package/src/react/index.ts +10 -230
  195. package/src/react/optimisticallySendMessage.ts +55 -12
  196. package/src/react/types.ts +6 -39
  197. package/src/react/useDeltaStreams.ts +160 -0
  198. package/src/react/useSmoothText.ts +56 -36
  199. package/src/react/useStreamingUIMessages.ts +143 -0
  200. package/src/react/useThreadMessages.ts +262 -0
  201. package/src/react/useUIMessages.test.ts +255 -0
  202. package/src/react/useUIMessages.ts +195 -0
  203. package/src/shared.ts +88 -12
  204. package/src/test.ts +18 -0
  205. package/src/toUIMessages.test.ts +1269 -0
  206. package/src/validators.test.ts +18 -19
  207. package/src/validators.ts +325 -185
  208. package/dist/client/_generated/_ignore.d.ts +0 -1
  209. package/dist/client/_generated/_ignore.d.ts.map +0 -1
  210. package/dist/client/_generated/_ignore.js +0 -3
  211. package/dist/client/_generated/_ignore.js.map +0 -1
  212. package/dist/client/listMessages.d.ts +0 -22
  213. package/dist/client/listMessages.d.ts.map +0 -1
  214. package/dist/client/listMessages.js +0 -25
  215. package/dist/client/listMessages.js.map +0 -1
  216. package/dist/package.json +0 -3
  217. package/dist/react/deltas.d.ts +0 -26
  218. package/dist/react/deltas.d.ts.map +0 -1
  219. package/dist/react/deltas.js +0 -384
  220. package/dist/react/deltas.js.map +0 -1
  221. package/dist/react/toUIMessages.d.ts +0 -15
  222. package/dist/react/toUIMessages.d.ts.map +0 -1
  223. package/dist/react/toUIMessages.js +0 -211
  224. package/dist/react/toUIMessages.js.map +0 -1
  225. package/src/client/listMessages.ts +0 -38
  226. package/src/component/_generated/api.d.ts +0 -2202
  227. package/src/component/_generated/api.js +0 -23
  228. package/src/component/_generated/server.js +0 -90
  229. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  230. package/src/react/deltas.test.ts +0 -315
  231. package/src/react/deltas.ts +0 -478
  232. package/src/react/toUIMessages.test.ts +0 -420
  233. package/src/react/toUIMessages.ts +0 -253
  234. package/src/vitest.config.ts +0 -7
  235. /package/src/component/_generated/{dataModel.d.ts → dataModel.ts} +0 -0
@@ -0,0 +1,96 @@
1
+ import { type BetterOmit, type ErrorMessage, type Expand } from "convex-helpers";
2
+ import { type UsePaginatedQueryResult } from "convex/react";
3
+ import type { FunctionArgs, FunctionReference, PaginationOptions, PaginationResult } from "convex/server";
4
+ import type { SyncStreamsReturnValue } from "../client/types.js";
5
+ import type { StreamArgs } from "../validators.js";
6
+ import type { StreamQuery } from "./types.js";
7
+ import { type UIMessage, type UIStatus } from "../UIMessages.js";
8
+ export type UIMessageLike = {
9
+ order: number;
10
+ stepOrder: number;
11
+ status: UIStatus;
12
+ parts: UIMessage["parts"];
13
+ role: UIMessage["role"];
14
+ };
15
+ export type UIMessagesQuery<Args = unknown, M extends UIMessageLike = UIMessageLike> = FunctionReference<"query", "public", {
16
+ threadId: string;
17
+ paginationOpts: PaginationOptions;
18
+ /**
19
+ * If { stream: true } is passed, it will also query for stream deltas.
20
+ * In order for this to work, the query must take as an argument streamArgs.
21
+ */
22
+ streamArgs?: StreamArgs;
23
+ } & Args, PaginationResult<M> & {
24
+ streams?: SyncStreamsReturnValue;
25
+ }>;
26
+ export type UIMessagesQueryArgs<Query extends UIMessagesQuery<unknown, UIMessageLike>> = Query extends UIMessagesQuery<unknown, UIMessageLike> ? Expand<BetterOmit<FunctionArgs<Query>, "paginationOpts" | "streamArgs">> : never;
27
+ export type UIMessagesQueryResult<Query extends UIMessagesQuery<unknown, UIMessageLike>> = Query extends UIMessagesQuery<unknown, infer M> ? M : never;
28
+ /**
29
+ * A hook that fetches UIMessages from a thread.
30
+ *
31
+ * It's similar to useThreadMessages, for endpoints that return UIMessages.
32
+ * The streaming messages are materialized as UIMessages. The rest are passed
33
+ * through from the query.
34
+ *
35
+ * This hook is a wrapper around `usePaginatedQuery` and `useStreamingUIMessages`.
36
+ * It will fetch both full messages and streaming messages, and merge them together.
37
+ *
38
+ * The query must take as arguments `{ threadId, paginationOpts }` and return a
39
+ * pagination result of objects similar to UIMessage:
40
+ *
41
+ * For streaming, it should look like this:
42
+ * ```ts
43
+ * export const listThreadMessages = query({
44
+ * args: {
45
+ * threadId: v.string(),
46
+ * paginationOpts: paginationOptsValidator,
47
+ * streamArgs: vStreamArgs,
48
+ * ... other arguments you want
49
+ * },
50
+ * handler: async (ctx, args) => {
51
+ * // await authorizeThreadAccess(ctx, threadId);
52
+ * // NOTE: listUIMessages returns UIMessages, not MessageDocs.
53
+ * const paginated = await listUIMessages(ctx, components.agent, args);
54
+ * const streams = await syncStreams(ctx, components.agent, args);
55
+ * // Here you could filter out / modify the documents & stream deltas.
56
+ * return { ...paginated, streams };
57
+ * },
58
+ * });
59
+ * ```
60
+ *
61
+ * Then the hook can be used like this:
62
+ * ```ts
63
+ * const { results, status, loadMore } = useUIMessages(
64
+ * api.myModule.listThreadMessages,
65
+ * { threadId },
66
+ * { initialNumItems: 10, stream: true }
67
+ * );
68
+ * ```
69
+ *
70
+ * @param query The query to use to fetch messages.
71
+ * It must take as arguments `{ threadId, paginationOpts }` and return a
72
+ * pagination result of objects similar to UIMessage:
73
+ * Required fields: (role, parts, status, order, stepOrder).
74
+ * To support streaming, it must also take in `streamArgs: vStreamArgs` and
75
+ * return a `streams` object returned from `syncStreams`.
76
+ * @param args The arguments to pass to the query other than `paginationOpts`
77
+ * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
78
+ * you want to pass to the query.
79
+ * @param options The options for the query. Similar to usePaginatedQuery.
80
+ * To enable streaming, pass `stream: true`.
81
+ * @returns The messages. If stream is true, it will return a list of messages
82
+ * that includes both full messages and streaming messages.
83
+ * The streaming messages are materialized as UIMessages. The rest are passed
84
+ * through from the query.
85
+ */
86
+ export declare function useUIMessages<Query extends UIMessagesQuery<any, any>>(query: Query, args: UIMessagesQueryArgs<Query> | "skip", options: {
87
+ initialNumItems: number;
88
+ stream?: Query extends StreamQuery ? boolean : ErrorMessage<"To enable streaming, your query must take in streamArgs: vStreamArgs and return a streams object returned from syncStreams. See docs.">;
89
+ skipStreamIds?: string[];
90
+ }): UsePaginatedQueryResult<UIMessagesQueryResult<Query>>;
91
+ export declare function dedupeMessages<M extends {
92
+ order: number;
93
+ stepOrder: number;
94
+ status: UIStatus;
95
+ }>(messages: M[], streamMessages: M[]): M[];
96
+ //# sourceMappingURL=useUIMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUIMessages.d.ts","sourceRoot":"","sources":["../../src/react/useUIMessages.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,KAAK,SAAS,EACd,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,IAAI,GAAG,OAAO,EACd,CAAC,SAAS,aAAa,GAAG,aAAa,IACrC,iBAAiB,CACnB,OAAO,EACP,QAAQ,EACR;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,iBAAiB,CAAC;IAClC;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,GAAG,IAAI,EACR,gBAAgB,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,sBAAsB,CAAA;CAAE,CAC3D,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,IAErD,KAAK,SAAS,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,GACjD,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,YAAY,CAAC,CAAC,GACxE,KAAK,CAAC;AAEZ,MAAM,MAAM,qBAAqB,CAC/B,KAAK,SAAS,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,IACnD,KAAK,SAAS,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACnE,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,MAAM,EACzC,OAAO,EAAE;IACP,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,SAAS,WAAW,GAC9B,OAAO,GACP,YAAY,CAAC,uIAAuI,CAAC,CAAC;IAC1J,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACA,uBAAuB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAgCvD;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS;IACR,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC;CAClB,EACD,QAAQ,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAoBzC"}
@@ -0,0 +1,108 @@
1
+ "use client";
2
+ import {} from "convex-helpers";
3
+ import { usePaginatedQuery } from "convex-helpers/react";
4
+ import {} from "convex/react";
5
+ import { useMemo } from "react";
6
+ import { combineUIMessages, } from "../UIMessages.js";
7
+ import { sorted } from "../shared.js";
8
+ import { useStreamingUIMessages } from "./useStreamingUIMessages.js";
9
+ /**
10
+ * A hook that fetches UIMessages from a thread.
11
+ *
12
+ * It's similar to useThreadMessages, for endpoints that return UIMessages.
13
+ * The streaming messages are materialized as UIMessages. The rest are passed
14
+ * through from the query.
15
+ *
16
+ * This hook is a wrapper around `usePaginatedQuery` and `useStreamingUIMessages`.
17
+ * It will fetch both full messages and streaming messages, and merge them together.
18
+ *
19
+ * The query must take as arguments `{ threadId, paginationOpts }` and return a
20
+ * pagination result of objects similar to UIMessage:
21
+ *
22
+ * For streaming, it should look like this:
23
+ * ```ts
24
+ * export const listThreadMessages = query({
25
+ * args: {
26
+ * threadId: v.string(),
27
+ * paginationOpts: paginationOptsValidator,
28
+ * streamArgs: vStreamArgs,
29
+ * ... other arguments you want
30
+ * },
31
+ * handler: async (ctx, args) => {
32
+ * // await authorizeThreadAccess(ctx, threadId);
33
+ * // NOTE: listUIMessages returns UIMessages, not MessageDocs.
34
+ * const paginated = await listUIMessages(ctx, components.agent, args);
35
+ * const streams = await syncStreams(ctx, components.agent, args);
36
+ * // Here you could filter out / modify the documents & stream deltas.
37
+ * return { ...paginated, streams };
38
+ * },
39
+ * });
40
+ * ```
41
+ *
42
+ * Then the hook can be used like this:
43
+ * ```ts
44
+ * const { results, status, loadMore } = useUIMessages(
45
+ * api.myModule.listThreadMessages,
46
+ * { threadId },
47
+ * { initialNumItems: 10, stream: true }
48
+ * );
49
+ * ```
50
+ *
51
+ * @param query The query to use to fetch messages.
52
+ * It must take as arguments `{ threadId, paginationOpts }` and return a
53
+ * pagination result of objects similar to UIMessage:
54
+ * Required fields: (role, parts, status, order, stepOrder).
55
+ * To support streaming, it must also take in `streamArgs: vStreamArgs` and
56
+ * return a `streams` object returned from `syncStreams`.
57
+ * @param args The arguments to pass to the query other than `paginationOpts`
58
+ * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
59
+ * you want to pass to the query.
60
+ * @param options The options for the query. Similar to usePaginatedQuery.
61
+ * To enable streaming, pass `stream: true`.
62
+ * @returns The messages. If stream is true, it will return a list of messages
63
+ * that includes both full messages and streaming messages.
64
+ * The streaming messages are materialized as UIMessages. The rest are passed
65
+ * through from the query.
66
+ */
67
+ export function useUIMessages(query, args, options) {
68
+ // These are full messages
69
+ const paginated = usePaginatedQuery(query, args, { initialNumItems: options.initialNumItems });
70
+ const startOrder = paginated.results.length
71
+ ? Math.min(...paginated.results.map((m) => m.order))
72
+ : 0;
73
+ // These are streaming messages that will not include full messages.
74
+ const streamMessages = useStreamingUIMessages(query, !options.stream ||
75
+ args === "skip" ||
76
+ paginated.status === "LoadingFirstPage"
77
+ ? "skip"
78
+ : { ...args, paginationOpts: { cursor: null, numItems: 0 } }, { startOrder, skipStreamIds: options.skipStreamIds });
79
+ const merged = useMemo(() => {
80
+ // Messages may have been split by pagination. Re-combine them here.
81
+ const combined = combineUIMessages(sorted(paginated.results));
82
+ return {
83
+ ...paginated,
84
+ results: dedupeMessages(combined, streamMessages ?? []),
85
+ };
86
+ }, [paginated, streamMessages]);
87
+ return merged;
88
+ }
89
+ export function dedupeMessages(messages, streamMessages) {
90
+ return sorted(messages.concat(streamMessages)).reduce((msgs, msg) => {
91
+ const last = msgs.at(-1);
92
+ if (!last) {
93
+ return [msg];
94
+ }
95
+ if (last.order !== msg.order || last.stepOrder !== msg.stepOrder) {
96
+ return [...msgs, msg];
97
+ }
98
+ if ((last.status === "pending" || last.status === "streaming") &&
99
+ msg.status !== "pending") {
100
+ // Let's prefer a streaming or finalized message over a pending
101
+ // one.
102
+ return [...msgs.slice(0, -1), msg];
103
+ }
104
+ // skip the new one if the previous one (listed) was finalized
105
+ return msgs;
106
+ }, []);
107
+ }
108
+ //# sourceMappingURL=useUIMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUIMessages.js","sourceRoot":"","sources":["../../src/react/useUIMessages.ts"],"names":[],"mappings":"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"}
package/dist/shared.d.ts CHANGED
@@ -1,10 +1,26 @@
1
- import type { CoreMessage } from "ai";
2
- import type { Message } from "./validators.js";
1
+ import type { FilePart, ImagePart, ReasoningPart, ToolCallPart, ToolResultPart, ToolApprovalRequest } from "@ai-sdk/provider-utils";
2
+ import type { ModelMessage, TextPart, UIDataTypes, UIMessagePart, UITools } from "ai";
3
+ import type { Message, MessageContentParts } from "./validators.js";
3
4
  export declare const DEFAULT_RECENT_MESSAGES = 100;
4
- export declare function isTool(message: Message | CoreMessage): boolean;
5
- export declare function extractText(message: Message | CoreMessage): string | undefined;
5
+ export declare function isTool(message: Message | ModelMessage): boolean;
6
+ export declare function extractText(message: Message | ModelMessage): string | undefined;
7
+ export declare function joinText(parts: (UIMessagePart<UIDataTypes, UITools> | TextPart | ImagePart | FilePart | ReasoningPart | ToolCallPart | ToolResultPart | MessageContentParts | ToolApprovalRequest)[]): string;
8
+ export declare function extractReasoning(message: Message | ModelMessage): string | undefined;
6
9
  export declare const DEFAULT_MESSAGE_RANGE: {
7
10
  before: number;
8
11
  after: number;
9
12
  };
13
+ export declare function sorted<T extends {
14
+ order: number;
15
+ stepOrder: number;
16
+ }>(messages: T[], order?: "asc" | "desc"): T[];
17
+ export type ModelOrMetadata = string | ({
18
+ provider: string;
19
+ } & ({
20
+ modelId: string;
21
+ } | {
22
+ model: string;
23
+ }));
24
+ export declare function getModelName(embeddingModel: ModelOrMetadata): string;
25
+ export declare function getProviderName(embeddingModel: ModelOrMetadata): string;
10
26
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,WAOpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,sBAoBzD;AAED,eAAO,MAAM,qBAAqB;;;CAA0B,CAAC"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,YAAY,EACZ,cAAc,EACd,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,aAAa,EACb,OAAO,EACR,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,WAOrD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,sBAkB1D;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CACH,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,GACnC,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,aAAa,GACb,YAAY,GACZ,cAAc,GACd,mBAAmB,GACnB,mBAAmB,CACtB,EAAE,UAOJ;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,sBAQ/D;AAED,eAAO,MAAM,qBAAqB;;;CAA0B,CAAC;AAE7D,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACnE,QAAQ,EAAE,CAAC,EAAE,EACb,KAAK,GAAE,KAAK,GAAG,MAAc,GAC5B,CAAC,EAAE,CAML;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEvE,wBAAgB,YAAY,CAAC,cAAc,EAAE,eAAe,GAAG,MAAM,CAUpE;AAED,wBAAgB,eAAe,CAAC,cAAc,EAAE,eAAe,GAAG,MAAM,CAKvE"}
package/dist/shared.js CHANGED
@@ -11,20 +11,57 @@ export function extractText(message) {
11
11
  if (typeof message.content === "string") {
12
12
  return message.content;
13
13
  }
14
- return message.content
15
- .filter((c) => c.type === "text")
16
- .map((c) => c.text)
17
- .join("");
14
+ return joinText(message.content);
18
15
  case "assistant":
19
16
  if (typeof message.content === "string") {
20
17
  return message.content;
21
18
  }
22
- return message.content
23
- .filter((c) => c.type === "text")
24
- .map((c) => c.text)
25
- .join("");
19
+ else {
20
+ return joinText(message.content) || undefined;
21
+ }
22
+ case "system":
23
+ return message.content;
24
+ // we don't extract text from tool messages
26
25
  }
27
26
  return undefined;
28
27
  }
28
+ export function joinText(parts) {
29
+ return parts
30
+ .filter((p) => p.type === "text")
31
+ .map((p) => p.text)
32
+ .filter(Boolean)
33
+ .join(" ");
34
+ }
35
+ export function extractReasoning(message) {
36
+ if (typeof message.content === "string") {
37
+ return undefined;
38
+ }
39
+ return message.content
40
+ .filter((c) => c.type === "reasoning")
41
+ .map((c) => c.text)
42
+ .join(" ");
43
+ }
29
44
  export const DEFAULT_MESSAGE_RANGE = { before: 2, after: 1 };
45
+ export function sorted(messages, order = "asc") {
46
+ return [...messages].sort(order === "asc"
47
+ ? (a, b) => a.order - b.order || a.stepOrder - b.stepOrder
48
+ : (a, b) => b.order - a.order || b.stepOrder - a.stepOrder);
49
+ }
50
+ export function getModelName(embeddingModel) {
51
+ if (typeof embeddingModel === "string") {
52
+ if (embeddingModel.includes("/")) {
53
+ return embeddingModel.split("/").slice(1).join("/");
54
+ }
55
+ return embeddingModel;
56
+ }
57
+ return "modelId" in embeddingModel
58
+ ? embeddingModel.modelId
59
+ : embeddingModel.model;
60
+ }
61
+ export function getProviderName(embeddingModel) {
62
+ if (typeof embeddingModel === "string") {
63
+ return embeddingModel.split("/").at(0);
64
+ }
65
+ return embeddingModel.provider;
66
+ }
30
67
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,MAAM,UAAU,MAAM,CAAC,OAA8B;IACnD,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,MAAM;QACvB,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAC3B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA8B;IACxD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,OAAO,CAAC,OAAO,CAAC;YACzB,CAAC;YACD,OAAO,OAAO,CAAC,OAAO;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,KAAK,WAAW;YACd,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,OAAO,CAAC,OAAO,CAAC;YACzB,CAAC;YACD,OAAO,OAAO,CAAC,OAAO;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}