@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
@@ -1,6 +1,13 @@
1
+ import { embedMany as embedMany_, } from "ai";
1
2
  import { assert } from "convex-helpers";
2
- import { DEFAULT_MESSAGE_RANGE, DEFAULT_RECENT_MESSAGES, extractText, } from "../shared.js";
3
+ import { validateVectorDimension, } from "../component/vector/tables.js";
4
+ import { DEFAULT_MESSAGE_RANGE, DEFAULT_RECENT_MESSAGES, extractText, getModelName, getProviderName, isTool, sorted, } from "../shared.js";
5
+ import { inlineMessagesFiles } from "./files.js";
6
+ import { docsToModelMessages, toModelMessage } from "../mapping.js";
3
7
  const DEFAULT_VECTOR_SCORE_THRESHOLD = 0.0;
8
+ // 10k characters should be more than enough for most cases, and stays under
9
+ // the 8k token limit for some models.
10
+ const MAX_EMBEDDING_TEXT_LENGTH = 10_000;
4
11
  /**
5
12
  * Fetch the context messages for a thread.
6
13
  * @param ctx Either a query, mutation, or action ctx.
@@ -10,13 +17,18 @@ const DEFAULT_VECTOR_SCORE_THRESHOLD = 0.0;
10
17
  * @returns
11
18
  */
