@convex-dev/agent 0.7.0 → 0.7.2
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/README.md +5 -8
- package/dist/client/messages.d.ts +10 -0
- package/dist/client/messages.d.ts.map +1 -1
- package/dist/client/messages.js +1 -0
- package/dist/client/messages.js.map +1 -1
- package/dist/component/_generated/component.d.ts +15 -8
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/files.d.ts +6 -4
- package/dist/component/files.d.ts.map +1 -1
- package/dist/component/files.js +53 -42
- package/dist/component/files.js.map +1 -1
- package/dist/component/messages.d.ts +340 -338
- package/dist/component/messages.d.ts.map +1 -1
- package/dist/component/messages.js +80 -16
- package/dist/component/messages.js.map +1 -1
- package/dist/component/schema.d.ts +782 -626
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +12 -2
- package/dist/component/schema.js.map +1 -1
- package/dist/component/streams.d.ts +16 -2
- package/dist/component/streams.d.ts.map +1 -1
- package/dist/component/streams.js +86 -30
- package/dist/component/streams.js.map +1 -1
- package/dist/component/vector/index.d.ts +9 -9
- package/dist/component/vector/index.d.ts.map +1 -1
- package/dist/component/vector/tables.d.ts +5 -5
- package/dist/component/vector/tables.d.ts.map +1 -1
- package/dist/component/vector/tables.js +1 -1
- package/dist/component/vector/tables.js.map +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +106 -0
- package/dist/errors.js.map +1 -0
- package/dist/streaming/materializePersistedUIMessageChunks.d.ts +8 -2
- package/dist/streaming/materializePersistedUIMessageChunks.d.ts.map +1 -1
- package/dist/streaming/materializePersistedUIMessageChunks.js +34 -3
- package/dist/streaming/materializePersistedUIMessageChunks.js.map +1 -1
- package/dist/validators.d.ts +1952 -1952
- package/dist/vercel/UIMessages.js +1 -1
- package/dist/vercel/UIMessages.js.map +1 -1
- package/dist/vercel/client/definePlaygroundAPI.d.ts +132 -132
- package/dist/vercel/client/files.d.ts.map +1 -1
- package/dist/vercel/client/files.js +51 -27
- package/dist/vercel/client/files.js.map +1 -1
- package/dist/vercel/client/messages.d.ts +50 -32
- package/dist/vercel/client/messages.d.ts.map +1 -1
- package/dist/vercel/client/messages.js +2 -0
- package/dist/vercel/client/messages.js.map +1 -1
- package/dist/vercel/client/search.d.ts +475 -32
- package/dist/vercel/client/search.d.ts.map +1 -1
- package/dist/vercel/client/search.js +34 -9
- package/dist/vercel/client/search.js.map +1 -1
- package/dist/vercel/client/start.d.ts.map +1 -1
- package/dist/vercel/client/start.js +1 -0
- package/dist/vercel/client/start.js.map +1 -1
- package/dist/vercel/client/streamText.d.ts +1 -2
- package/dist/vercel/client/streamText.d.ts.map +1 -1
- package/dist/vercel/client/streamText.js +49 -17
- package/dist/vercel/client/streamText.js.map +1 -1
- package/dist/vercel/client/streaming.d.ts +318 -301
- package/dist/vercel/client/streaming.d.ts.map +1 -1
- package/dist/vercel/client/streaming.js +56 -21
- package/dist/vercel/client/streaming.js.map +1 -1
- package/dist/vercel/client/types.d.ts +2 -0
- package/dist/vercel/client/types.d.ts.map +1 -1
- package/dist/vercel/client/types.js.map +1 -1
- package/dist/vercel/client/utils.d.ts +9 -5
- package/dist/vercel/client/utils.d.ts.map +1 -1
- package/dist/vercel/client/utils.js +13 -13
- package/dist/vercel/client/utils.js.map +1 -1
- package/dist/vercel/fileMaterialization.d.ts +24 -0
- package/dist/vercel/fileMaterialization.d.ts.map +1 -0
- package/dist/vercel/fileMaterialization.js +118 -0
- package/dist/vercel/fileMaterialization.js.map +1 -0
- package/dist/vercel/index.d.ts +91 -90
- package/dist/vercel/index.d.ts.map +1 -1
- package/dist/vercel/index.js +2 -0
- package/dist/vercel/index.js.map +1 -1
- package/dist/vercel/mapping.d.ts.map +1 -1
- package/dist/vercel/mapping.js +7 -1
- package/dist/vercel/mapping.js.map +1 -1
- package/package.json +16 -9
- package/src/client/messages.ts +12 -0
- package/src/component/_generated/component.ts +18 -2
- package/src/component/files.test.ts +81 -6
- package/src/component/files.ts +69 -41
- package/src/component/messages.test.ts +496 -0
- package/src/component/messages.ts +105 -15
- package/src/component/schema.ts +16 -2
- package/src/component/streams.test.ts +109 -0
- package/src/component/streams.ts +123 -35
- package/src/component/vector/tables.ts +1 -1
- package/src/errors.test.ts +76 -0
- package/src/errors.ts +113 -0
- package/src/streaming/materializePersistedUIMessageChunks.test.ts +33 -0
- package/src/streaming/materializePersistedUIMessageChunks.ts +37 -0
- package/src/vercel/UIMessages.ts +1 -1
- package/src/vercel/client/files.test.ts +56 -0
- package/src/vercel/client/files.ts +53 -28
- package/src/vercel/client/index.test.ts +47 -0
- package/src/vercel/client/messages.ts +20 -0
- package/src/vercel/client/search.test.ts +183 -8
- package/src/vercel/client/search.ts +46 -12
- package/src/vercel/client/start.ts +1 -0
- package/src/vercel/client/streamText.test.ts +113 -17
- package/src/vercel/client/streamText.ts +55 -28
- package/src/vercel/client/streaming.test.ts +142 -7
- package/src/vercel/client/streaming.ts +73 -19
- package/src/vercel/client/types.ts +2 -0
- package/src/vercel/client/utils.test.ts +97 -0
- package/src/vercel/client/utils.ts +15 -15
- package/src/vercel/fileMaterialization.ts +174 -0
- package/src/vercel/index.ts +2 -0
- package/src/vercel/mapping.test.ts +117 -0
- package/src/vercel/mapping.ts +15 -1
- package/src/vercel/toUIMessages.test.ts +7 -1
|
@@ -49,13 +49,15 @@ export declare const get: import("convex/server").RegisteredQuery<"public", {
|
|
|
49
49
|
* It will only match if the filename is the same (or both are undefined).
|
|
50
50
|
*/
|
|
51
51
|
export declare const useExistingFile: import("convex/server").RegisteredMutation<"public", {
|
|
52
|
+
mediaType?: string | undefined;
|
|
52
53
|
filename?: string | undefined;
|
|
53
54
|
hash: string;
|
|
54
55
|
}, Promise<{
|
|
55
56
|
fileId: import("convex/values").GenericId<"files">;
|
|
56
57
|
storageId: string;
|
|
57
58
|
} | null>>;
|
|
58
|
-
|
|
59
|
+
/** Transfer ownership between two durable records. */
|
|
60
|
+
export declare function changeRefcount(ctx: MutationCtx, previous: Id<"files">[], next: Id<"files">[]): Promise<void>;
|
|
59
61
|
export declare const copyFile: import("convex/server").RegisteredMutation<"public", {
|
|
60
62
|
fileId: Id<"files">;
|
|
61
63
|
}, Promise<void>>;
|
|
@@ -65,9 +67,9 @@ export declare function copyFileHandler(ctx: MutationCtx, args: {
|
|
|
65
67
|
/**
|
|
66
68
|
* Get files that are unused and can be deleted.
|
|
67
69
|
* This is useful for cleaning up files that are no longer needed.
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
70
|
+
* Files remain protected for 24 hours after registration or their last
|
|
71
|
+
* ownership change, so a file cannot be removed between registration and the
|
|
72
|
+
* transaction that saves its message or stream reference.
|
|
71
73
|
*/
|
|
72
74
|
export declare const getFilesToDelete: import("convex/server").RegisteredQuery<"public", {
|
|
73
75
|
paginationOpts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAO,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAY,KAAK,WAAW,EAAS,MAAM,wBAAwB,CAAC;AAG3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAI3C,QAAA,MAAM,WAAW;;;;;;;;;;;IAKf,2CAA2C;;4EAE3C,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;GAOlB,CAAC;AAEH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,KAAK,CAAC,OAAO,WAAW,CAAC;;;GAuChC;AAED,eAAO,MAAM,GAAG;;;;;;;;;;;;UAQd,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;;;UA+B1B,CAAC;AAiBH,sDAAsD;AACtD,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EACvB,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,iBA2BpB;AAED,eAAO,MAAM,QAAQ;YAUH,EAAE,CAAC,OAAO,CAAC;iBAJ3B,CAAC;AAEH,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;CAAE,iBAG9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;IAoB3B,CAAC;AAEH,eAAO,MAAM,WAAW;;;yDAmCtB,CAAC"}
|
package/dist/component/files.js
CHANGED
|
@@ -2,6 +2,7 @@ import { paginator } from "convex-helpers/server/pagination";
|
|
|
2
2
|
import { mutation, query } from "./_generated/server.js";
|
|
3
3
|
import { schema, v } from "./schema.js";
|
|
4
4
|
import { paginationOptsValidator } from "convex/server";
|
|
5
|
+
const FILE_CLEANUP_GRACE_MS = 24 * 60 * 60 * 1000;
|
|
5
6
|
const addFileArgs = v.object({
|
|
6
7
|
storageId: v.string(),
|
|
7
8
|
hash: v.string(),
|
|
@@ -20,17 +21,18 @@ export const addFile = mutation({
|
|
|
20
21
|
});
|
|
21
22
|
export async function addFileHandler(ctx, args) {
|
|
22
23
|
// Support both mediaType (preferred) and mimeType (deprecated)
|
|
23
|
-
const mediaType = args.mediaType ?? args.mimeType;
|
|
24
|
-
const
|
|
24
|
+
const mediaType = normalizeMediaType(args.mediaType ?? args.mimeType);
|
|
25
|
+
const existingFiles = await ctx.db
|
|
25
26
|
.query("files")
|
|
26
27
|
.withIndex("hash", (q) => q.eq("hash", args.hash))
|
|
27
28
|
// eslint-disable-next-line @convex-dev/no-filter-in-query -- We do not expect many files with the same hash and different filenames
|
|
28
29
|
.filter((q) => q.eq(q.field("filename"), args.filename))
|
|
29
|
-
.
|
|
30
|
+
.collect();
|
|
31
|
+
const existingFile = existingFiles.find((file) => sameMediaType(file, mediaType));
|
|
30
32
|
if (existingFile) {
|
|
31
|
-
//
|
|
33
|
+
// Registration is not ownership. Persisted messages and in-flight streams
|
|
34
|
+
// acquire ownership explicitly.
|
|
32
35
|
await ctx.db.patch("files", existingFile._id, {
|
|
33
|
-
refcount: existingFile.refcount + 1,
|
|
34
36
|
lastTouchedAt: Date.now(),
|
|
35
37
|
});
|
|
36
38
|
return {
|
|
@@ -72,14 +74,16 @@ export const useExistingFile = mutation({
|
|
|
72
74
|
args: {
|
|
73
75
|
hash: v.string(),
|
|
74
76
|
filename: v.optional(v.string()),
|
|
77
|
+
mediaType: v.optional(v.string()),
|
|
75
78
|
},
|
|
76
79
|
handler: async (ctx, args) => {
|
|
77
|
-
const
|
|
80
|
+
const files = await ctx.db
|
|
78
81
|
.query("files")
|
|
79
82
|
.withIndex("hash", (q) => q.eq("hash", args.hash))
|
|
80
83
|
// eslint-disable-next-line @convex-dev/no-filter-in-query -- We do not expect many files with the same hash and different filenames
|
|
81
84
|
.filter((q) => q.eq(q.field("filename"), args.filename))
|
|
82
|
-
.
|
|
85
|
+
.collect();
|
|
86
|
+
const file = files.find((candidate) => sameMediaType(candidate, normalizeMediaType(args.mediaType)));
|
|
83
87
|
if (!file) {
|
|
84
88
|
return null;
|
|
85
89
|
}
|
|
@@ -93,34 +97,41 @@ export const useExistingFile = mutation({
|
|
|
93
97
|
storageId: v.string(),
|
|
94
98
|
})),
|
|
95
99
|
});
|
|
96
|
-
|
|
97
|
-
const
|
|
100
|
+
function normalizeMediaType(value) {
|
|
101
|
+
const normalized = value?.trim().toLowerCase();
|
|
102
|
+
return normalized || undefined;
|
|
103
|
+
}
|
|
104
|
+
function sameMediaType(file, expected) {
|
|
105
|
+
const actual = normalizeMediaType(file.mediaType ?? file.mimeType);
|
|
106
|
+
// File rows from before media-type tracking have no value to distinguish.
|
|
107
|
+
// Preserve the prior hash-and-filename reuse behavior for those rows.
|
|
108
|
+
return expected === undefined || actual === undefined || actual === expected;
|
|
109
|
+
}
|
|
110
|
+
/** Transfer ownership between two durable records. */
|
|
111
|
+
export async function changeRefcount(ctx, previous, next) {
|
|
112
|
+
const previousSet = new Set(previous);
|
|
98
113
|
const nextSet = new Set(next);
|
|
99
|
-
for (const fileId of
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
else {
|
|
114
|
+
for (const fileId of new Set([...previousSet, ...nextSet])) {
|
|
115
|
+
const increment = Number(!previousSet.has(fileId) && nextSet.has(fileId));
|
|
116
|
+
const decrement = Number(previousSet.has(fileId) && !nextSet.has(fileId));
|
|
117
|
+
if (increment === 0 && decrement === 0)
|
|
118
|
+
continue;
|
|
119
|
+
const file = await ctx.db.get("files", fileId);
|
|
120
|
+
if (!file) {
|
|
121
|
+
if (increment === 0) {
|
|
108
122
|
console.error(`File ${fileId} not found when decrementing refcount`);
|
|
123
|
+
continue;
|
|
109
124
|
}
|
|
125
|
+
throw new Error(`File ${fileId} not found when incrementing refcount`);
|
|
110
126
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!prevSet.has(fileId)) {
|
|
114
|
-
const file = await ctx.db.get("files", fileId);
|
|
115
|
-
if (file) {
|
|
116
|
-
await ctx.db.patch("files", fileId, {
|
|
117
|
-
refcount: file.refcount + 1,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
throw new Error(`File ${fileId} not found when incrementing refcount`);
|
|
122
|
-
}
|
|
127
|
+
if (file.refcount < decrement) {
|
|
128
|
+
throw new Error(`File ${fileId} refcount underflow: ${file.refcount} - ${decrement}`);
|
|
123
129
|
}
|
|
130
|
+
const delta = increment - decrement;
|
|
131
|
+
await ctx.db.patch("files", fileId, {
|
|
132
|
+
refcount: file.refcount + delta,
|
|
133
|
+
lastTouchedAt: Date.now(),
|
|
134
|
+
});
|
|
124
135
|
}
|
|
125
136
|
}
|
|
126
137
|
export const copyFile = mutation({
|
|
@@ -131,21 +142,14 @@ export const copyFile = mutation({
|
|
|
131
142
|
returns: v.null(),
|
|
132
143
|
});
|
|
133
144
|
export async function copyFileHandler(ctx, args) {
|
|
134
|
-
|
|
135
|
-
if (!file) {
|
|
136
|
-
throw new Error("File not found");
|
|
137
|
-
}
|
|
138
|
-
await ctx.db.patch("files", args.fileId, {
|
|
139
|
-
refcount: file.refcount + 1,
|
|
140
|
-
lastTouchedAt: Date.now(),
|
|
141
|
-
});
|
|
145
|
+
await changeRefcount(ctx, [], [args.fileId]);
|
|
142
146
|
}
|
|
143
147
|
/**
|
|
144
148
|
* Get files that are unused and can be deleted.
|
|
145
149
|
* This is useful for cleaning up files that are no longer needed.
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
150
|
+
* Files remain protected for 24 hours after registration or their last
|
|
151
|
+
* ownership change, so a file cannot be removed between registration and the
|
|
152
|
+
* transaction that saves its message or stream reference.
|
|
149
153
|
*/
|
|
150
154
|
export const getFilesToDelete = query({
|
|
151
155
|
args: {
|
|
@@ -154,7 +158,9 @@ export const getFilesToDelete = query({
|
|
|
154
158
|
handler: async (ctx, args) => {
|
|
155
159
|
const files = await paginator(ctx.db, schema)
|
|
156
160
|
.query("files")
|
|
157
|
-
.withIndex("
|
|
161
|
+
.withIndex("refcount_lastTouchedAt", (q) => q
|
|
162
|
+
.eq("refcount", 0)
|
|
163
|
+
.lte("lastTouchedAt", Date.now() - FILE_CLEANUP_GRACE_MS))
|
|
158
164
|
.paginate(args.paginationOpts);
|
|
159
165
|
return files;
|
|
160
166
|
},
|
|
@@ -183,6 +189,11 @@ export const deleteFiles = mutation({
|
|
|
183
189
|
return null;
|
|
184
190
|
}
|
|
185
191
|
}
|
|
192
|
+
if (!args.force &&
|
|
193
|
+
file.lastTouchedAt > Date.now() - FILE_CLEANUP_GRACE_MS) {
|
|
194
|
+
console.error(`File ${fileId} is still within the cleanup grace period, skipping...`);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
186
197
|
await ctx.db.delete("files", fileId);
|
|
187
198
|
return fileId;
|
|
188
199
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAoB,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE;QACP,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAgB,EAChB,IAA+B;IAE/B,+DAA+D;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"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"}
|