@convex-dev/agent 0.1.9-alpha.5 → 0.1.9-alpha.6

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 (73) hide show
  1. package/dist/commonjs/client/index.d.ts +71 -72
  2. package/dist/commonjs/client/index.d.ts.map +1 -1
  3. package/dist/commonjs/client/index.js +0 -2
  4. package/dist/commonjs/client/index.js.map +1 -1
  5. package/dist/commonjs/client/streaming.d.ts.map +1 -1
  6. package/dist/commonjs/client/streaming.js +1 -7
  7. package/dist/commonjs/client/streaming.js.map +1 -1
  8. package/dist/commonjs/component/_generated/api.d.ts +1 -12
  9. package/dist/commonjs/component/messages.d.ts +210 -210
  10. package/dist/commonjs/component/schema.d.ts +583 -583
  11. package/dist/commonjs/component/schema.d.ts.map +1 -1
  12. package/dist/commonjs/component/schema.js +2 -2
  13. package/dist/commonjs/component/schema.js.map +1 -1
  14. package/dist/commonjs/component/streams.d.ts +10 -17
  15. package/dist/commonjs/component/streams.d.ts.map +1 -1
  16. package/dist/commonjs/component/streams.js +12 -42
  17. package/dist/commonjs/component/streams.js.map +1 -1
  18. package/dist/commonjs/component/threads.d.ts +18 -18
  19. package/dist/commonjs/component/vector/index.d.ts +3 -3
  20. package/dist/commonjs/component/vector/tables.d.ts +2 -2
  21. package/dist/commonjs/react/deltas.d.ts.map +1 -1
  22. package/dist/commonjs/react/deltas.js +3 -2
  23. package/dist/commonjs/react/deltas.js.map +1 -1
  24. package/dist/commonjs/react/index.d.ts +1 -3
  25. package/dist/commonjs/react/index.d.ts.map +1 -1
  26. package/dist/commonjs/react/index.js +3 -14
  27. package/dist/commonjs/react/index.js.map +1 -1
  28. package/dist/commonjs/validators.d.ts +162 -167
  29. package/dist/commonjs/validators.d.ts.map +1 -1
  30. package/dist/commonjs/validators.js +0 -2
  31. package/dist/commonjs/validators.js.map +1 -1
  32. package/dist/commonjs.tsbuildinfo +1 -1
  33. package/dist/esm/client/index.d.ts +19 -20
  34. package/dist/esm/client/index.d.ts.map +1 -1
  35. package/dist/esm/client/index.js +0 -2
  36. package/dist/esm/client/index.js.map +1 -1
  37. package/dist/esm/client/streaming.d.ts.map +1 -1
  38. package/dist/esm/client/streaming.js +1 -7
  39. package/dist/esm/client/streaming.js.map +1 -1
  40. package/dist/esm/component/_generated/api.d.ts +1 -12
  41. package/dist/esm/component/messages.d.ts +37 -37
  42. package/dist/esm/component/schema.d.ts +583 -583
  43. package/dist/esm/component/schema.d.ts.map +1 -1
  44. package/dist/esm/component/schema.js +2 -2
  45. package/dist/esm/component/schema.js.map +1 -1
  46. package/dist/esm/component/streams.d.ts +0 -7
  47. package/dist/esm/component/streams.d.ts.map +1 -1
  48. package/dist/esm/component/streams.js +12 -42
  49. package/dist/esm/component/streams.js.map +1 -1
  50. package/dist/esm/component/threads.d.ts +15 -15
  51. package/dist/esm/component/vector/index.d.ts +3 -3
  52. package/dist/esm/component/vector/tables.d.ts +2 -2
  53. package/dist/esm/react/deltas.d.ts.map +1 -1
  54. package/dist/esm/react/deltas.js +3 -2
  55. package/dist/esm/react/deltas.js.map +1 -1
  56. package/dist/esm/react/index.d.ts +1 -3
  57. package/dist/esm/react/index.d.ts.map +1 -1
  58. package/dist/esm/react/index.js +3 -14
  59. package/dist/esm/react/index.js.map +1 -1
  60. package/dist/esm/validators.d.ts +162 -167
  61. package/dist/esm/validators.d.ts.map +1 -1
  62. package/dist/esm/validators.js +0 -2
  63. package/dist/esm/validators.js.map +1 -1
  64. package/dist/esm.tsbuildinfo +1 -1
  65. package/package.json +1 -1
  66. package/src/client/index.ts +0 -4
  67. package/src/client/streaming.ts +1 -7
  68. package/src/component/_generated/api.d.ts +1 -12
  69. package/src/component/schema.ts +2 -2
  70. package/src/component/streams.ts +27 -76
  71. package/src/react/deltas.ts +3 -4
  72. package/src/react/index.ts +4 -15
  73. package/src/validators.ts +0 -6