12
19
  export async function fetchContextMessages(ctx, component, args) {
20
+ const { recentMessages, searchMessages } = await fetchRecentAndSearchMessages(ctx, component, args);
21
+ return [...searchMessages, ...recentMessages];
22
+ }
23
+ export async function fetchRecentAndSearchMessages(ctx, component, args) {
13
24
  assert(args.userId || args.threadId, "Specify userId or threadId");
14
25
  const opts = args.contextOptions;
15
26
  // Fetch the latest messages from the thread
16
27
  let included;
17
- const contextMessages = [];
18
- if (args.threadId &&
19
- (opts.recentMessages !== 0 || args.upToAndIncludingMessageId)) {
28
+ let recentMessages = [];
29
+ let searchMessages = [];
30
+ const targetMessageId = args.targetMessageId ?? args.upToAndIncludingMessageId;
31
+ if (args.threadId && opts.recentMessages !== 0) {
20
32
  const { page } = await ctx.runQuery(component.messages.listMessagesByThreadId, {
21
33
  threadId: args.threadId,
22
34
  excludeToolMessages: opts.excludeToolMessages,
@@ -24,85 +36,157 @@ export async function fetchContextMessages(ctx, component, args) {
24
36
  numItems: opts.recentMessages ?? DEFAULT_RECENT_MESSAGES,
25
37
  cursor: null,
26
38
  },
27
- upToAndIncludingMessageId: args.upToAndIncludingMessageId,
39
+ upToAndIncludingMessageId: targetMessageId,
28
40
  order: "desc",
29
41
  statuses: ["success"],
30
42
  });
31
43
  included = new Set(page.map((m) => m._id));
32
- contextMessages.push(
33
- // Reverse since we fetched in descending order
34
- ...page.reverse());
44
+ recentMessages = filterOutOrphanedToolMessages(sorted(page));
35
45
  }
36
- if (opts.searchOptions?.textSearch || opts.searchOptions?.vectorSearch) {
37
- const targetMessage = contextMessages.find((m) => m._id === args.upToAndIncludingMessageId)?.message;
38
- const messagesToSearch = targetMessage ? [targetMessage] : args.messages;
46
+ if ((opts.searchOptions?.textSearch || opts.searchOptions?.vectorSearch) &&
47
+ opts.searchOptions?.limit) {
39
48
  if (!("runAction" in ctx)) {
40
49
  throw new Error("searchUserMessages only works in an action");
41
50
  }
42
- const lastMessage = messagesToSearch.at(-1);
43
- assert(lastMessage, "No messages to search");
44
- const text = extractText(lastMessage);
45
- assert(text, `No text to search in message ${JSON.stringify(lastMessage)}`);
46
- assert(!args.contextOptions?.searchOptions?.vectorSearch || "runAction" in ctx, "You must do vector search from an action");
47
- if (opts.searchOptions?.vectorSearch && !args.getEmbedding) {
48
- throw new Error("You must provide an embedding and embeddingModel to use vector search");
51
+ let text = args.searchText;
52
+ let embedding;
53
+ let embeddingModel;
54
+ if (!text) {
55
+ if (targetMessageId) {
56
+ const targetMessage = recentMessages.find((m) => m._id === targetMessageId);
57
+ if (targetMessage) {
58
+ text = targetMessage.text;
59
+ }
60
+ else {
61
+ const targetSearchFields = await ctx.runQuery(component.messages.getMessageSearchFields, {
62
+ messageId: targetMessageId,
63
+ });
64
+ text = targetSearchFields.text;
65
+ embedding = targetSearchFields.embedding;
66
+ embeddingModel = targetSearchFields.embeddingModel;
67
+ }
68
+ assert(text, "Target message has no text for searching");
69
+ }
70
+ else if (args.messages?.length) {
71
+ text = extractText(args.messages.at(-1));
72
+ assert(text, "Final context message has no text to search");
73
+ }
74
+ assert(text, "No text to search");
75
+ }
76
+ if (opts.searchOptions?.vectorSearch) {
77
+ if (!embedding && args.getEmbedding) {
78
+ const embeddingFields = await args.getEmbedding(text);
79
+ embedding = embeddingFields.embedding;
80
+ const effectiveModel = embeddingFields.embeddingModel ?? embeddingFields.textEmbeddingModel;
81
+ embeddingModel = effectiveModel
82
+ ? getModelName(effectiveModel)
83
+ : undefined;
84
+ // TODO: if the text matches the target message, save the embedding
85
+ // for the target message and return the embeddingId on the message.
86
+ }
49
87
  }
50
- const embeddingFields = opts.searchOptions?.vectorSearch
51
- ? await args.getEmbedding?.(text)
52
- : undefined;
53
- const searchMessages = await ctx.runAction(component.messages.searchMessages, {
88
+ const searchResults = await ctx.runAction(component.messages.searchMessages, {
54
89
  searchAllMessagesForUserId: opts?.searchOtherThreads
55
- ? args.userId ??
90
+ ? (args.userId ??
56
91
  (args.threadId &&
57
92
  (await ctx.runQuery(component.threads.getThread, {
58
93
  threadId: args.threadId,
59
- }))?.userId)
94
+ }))?.userId))
60
95
  : undefined,
61
96
  threadId: args.threadId,
62
- beforeMessageId: args.upToAndIncludingMessageId,
97
+ targetMessageId,
63
98
  limit: opts.searchOptions?.limit ?? 10,
64
99
  messageRange: {
65
100
  ...DEFAULT_MESSAGE_RANGE,
66
101
  ...opts.searchOptions?.messageRange,
67
102
  },
68
103
  text,
104
+ textSearch: opts.searchOptions?.textSearch,
105
+ vectorSearch: opts.searchOptions?.vectorSearch,
69
106
  vectorScoreThreshold: opts.searchOptions?.vectorScoreThreshold ??
70
107
  DEFAULT_VECTOR_SCORE_THRESHOLD,
71
- embedding: embeddingFields?.embedding,
72
- embeddingModel: embeddingFields?.embeddingModel,
108
+ embedding,
109
+ embeddingModel,
73
110
  });
74
111
  // TODO: track what messages we used for context
75
- contextMessages.unshift(...searchMessages.filter((m) => !included?.has(m._id)));
112
+ searchMessages = filterOutOrphanedToolMessages(sorted(searchResults.filter((m) => !included?.has(m._id))));
76
113
  }
77
114
  // Ensure we don't include tool messages without a corresponding tool call
78
- return filterOutOrphanedToolMessages(contextMessages.sort((a, b) =>
79
- // Sort the raw MessageDocs by order and stepOrder
80
- a.order === b.order ? a.stepOrder - b.stepOrder : a.order - b.order));
115
+ return { recentMessages, searchMessages };
81
116
  }
82
117
  /**
83
118
  * Filter out tool messages that don't have both a tool call and response.
119
+ * For the approval workflow, tool calls with approval responses (but no tool-results yet)
120
+ * should also be kept.
84
121
  * @param docs The messages to filter.
85
122
  * @returns The filtered messages.
86
123
  */
87
124
  export function filterOutOrphanedToolMessages(docs) {
88
125
  const toolCallIds = new Set();
126
+ const toolResultIds = new Set();
127
+ // Track approval workflow: toolCallId → approvalId
128
+ const approvalRequestsByToolCallId = new Map();
129
+ // Track which approvalIds have responses
130
+ const approvalResponseIds = new Set();
89
131
  const result = [];
90
132
  for (const doc of docs) {
91
- if (doc.message?.role === "assistant" &&
92
- Array.isArray(doc.message.content)) {
133
+ if (doc.message && Array.isArray(doc.message.content)) {
93
134
  for (const content of doc.message.content) {
94
135
  if (content.type === "tool-call") {
95
136
  toolCallIds.add(content.toolCallId);
96
137
  }
138
+ else if (content.type === "tool-result") {
139
+ toolResultIds.add(content.toolCallId);
140
+ }
141
+ else if (content.type === "tool-approval-request") {
142
+ const approvalRequest = content;
143
+ approvalRequestsByToolCallId.set(approvalRequest.toolCallId, approvalRequest.approvalId);
144
+ }
145
+ else if (content.type === "tool-approval-response") {
146
+ const approvalResponse = content;
147
+ approvalResponseIds.add(approvalResponse.approvalId);
148
+ }
97
149
  }
98
- result.push(doc);
99
150
  }
100
- else if (doc.message?.role === "tool") {
101
- if (doc.message.content.every((c) => toolCallIds.has(c.toolCallId))) {
102
- result.push(doc);
151
+ }
152
+ // Helper: check if tool call has a corresponding approval response
153
+ const hasApprovalResponse = (toolCallId) => {
154
+ const approvalId = approvalRequestsByToolCallId.get(toolCallId);
155
+ return approvalId !== undefined && approvalResponseIds.has(approvalId);
156
+ };
157
+ for (const doc of docs) {
158
+ if (doc.message?.role === "assistant" &&
159
+ Array.isArray(doc.message.content)) {
160
+ const content = doc.message.content.filter((p) => p.type !== "tool-call" ||
161
+ toolResultIds.has(p.toolCallId) ||
162
+ hasApprovalResponse(p.toolCallId));
163
+ if (content.length) {
164
+ result.push({
165
+ ...doc,
166
+ message: {
167
+ ...doc.message,
168
+ content,
169
+ },
170
+ });
103
171
  }
104
- else {
105
- console.debug("Filtering out orphaned tool message", doc);
172
+ }
173
+ else if (doc.message?.role === "tool") {
174
+ const content = doc.message.content.filter((c) => {
175
+ // tool-result parts have toolCallId
176
+ if (c.type === "tool-result") {
177
+ return toolCallIds.has(c.toolCallId);
178
+ }
179
+ // tool-approval-response parts don't have toolCallId, so include them
180
+ return true;
181
+ });
182
+ if (content.length) {
183
+ result.push({
184
+ ...doc,
185
+ message: {
186
+ ...doc.message,
187
+ content,
188
+ },
189
+ });
106
190
  }
107
191
  }
108
192
  else {
@@ -111,4 +195,231 @@ export function filterOutOrphanedToolMessages(docs) {
111
195
  }
112
196
  return result;
113
197
  }
198
+ /**
199
+ * Embed a list of messages, including calling any usage handler.
200
+ * This will not save the embeddings to the database.
201
+ */
202
+ export async function embedMessages(ctx, { userId, threadId, ...options }, messages) {
203
+ const textEmbeddingModel = options.embeddingModel ?? options.textEmbeddingModel;
204
+ if (!textEmbeddingModel) {
205
+ return undefined;
206
+ }
207
+ let embeddings;
208
+ const messageTexts = messages.map((m) => !isTool(m) && extractText(m));
209
+ // Find the indexes of the messages that have text.
210
+ const textIndexes = messageTexts
211
+ .map((t, i) => (t ? i : undefined))
212
+ .filter((i) => i !== undefined);
213
+ if (textIndexes.length === 0) {
214
+ return undefined;
215
+ }
216
+ const values = messageTexts
217
+ .map((t) => t && t.trim().slice(0, MAX_EMBEDDING_TEXT_LENGTH))
218
+ .filter((t) => !!t);
219
+ // Then embed those messages.
220
+ const textEmbeddings = await embedMany(ctx, {
221
+ ...options,
222
+ userId,
223
+ threadId,
224
+ values,
225
+ });
226
+ // Then assemble the embeddings into a single array with nulls for the messages without text.
227
+ const embeddingsOrNull = Array(messages.length).fill(null);
228
+ textIndexes.forEach((i, j) => {
229
+ embeddingsOrNull[i] = textEmbeddings.embeddings[j];
230
+ });
231
+ if (textEmbeddings.embeddings.length > 0) {
232
+ const dimension = textEmbeddings.embeddings[0].length;
233
+ validateVectorDimension(dimension);
234
+ const model = getModelName(textEmbeddingModel);
235
+ embeddings = { vectors: embeddingsOrNull, dimension, model };
236
+ }
237
+ return embeddings;
238
+ }
239
+ /**
240
+ * Embeds many strings, calling any usage handler.
241
+ * @param ctx The ctx parameter to an action.
242
+ * @param args Arguments to AI SDK's embedMany, and context for the embedding,
243
+ * passed to the usage handler.
244
+ * @returns The embeddings for the strings, matching the order of the values.
245
+ */
246
+ export async function embedMany(ctx, args) {
247
+ const { userId, threadId, values, abortSignal, headers, agentName, usageHandler, textEmbeddingModel, embeddingModel, callSettings, } = args;
248
+ const effectiveEmbeddingModel = embeddingModel ?? textEmbeddingModel;
249
+ assert(effectiveEmbeddingModel, "an embeddingModel (or textEmbeddingModel) is required to be set for vector search");
250
+ const result = await embedMany_({
251
+ ...callSettings,
252
+ model: effectiveEmbeddingModel,
253
+ values,
254
+ abortSignal,
255
+ headers,
256
+ });
257
+ if (usageHandler && result.usage) {
258
+ await usageHandler(ctx, {
259
+ userId,
260
+ threadId,
261
+ agentName,
262
+ model: getModelName(effectiveEmbeddingModel),
263
+ provider: getProviderName(effectiveEmbeddingModel),
264
+ providerMetadata: undefined,
265
+ usage: {
266
+ inputTokens: result.usage.tokens,
267
+ outputTokens: 0,
268
+ totalTokens: result.usage.tokens,
269
+ // These detail fields are required by LanguageModelUsage type but we don't
270
+ // have the granular data, so we provide objects with undefined values.
271
+ inputTokenDetails: {
272
+ cacheReadTokens: undefined,
273
+ cacheWriteTokens: undefined,
274
+ noCacheTokens: undefined,
275
+ },
276
+ outputTokenDetails: {
277
+ textTokens: undefined,
278
+ reasoningTokens: undefined,
279
+ },
280
+ },
281
+ });
282
+ }
283
+ return { embeddings: result.embeddings };
284
+ }
285
+ /**
286
+ * Embed a list of messages, and save the embeddings to the database.
287
+ * @param ctx The ctx parameter to an action.
288
+ * @param component The agent component, usually components.agent.
289
+ * @param args The context for the embedding, passed to the usage handler.
290
+ * @param messages The messages to embed, in the Agent MessageDoc format.
291
+ */
292
+ export async function generateAndSaveEmbeddings(ctx, component, args, messages) {
293
+ const effectiveEmbeddingModel = args.embeddingModel ?? args.textEmbeddingModel;
294
+ if (!effectiveEmbeddingModel) {
295
+ throw new Error("an embeddingModel (or textEmbeddingModel) is required to generate and save embeddings");
296
+ }
297
+ const toEmbed = messages.filter((m) => !m.embeddingId && m.message);
298
+ if (toEmbed.length === 0) {
299
+ return;
300
+ }
301
+ const embeddings = await embedMessages(ctx, { ...args, embeddingModel: effectiveEmbeddingModel }, toEmbed.map((m) => m.message));
302
+ if (embeddings && embeddings.vectors.some((v) => v !== null)) {
303
+ await ctx.runMutation(component.vector.index.insertBatch, {
304
+ vectorDimension: embeddings.dimension,
305
+ vectors: toEmbed
306
+ .map((m, i) => ({
307
+ messageId: m._id,
308
+ model: embeddings.model,
309
+ table: "messages",
310
+ userId: m.userId,
311
+ threadId: m.threadId,
312
+ vector: embeddings.vectors[i],
313
+ }))
314
+ .filter((v) => v.vector !== null),
315
+ });
316
+ }
317
+ }
318
+ /**
319
+ * Similar to fetchContextMessages, but also combines the input messages,
320
+ * with search context, recent messages, input messages, then prompt messages.
321
+ * If there is a promptMessageId and prompt message(s) provided, it will splice
322
+ * the prompt messages into the history to replace the promptMessageId message,
323
+ * but still be followed by any existing messages that were in response to the
324
+ * promptMessageId message.
325
+ */
326
+ export async function fetchContextWithPrompt(ctx, component, args) {
327
+ const { threadId, userId, textEmbeddingModel, embeddingModel } = args;
328
+ const effectiveEmbeddingModel = embeddingModel ?? textEmbeddingModel;
329
+ const promptArray = getPromptArray(args.prompt);
330
+ const searchText = promptArray.length
331
+ ? extractText(promptArray.at(-1))
332
+ : args.promptMessageId
333
+ ? undefined
334
+ : args.messages?.at(-1)
335
+ ? extractText(args.messages.at(-1))
336
+ : undefined;
337
+ // If only a messageId is provided, this will add that message to the end.
338
+ const { recentMessages, searchMessages } = await fetchRecentAndSearchMessages(ctx, component, {
339
+ userId,
340
+ threadId,
341
+ targetMessageId: args.promptMessageId,
342
+ searchText,
343
+ contextOptions: args.contextOptions ?? {},
344
+ getEmbedding: async (text) => {
345
+ assert(effectiveEmbeddingModel, "An embeddingModel (or textEmbeddingModel) is required to be set on the Agent that you're doing vector search with");
346
+ return {
347
+ embedding: (await embedMany(ctx, {
348
+ ...args,
349
+ userId,
350
+ values: [text],
351
+ embeddingModel: effectiveEmbeddingModel,
352
+ })).embeddings[0],
353
+ embeddingModel: effectiveEmbeddingModel,
354
+ };
355
+ },
356
+ });
357
+ const promptMessageIndex = args.promptMessageId
358
+ ? recentMessages.findIndex((m) => m._id === args.promptMessageId)
359
+ : -1;
360
+ const promptMessage = promptMessageIndex !== -1 ? recentMessages[promptMessageIndex] : undefined;
361
+ let prePromptDocs = recentMessages;
362
+ const messages = args.messages ?? [];
363
+ let existingResponseDocs = [];
364
+ if (promptMessage) {
365
+ prePromptDocs = recentMessages.slice(0, promptMessageIndex);
366
+ existingResponseDocs = recentMessages.slice(promptMessageIndex + 1);
367
+ if (promptArray.length === 0) {
368
+ // If they didn't override the prompt, use the existing prompt message.
369
+ if (promptMessage.message) {
370
+ promptArray.push(promptMessage.message);
371
+ }
372
+ }
373
+ if (!promptMessage.embeddingId && effectiveEmbeddingModel) {
374
+ // Lazily generate embeddings for the prompt message, if it doesn't have
375
+ // embeddings yet. This can happen if the message was saved in a mutation
376
+ // where the LLM is not available.
377
+ await generateAndSaveEmbeddings(ctx, component, {
378
+ ...args,
379
+ userId,
380
+ embeddingModel: effectiveEmbeddingModel,
381
+ }, [promptMessage]);
382
+ }
383
+ }
384
+ const search = docsToModelMessages(searchMessages);
385
+ const recent = docsToModelMessages(prePromptDocs);
386
+ const inputMessages = messages.map(toModelMessage);
387
+ const inputPrompt = promptArray.map(toModelMessage);
388
+ const existingResponses = docsToModelMessages(existingResponseDocs);
389
+ const allMessages = [
390
+ ...search,
391
+ ...recent,
392
+ ...inputMessages,
393
+ ...inputPrompt,
394
+ ...existingResponses,
395
+ ];
396
+ let processedMessages = args.contextHandler
397
+ ? await args.contextHandler(ctx, {
398
+ allMessages,
399
+ search,
400
+ recent,
401
+ inputMessages,
402
+ inputPrompt,
403
+ existingResponses,
404
+ userId,
405
+ threadId,
406
+ })
407
+ : allMessages;
408
+ // Process messages to inline localhost files (if not, file urls pointing to localhost will be sent to LLM providers)
409
+ if (process.env.CONVEX_CLOUD_URL?.startsWith("http://127.0.0.1")) {
410
+ processedMessages = await inlineMessagesFiles(processedMessages);
411
+ }
412
+ return {
413
+ messages: processedMessages,
414
+ order: promptMessage?.order,
415
+ stepOrder: promptMessage?.stepOrder,
416
+ };
417
+ }
418
+ export function getPromptArray(prompt) {
419
+ return !prompt
420
+ ? []
421
+ : Array.isArray(prompt)
422
+ ? prompt
423
+ : [{ role: "user", content: prompt }];
424
+ }
114
425
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/client/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/client/search.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,IAAI,UAAU,GAGxB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EACL,uBAAuB,GAExB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,eAAe,EACf,MAAM,EACN,MAAM,GACP,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAC3C,4EAA4E;AAC5E,sCAAsC;AACtC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAiBzC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAuC,EACvC,SAAyB,EACzB,IAuBC;IAED,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,4BAA4B,CAC3E,GAAG,EACH,SAAS,EACT,IAAI,CACL,CAAC;IACF,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,GAAuC,EACvC,SAAyB,EACzB,IAuBC;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;IACjC,4CAA4C;IAC5C,IAAI,QAAiC,CAAC;IACtC,IAAI,cAAc,GAAiB,EAAE,CAAC;IACtC,IAAI,cAAc,GAAiB,EAAE,CAAC;IACtC,MAAM,eAAe,GACnB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,yBAAyB,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CACjC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EACzC;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,cAAc,EAAE;gBACd,QAAQ,EAAE,IAAI,CAAC,cAAc,IAAI,uBAAuB;gBACxD,MAAM,EAAE,IAAI;aACb;YACD,yBAAyB,EAAE,eAAe;YAC1C,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB,CACF,CAAC;QACF,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,cAAc,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IACE,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC;QACpE,IAAI,CAAC,aAAa,EAAE,KAAK,EACzB,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,IAAI,SAA+B,CAAC;QACpC,IAAI,cAAkC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,CACjC,CAAC;gBACF,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,QAAQ,CAC3C,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EACzC;wBACE,SAAS,EAAE,eAAe;qBAC3B,CACF,CAAC;oBACF,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;oBAC/B,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC;oBACzC,cAAc,GAAG,kBAAkB,CAAC,cAAc,CAAC;gBACrD,CAAC;gBACD,MAAM,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACjC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,IAAI,EAAE,6CAA6C,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACtD,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;gBACtC,MAAM,cAAc,GAClB,eAAe,CAAC,cAAc,IAAI,eAAe,CAAC,kBAAkB,CAAC;gBACvE,cAAc,GAAG,cAAc;oBAC7B,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC;oBAC9B,CAAC,CAAC,SAAS,CAAC;gBACd,mEAAmE;gBACnE,oEAAoE;YACtE,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,SAAS,CACvC,SAAS,CAAC,QAAQ,CAAC,cAAc,EACjC;YACE,0BAA0B,EAAE,IAAI,EAAE,kBAAkB;gBAClD,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;oBACZ,CAAC,IAAI,CAAC,QAAQ;wBACZ,CACE,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE;4BAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;yBACxB,CAAC,CACH,EAAE,MAAM,CAAC,CAAC;gBACf,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe;YACf,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;YACtC,YAAY,EAAE;gBACZ,GAAG,qBAAqB;gBACxB,GAAG,IAAI,CAAC,aAAa,EAAE,YAAY;aACpC;YACD,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU;YAC1C,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY;YAC9C,oBAAoB,EAClB,IAAI,CAAC,aAAa,EAAE,oBAAoB;gBACxC,8BAA8B;YAChC,SAAS;YACT,cAAc;SACf,CACF,CAAC;QACF,gDAAgD;QAChD,cAAc,GAAG,6BAA6B,CAC5C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IACD,0EAA0E;IAC1E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAAkB;IAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,mDAAmD;IACnD,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/D,yCAAyC;IACzC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACjC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtC,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC1C,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;oBACpD,MAAM,eAAe,GAAG,OAIvB,CAAC;oBACF,4BAA4B,CAAC,GAAG,CAC9B,eAAe,CAAC,UAAU,EAC1B,eAAe,CAAC,UAAU,CAC3B,CAAC;gBACJ,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;oBACrD,MAAM,gBAAgB,GAAG,OAGxB,CAAC;oBACF,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAE,EAAE;QACjD,MAAM,UAAU,GAAG,4BAA4B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChE,OAAO,UAAU,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IACE,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW;YACjC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAClC,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,WAAW;gBACtB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC/B,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CACpC,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,GAAG;oBACN,OAAO,EAAE;wBACP,GAAG,GAAG,CAAC,OAAO;wBACd,OAAO;qBACR;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/C,oCAAoC;gBACpC,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC7B,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACvC,CAAC;gBACD,sEAAsE;gBACtE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,GAAG;oBACN,OAAO,EAAE;wBACP,GAAG,GAAG,CAAC,OAAO;wBACd,OAAO;qBACR;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,EACE,MAAM,EACN,QAAQ,EACR,GAAG,OAAO,EAQX,EACD,QAAoC;IASpC,MAAM,kBAAkB,GACtB,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC;IACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAMS,CAAC;IACd,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,mDAAmD;IACnD,MAAM,WAAW,GAAG,YAAY;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAClC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,YAAY;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,6BAA6B;IAC7B,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAC1C,GAAG,OAAO;QACV,MAAM;QACN,QAAQ;QACR,MAAM;KACP,CAAC,CAAC;IACH,6FAA6F;IAC7F,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,gBAAgB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtD,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC/C,UAAU,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAc,EACd,IAUC;IAED,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,WAAW,EACX,OAAO,EACP,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,GAAG,IAAI,CAAC;IACT,MAAM,uBAAuB,GAAG,cAAc,IAAI,kBAAkB,CAAC;IACrE,MAAM,CACJ,uBAAuB,EACvB,mFAAmF,CACpF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,GAAG,YAAY;QACf,KAAK,EAAE,uBAAuB;QAC9B,MAAM;QACN,WAAW;QACX,OAAO;KACR,CAAC,CAAC;IACH,IAAI,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,YAAY,CAAC,GAAG,EAAE;YACtB,MAAM;YACN,QAAQ;YACR,SAAS;YACT,KAAK,EAAE,YAAY,CAAC,uBAAuB,CAAC;YAC5C,QAAQ,EAAE,eAAe,CAAC,uBAAuB,CAAC;YAClD,gBAAgB,EAAE,SAAS;YAC3B,KAAK,EAAE;gBACL,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBAChC,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBAChC,2EAA2E;gBAC3E,uEAAuE;gBACvE,iBAAiB,EAAE;oBACjB,eAAe,EAAE,SAAS;oBAC1B,gBAAgB,EAAE,SAAS;oBAC3B,aAAa,EAAE,SAAS;iBACzB;gBACD,kBAAkB,EAAE;oBAClB,UAAU,EAAE,SAAS;oBACrB,eAAe,EAAE,SAAS;iBAC3B;aACF;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,GAAc,EACd,SAAyB,EACzB,IASiD,EACjD,QAAsB;IAEtB,MAAM,uBAAuB,GAC3B,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,CAAC;IACjD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,aAAa,CACpC,GAAG,EACH,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,uBAAuB,EAAE,EACpD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,CAC/B,CAAC;IACF,IAAI,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;YACxD,eAAe,EAAE,UAAU,CAAC,SAAS;YACrC,OAAO,EAAE,OAAO;iBACb,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACd,SAAS,EAAE,CAAC,CAAC,GAAG;gBAChB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAE;aAC/B,CAAC,CAAC;iBACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAc,EACd,SAAyB,EACzB,IAQQ;IAMR,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACtE,MAAM,uBAAuB,GAAG,cAAc,IAAI,kBAAkB,CAAC;IAErE,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM;QACnC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,eAAe;YACpB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;gBACpC,CAAC,CAAC,SAAS,CAAC;IAClB,0EAA0E;IAC1E,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,4BAA4B,CAC3E,GAAG,EACH,SAAS,EACT;QACE,MAAM;QACN,QAAQ;QACR,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,UAAU;QACV,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;QACzC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,CACJ,uBAAuB,EACvB,mHAAmH,CACpH,CAAC;YACF,OAAO;gBACL,SAAS,EAAE,CACT,MAAM,SAAS,CAAC,GAAG,EAAE;oBACnB,GAAG,IAAI;oBACP,MAAM;oBACN,MAAM,EAAE,CAAC,IAAI,CAAC;oBACd,cAAc,EAAE,uBAAuB;iBACxC,CAAC,CACH,CAAC,UAAU,CAAC,CAAC,CAAC;gBACf,cAAc,EAAE,uBAAuB;aACxC,CAAC;QACJ,CAAC;KACF,CACF,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe;QAC7C,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC;QACjE,CAAC,CAAC,CAAC,CAAC,CAAC;IACP,MAAM,aAAa,GACjB,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,IAAI,aAAa,GAAG,cAAc,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,IAAI,oBAAoB,GAAiB,EAAE,CAAC;IAC5C,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC5D,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,uEAAuE;YACvE,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,uBAAuB,EAAE,CAAC;YAC1D,wEAAwE;YACxE,yEAAyE;YACzE,kCAAkC;YAClC,MAAM,yBAAyB,CAC7B,GAAG,EACH,SAAS,EACT;gBACE,GAAG,IAAI;gBACP,MAAM;gBACN,cAAc,EAAE,uBAAuB;aACxC,EACD,CAAC,aAAa,CAAC,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG;QAClB,GAAG,MAAM;QACT,GAAG,MAAM;QACT,GAAG,aAAa;QAChB,GAAG,WAAW;QACd,GAAG,iBAAiB;KACrB,CAAC;IACF,IAAI,iBAAiB,GAAG,IAAI,CAAC,cAAc;QACzC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE;YAC7B,WAAW;YACX,MAAM;YACN,MAAM;YACN,aAAa;YACb,WAAW;YACX,iBAAiB;YACjB,MAAM;YACN,QAAQ;SACT,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAEhB,qHAAqH;IACrH,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACjE,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,EAAE,aAAa,EAAE,KAAK;QAC3B,SAAS,EAAE,aAAa,EAAE,SAAS;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAuD;IAEvD,OAAO,CAAC,MAAM;QACZ,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { type CallSettings, type GenerateObjectResult, type IdGenerator, type LanguageModel, type ModelMessage, type StepResult, type StopCondition, type ToolSet } from "ai";
2
+ import type { ActionCtx, AgentComponent, Config, Options } from "./types.js";
3
+ import type { Message, MessageDoc } from "../validators.js";
4
+ import { type ModelOrMetadata } from "../shared.js";
5
+ import type { Agent } from "./index.js";
6
+ export declare function startGeneration<T, Tools extends ToolSet = ToolSet, CustomCtx extends object = object>(ctx: ActionCtx & CustomCtx, component: AgentComponent,
7
+ /**
8
+ * These are the arguments you'll pass to the LLM call such as
9
+ * `generateText` or `streamText`. This function will look up the context
10
+ * and provide functions to save the steps, abort the generation, and more.
11
+ * The type of the arguments returned infers from the type of the arguments
12
+ * you pass here.
13
+ */
14
+ args: T & {
15
+ /**
16
+ * If provided, this message will be used as the "prompt" for the LLM call,
17
+ * instead of the prompt or messages.
18
+ * This is useful if you want to first save a user message, then use it as
19
+ * the prompt for the LLM call in another call.
20
+ */
21
+ promptMessageId?: string;
22
+ /**
23
+ * The model to use for the LLM calls. This will override the model specified
24
+ * in the Agent constructor.
25
+ */
26
+ model?: LanguageModel;
27
+ /**
28
+ * The tools to use for the tool calls. This will override tools specified
29
+ * in the Agent constructor or createThread / continueThread.
30
+ */
31
+ tools?: Tools;
32
+ /**
33
+ * The single prompt message to use for the LLM call. This will be the
34
+ * last message in the context. If it's a string, it will be a user role.
35
+ */
36
+ prompt?: string | (ModelMessage | Message)[];
37
+ /**
38
+ * If provided alongside prompt, the ordering will be:
39
+ * 1. system prompt
40
+ * 2. search context
41
+ * 3. recent messages
42
+ * 4. these messages
43
+ * 5. prompt messages, including those already on the same `order` as
44
+ * the promptMessageId message, if provided.
45
+ */
46
+ messages?: (ModelMessage | Message)[];
47
+ /**
48
+ * The abort signal to be passed to the LLM call. If triggered, it will
49
+ * mark the pending message as failed. If the generation is asynchronously
50
+ * aborted, it will trigger this signal when detected.
51
+ */
52
+ abortSignal?: AbortSignal;
53
+ stopWhen?: StopCondition<Tools> | Array<StopCondition<Tools>>;
54
+ _internal?: {
55
+ generateId?: IdGenerator;
56
+ };
57
+ }, { threadId, ...opts }: Options & Config & {
58
+ userId?: string | null;
59
+ threadId?: string;
60
+ languageModel?: LanguageModel;
61
+ agentName: string;
62
+ agentForToolCtx?: Agent;
63
+ }): Promise<{
64
+ args: T & {
65
+ system?: string;
66
+ model: LanguageModel;
67
+ messages: ModelMessage[];
68
+ prompt?: never;
69
+ tools?: Tools;
70
+ } & CallSettings;
71
+ order: number;
72
+ stepOrder: number;
73
+ userId: string | undefined;
74
+ promptMessageId: string | undefined;
75
+ updateModel: (model: ModelOrMetadata | undefined) => void;
76
+ save: <TOOLS extends ToolSet>(toSave: {
77
+ step: StepResult<TOOLS>;
78
+ } | {
79
+ object: GenerateObjectResult<unknown>;
80
+ }, createPendingMessage?: boolean) => Promise<void>;
81
+ fail: (reason: string) => Promise<void>;
82
+ getSavedMessages: () => MessageDoc[];
83
+ }>;
84
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/client/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAMZ,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKxC,wBAAsB,eAAe,CACnC,CAAC,EACD,KAAK,SAAS,OAAO,GAAG,OAAO,EAC/B,SAAS,SAAS,MAAM,GAAG,MAAM,EAEjC,GAAG,EAAE,SAAS,GAAG,SAAS,EAC1B,SAAS,EAAE,cAAc;AACzB;;;;;;GAMG;AACH,IAAI,EAAE,CAAC,GAAG;IACR;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;IAC7C;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,CAAC,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;IACtC;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;CAC1C,EACD,EACE,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,OAAO,GACR,MAAM,GAAG;IACP,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,KAAK,CAAC;CACzB,GACF,OAAO,CAAC;IACT,IAAI,EAAE,CAAC,GAAG;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,aAAa,CAAC;QACrB,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,GAAG,YAAY,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1D,IAAI,EAAE,CAAC,KAAK,SAAS,OAAO,EAC1B,MAAM,EACF;QAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;KAAE,GAC3B;QAAE,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAA;KAAE,EAC7C,oBAAoB,CAAC,EAAE,OAAO,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,UAAU,EAAE,CAAC;CACtC,CAAC,CAgMD"}