@convex-dev/agent 0.6.0-alpha.1 → 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 (181) hide show
  1. package/package.json +1 -1
  2. package/src/UIMessages.ts +135 -0
  3. package/src/client/index.ts +56 -14
  4. package/src/client/search.test.ts +4 -5
  5. package/src/client/search.ts +45 -4
  6. package/src/client/streaming.integration.test.ts +1206 -0
  7. package/src/client/streaming.ts +9 -2
  8. package/src/mapping.test.ts +136 -71
  9. package/src/mapping.ts +81 -28
  10. package/dist/UIMessages.d.ts +0 -46
  11. package/dist/UIMessages.d.ts.map +0 -1
  12. package/dist/UIMessages.js +0 -546
  13. package/dist/UIMessages.js.map +0 -1
  14. package/dist/client/createTool.d.ts +0 -167
  15. package/dist/client/createTool.d.ts.map +0 -1
  16. package/dist/client/createTool.js +0 -116
  17. package/dist/client/createTool.js.map +0 -1
  18. package/dist/client/defaultComponent.d.ts +0 -11
  19. package/dist/client/defaultComponent.d.ts.map +0 -1
  20. package/dist/client/defaultComponent.js +0 -7
  21. package/dist/client/defaultComponent.js.map +0 -1
  22. package/dist/client/definePlaygroundAPI.d.ts +0 -1725
  23. package/dist/client/definePlaygroundAPI.d.ts.map +0 -1
  24. package/dist/client/definePlaygroundAPI.js +0 -271
  25. package/dist/client/definePlaygroundAPI.js.map +0 -1
  26. package/dist/client/files.d.ts +0 -69
  27. package/dist/client/files.d.ts.map +0 -1
  28. package/dist/client/files.js +0 -181
  29. package/dist/client/files.js.map +0 -1
  30. package/dist/client/index.d.ts +0 -2091
  31. package/dist/client/index.d.ts.map +0 -1
  32. package/dist/client/index.js +0 -895
  33. package/dist/client/index.js.map +0 -1
  34. package/dist/client/messages.d.ts +0 -461
  35. package/dist/client/messages.d.ts.map +0 -1
  36. package/dist/client/messages.js +0 -106
  37. package/dist/client/messages.js.map +0 -1
  38. package/dist/client/mockModel.d.ts +0 -42
  39. package/dist/client/mockModel.d.ts.map +0 -1
  40. package/dist/client/mockModel.js +0 -182
  41. package/dist/client/mockModel.js.map +0 -1
  42. package/dist/client/saveInputMessages.d.ts +0 -20
  43. package/dist/client/saveInputMessages.d.ts.map +0 -1
  44. package/dist/client/saveInputMessages.js +0 -58
  45. package/dist/client/saveInputMessages.js.map +0 -1
  46. package/dist/client/search.d.ts +0 -493
  47. package/dist/client/search.d.ts.map +0 -1
  48. package/dist/client/search.js +0 -425
  49. package/dist/client/search.js.map +0 -1
  50. package/dist/client/start.d.ts +0 -84
  51. package/dist/client/start.d.ts.map +0 -1
  52. package/dist/client/start.js +0 -185
  53. package/dist/client/start.js.map +0 -1
  54. package/dist/client/streamText.d.ts +0 -46
  55. package/dist/client/streamText.d.ts.map +0 -1
  56. package/dist/client/streamText.js +0 -117
  57. package/dist/client/streamText.js.map +0 -1
  58. package/dist/client/streaming.d.ts +0 -3778
  59. package/dist/client/streaming.d.ts.map +0 -1
  60. package/dist/client/streaming.js +0 -314
  61. package/dist/client/streaming.js.map +0 -1
  62. package/dist/client/threads.d.ts +0 -46
  63. package/dist/client/threads.d.ts.map +0 -1
  64. package/dist/client/threads.js +0 -49
  65. package/dist/client/threads.js.map +0 -1
  66. package/dist/client/types.d.ts +0 -461
  67. package/dist/client/types.d.ts.map +0 -1
  68. package/dist/client/types.js +0 -2
  69. package/dist/client/types.js.map +0 -1
  70. package/dist/client/utils.d.ts +0 -4
  71. package/dist/client/utils.d.ts.map +0 -1
  72. package/dist/client/utils.js +0 -21
  73. package/dist/client/utils.js.map +0 -1
  74. package/dist/component/_generated/api.d.ts +0 -48
  75. package/dist/component/_generated/api.d.ts.map +0 -1
  76. package/dist/component/_generated/api.js +0 -31
  77. package/dist/component/_generated/api.js.map +0 -1
  78. package/dist/component/_generated/component.d.ts +0 -3120
  79. package/dist/component/_generated/component.d.ts.map +0 -1
  80. package/dist/component/_generated/component.js +0 -11
  81. package/dist/component/_generated/component.js.map +0 -1
  82. package/dist/component/_generated/dataModel.d.ts +0 -46
  83. package/dist/component/_generated/dataModel.d.ts.map +0 -1
  84. package/dist/component/_generated/dataModel.js +0 -11
  85. package/dist/component/_generated/dataModel.js.map +0 -1
  86. package/dist/component/_generated/server.d.ts +0 -121
  87. package/dist/component/_generated/server.d.ts.map +0 -1
  88. package/dist/component/_generated/server.js +0 -78
  89. package/dist/component/_generated/server.js.map +0 -1
  90. package/dist/component/apiKeys.d.ts +0 -11
  91. package/dist/component/apiKeys.d.ts.map +0 -1
  92. package/dist/component/apiKeys.js +0 -69
  93. package/dist/component/apiKeys.js.map +0 -1
  94. package/dist/component/convex.config.d.ts +0 -3
  95. package/dist/component/convex.config.d.ts.map +0 -1
  96. package/dist/component/convex.config.js +0 -3
  97. package/dist/component/convex.config.js.map +0 -1
  98. package/dist/component/files.d.ts +0 -97
  99. package/dist/component/files.d.ts.map +0 -1
  100. package/dist/component/files.js +0 -190
  101. package/dist/component/files.js.map +0 -1
  102. package/dist/component/messages.d.ts +0 -3851
  103. package/dist/component/messages.d.ts.map +0 -1
  104. package/dist/component/messages.js +0 -757
  105. package/dist/component/messages.js.map +0 -1
  106. package/dist/component/schema.d.ts +0 -8026
  107. package/dist/component/schema.d.ts.map +0 -1
  108. package/dist/component/schema.js +0 -147
  109. package/dist/component/schema.js.map +0 -1
  110. package/dist/component/streams.d.ts +0 -128
  111. package/dist/component/streams.d.ts.map +0 -1
  112. package/dist/component/streams.js +0 -413
  113. package/dist/component/streams.js.map +0 -1
  114. package/dist/component/threads.d.ts +0 -115
  115. package/dist/component/threads.d.ts.map +0 -1
  116. package/dist/component/threads.js +0 -208
  117. package/dist/component/threads.js.map +0 -1
  118. package/dist/component/users.d.ts +0 -52
  119. package/dist/component/users.d.ts.map +0 -1
  120. package/dist/component/users.js +0 -229
  121. package/dist/component/users.js.map +0 -1
  122. package/dist/component/vector/index.d.ts +0 -61
  123. package/dist/component/vector/index.d.ts.map +0 -1
  124. package/dist/component/vector/index.js +0 -146
  125. package/dist/component/vector/index.js.map +0 -1
  126. package/dist/component/vector/tables.d.ts +0 -58
  127. package/dist/component/vector/tables.d.ts.map +0 -1
  128. package/dist/component/vector/tables.js +0 -56
  129. package/dist/component/vector/tables.js.map +0 -1
  130. package/dist/deltas.d.ts +0 -43
  131. package/dist/deltas.d.ts.map +0 -1
  132. package/dist/deltas.js +0 -446
  133. package/dist/deltas.js.map +0 -1
  134. package/dist/mapping.d.ts +0 -72
  135. package/dist/mapping.d.ts.map +0 -1
  136. package/dist/mapping.js +0 -677
  137. package/dist/mapping.js.map +0 -1
  138. package/dist/react/SmoothText.d.ts +0 -5
  139. package/dist/react/SmoothText.d.ts.map +0 -1
  140. package/dist/react/SmoothText.js +0 -6
  141. package/dist/react/SmoothText.js.map +0 -1
  142. package/dist/react/index.d.ts +0 -25
  143. package/dist/react/index.d.ts.map +0 -1
  144. package/dist/react/index.js +0 -70
  145. package/dist/react/index.js.map +0 -1
  146. package/dist/react/optimisticallySendMessage.d.ts +0 -42
  147. package/dist/react/optimisticallySendMessage.d.ts.map +0 -1
  148. package/dist/react/optimisticallySendMessage.js +0 -74
  149. package/dist/react/optimisticallySendMessage.js.map +0 -1
  150. package/dist/react/types.d.ts +0 -12
  151. package/dist/react/types.d.ts.map +0 -1
  152. package/dist/react/types.js +0 -2
  153. package/dist/react/types.js.map +0 -1
  154. package/dist/react/useDeltaStreams.d.ts +0 -10
  155. package/dist/react/useDeltaStreams.d.ts.map +0 -1
  156. package/dist/react/useDeltaStreams.js +0 -106
  157. package/dist/react/useDeltaStreams.js.map +0 -1
  158. package/dist/react/useSmoothText.d.ts +0 -27
  159. package/dist/react/useSmoothText.d.ts.map +0 -1
  160. package/dist/react/useSmoothText.js +0 -68
  161. package/dist/react/useSmoothText.js.map +0 -1
  162. package/dist/react/useStreamingUIMessages.d.ts +0 -22
  163. package/dist/react/useStreamingUIMessages.d.ts.map +0 -1
  164. package/dist/react/useStreamingUIMessages.js +0 -92
  165. package/dist/react/useStreamingUIMessages.js.map +0 -1
  166. package/dist/react/useThreadMessages.d.ts +0 -104
  167. package/dist/react/useThreadMessages.d.ts.map +0 -1
  168. package/dist/react/useThreadMessages.js +0 -148
  169. package/dist/react/useThreadMessages.js.map +0 -1
  170. package/dist/react/useUIMessages.d.ts +0 -96
  171. package/dist/react/useUIMessages.d.ts.map +0 -1
  172. package/dist/react/useUIMessages.js +0 -108
  173. package/dist/react/useUIMessages.js.map +0 -1
  174. package/dist/shared.d.ts +0 -26
  175. package/dist/shared.d.ts.map +0 -1
  176. package/dist/shared.js +0 -67
  177. package/dist/shared.js.map +0 -1
  178. package/dist/validators.d.ts +0 -24516
  179. package/dist/validators.d.ts.map +0 -1
  180. package/dist/validators.js +0 -475
  181. package/dist/validators.js.map +0 -1