@@ -994,8 +994,6 @@ export class Agent<AgentTools extends ToolSet> {
994
994
  args: {
995
995
  threadId: string;
996
996
  streamArgs: StreamArgs | undefined;
997
- // By default, only streaming messages are included.
998
- includeStatuses?: ("streaming" | "finished" | "aborted")[];
999
997
  }
1000
998
  ): Promise<SyncStreamsReturnValue | undefined> {
1001
999
  if (!args.streamArgs) return undefined;
@@ -1004,8 +1002,6 @@ export class Agent<AgentTools extends ToolSet> {
1004
1002
  kind: "list",
1005
1003
  messages: await ctx.runQuery(this.component.streams.list, {
1006
1004
  threadId: args.threadId,
1007
- startOrder: args.streamArgs.startOrder,
1008
- statuses: args.includeStatuses,
1009
1005
  }),
1010
1006
  };
1011
1007
  } else {
@@ -96,13 +96,7 @@ export class DeltaStreamer {
96
96
  this.#nextStepOrder = (metadata.stepOrder ?? 0) + 1;
97
97
  this.abortController = new AbortController();
98
98
  if (metadata.abortSignal) {
99
- metadata.abortSignal.addEventListener("abort", async () => {
100
- if (this.streamId) {
101
- await this.ctx.runMutation(this.component.streams.abort, {
102
- streamId: this.streamId,
103
- reason: "abortSignal",
104
- });
105
- }
99
+ metadata.abortSignal.addEventListener("abort", () => {
106
100
  this.abortController.abort();
107
101
  });
108
102
  }
@@ -1414,12 +1414,6 @@ export type Mounts = {
1414
1414
  >;
1415
1415
  };
1416
1416
  streams: {
1417
- abort: FunctionReference<
1418
- "mutation",
1419
- "public",
1420
- { reason: string; streamId: string },
1421
- null
1422
- >;
1423
1417
  addDelta: FunctionReference<
1424
1418
  "mutation",
1425
1419
  "public",
@@ -1575,18 +1569,13 @@ export type Mounts = {
1575
1569
  list: FunctionReference<
1576
1570
  "query",
1577
1571
  "public",
1578
- {
1579
- startOrder?: number;
1580
- statuses?: Array<"streaming" | "finished" | "aborted">;
1581
- threadId: string;
1582
- },
1572
+ { threadId: string },
1583
1573
  Array<{
1584
1574
  agentName?: string;
1585
1575
  model?: string;
1586
1576
  order: number;
1587
1577
  provider?: string;
1588
1578
  providerOptions?: Record<string, Record<string, any>>;
1589
- status: "streaming" | "finished" | "aborted";
1590
1579
  stepOrder: number;
1591
1580
  streamId: string;
1592
1581
  userId?: string;
@@ -110,8 +110,8 @@ export const schema = defineSchema({
110
110
  endedAt: v.number(),
111
111
  }),
112
112
  v.object({
113
- kind: v.literal("aborted"),
114
- reason: v.string(),
113
+ kind: v.literal("error"),
114
+ error: v.string(),
115
115
  })
116
116
  ),
117
117
  })
@@ -6,7 +6,7 @@ import {
6
6
  vStreamMessage,
7
7
  } from "../validators.js";
8
8
  import { api, internal } from "./_generated/api.js";
9
- import type { Doc, Id } from "./_generated/dataModel.js";
9
+ import type { Id } from "./_generated/dataModel.js";
10
10
  import {
11
11
  internalMutation,
12
12
  mutation,
@@ -102,87 +102,33 @@ export const create = mutation({
102
102
  export const list = query({
103
103
  args: {
104
104
  threadId: v.id("threads"),
105
- startOrder: v.optional(v.number()),
106
- statuses: v.optional(
107
- v.array(
108
- v.union(
109
- v.literal("streaming"),
110
- v.literal("finished"),
111
- v.literal("aborted")
112
- )
113
- )
114
- ),
115
105
  },
116
106
  returns: v.array(vStreamMessage),
117
107
  handler: async (ctx, args) => {
118
- const statuses = args.statuses ?? ["streaming"];
119
- const messages = await mergedStream(
120
- statuses.map((status) =>
121
- stream(ctx.db, schema)
122
- .query("streamingMessages")
123
- .withIndex("threadId_state_order_stepOrder", (q) =>
124
- q
125
- .eq("threadId", args.threadId)
126
- .eq("state.kind", status)
127
- .gte("order", args.startOrder ?? 0)
128
- )
129
- .order("desc")
130
- ),
131
- ["order", "stepOrder"]
132
- ).take(100);
133
-
134
- return messages.map((m) => ({
135
- streamId: m._id,
136
- status: m.state.kind,
137
- ...pick(m, [
138
- "order",
139
- "stepOrder",
140
- "userId",
141
- "agentName",
142
- "model",
143
- "provider",
144
- "providerOptions",
145
- ]),
146
- }));
147
- },
148
- });
149
-
150
- export const abort = mutation({
151
- args: {
152
- streamId: v.id("streamingMessages"),
153
- reason: v.string(),
154
- },
155
- returns: v.null(),
156
- handler: async (ctx, args) => {
157
- const stream = await ctx.db.get(args.streamId);
158
- if (!stream) {
159
- throw new Error(`Stream not found: ${args.streamId}`);
160
- }
161
- if (stream.state.kind !== "streaming") {
162
- console.warn(
163
- `Stream trying to abort but not currently streaming (${stream.state.kind}): ${args.streamId}`
108
+ return ctx.db
109
+ .query("streamingMessages")
110
+ .withIndex("threadId_state_order_stepOrder", (q) =>
111
+ q.eq("threadId", args.threadId).eq("state.kind", "streaming")
112
+ )
113
+ .order("desc")
114
+ .take(100)
115
+ .then((msgs) =>
116
+ msgs.map((m) => ({
117
+ streamId: m._id,
118
+ ...pick(m, [
119
+ "order",
120
+ "stepOrder",
121
+ "userId",
122
+ "agentName",
123
+ "model",
124
+ "provider",
125
+ "providerOptions",
126
+ ]),
127
+ }))
164
128
  );
165
- return;
166
- }
167
- await cleanupTimeoutFn(ctx, stream);
168
- await ctx.db.patch(args.streamId, {
169
- state: { kind: "aborted", reason: args.reason },
170
- });
171
129
  },
172
130
  });
173
131
 
174
- async function cleanupTimeoutFn(
175
- ctx: MutationCtx,
176
- stream: Doc<"streamingMessages">
177
- ) {
178
- if (stream.state.kind === "streaming" && stream.state.timeoutFnId) {
179
- const timeoutFn = await ctx.db.system.get(stream.state.timeoutFnId);
180
- if (timeoutFn?.state.kind === "pending") {
181
- await ctx.scheduler.cancel(stream.state.timeoutFnId);
182
- }
183
- }
184
- }
185
-
186
132
  export const finish = mutation({
187
133
  args: {
188
134
  streamId: v.id("streamingMessages"),
@@ -203,7 +149,12 @@ export const finish = mutation({
203
149
  );
204
150
  return;
205
151
  }
206
- await cleanupTimeoutFn(ctx, stream);
152
+ if (stream.state.timeoutFnId) {
153
+ const timeoutFn = await ctx.db.system.get(stream.state.timeoutFnId);
154
+ if (timeoutFn?.state.kind === "pending") {
155
+ await ctx.scheduler.cancel(stream.state.timeoutFnId);
156
+ }
157
+ }
207
158
  await ctx.db.patch(args.streamId, {
208
159
  state: { kind: "finished", endedAt: Date.now() },
209
160
  });
@@ -189,6 +189,7 @@ export function applyDeltasToStreamMessage(
189
189
  contentToAdd = part;
190
190
  break;
191
191
  case "reasoning":
192
+ currentMessage.reasoning += part.textDelta;
192
193
  if (lastContent?.type === "reasoning") {
193
194
  lastContent.text += part.textDelta;
194
195
  } else {
@@ -255,14 +256,12 @@ export function createStreamingMessage(
255
256
  ): MessageDoc {
256
257
  const { streamId, ...rest } = message;
257
258
  const metadata: MessageDoc = {
258
- ...rest,
259
259
  _id: `${streamId}-${index}`,
260
260
  _creationTime: Date.now(),
261
- status: (
262
- { streaming: "pending", finished: "success", aborted: "failed" } as const
263
- )[message.status],
261
+ status: "pending",
264
262
  threadId,
265
263
  tool: false,
264
+ ...rest,
266
265
  };
267
266
  switch (part.type) {
268
267
  case "text-delta":
@@ -7,7 +7,7 @@ import {
7
7
  } from "convex/react";
8
8
  import { usePaginatedQuery } from "convex-helpers/react";
9
9
  import type { FunctionArgs } from "convex/server";
10
- import { useMemo, useRef, useState } from "react";
10
+ import { useMemo, useState } from "react";
11
11
  import type { MessageDoc } from "../client/index.js";
12
12
  import type { SyncStreamsReturnValue } from "../client/types.js";
13
13
  import type { StreamArgs } from "../validators.js";
@@ -103,11 +103,7 @@ export function useThreadMessages<
103
103
  ThreadMessagesArgs<Query>,
104
104
  ThreadMessagesResult<Query>
105
105
  >,
106
- !options.stream ||
107
- args === "skip" ||
108
- paginated.status === "LoadingFirstPage"
109
- ? "skip"
110
- : { ...args, startOrder: paginated.results.at(0)?.order }
106
+ !options.stream ? "skip" : args
111
107
  );
112
108
 
113
109
  const merged = useMemo(() => {
@@ -154,7 +150,7 @@ export function useStreamingThreadMessages<
154
150
  Query extends ThreadStreamQuery<any, any>,
155
151
  >(
156
152
  query: Query,
157
- args: (ThreadMessagesArgs<Query> & { startOrder?: number }) | "skip"
153
+ args: ThreadMessagesArgs<Query> | "skip"
158
154
  ): Array<ThreadMessagesResult<Query>> | undefined {
159
155
  // Invariant: streamMessages[streamId] is comprised of all deltas up to the
160
156
  // cursor. There can be multiple messages in the same stream, e.g. for tool
@@ -162,10 +158,6 @@ export function useStreamingThreadMessages<
162
158
  const [streams, setStreams] = useState<
163
159
  Array<{ streamId: string; cursor: number; messages: MessageDoc[] }>
164
160
  >([]);
165
- const startOrderRef = useRef<number>(0);
166
- if (args !== "skip" && !startOrderRef.current && args.startOrder) {
167
- startOrderRef.current = args.startOrder;
168
- }
169
161
  // Get all the active streams
170
162
  const streamList = useQuery(
171
163
  query,
@@ -174,10 +166,7 @@ export function useStreamingThreadMessages<
174
166
  : ({
175
167
  ...args,
176
168
  paginationOpts: { cursor: null, numItems: 0 },
177
- streamArgs: {
178
- kind: "list",
179
- startOrder: startOrderRef.current,
180
- } as StreamArgs,
169
+ streamArgs: { kind: "list" } as StreamArgs,
181
170
  } as FunctionArgs<Query>)
182
171
  ) as
183
172
  | { streams: Extract<SyncStreamsReturnValue, { kind: "list" }> }
package/src/validators.ts CHANGED
@@ -460,7 +460,6 @@ export const vStreamArgs = v.optional(
460
460
  v.union(
461
461
  v.object({
462
462
  kind: v.literal("list"),
463
- startOrder: v.optional(v.number()),
464
463
  }),
465
464
  v.object({
466
465
  kind: v.literal("deltas"),
@@ -472,11 +471,6 @@ export type StreamArgs = Infer<typeof vStreamArgs>;
472
471
 
473
472
  export const vStreamMessage = v.object({
474
473
  streamId: v.string(),
475
- status: v.union(
476
- v.literal("streaming"),
477
- v.literal("finished"),
478
- v.literal("aborted")
479
- ),
480
474
  order: v.number(),
481
475
  stepOrder: v.number(),
482
476
  // metadata