@convex-dev/agent 0.6.0 → 0.6.1

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 (184) hide show
  1. package/dist/UIMessages.d.ts +46 -0
  2. package/dist/UIMessages.d.ts.map +1 -0
  3. package/dist/UIMessages.js +634 -0
  4. package/dist/UIMessages.js.map +1 -0
  5. package/dist/client/createTool.d.ts +167 -0
  6. package/dist/client/createTool.d.ts.map +1 -0
  7. package/dist/client/createTool.js +116 -0
  8. package/dist/client/createTool.js.map +1 -0
  9. package/dist/client/defaultComponent.d.ts +11 -0
  10. package/dist/client/defaultComponent.d.ts.map +1 -0
  11. package/dist/client/defaultComponent.js +7 -0
  12. package/dist/client/defaultComponent.js.map +1 -0
  13. package/dist/client/definePlaygroundAPI.d.ts +1725 -0
  14. package/dist/client/definePlaygroundAPI.d.ts.map +1 -0
  15. package/dist/client/definePlaygroundAPI.js +271 -0
  16. package/dist/client/definePlaygroundAPI.js.map +1 -0
  17. package/dist/client/files.d.ts +69 -0
  18. package/dist/client/files.d.ts.map +1 -0
  19. package/dist/client/files.js +181 -0
  20. package/dist/client/files.js.map +1 -0
  21. package/dist/client/index.d.ts +2091 -0
  22. package/dist/client/index.d.ts.map +1 -0
  23. package/dist/client/index.js +929 -0
  24. package/dist/client/index.js.map +1 -0
  25. package/dist/client/messages.d.ts +461 -0
  26. package/dist/client/messages.d.ts.map +1 -0
  27. package/dist/client/messages.js +106 -0
  28. package/dist/client/messages.js.map +1 -0
  29. package/dist/client/mockModel.d.ts +42 -0
  30. package/dist/client/mockModel.d.ts.map +1 -0
  31. package/dist/client/mockModel.js +182 -0
  32. package/dist/client/mockModel.js.map +1 -0
  33. package/dist/client/saveInputMessages.d.ts +20 -0
  34. package/dist/client/saveInputMessages.d.ts.map +1 -0
  35. package/dist/client/saveInputMessages.js +58 -0
  36. package/dist/client/saveInputMessages.js.map +1 -0
  37. package/dist/client/search.d.ts +493 -0
  38. package/dist/client/search.d.ts.map +1 -0
  39. package/dist/client/search.js +435 -0
  40. package/dist/client/search.js.map +1 -0
  41. package/dist/client/start.d.ts +84 -0
  42. package/dist/client/start.d.ts.map +1 -0
  43. package/dist/client/start.js +185 -0
  44. package/dist/client/start.js.map +1 -0
  45. package/dist/client/streamText.d.ts +46 -0
  46. package/dist/client/streamText.d.ts.map +1 -0
  47. package/dist/client/streamText.js +127 -0
  48. package/dist/client/streamText.js.map +1 -0
  49. package/dist/client/streaming.d.ts +3778 -0
  50. package/dist/client/streaming.d.ts.map +1 -0
  51. package/dist/client/streaming.js +330 -0
  52. package/dist/client/streaming.js.map +1 -0
  53. package/dist/client/threads.d.ts +46 -0
  54. package/dist/client/threads.d.ts.map +1 -0
  55. package/dist/client/threads.js +49 -0
  56. package/dist/client/threads.js.map +1 -0
  57. package/dist/client/types.d.ts +461 -0
  58. package/dist/client/types.d.ts.map +1 -0
  59. package/dist/client/types.js +2 -0
  60. package/dist/client/types.js.map +1 -0
  61. package/dist/client/utils.d.ts +4 -0
  62. package/dist/client/utils.d.ts.map +1 -0
  63. package/dist/client/utils.js +21 -0
  64. package/dist/client/utils.js.map +1 -0
  65. package/dist/component/_generated/api.d.ts +48 -0
  66. package/dist/component/_generated/api.d.ts.map +1 -0
  67. package/dist/component/_generated/api.js +31 -0
  68. package/dist/component/_generated/api.js.map +1 -0
  69. package/dist/component/_generated/component.d.ts +3120 -0
  70. package/dist/component/_generated/component.d.ts.map +1 -0
  71. package/dist/component/_generated/component.js +11 -0
  72. package/dist/component/_generated/component.js.map +1 -0
  73. package/dist/component/_generated/dataModel.d.ts +46 -0
  74. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  75. package/dist/component/_generated/dataModel.js +11 -0
  76. package/dist/component/_generated/dataModel.js.map +1 -0
  77. package/dist/component/_generated/server.d.ts +121 -0
  78. package/dist/component/_generated/server.d.ts.map +1 -0
  79. package/dist/component/_generated/server.js +78 -0
  80. package/dist/component/_generated/server.js.map +1 -0
  81. package/dist/component/apiKeys.d.ts +11 -0
  82. package/dist/component/apiKeys.d.ts.map +1 -0
  83. package/dist/component/apiKeys.js +69 -0
  84. package/dist/component/apiKeys.js.map +1 -0
  85. package/dist/component/convex.config.d.ts +3 -0
  86. package/dist/component/convex.config.d.ts.map +1 -0
  87. package/dist/component/convex.config.js +3 -0
  88. package/dist/component/convex.config.js.map +1 -0
  89. package/dist/component/files.d.ts +97 -0
  90. package/dist/component/files.d.ts.map +1 -0
  91. package/dist/component/files.js +190 -0
  92. package/dist/component/files.js.map +1 -0
  93. package/dist/component/messages.d.ts +3851 -0
  94. package/dist/component/messages.d.ts.map +1 -0
  95. package/dist/component/messages.js +757 -0
  96. package/dist/component/messages.js.map +1 -0
  97. package/dist/component/schema.d.ts +8029 -0
  98. package/dist/component/schema.d.ts.map +1 -0
  99. package/dist/component/schema.js +147 -0
  100. package/dist/component/schema.js.map +1 -0
  101. package/dist/component/streams.d.ts +128 -0
  102. package/dist/component/streams.d.ts.map +1 -0
  103. package/dist/component/streams.js +413 -0
  104. package/dist/component/streams.js.map +1 -0
  105. package/dist/component/threads.d.ts +115 -0
  106. package/dist/component/threads.d.ts.map +1 -0
  107. package/dist/component/threads.js +208 -0
  108. package/dist/component/threads.js.map +1 -0
  109. package/dist/component/users.d.ts +52 -0
  110. package/dist/component/users.d.ts.map +1 -0
  111. package/dist/component/users.js +229 -0
  112. package/dist/component/users.js.map +1 -0
  113. package/dist/component/vector/index.d.ts +61 -0
  114. package/dist/component/vector/index.d.ts.map +1 -0
  115. package/dist/component/vector/index.js +146 -0
  116. package/dist/component/vector/index.js.map +1 -0
  117. package/dist/component/vector/tables.d.ts +58 -0
  118. package/dist/component/vector/tables.d.ts.map +1 -0
  119. package/dist/component/vector/tables.js +56 -0
  120. package/dist/component/vector/tables.js.map +1 -0
  121. package/dist/deltas.d.ts +43 -0
  122. package/dist/deltas.d.ts.map +1 -0
  123. package/dist/deltas.js +446 -0
  124. package/dist/deltas.js.map +1 -0
  125. package/dist/mapping.d.ts +76 -0
  126. package/dist/mapping.d.ts.map +1 -0
  127. package/dist/mapping.js +720 -0
  128. package/dist/mapping.js.map +1 -0
  129. package/dist/react/SmoothText.d.ts +5 -0
  130. package/dist/react/SmoothText.d.ts.map +1 -0
  131. package/dist/react/SmoothText.js +6 -0
  132. package/dist/react/SmoothText.js.map +1 -0
  133. package/dist/react/index.d.ts +25 -0
  134. package/dist/react/index.d.ts.map +1 -0
  135. package/dist/react/index.js +70 -0
  136. package/dist/react/index.js.map +1 -0
  137. package/dist/react/optimisticallySendMessage.d.ts +42 -0
  138. package/dist/react/optimisticallySendMessage.d.ts.map +1 -0
  139. package/dist/react/optimisticallySendMessage.js +74 -0
  140. package/dist/react/optimisticallySendMessage.js.map +1 -0
  141. package/dist/react/types.d.ts +12 -0
  142. package/dist/react/types.d.ts.map +1 -0
  143. package/dist/react/types.js +2 -0
  144. package/dist/react/types.js.map +1 -0
  145. package/dist/react/useDeltaStreams.d.ts +10 -0
  146. package/dist/react/useDeltaStreams.d.ts.map +1 -0
  147. package/dist/react/useDeltaStreams.js +106 -0
  148. package/dist/react/useDeltaStreams.js.map +1 -0
  149. package/dist/react/useSmoothText.d.ts +27 -0
  150. package/dist/react/useSmoothText.d.ts.map +1 -0
  151. package/dist/react/useSmoothText.js +68 -0
  152. package/dist/react/useSmoothText.js.map +1 -0
  153. package/dist/react/useStreamingUIMessages.d.ts +22 -0
  154. package/dist/react/useStreamingUIMessages.d.ts.map +1 -0
  155. package/dist/react/useStreamingUIMessages.js +92 -0
  156. package/dist/react/useStreamingUIMessages.js.map +1 -0
  157. package/dist/react/useThreadMessages.d.ts +104 -0
  158. package/dist/react/useThreadMessages.d.ts.map +1 -0
  159. package/dist/react/useThreadMessages.js +148 -0
  160. package/dist/react/useThreadMessages.js.map +1 -0
  161. package/dist/react/useUIMessages.d.ts +96 -0
  162. package/dist/react/useUIMessages.d.ts.map +1 -0
  163. package/dist/react/useUIMessages.js +108 -0
  164. package/dist/react/useUIMessages.js.map +1 -0
  165. package/dist/shared.d.ts +26 -0
  166. package/dist/shared.d.ts.map +1 -0
  167. package/dist/shared.js +67 -0
  168. package/dist/shared.js.map +1 -0
  169. package/dist/validators.d.ts +24516 -0
  170. package/dist/validators.d.ts.map +1 -0
  171. package/dist/validators.js +475 -0
  172. package/dist/validators.js.map +1 -0
  173. package/package.json +39 -39
  174. package/src/UIMessages.ts +0 -9
  175. package/src/client/approval.test.ts +144 -0
  176. package/src/client/index.ts +17 -9
  177. package/src/client/search.ts +0 -29
  178. package/src/client/start.ts +2 -2
  179. package/src/client/streamText.ts +9 -0
  180. package/src/client/streaming.ts +30 -23
  181. package/src/component/_generated/dataModel.ts +1 -1
  182. package/src/component/_generated/server.ts +0 -5
  183. package/src/mapping.ts +38 -22
  184. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
