@convex-dev/agent
Version:
A agent component for Convex.
54 lines (51 loc) • 1.48 kB
text/typescript
import { insertAtTop } from "convex/react";
import type { MessageDoc } from "../client/index.js";
import type { OptimisticLocalStore } from "convex/browser";
import type { ThreadQuery } from "./types.js";
export function optimisticallySendMessage(
query: ThreadQuery<unknown, MessageDoc>,
): (
store: OptimisticLocalStore,
args: { threadId: string; prompt: string },
) => void {
return (store, args) => {
const queries = store.getAllQueries(query);
let maxOrder = -1;
for (const q of queries) {
if (q.args?.threadId !== args.threadId) continue;
if (q.args.streamArgs) continue;
for (const m of q.value?.page ?? []) {
maxOrder = Math.max(maxOrder, m.order);
}
}
const order = maxOrder + 1;
insertAtTop({
paginatedQuery: query,
argsToMatch: { threadId: args.threadId, streamArgs: undefined },
item: {
_creationTime: Date.now(),
_id: randomUUID(),
order,
stepOrder: 0,
status: "pending",
threadId: args.threadId,
tool: false,
message: { role: "user", content: args.prompt },
text: args.prompt,
},
localQueryStore: store,
});
};
}
export function randomUUID() {
if (
typeof crypto !== "undefined" &&
typeof crypto.randomUUID === "function"
) {
return crypto.randomUUID();
}
return (
Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15)
);
}