@convex-dev/agent 0.1.8-alpha.1 → 0.1.8
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.
- package/dist/commonjs/component/streams.d.ts +47 -0
- package/dist/commonjs/component/streams.d.ts.map +1 -1
- package/dist/commonjs/component/streams.js +120 -2
- package/dist/commonjs/component/streams.js.map +1 -1
- package/dist/commonjs/component/threads.d.ts.map +1 -1
- package/dist/commonjs/component/threads.js +11 -1
- package/dist/commonjs/component/threads.js.map +1 -1
- package/dist/commonjs/component/users.d.ts +9 -0
- package/dist/commonjs/component/users.d.ts.map +1 -1
- package/dist/commonjs/component/users.js +92 -20
- package/dist/commonjs/component/users.js.map +1 -1
- package/dist/commonjs.tsbuildinfo +1 -1
- package/dist/esm/component/streams.d.ts +47 -0
- package/dist/esm/component/streams.d.ts.map +1 -1
- package/dist/esm/component/streams.js +120 -2
- package/dist/esm/component/streams.js.map +1 -1
- package/dist/esm/component/threads.d.ts.map +1 -1
- package/dist/esm/component/threads.js +11 -1
- package/dist/esm/component/threads.js.map +1 -1
- package/dist/esm/component/users.d.ts +9 -0
- package/dist/esm/component/users.d.ts.map +1 -1
- package/dist/esm/component/users.js +92 -20
- package/dist/esm/component/users.js.map +1 -1
- package/dist/esm.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/client/setup.test.ts +1 -2
- package/src/component/streams.ts +148 -2
- package/src/component/threads.test.ts +560 -0
- package/src/component/threads.ts +14 -1
- package/src/component/users.test.ts +478 -0
- package/src/component/users.ts +100 -19
package/src/component/streams.ts
CHANGED
|
@@ -5,15 +5,20 @@ import {
|
|
|
5
5
|
vStreamDelta,
|
|
6
6
|
vStreamMessage,
|
|
7
7
|
} from "../validators.js";
|
|
8
|
-
import { internal } from "./_generated/api.js";
|
|
9
|
-
import type { Id } from "./_generated/dataModel.js";
|
|
8
|
+
import { api, internal } from "./_generated/api.js";
|
|
9
|
+
import type { Doc, Id } from "./_generated/dataModel.js";
|
|
10
10
|
import {
|
|
11
11
|
internalMutation,
|
|
12
12
|
mutation,
|
|
13
13
|
type MutationCtx,
|
|
14
14
|
query,
|
|
15
|
+
action,
|
|
15
16
|
} from "./_generated/server.js";
|
|
16
17
|
import schema from "./schema.js";
|
|
18
|
+
import type { PaginationResult } from "convex/server";
|
|
19
|
+
import { paginator } from "convex-helpers/server/pagination";
|
|
20
|
+
import { stream } from "convex-helpers/server/stream";
|
|
21
|
+
import { mergedStream } from "convex-helpers/server/stream";
|
|
17
22
|
|
|
18
23
|
const MAX_DELTAS_PER_REQUEST = 1000;
|
|
19
24
|
const MAX_DELTAS_PER_STREAM = 100;
|
|
@@ -207,3 +212,144 @@ export const timeoutStream = internalMutation({
|
|
|
207
212
|
});
|
|
208
213
|
},
|
|
209
214
|
});
|
|
215
|
+
|
|
216
|
+
async function deletePageForStreamId(
|
|
217
|
+
ctx: MutationCtx,
|
|
218
|
+
args: { streamId: Id<"streamingMessages">; cursor?: string }
|
|
219
|
+
) {
|
|
220
|
+
const deltas = await ctx.db
|
|
221
|
+
.query("streamDeltas")
|
|
222
|
+
.withIndex("streamId_start_end", (q) => q.eq("streamId", args.streamId))
|
|
223
|
+
.paginate({
|
|
224
|
+
numItems: MAX_DELTAS_PER_REQUEST,
|
|
225
|
+
cursor: args.cursor ?? null,
|
|
226
|
+
});
|
|
227
|
+
await Promise.all(deltas.page.map((d) => ctx.db.delete(d._id)));
|
|
228
|
+
return deltas;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export async function deleteStreamsPageForThreadId(
|
|
232
|
+
ctx: MutationCtx,
|
|
233
|
+
args: { threadId: Id<"threads">; streamOrder?: number; deltaCursor?: string }
|
|
234
|
+
) {
|
|
235
|
+
const allStreamMessages =
|
|
236
|
+
schema.tables.streamingMessages.validator.fields.state.members
|
|
237
|
+
.flatMap((state) => state.fields.kind.value)
|
|
238
|
+
.map((stateKind) =>
|
|
239
|
+
stream(ctx.db, schema)
|
|
240
|
+
.query("streamingMessages")
|
|
241
|
+
.withIndex("threadId_state_order_stepOrder", (q) =>
|
|
242
|
+
q
|
|
243
|
+
.eq("threadId", args.threadId)
|
|
244
|
+
.eq("state.kind", stateKind)
|
|
245
|
+
.gte("order", args.streamOrder ?? 0)
|
|
246
|
+
)
|
|
247
|
+
);
|
|
248
|
+
let deltaCursor = args.deltaCursor;
|
|
249
|
+
const streamMessage = await mergedStream(allStreamMessages, [
|
|
250
|
+
"threadId",
|
|
251
|
+
"state.kind",
|
|
252
|
+
"order",
|
|
253
|
+
"stepOrder",
|
|
254
|
+
]).first();
|
|
255
|
+
if (!streamMessage) {
|
|
256
|
+
return {
|
|
257
|
+
isDone: true,
|
|
258
|
+
streamOrder: undefined,
|
|
259
|
+
deltaCursor: undefined,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const result = await deletePageForStreamId(ctx, {
|
|
263
|
+
streamId: streamMessage._id,
|
|
264
|
+
cursor: deltaCursor,
|
|
265
|
+
});
|
|
266
|
+
if (result.isDone) {
|
|
267
|
+
await ctx.db.delete(streamMessage._id);
|
|
268
|
+
deltaCursor = undefined;
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
isDone: false,
|
|
272
|
+
streamOrder: streamMessage.order,
|
|
273
|
+
deltaCursor: result.continueCursor,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export const deleteStreamsPageForThreadIdMutation = internalMutation({
|
|
278
|
+
args: {
|
|
279
|
+
threadId: v.id("threads"),
|
|
280
|
+
streamOrder: v.optional(v.number()),
|
|
281
|
+
deltaCursor: v.optional(v.string()),
|
|
282
|
+
},
|
|
283
|
+
returns: v.object({
|
|
284
|
+
isDone: v.boolean(),
|
|
285
|
+
streamOrder: v.optional(v.number()),
|
|
286
|
+
deltaCursor: v.optional(v.string()),
|
|
287
|
+
}),
|
|
288
|
+
handler: deleteStreamsPageForThreadId,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
export const deleteAllStreamsForThreadIdAsync = mutation({
|
|
292
|
+
args: {
|
|
293
|
+
threadId: v.id("threads"),
|
|
294
|
+
streamOrder: v.optional(v.number()),
|
|
295
|
+
deltaCursor: v.optional(v.string()),
|
|
296
|
+
},
|
|
297
|
+
returns: v.object({
|
|
298
|
+
isDone: v.boolean(),
|
|
299
|
+
streamOrder: v.optional(v.number()),
|
|
300
|
+
deltaCursor: v.optional(v.string()),
|
|
301
|
+
}),
|
|
302
|
+
handler: async (ctx, args) => {
|
|
303
|
+
const result = await deleteStreamsPageForThreadId(ctx, args);
|
|
304
|
+
if (!result.isDone) {
|
|
305
|
+
await ctx.scheduler.runAfter(
|
|
306
|
+
0,
|
|
307
|
+
api.streams.deleteAllStreamsForThreadIdAsync,
|
|
308
|
+
{
|
|
309
|
+
threadId: args.threadId,
|
|
310
|
+
streamOrder: result.streamOrder,
|
|
311
|
+
deltaCursor: result.deltaCursor,
|
|
312
|
+
}
|
|
313
|
+
);
|
|
314
|
+
} else {
|
|
315
|
+
await ctx.db.delete(args.threadId);
|
|
316
|
+
}
|
|
317
|
+
return result;
|
|
318
|
+
},
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
export const deleteStreamSync = mutation({
|
|
322
|
+
args: { streamId: v.id("streamingMessages") },
|
|
323
|
+
returns: v.null(),
|
|
324
|
+
handler: async (ctx, args) => {
|
|
325
|
+
let deltas = await deletePageForStreamId(ctx, args);
|
|
326
|
+
while (!deltas.isDone) {
|
|
327
|
+
deltas = await deletePageForStreamId(ctx, {
|
|
328
|
+
...args,
|
|
329
|
+
cursor: deltas.continueCursor,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
await ctx.db.delete(args.streamId);
|
|
333
|
+
},
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
export const deleteAllStreamsForThreadIdSync = action({
|
|
337
|
+
args: { threadId: v.id("threads") },
|
|
338
|
+
returns: v.null(),
|
|
339
|
+
handler: async (ctx, args) => {
|
|
340
|
+
let result = await ctx.runMutation(
|
|
341
|
+
internal.streams.deleteStreamsPageForThreadIdMutation,
|
|
342
|
+
args
|
|
343
|
+
);
|
|
344
|
+
while (!result.isDone) {
|
|
345
|
+
result = await ctx.runMutation(
|
|
346
|
+
internal.streams.deleteStreamsPageForThreadIdMutation,
|
|
347
|
+
{
|
|
348
|
+
...args,
|
|
349
|
+
streamOrder: result.streamOrder,
|
|
350
|
+
deltaCursor: result.deltaCursor,
|
|
351
|
+
}
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
});
|