@@ -0,0 +1,69 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query } from "./_generated/server.js";
3
+ export const issue = mutation({
4
+ args: {
5
+ name: v.optional(v.string()),
6
+ },
7
+ handler: async (ctx, args) => {
8
+ if (args.name) {
9
+ const existingApiKey = await ctx.db
10
+ .query("apiKeys")
11
+ .withIndex("name", (q) => q.eq("name", args.name))
12
+ .first();
13
+ if (existingApiKey) {
14
+ console.warn(`API key ${args.name} already exists, deleting...`);
15
+ await ctx.db.delete(existingApiKey._id);
16
+ }
17
+ }
18
+ const apiKey = await ctx.db.insert("apiKeys", args);
19
+ return apiKey;
20
+ },
21
+ returns: v.id("apiKeys"),
22
+ });
23
+ export const validate = query({
24
+ args: {
25
+ apiKey: v.id("apiKeys"),
26
+ },
27
+ handler: async (ctx, args) => {
28
+ const apiKey = await ctx.db.get(args.apiKey);
29
+ if (!apiKey) {
30
+ throw new Error("Invalid API key");
31
+ }
32
+ return true;
33
+ },
34
+ returns: v.boolean(),
35
+ });
36
+ export const destroy = mutation({
37
+ args: v.object({
38
+ apiKey: v.optional(v.id("apiKeys")),
39
+ name: v.optional(v.string()),
40
+ }),
41
+ handler: async (ctx, args) => {
42
+ if (args.apiKey) {
43
+ const apiKey = await ctx.db.get(args.apiKey);
44
+ if (!apiKey) {
45
+ return "missing";
46
+ }
47
+ if (apiKey.name !== args.name) {
48
+ return "name mismatch";
49
+ }
50
+ await ctx.db.delete(args.apiKey);
51
+ }
52
+ else if (args.name) {
53
+ const apiKey = await ctx.db
54
+ .query("apiKeys")
55
+ .withIndex("name", (q) => q.eq("name", args.name))
56
+ .first();
57
+ if (!apiKey) {
58
+ return "missing";
59
+ }
60
+ await ctx.db.delete(apiKey._id);
61
+ }
62
+ else {
63
+ return "must provide either apiKey or name";
64
+ }
65
+ return "deleted";
66
+ },
67
+ returns: v.union(v.literal("missing"), v.literal("deleted"), v.literal("name mismatch"), v.literal("must provide either apiKey or name")),
68
+ });
69
+ //# sourceMappingURL=apiKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeys.js","sourceRoot":"","sources":["../../src/component/apiKeys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("convex/server").ComponentDefinition<any>;
2
+ export default _default;
3
+ //# sourceMappingURL=convex.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convex.config.d.ts","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":";AAEA,wBAAwC"}
@@ -0,0 +1,3 @@
1
+ import { defineComponent } from "convex/server";
2
+ export default defineComponent("agent");
3
+ //# sourceMappingURL=convex.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convex.config.js","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAe,eAAe,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,97 @@
1
+ import type { Id } from "./_generated/dataModel.js";
2
+ import { type MutationCtx } from "./_generated/server.js";
3
+ import type { Infer } from "convex/values";
4
+ declare const addFileArgs: import("convex/values").VObject<{
5
+ mediaType?: string | undefined;
6
+ mimeType?: string | undefined;
7
+ filename?: string | undefined;
8
+ storageId: string;
9
+ hash: string;
10
+ }, {
11
+ storageId: import("convex/values").VString<string, "required">;
12
+ hash: import("convex/values").VString<string, "required">;
13
+ filename: import("convex/values").VString<string | undefined, "optional">;
14
+ mediaType: import("convex/values").VString<string | undefined, "optional">;
15
+ /** @deprecated Use `mediaType` instead. */
16
+ mimeType: import("convex/values").VString<string | undefined, "optional">;
17
+ }, "required", "mediaType" | "mimeType" | "filename" | "storageId" | "hash">;
18
+ export declare const addFile: import("convex/server").RegisteredMutation<"public", {
19
+ mediaType?: string | undefined;
20
+ mimeType?: string | undefined;
21
+ filename?: string | undefined;
22
+ storageId: string;
23
+ hash: string;
24
+ }, Promise<{
25
+ fileId: import("convex/values").GenericId<"files">;
26
+ storageId: string;
27
+ }>>;
28
+ export declare function addFileHandler(ctx: MutationCtx, args: Infer<typeof addFileArgs>): Promise<{
29
+ fileId: import("convex/values").GenericId<"files">;
30
+ storageId: string;
31
+ }>;
32
+ export declare const get: import("convex/server").RegisteredQuery<"public", {
33
+ fileId: import("convex/values").GenericId<"files">;
34
+ }, Promise<{
35
+ _id: import("convex/values").GenericId<"files">;
36
+ _creationTime: number;
37
+ mediaType?: string | undefined;
38
+ mimeType?: string | undefined;
39
+ filename?: string | undefined;
40
+ storageId: string;
41
+ hash: string;
42
+ refcount: number;
43
+ lastTouchedAt: number;
44
+ } | null>>;
45
+ /**
46
+ * If you plan to have the same file added over and over without a reference to
47
+ * the fileId, you can use this query to get the fileId of the existing file.
48
+ * Note: this will not increment the refcount. only saving messages does that.
49
+ * It will only match if the filename is the same (or both are undefined).
50
+ */
51
+ export declare const useExistingFile: import("convex/server").RegisteredMutation<"public", {
52
+ filename?: string | undefined;
53
+ hash: string;
54
+ }, Promise<{
55
+ fileId: import("convex/values").GenericId<"files">;
56
+ storageId: string;
57
+ } | null>>;
58
+ export declare function changeRefcount(ctx: MutationCtx, prev: Id<"files">[], next: Id<"files">[]): Promise<void>;
59
+ export declare const copyFile: import("convex/server").RegisteredMutation<"public", {
60
+ fileId: Id<"files">;
61
+ }, Promise<void>>;
62
+ export declare function copyFileHandler(ctx: MutationCtx, args: {
63
+ fileId: Id<"files">;
64
+ }): Promise<void>;
65
+ /**
66
+ * Get files that are unused and can be deleted.
67
+ * This is useful for cleaning up files that are no longer needed.
68
+ * Note: recently added files that have not been saved yet will show up here.
69
+ * You can inspect the `lastTouchedAt` field to see how recently it was used.
70
+ * I'd recommend not deleting anything touched in the last 24 hours.
71
+ */
72
+ export declare const getFilesToDelete: import("convex/server").RegisteredQuery<"public", {
73
+ paginationOpts: {
74
+ id?: number;
75
+ endCursor?: string | null;
76
+ maximumRowsRead?: number;
77
+ maximumBytesRead?: number;
78
+ numItems: number;
79
+ cursor: string | null;
80
+ };
81
+ }, Promise<import("convex/server").PaginationResult<{
82
+ _id: import("convex/values").GenericId<"files">;
83
+ _creationTime: number;
84
+ mediaType?: string | undefined;
85
+ mimeType?: string | undefined;
86
+ filename?: string | undefined;
87
+ storageId: string;
88
+ hash: string;
89
+ refcount: number;
90
+ lastTouchedAt: number;
91
+ }>>>;
92
+ export declare const deleteFiles: import("convex/server").RegisteredMutation<"public", {
93
+ force?: boolean | undefined;
94
+ fileIds: import("convex/values").GenericId<"files">[];
95
+ }, Promise<import("convex/values").GenericId<"files">[]>>;
96
+ export {};
97
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAY,KAAK,WAAW,EAAS,MAAM,wBAAwB,CAAC;AAG3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,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;;;GAmChC;AAED,eAAO,MAAM,GAAG;;;;;;;;;;;;UAQd,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;;UA0B1B,CAAC;AAEH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EACnB,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,iBA4BpB;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,iBAU9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;IAgB3B,CAAC;AAEH,eAAO,MAAM,WAAW;;;yDA4BtB,CAAC"}
@@ -0,0 +1,190 @@
1
+ import { paginator } from "convex-helpers/server/pagination";
2
+ import { mutation, query } from "./_generated/server.js";
3
+ import { schema, v } from "./schema.js";
4
+ import { paginationOptsValidator } from "convex/server";
5
+ const addFileArgs = v.object({
6
+ storageId: v.string(),
7
+ hash: v.string(),
8
+ filename: v.optional(v.string()),
9
+ mediaType: v.optional(v.string()),
10
+ /** @deprecated Use `mediaType` instead. */
11
+ mimeType: v.optional(v.string()),
12
+ });
13
+ export const addFile = mutation({
14
+ args: addFileArgs,
15
+ handler: addFileHandler,
16
+ returns: {
17
+ fileId: v.id("files"),
18
+ storageId: v.string(),
19
+ },
20
+ });
21
+ export async function addFileHandler(ctx, args) {
22
+ // Support both mediaType (preferred) and mimeType (deprecated)
23
+ const mediaType = args.mediaType ?? args.mimeType;
24
+ const existingFile = await ctx.db
25
+ .query("files")
26
+ .withIndex("hash", (q) => q.eq("hash", args.hash))
27
+ .filter((q) => q.eq(q.field("filename"), args.filename))
28
+ .first();
29
+ if (existingFile) {
30
+ // increment the refcount
31
+ await ctx.db.patch(existingFile._id, {
32
+ refcount: existingFile.refcount + 1,
33
+ lastTouchedAt: Date.now(),
34
+ });
35
+ return {
36
+ fileId: existingFile._id,
37
+ storageId: existingFile.storageId,
38
+ };
39
+ }
40
+ const fileId = await ctx.db.insert("files", {
41
+ storageId: args.storageId,
42
+ hash: args.hash,
43
+ filename: args.filename,
44
+ mediaType,
45
+ mimeType: args.mimeType, // Keep for backwards compatibility
46
+ // We start out with it unused - when it's saved in a message we increment.
47
+ refcount: 0,
48
+ lastTouchedAt: Date.now(),
49
+ });
50
+ return {
51
+ fileId,
52
+ storageId: args.storageId,
53
+ };
54
+ }
55
+ export const get = query({
56
+ args: {
57
+ fileId: v.id("files"),
58
+ },
59
+ returns: v.union(v.null(), v.doc("files")),
60
+ handler: async (ctx, args) => {
61
+ return ctx.db.get(args.fileId);
62
+ },
63
+ });
64
+ /**
65
+ * If you plan to have the same file added over and over without a reference to
66
+ * the fileId, you can use this query to get the fileId of the existing file.
67
+ * Note: this will not increment the refcount. only saving messages does that.
68
+ * It will only match if the filename is the same (or both are undefined).
69
+ */
70
+ export const useExistingFile = mutation({
71
+ args: {
72
+ hash: v.string(),
73
+ filename: v.optional(v.string()),
74
+ },
75
+ handler: async (ctx, args) => {
76
+ const file = await ctx.db
77
+ .query("files")
78
+ .withIndex("hash", (q) => q.eq("hash", args.hash))
79
+ .filter((q) => q.eq(q.field("filename"), args.filename))
80
+ .first();
81
+ if (!file) {
82
+ return null;
83
+ }
84
+ await ctx.db.patch(file._id, {
85
+ lastTouchedAt: Date.now(),
86
+ });
87
+ return { fileId: file._id, storageId: file.storageId };
88
+ },
89
+ returns: v.union(v.null(), v.object({
90
+ fileId: v.id("files"),
91
+ storageId: v.string(),
92
+ })),
93
+ });
94
+ export async function changeRefcount(ctx, prev, next) {
95
+ const prevSet = new Set(prev);
96
+ const nextSet = new Set(next);
97
+ for (const fileId of prevSet) {
98
+ if (!nextSet.has(fileId)) {
99
+ const file = await ctx.db.get(fileId);
100
+ if (file) {
101
+ await ctx.db.patch(fileId, {
102
+ refcount: file.refcount - 1,
103
+ });
104
+ }
105
+ else {
106
+ console.error(`File ${fileId} not found when decrementing refcount`);
107
+ }
108
+ }
109
+ }
110
+ for (const fileId of nextSet) {
111
+ if (!prevSet.has(fileId)) {
112
+ const file = await ctx.db.get(fileId);
113
+ if (file) {
114
+ await ctx.db.patch(fileId, {
115
+ refcount: file.refcount + 1,
116
+ });
117
+ }
118
+ else {
119
+ throw new Error(`File ${fileId} not found when incrementing refcount`);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ export const copyFile = mutation({
125
+ args: {
126
+ fileId: v.id("files"),
127
+ },
128
+ handler: copyFileHandler,
129
+ returns: v.null(),
130
+ });
131
+ export async function copyFileHandler(ctx, args) {
132
+ const file = await ctx.db.get(args.fileId);
133
+ if (!file) {
134
+ throw new Error("File not found");
135
+ }
136
+ await ctx.db.patch(args.fileId, {
137
+ refcount: file.refcount + 1,
138
+ lastTouchedAt: Date.now(),
139
+ });
140
+ }
141
+ /**
142
+ * Get files that are unused and can be deleted.
143
+ * This is useful for cleaning up files that are no longer needed.
144
+ * Note: recently added files that have not been saved yet will show up here.
145
+ * You can inspect the `lastTouchedAt` field to see how recently it was used.
146
+ * I'd recommend not deleting anything touched in the last 24 hours.
147
+ */
148
+ export const getFilesToDelete = query({
149
+ args: {
150
+ paginationOpts: paginationOptsValidator,
151
+ },
152
+ handler: async (ctx, args) => {
153
+ const files = await paginator(ctx.db, schema)
154
+ .query("files")
155
+ .withIndex("refcount", (q) => q.eq("refcount", 0))
156
+ .paginate(args.paginationOpts);
157
+ return files;
158
+ },
159
+ returns: v.object({
160
+ page: v.array(v.doc("files")),
161
+ continueCursor: v.string(),
162
+ isDone: v.boolean(),
163
+ }),
164
+ });
165
+ export const deleteFiles = mutation({
166
+ args: {
167
+ fileIds: v.array(v.id("files")),
168
+ force: v.optional(v.boolean()),
169
+ },
170
+ returns: v.array(v.id("files")),
171
+ handler: async (ctx, args) => {
172
+ const deletedFileIds = await Promise.all(args.fileIds.map(async (fileId) => {
173
+ const file = await ctx.db.get(fileId);
174
+ if (!file) {
175
+ console.error(`File ${fileId} not found when deleting, skipping...`);
176
+ return null;
177
+ }
178
+ if (file.refcount && file.refcount > 0) {
179
+ if (!args.force) {
180
+ console.error(`File ${fileId} has refcount ${file.refcount} > 0, skipping...`);
181
+ return null;
182
+ }
183
+ }
184
+ await ctx.db.delete(fileId);
185
+ return fileId;
186
+ }));
187
+ return deletedFileIds.filter((fileId) => fileId !== null);
188
+ },
189
+ });
190
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/component/files.ts"],"names":[],"mappings":"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"}