@@ -1,92 +0,0 @@
1
- "use client";
2
- import { useMemo, useState, useEffect } from "react";
3
- import {} from "ai";
4
- import {} from "../UIMessages.js";
5
- import { blankUIMessage, getParts, updateFromUIMessageChunks, deriveUIMessagesFromTextStreamParts, } from "../deltas.js";
6
- import { useDeltaStreams } from "./useDeltaStreams.js";
7
- // Polyfill structuredClone to support readUIMessageStream on ReactNative
8
- if (!("structuredClone" in globalThis)) {
9
- void import("@ungap/structured-clone").then(({ default: structuredClone }) => (globalThis.structuredClone = structuredClone));
10
- }
11
- /**
12
- * A hook that fetches streaming messages from a thread and converts them to UIMessages
13
- * using AI SDK's readUIMessageStream.
14
- * This ONLY returns streaming UIMessages. To get both full and streaming messages,
15
- * use `useUIMessages`.
16
- *
17
- * @param query The query to use to fetch messages.
18
- * It must take as arguments `{ threadId, paginationOpts, streamArgs }` and
19
- * return a `streams` object returned from `agent.syncStreams`.
20
- * @param args The arguments to pass to the query other than `paginationOpts`
21
- * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
22
- * you want to pass to the query.
23
- * @returns The streaming UIMessages.
24
- */
25
- export function useStreamingUIMessages(query, args, options) {
26
- const [messageState, setMessageState] = useState({});
27
- const streams = useDeltaStreams(query, args, options);
28
- const threadId = args === "skip" ? undefined : args.threadId;
29
- useEffect(() => {
30
- if (!streams)
31
- return;
32
- // return if there are no new deltas beyond the cursors
33
- let noNewDeltas = true;
34
- for (const stream of streams) {
35
- const lastDelta = stream.deltas.at(-1);
36
- const cursor = messageState[stream.streamMessage.streamId]?.cursor;
37
- if (!cursor) {
38
- noNewDeltas = false;
39
- break;
40
- }
41
- if (lastDelta && lastDelta.start >= cursor) {
42
- noNewDeltas = false;
43
- break;
44
- }
45
- }
46
- if (noNewDeltas) {
47
- return;
48
- }
49
- const abortController = new AbortController();
50
- void (async () => {
51
- const newMessageState = Object.fromEntries(await Promise.all(streams.map(async ({ deltas, streamMessage }) => {
52
- const { parts, cursor } = getParts(deltas, 0);
53
- if (streamMessage.format === "UIMessageChunk") {
54
- // Unfortunately this can't handle resuming from a UIMessage and
55
- // adding more chunks, so we re-create it from scratch each time.
56
- const uiMessage = await updateFromUIMessageChunks(blankUIMessage(streamMessage, threadId), parts);
57
- return [
58
- streamMessage.streamId,
59
- {
60
- uiMessage,
61
- cursor,
62
- },
63
- ];
64
- }
65
- else {
66
- const [uiMessages] = deriveUIMessagesFromTextStreamParts(threadId, [streamMessage], [], deltas);
67
- return [
68
- streamMessage.streamId,
69
- {
70
- uiMessage: uiMessages[0],
71
- cursor,
72
- },
73
- ];
74
- }
75
- })));
76
- if (abortController.signal.aborted)
77
- return;
78
- setMessageState(newMessageState);
79
- })();
80
- return () => {
81
- abortController.abort();
82
- };
83
- }, [messageState, streams, threadId]);
84
- return useMemo(() => {
85
- if (!streams)
86
- return undefined;
87
- return streams
88
- .map(({ streamMessage }) => messageState[streamMessage.streamId]?.uiMessage)
89
- .filter((uiMessage) => uiMessage !== undefined);
90
- }, [messageState, streams]);
91
- }
92
- //# sourceMappingURL=useStreamingUIMessages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useStreamingUIMessages.js","sourceRoot":"","sources":["../../src/react/useStreamingUIMessages.ts"],"names":[],"mappings":"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"}
@@ -1,104 +0,0 @@
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 { Message, MessageDoc, MessageStatus, StreamArgs } from "../validators.js";
6
- import type { StreamQueryArgs, StreamQuery } from "./types.js";
7
- export type MessageDocLike = {
8
- order: number;
9
- stepOrder: number;
10
- status: MessageStatus | "streaming";
11
- message?: Message;
12
- };
13
- export type ThreadMessagesQuery<Args = unknown, M extends MessageDocLike = MessageDocLike> = FunctionReference<"query", "public", {
14
- threadId: string;
15
- paginationOpts: PaginationOptions;
16
- /**
17
- * If { stream: true } is passed, it will also query for stream deltas.
18
- * In order for this to work, the query must take as an argument streamArgs.
19
- */
20
- streamArgs?: StreamArgs;
21
- } & Args, PaginationResult<M> & {
22
- streams?: SyncStreamsReturnValue;
23
- }>;
24
- export type ThreadMessagesArgs<Query extends ThreadMessagesQuery<unknown, MessageDocLike>> = Query extends ThreadMessagesQuery<unknown, MessageDocLike> ? Expand<BetterOmit<FunctionArgs<Query>, "paginationOpts" | "streamArgs">> : never;
25
- export type ThreadMessagesResult<Query extends ThreadMessagesQuery<unknown, MessageDocLike>> = Query extends ThreadMessagesQuery<unknown, infer M> ? M : never;
26
- /**
27
- * A hook that fetches messages from a thread.
28
- *
29
- * This hook is a wrapper around `usePaginatedQuery` and `useStreamingThreadMessages`.
30
- * It will fetch both full messages and streaming messages, and merge them together.
31
- *
32
- * The query must take as arguments `{ threadId, paginationOpts }` and return a
33
- * pagination result of objects that extend `MessageDoc`.
34
- *
35
- * For streaming, it should look like this:
36
- * ```ts
37
- * export const listThreadMessages = query({
38
- * args: {
39
- * threadId: v.string(),
40
- * paginationOpts: paginationOptsValidator,
41
- * streamArgs: vStreamArgs,
42
- * ... other arguments you want
43
- * },
44
- * handler: async (ctx, args) => {
45
- * // await authorizeThreadAccess(ctx, threadId);
46
- * // NOTE: listMessages returns MessageDocs, not UIMessages.
47
- * const paginated = await listMessages(ctx, components.agent, args);
48
- * const streams = await syncStreams(ctx, components.agent, args);
49
- * // Here you could filter out / modify the documents & stream deltas.
50
- * return { ...paginated, streams };
51
- * },
52
- * });
53
- * ```
54
- *
55
- * Then the hook can be used like this:
56
- * ```ts
57
- * const { results, status, loadMore } = useThreadMessages(
58
- * api.myModule.listThreadMessages,
59
- * { threadId },
60
- * { initialNumItems: 10, stream: true }
61
- * );
62
- * ```
63
- *
64
- * @param query The query to use to fetch messages.
65
- * It must take as arguments `{ threadId, paginationOpts }` and return a
66
- * pagination result of objects that extend `MessageDoc`.
67
- * To support streaming, it must also take in `streamArgs: vStreamArgs` and
68
- * return a `streams` object returned from `agent.syncStreams`.
69
- * @param args The arguments to pass to the query other than `paginationOpts`
70
- * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
71
- * you want to pass to the query.
72
- * @param options The options for the query. Similar to usePaginatedQuery.
73
- * To enable streaming, pass `stream: true`.
74
- * @returns The messages. If stream is true, it will return a list of messages
75
- * that includes both full messages and streaming messages.
76
- */
77
- export declare function useThreadMessages<Query extends ThreadMessagesQuery<any, any>>(query: Query, args: ThreadMessagesArgs<Query> | "skip", options: {
78
- initialNumItems: number;
79
- 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.">;
80
- }): UsePaginatedQueryResult<ThreadMessagesResult<Query> & {
81
- streaming: boolean;
82
- key: string;
83
- }>;
84
- /**
85
- * @deprecated FYI `useStreamingUIMessages` is likely better for you.
86
- * A hook that fetches streaming messages from a thread.
87
- * This ONLY returns streaming messages. To get both, use `useThreadMessages`.
88
- *
89
- * @param query The query to use to fetch messages.
90
- * It must take as arguments `{ threadId, paginationOpts, streamArgs }` and
91
- * return a `streams` object returned from `agent.syncStreams`.
92
- * @param args The arguments to pass to the query other than `paginationOpts`
93
- * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
94
- * you want to pass to the query.
95
- * @returns The streaming messages.
96
- */
97
- export declare function useStreamingThreadMessages<Query extends StreamQuery<any>>(query: Query, args: (StreamQueryArgs<Query> & {
98
- /** @deprecated Pass startOrder to the next argument (third argument). */
99
- startOrder?: number;
100
- }) | "skip", options?: {
101
- startOrder?: number;
102
- skipStreamIds?: string[];
103
- }): Array<MessageDoc> | undefined;
104
- //# sourceMappingURL=useThreadMessages.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useThreadMessages.d.ts","sourceRoot":"","sources":["../../src/react/useThreadMessages.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,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;AAGjE,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,aAAa,EACb,UAAU,EACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/D,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAC7B,IAAI,GAAG,OAAO,EACd,CAAC,SAAS,cAAc,GAAG,cAAc,IACvC,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,kBAAkB,CAC5B,KAAK,SAAS,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,IAE1D,KAAK,SAAS,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,GACtD,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,YAAY,CAAC,CAAC,GACxE,KAAK,CAAC;AAEZ,MAAM,MAAM,oBAAoB,CAC9B,KAAK,SAAS,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,IACxD,KAAK,SAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3E,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,MAAM,EACxC,OAAO,EAAE;IACP,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,SAAS,WAAW,GAC9B,OAAO,GACP,YAAY,CAAC,uIAAuI,CAAC,CAAC;CAC3J,GACA,uBAAuB,CACxB,oBAAoB,CAAC,KAAK,CAAC,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAClE,CA4EA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,WAAW,CAAC,GAAG,CAAC,EACvE,KAAK,EAAE,KAAK,EACZ,IAAI,EACA,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,GACF,MAAM,EACV,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACA,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,CA6B/B"}
@@ -1,148 +0,0 @@
1
- "use client";
2
- import { omit, } from "convex-helpers";
3
- import { usePaginatedQuery } from "convex-helpers/react";
4
- import {} from "convex/react";
5
- import { useMemo, useState, useEffect, useRef } from "react";
6
- import { sorted } from "../shared.js";
7
- import { fromUIMessages } from "../UIMessages.js";
8
- import { useStreamingUIMessages } from "./useStreamingUIMessages.js";
9
- /**
10
- * A hook that fetches messages from a thread.
11
- *
12
- * This hook is a wrapper around `usePaginatedQuery` and `useStreamingThreadMessages`.
13
- * It will fetch both full messages and streaming messages, and merge them together.
14
- *
15
- * The query must take as arguments `{ threadId, paginationOpts }` and return a
16
- * pagination result of objects that extend `MessageDoc`.
17
- *
18
- * For streaming, it should look like this:
19
- * ```ts
20
- * export const listThreadMessages = query({
21
- * args: {
22
- * threadId: v.string(),
23
- * paginationOpts: paginationOptsValidator,
24
- * streamArgs: vStreamArgs,
25
- * ... other arguments you want
26
- * },
27
- * handler: async (ctx, args) => {
28
- * // await authorizeThreadAccess(ctx, threadId);
29
- * // NOTE: listMessages returns MessageDocs, not UIMessages.
30
- * const paginated = await listMessages(ctx, components.agent, args);
31
- * const streams = await syncStreams(ctx, components.agent, args);
32
- * // Here you could filter out / modify the documents & stream deltas.
33
- * return { ...paginated, streams };
34
- * },
35
- * });
36
- * ```
37
- *
38
- * Then the hook can be used like this:
39
- * ```ts
40
- * const { results, status, loadMore } = useThreadMessages(
41
- * api.myModule.listThreadMessages,
42
- * { threadId },
43
- * { initialNumItems: 10, stream: true }
44
- * );
45
- * ```
46
- *
47
- * @param query The query to use to fetch messages.
48
- * It must take as arguments `{ threadId, paginationOpts }` and return a
49
- * pagination result of objects that extend `MessageDoc`.
50
- * To support streaming, it must also take in `streamArgs: vStreamArgs` and
51
- * return a `streams` object returned from `agent.syncStreams`.
52
- * @param args The arguments to pass to the query other than `paginationOpts`
53
- * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
54
- * you want to pass to the query.
55
- * @param options The options for the query. Similar to usePaginatedQuery.
56
- * To enable streaming, pass `stream: true`.
57
- * @returns The messages. If stream is true, it will return a list of messages
58
- * that includes both full messages and streaming messages.
59
- */
60
- export function useThreadMessages(query, args, options) {
61
- // These are full messages
62
- const paginated = usePaginatedQuery(query, args, { initialNumItems: options.initialNumItems });
63
- let startOrder = paginated.results.at(-1)?.order ?? 0;
64
- for (let i = paginated.results.length - 1; i >= 0; i--) {
65
- const m = paginated.results[i];
66
- if (!m.streaming && m.status === "pending") {
67
- // round down to the nearest 10 for some cache benefits
68
- startOrder = m.order - (m.order % 10);
69
- break;
70
- }
71
- }
72
- // These are streaming messages that will not include full messages.
73
- const streamMessages = useStreamingThreadMessages(query, !options.stream ||
74
- args === "skip" ||
75
- paginated.status === "LoadingFirstPage"
76
- ? "skip"
77
- : { ...args, paginationOpts: { cursor: null, numItems: 0 } }, { startOrder });
78
- const threadId = args === "skip" ? undefined : args.threadId;
79
- const merged = useMemo(() => {
80
- const streamListMessages = streamMessages?.map((m) => ({
81
- ...m,
82
- streaming: !m.status || m.status === "pending",
83
- })) ?? [];
84
- return {
85
- ...paginated,
86
- results: sorted(paginated.results
87
- .map((m) => ({ ...m, streaming: false }))
88
- // Note: this is intentionally after paginated results.
89
- .concat(streamListMessages)).reduce((msgs, msg) => {
90
- msg.key = `${threadId}-${msg.order}-${msg.stepOrder}`;
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" &&
99
- (msg.streaming || 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
- }, [paginated, streamMessages, threadId]);
109
- return merged;
110
- }
111
- /**
112
- * @deprecated FYI `useStreamingUIMessages` is likely better for you.
113
- * A hook that fetches streaming messages from a thread.
114
- * This ONLY returns streaming messages. To get both, use `useThreadMessages`.
115
- *
116
- * @param query The query to use to fetch messages.
117
- * It must take as arguments `{ threadId, paginationOpts, streamArgs }` and
118
- * return a `streams` object returned from `agent.syncStreams`.
119
- * @param args The arguments to pass to the query other than `paginationOpts`
120
- * and `streamArgs`. So `{ threadId }` at minimum, plus any other arguments that
121
- * you want to pass to the query.
122
- * @returns The streaming messages.
123
- */
124
- export function useStreamingThreadMessages(query, args, options) {
125
- const queryArgs = args === "skip"
126
- ? args
127
- : omit(args, ["startOrder"]);
128
- const startOrder = args === "skip" ? undefined : (args.startOrder ?? undefined);
129
- const queryOptions = { startOrder, ...options };
130
- const uiMessages = useStreamingUIMessages(query, queryArgs, queryOptions);
131
- const [messages, setMessages] = useState();
132
- const generationRef = useRef(0);
133
- useEffect(() => {
134
- if (args === "skip" || !uiMessages) {
135
- setMessages(undefined);
136
- return;
137
- }
138
- const currentGeneration = ++generationRef.current;
139
- (async () => {
140
- const nested = await Promise.all(uiMessages.map((m) => fromUIMessages([m], { threadId: args.threadId })));
141
- if (generationRef.current === currentGeneration) {
142
- setMessages(nested.flat());
143
- }
144
- })();
145
- }, [uiMessages, args === "skip" ? undefined : args.threadId]);
146
- return messages;
147
- }
148
- //# sourceMappingURL=useThreadMessages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useThreadMessages.js","sourceRoot":"","sources":["../../src/react/useThreadMessages.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EACL,IAAI,GAIL,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAGN,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQlD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAsCrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,IAAwC,EACxC,OAKC;IAID,0BAA0B;IAC1B,MAAM,SAAS,GAAG,iBAAiB,CACjC,KAAK,EACL,IAA0C,EAC1C,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAC7C,CAAC;IAEF,IAAI,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3C,uDAAuD;YACvD,UAAU,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YACtC,MAAM;QACR,CAAC;IACH,CAAC;IACD,oEAAoE;IACpE,MAAM,cAAc,GAAG,0BAA0B,CAC/C,KAA+C,EAC/C,CAAC,OAAO,CAAC,MAAM;QACb,IAAI,KAAK,MAAM;QACf,SAAS,CAAC,MAAM,KAAK,kBAAkB;QACvC,CAAC,CAAC,MAAM;QACR,CAAC,CAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAU,EACvE,EAAE,UAAU,EAAE,CACf,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,MAAM,kBAAkB,GACtB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,CAAC;YACJ,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;SAC/C,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO;YACL,GAAG,SAAS;YACZ,OAAO,EAAE,MAAM,CACb,SAAS,CAAC,OAAO;iBACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,uDAAuD;iBACtD,MAAM,CAAC,kBAAkB,CAGxB,CACL,CAAC,MAAM,CACN,CAAC,IAAI,EAAE,GAAyD,EAAE,EAAE;gBAClE,GAAG,CAAC,GAAG,GAAG,GAAG,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;oBACjE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;gBACxB,CAAC;gBACD,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;oBACzB,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,EAC3C,CAAC;oBACD,+DAA+D;oBAC/D,OAAO;oBACP,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrC,CAAC;gBACD,8DAA8D;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC,EACD,EAA8D,CAC/D;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1C,OAAO,MAGN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAY,EACZ,IAKU,EACV,OAGC;IAED,MAAM,SAAS,GACb,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,IAAI;QACN,CAAC,CAAE,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAuC,CAAC;IACxE,MAAM,UAAU,GACd,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAiC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,WAAW,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC;QAClD,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CACxE,CAAC;YACF,IAAI,aAAa,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;gBAChD,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,96 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,108 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"useUIMessages.js","sourceRoot":"","sources":["../../src/react/useUIMessages.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAIN,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAGN,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,EAGL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAuCrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAY,EACZ,IAAyC,EACzC,OAMC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,iBAAiB,CACjC,KAAK,EACL,IAA0C,EAC1C,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAC7C,CAAC;IAEF,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM;QACzC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC;IACN,oEAAoE;IACpE,MAAM,cAAc,GAAG,sBAAsB,CAC3C,KAAgD,EAChD,CAAC,OAAO,CAAC,MAAM;QACb,IAAI,KAAK,MAAM;QACf,SAAS,CAAC,MAAM,KAAK,kBAAkB;QACvC,CAAC,CAAC,MAAM;QACR,CAAC,CAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAU,EACvE,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CACrD,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,oEAAoE;QACpE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,OAAO;YACL,GAAG,SAAS;YACZ,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,cAAc,IAAI,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAEhC,OAAO,MAAsC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc,CAM5B,QAAa,EAAE,cAAmB;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IACE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;YAC1D,GAAG,CAAC,MAAM,KAAK,SAAS,EACxB,CAAC;YACD,+DAA+D;YAC/D,OAAO;YACP,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,8DAA8D;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAS,CAAC,CAAC;AAChB,CAAC"}
package/dist/shared.d.ts DELETED
@@ -1,26 +0,0 @@
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";
4
- export declare const DEFAULT_RECENT_MESSAGES = 100;
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;
9
- export declare const DEFAULT_MESSAGE_RANGE: {
10
- before: number;
11
- after: number;
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;
26
- //# sourceMappingURL=shared.d.ts.map
@@ -1 +0,0 @@
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"}