@convex-dev/agent 0.1.9-alpha.7 → 0.1.9-alpha.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/client/index.d.ts +0 -1
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +0 -2
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/client/streaming.d.ts.map +1 -1
- package/dist/commonjs/client/streaming.js +1 -7
- package/dist/commonjs/client/streaming.js.map +1 -1
- package/dist/commonjs/component/_generated/api.d.ts +1 -12
- package/dist/commonjs/component/schema.d.ts +26 -26
- package/dist/commonjs/component/schema.d.ts.map +1 -1
- package/dist/commonjs/component/schema.js +2 -2
- package/dist/commonjs/component/schema.js.map +1 -1
- package/dist/commonjs/component/streams.d.ts +0 -7
- package/dist/commonjs/component/streams.d.ts.map +1 -1
- package/dist/commonjs/component/streams.js +14 -43
- package/dist/commonjs/component/streams.js.map +1 -1
- package/dist/commonjs/react/deltas.d.ts.map +1 -1
- package/dist/commonjs/react/deltas.js +3 -2
- package/dist/commonjs/react/deltas.js.map +1 -1
- package/dist/commonjs/react/index.d.ts +2 -4
- package/dist/commonjs/react/index.d.ts.map +1 -1
- package/dist/commonjs/react/index.js +8 -21
- package/dist/commonjs/react/index.js.map +1 -1
- package/dist/commonjs/validators.d.ts +3 -8
- package/dist/commonjs/validators.d.ts.map +1 -1
- package/dist/commonjs/validators.js +0 -2
- package/dist/commonjs/validators.js.map +1 -1
- package/dist/commonjs.tsbuildinfo +1 -1
- package/dist/esm/client/index.d.ts +0 -1
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +0 -2
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/streaming.d.ts.map +1 -1
- package/dist/esm/client/streaming.js +1 -7
- package/dist/esm/client/streaming.js.map +1 -1
- package/dist/esm/component/_generated/api.d.ts +1 -12
- package/dist/esm/component/schema.d.ts +26 -26
- package/dist/esm/component/schema.d.ts.map +1 -1
- package/dist/esm/component/schema.js +2 -2
- package/dist/esm/component/schema.js.map +1 -1
- package/dist/esm/component/streams.d.ts +0 -7
- package/dist/esm/component/streams.d.ts.map +1 -1
- package/dist/esm/component/streams.js +14 -43
- package/dist/esm/component/streams.js.map +1 -1
- package/dist/esm/react/deltas.d.ts.map +1 -1
- package/dist/esm/react/deltas.js +3 -2
- package/dist/esm/react/deltas.js.map +1 -1
- package/dist/esm/react/index.d.ts +2 -4
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +8 -21
- package/dist/esm/react/index.js.map +1 -1
- package/dist/esm/validators.d.ts +3 -8
- package/dist/esm/validators.d.ts.map +1 -1
- package/dist/esm/validators.js +0 -2
- package/dist/esm/validators.js.map +1 -1
- package/dist/esm.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +0 -4
- package/src/client/streaming.ts +1 -7
- package/src/component/_generated/api.d.ts +1 -12
- package/src/component/schema.ts +2 -2
- package/src/component/streams.ts +29 -77
- package/src/react/deltas.ts +3 -4
- package/src/react/index.ts +10 -22
- package/src/validators.ts +0 -6
package/src/component/streams.ts
CHANGED
|
@@ -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 {
|
|
9
|
+
import type { Id } from "./_generated/dataModel.js";
|
|
10
10
|
import {
|
|
11
11
|
internalMutation,
|
|
12
12
|
mutation,
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import schema from "./schema.js";
|
|
18
18
|
import { stream } from "convex-helpers/server/stream";
|
|
19
19
|
import { mergedStream } from "convex-helpers/server/stream";
|
|
20
|
+
import { paginator } from "convex-helpers/server/pagination";
|
|
20
21
|
|
|
21
22
|
const MAX_DELTAS_PER_REQUEST = 1000;
|
|
22
23
|
const MAX_DELTAS_PER_STREAM = 100;
|
|
@@ -102,87 +103,33 @@ export const create = mutation({
|
|
|
102
103
|
export const list = query({
|
|
103
104
|
args: {
|
|
104
105
|
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
106
|
},
|
|
116
107
|
returns: v.array(vStreamMessage),
|
|
117
108
|
handler: async (ctx, args) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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}`
|
|
109
|
+
return ctx.db
|
|
110
|
+
.query("streamingMessages")
|
|
111
|
+
.withIndex("threadId_state_order_stepOrder", (q) =>
|
|
112
|
+
q.eq("threadId", args.threadId).eq("state.kind", "streaming")
|
|
113
|
+
)
|
|
114
|
+
.order("desc")
|
|
115
|
+
.take(100)
|
|
116
|
+
.then((msgs) =>
|
|
117
|
+
msgs.map((m) => ({
|
|
118
|
+
streamId: m._id,
|
|
119
|
+
...pick(m, [
|
|
120
|
+
"order",
|
|
121
|
+
"stepOrder",
|
|
122
|
+
"userId",
|
|
123
|
+
"agentName",
|
|
124
|
+
"model",
|
|
125
|
+
"provider",
|
|
126
|
+
"providerOptions",
|
|
127
|
+
]),
|
|
128
|
+
}))
|
|
164
129
|
);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
await cleanupTimeoutFn(ctx, stream);
|
|
168
|
-
await ctx.db.patch(args.streamId, {
|
|
169
|
-
state: { kind: "aborted", reason: args.reason },
|
|
170
|
-
});
|
|
171
130
|
},
|
|
172
131
|
});
|
|
173
132
|
|
|
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
133
|
export const finish = mutation({
|
|
187
134
|
args: {
|
|
188
135
|
streamId: v.id("streamingMessages"),
|
|
@@ -203,7 +150,12 @@ export const finish = mutation({
|
|
|
203
150
|
);
|
|
204
151
|
return;
|
|
205
152
|
}
|
|
206
|
-
|
|
153
|
+
if (stream.state.timeoutFnId) {
|
|
154
|
+
const timeoutFn = await ctx.db.system.get(stream.state.timeoutFnId);
|
|
155
|
+
if (timeoutFn?.state.kind === "pending") {
|
|
156
|
+
await ctx.scheduler.cancel(stream.state.timeoutFnId);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
207
159
|
await ctx.db.patch(args.streamId, {
|
|
208
160
|
state: { kind: "finished", endedAt: Date.now() },
|
|
209
161
|
});
|
|
@@ -279,7 +231,7 @@ async function deletePageForStreamId(
|
|
|
279
231
|
ctx: MutationCtx,
|
|
280
232
|
args: { streamId: Id<"streamingMessages">; cursor?: string }
|
|
281
233
|
) {
|
|
282
|
-
const deltas = await ctx.db
|
|
234
|
+
const deltas = await paginator(ctx.db, schema)
|
|
283
235
|
.query("streamDeltas")
|
|
284
236
|
.withIndex("streamId_start_end", (q) => q.eq("streamId", args.streamId))
|
|
285
237
|
.paginate({
|
package/src/react/deltas.ts
CHANGED
|
@@ -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":
|
package/src/react/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import type { ErrorMessage } from "convex-helpers";
|
|
3
3
|
import {
|
|
4
4
|
type PaginatedQueryArgs,
|
|
5
5
|
type UsePaginatedQueryResult,
|
|
@@ -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,
|
|
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:
|
|
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,23 +158,15 @@ 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
|
-
const queryArgs = args === "skip" ? args : omit(args, ["startOrder"]);
|
|
167
|
-
if (args !== "skip" && !startOrderRef.current && args.startOrder) {
|
|
168
|
-
startOrderRef.current = args.startOrder;
|
|
169
|
-
}
|
|
170
161
|
// Get all the active streams
|
|
171
162
|
const streamList = useQuery(
|
|
172
163
|
query,
|
|
173
|
-
|
|
174
|
-
?
|
|
164
|
+
args === "skip"
|
|
165
|
+
? args
|
|
175
166
|
: ({
|
|
176
|
-
...
|
|
167
|
+
...args,
|
|
177
168
|
paginationOpts: { cursor: null, numItems: 0 },
|
|
178
|
-
streamArgs: {
|
|
179
|
-
kind: "list",
|
|
180
|
-
startOrder: startOrderRef.current,
|
|
181
|
-
} as StreamArgs,
|
|
169
|
+
streamArgs: { kind: "list" } as StreamArgs,
|
|
182
170
|
} as FunctionArgs<Query>)
|
|
183
171
|
) as
|
|
184
172
|
| { streams: Extract<SyncStreamsReturnValue, { kind: "list" }> }
|
|
@@ -198,10 +186,10 @@ export function useStreamingThreadMessages<
|
|
|
198
186
|
// Get the deltas for all the active streams, if any.
|
|
199
187
|
const cursorQuery = useQuery(
|
|
200
188
|
query,
|
|
201
|
-
|
|
189
|
+
args === "skip" || !streamList
|
|
202
190
|
? ("skip" as const)
|
|
203
191
|
: ({
|
|
204
|
-
...
|
|
192
|
+
...args,
|
|
205
193
|
paginationOpts: { cursor: null, numItems: 0 },
|
|
206
194
|
streamArgs: { kind: "deltas", cursors } as StreamArgs,
|
|
207
195
|
} as FunctionArgs<Query>)
|
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
|