@mastra/convex 1.0.11 → 1.1.0

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 (49) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +76 -4
  3. package/dist/cache/client.d.ts +21 -0
  4. package/dist/cache/client.d.ts.map +1 -0
  5. package/dist/cache/index.d.ts +35 -0
  6. package/dist/cache/index.d.ts.map +1 -0
  7. package/dist/cache/types.d.ts +46 -0
  8. package/dist/cache/types.d.ts.map +1 -0
  9. package/dist/{chunk-FTVDAP6U.cjs → chunk-CV23JOCS.cjs} +44 -2
  10. package/dist/chunk-CV23JOCS.cjs.map +1 -0
  11. package/dist/chunk-EEELVBWO.cjs +893 -0
  12. package/dist/chunk-EEELVBWO.cjs.map +1 -0
  13. package/dist/chunk-FZDLZ4S3.js +887 -0
  14. package/dist/chunk-FZDLZ4S3.js.map +1 -0
  15. package/dist/{chunk-G5FLGAPE.js → chunk-JPWDG4L3.js} +42 -3
  16. package/dist/chunk-JPWDG4L3.js.map +1 -0
  17. package/dist/docs/SKILL.md +1 -1
  18. package/dist/docs/assets/SOURCE_MAP.json +44 -15
  19. package/dist/docs/references/reference-storage-convex.md +74 -12
  20. package/dist/docs/references/reference-vectors-convex.md +129 -7
  21. package/dist/index.cjs +515 -36
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +471 -23
  26. package/dist/index.js.map +1 -1
  27. package/dist/schema.cjs +29 -17
  28. package/dist/schema.d.ts +76 -0
  29. package/dist/schema.d.ts.map +1 -1
  30. package/dist/schema.js +1 -1
  31. package/dist/server/cache.d.ts +5 -0
  32. package/dist/server/cache.d.ts.map +1 -0
  33. package/dist/server/index.cjs +44 -16
  34. package/dist/server/index.d.ts +3 -1
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +2 -2
  37. package/dist/server/native-vector.d.ts +17 -0
  38. package/dist/server/native-vector.d.ts.map +1 -0
  39. package/dist/storage/client.d.ts +5 -0
  40. package/dist/storage/client.d.ts.map +1 -1
  41. package/dist/vector/native.d.ts +111 -0
  42. package/dist/vector/native.d.ts.map +1 -0
  43. package/package.json +5 -5
  44. package/dist/chunk-C6QDNSBM.cjs +0 -425
  45. package/dist/chunk-C6QDNSBM.cjs.map +0 -1
  46. package/dist/chunk-FTVDAP6U.cjs.map +0 -1
  47. package/dist/chunk-G5FLGAPE.js.map +0 -1
  48. package/dist/chunk-NXNW2MK5.js +0 -423
  49. package/dist/chunk-NXNW2MK5.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,143 @@
1
1
  # @mastra/convex
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added native Convex vector search support for production workloads. The new `ConvexNativeVector` adapter uses ([#16729](https://github.com/mastra-ai/mastra/pull/16729))
8
+ Convex schema-defined vector indexes and `ctx.vectorSearch` instead of loading vectors through `ConvexVector` and
9
+ scoring them in JavaScript.
10
+
11
+ Define a native vector table in `convex/schema.ts`:
12
+
13
+ ```ts
14
+ import { defineSchema } from 'convex/server';
15
+ import { defineMastraNativeVectorTable } from '@mastra/convex/schema';
16
+
17
+ export default defineSchema({
18
+ docs_vectors: defineMastraNativeVectorTable({
19
+ dimensions: 1536,
20
+ }),
21
+ });
22
+ ```
23
+
24
+ Export the native vector handlers:
25
+
26
+ ```ts
27
+ import { mastraNativeVectorAction, mastraNativeVectorMutation, mastraNativeVectorQuery } from '@mastra/convex/server';
28
+
29
+ export const query = mastraNativeVectorAction;
30
+ export const read = mastraNativeVectorQuery;
31
+ export const write = mastraNativeVectorMutation;
32
+ ```
33
+
34
+ Then configure `ConvexNativeVector` in your Mastra app:
35
+
36
+ ```ts
37
+ import { ConvexNativeVector } from '@mastra/convex';
38
+
39
+ const vectorStore = new ConvexNativeVector({
40
+ id: 'convex-native-vectors',
41
+ deploymentUrl: process.env.CONVEX_URL!,
42
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
43
+ indexes: {
44
+ docs: {
45
+ tableName: 'docs_vectors',
46
+ vectorIndexName: 'by_embedding',
47
+ dimension: 1536,
48
+ },
49
+ },
50
+ });
51
+ ```
52
+
53
+ - Added `ConvexServerCache` so Convex-backed Mastra apps can keep durable stream replay and response cache state in Convex. ([#16736](https://github.com/mastra-ai/mastra/pull/16736))
54
+
55
+ ```ts
56
+ import { ConvexServerCache } from '@mastra/convex';
57
+
58
+ const cache = new ConvexServerCache({
59
+ deploymentUrl: process.env.CONVEX_URL!,
60
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
61
+ });
62
+ ```
63
+
64
+ The package also exports the Convex cache schema tables and server mutation for mounting the cache handler in a Convex app.
65
+ Existing Convex users who adopt the cache must add `mastra_cache` and `mastra_cache_list_items` to their Convex schema, mount the `mastraCache` handler, and deploy the schema update.
66
+
67
+ ### Patch Changes
68
+
69
+ - Updated dependencies [[`452036a`](https://github.com/mastra-ai/mastra/commit/452036a0d965b4f4c1efd93606e4f03b50b807a5), [`c272d50`](https://github.com/mastra-ai/mastra/commit/c272d50610a54496b6b6d92ccd4d37b333a2613a), [`27fd1b7`](https://github.com/mastra-ai/mastra/commit/27fd1b79ac62eb7694f92587eb7d1be05b59be01), [`5ba7253`](https://github.com/mastra-ai/mastra/commit/5ba7253745c85e8df8012a76d954c640ffa336f7), [`5556cc1`](https://github.com/mastra-ai/mastra/commit/5556cc1befec71518d84f826b3bfe3a079a9daf7), [`f73980d`](https://github.com/mastra-ai/mastra/commit/f73980d651eb5f7f1ab20582de4615a1b6f10fce), [`5499303`](https://github.com/mastra-ai/mastra/commit/54993032c1ebc09642625b78d2014e0cf84a3cae), [`a702009`](https://github.com/mastra-ai/mastra/commit/a702009d3cfaa745120f501e21c783ed4d6a3072), [`9aee493`](https://github.com/mastra-ai/mastra/commit/9aee493ed6089b5133472623dcce49934bf2d509), [`d8692af`](https://github.com/mastra-ai/mastra/commit/d8692afa253028e39cdce2aafa0ac414071a762e), [`1a9cc60`](https://github.com/mastra-ai/mastra/commit/1a9cc6069f9910fc3d59e4953ac8cd95d89ad6f5), [`8cdb86c`](https://github.com/mastra-ai/mastra/commit/8cdb86ceed1137bc2768e147dce85a0692b9fb26), [`8534d79`](https://github.com/mastra-ai/mastra/commit/8534d791fa1cb70fe1c19e2604c4b63cc10dd051), [`eda90c5`](https://github.com/mastra-ai/mastra/commit/eda90c5bfd7de11805ecc9f4552716c895fbaf78), [`a935b0a`](https://github.com/mastra-ai/mastra/commit/a935b0a0977ae3f196b33ec7621f528069c82db0), [`9c88701`](https://github.com/mastra-ai/mastra/commit/9c8870195b41a38dc40b6ba2aa55eda04df8fa69), [`c78f8cd`](https://github.com/mastra-ai/mastra/commit/c78f8cd6222a86e6c60ae5210b6929ad5221b6fb), [`e146aad`](https://github.com/mastra-ai/mastra/commit/e146aadbba66c410ba0e74bac4c50135495cb8dd), [`ac79462`](https://github.com/mastra-ai/mastra/commit/ac79462b98f1062394c45093aa515b0766f27ee2), [`1a0ec78`](https://github.com/mastra-ai/mastra/commit/1a0ec789a26cae443744e9abbd62ed6ee676af39), [`e47bca7`](https://github.com/mastra-ai/mastra/commit/e47bca7b72866d3abd173b9f530ac4318113a8ff), [`afc004f`](https://github.com/mastra-ai/mastra/commit/afc004f5cc7e30697809e7021820b9f5881e6719), [`0031d0f`](https://github.com/mastra-ai/mastra/commit/0031d0f13831d7843ac5d498734a7d92862e2ce3), [`841a222`](https://github.com/mastra-ai/mastra/commit/841a222560d8c19238f8213713f30535cdd82284), [`64c1e0b`](https://github.com/mastra-ai/mastra/commit/64c1e0b35165c96b659818bd0177aa18794ef11f), [`40d83a9`](https://github.com/mastra-ai/mastra/commit/40d83a90d9be31a1b83e04649edb703eb7753e33), [`4e88dc6`](https://github.com/mastra-ai/mastra/commit/4e88dc6b89f154c0eae37221c8126be0c23c569f), [`19018f0`](https://github.com/mastra-ai/mastra/commit/19018f05722af74a5978781a7731a654b26f7f2a), [`19281c7`](https://github.com/mastra-ai/mastra/commit/19281c70424f757219782de16c2699743c5e04d0), [`3498b49`](https://github.com/mastra-ai/mastra/commit/3498b4946be94f4313cd817733589680dcda5278), [`d52b6fe`](https://github.com/mastra-ai/mastra/commit/d52b6fe1c56853eb38864baae0bbfa75cc739ccb), [`408be73`](https://github.com/mastra-ai/mastra/commit/408be73449dfab92b51eab8c6623b6c443debc25), [`359439b`](https://github.com/mastra-ai/mastra/commit/359439bb8c635e048176306828195f8297f50021), [`71a820b`](https://github.com/mastra-ai/mastra/commit/71a820b2353fa1406772c50760a3732058a8b337), [`1698f5e`](https://github.com/mastra-ai/mastra/commit/1698f5ec141d34f22a873efdb145ce3cdf848a5e)]:
70
+ - @mastra/core@1.36.0
71
+
72
+ ## 1.1.0-alpha.0
73
+
74
+ ### Minor Changes
75
+
76
+ - Added native Convex vector search support for production workloads. The new `ConvexNativeVector` adapter uses ([#16729](https://github.com/mastra-ai/mastra/pull/16729))
77
+ Convex schema-defined vector indexes and `ctx.vectorSearch` instead of loading vectors through `ConvexVector` and
78
+ scoring them in JavaScript.
79
+
80
+ Define a native vector table in `convex/schema.ts`:
81
+
82
+ ```ts
83
+ import { defineSchema } from 'convex/server';
84
+ import { defineMastraNativeVectorTable } from '@mastra/convex/schema';
85
+
86
+ export default defineSchema({
87
+ docs_vectors: defineMastraNativeVectorTable({
88
+ dimensions: 1536,
89
+ }),
90
+ });
91
+ ```
92
+
93
+ Export the native vector handlers:
94
+
95
+ ```ts
96
+ import { mastraNativeVectorAction, mastraNativeVectorMutation, mastraNativeVectorQuery } from '@mastra/convex/server';
97
+
98
+ export const query = mastraNativeVectorAction;
99
+ export const read = mastraNativeVectorQuery;
100
+ export const write = mastraNativeVectorMutation;
101
+ ```
102
+
103
+ Then configure `ConvexNativeVector` in your Mastra app:
104
+
105
+ ```ts
106
+ import { ConvexNativeVector } from '@mastra/convex';
107
+
108
+ const vectorStore = new ConvexNativeVector({
109
+ id: 'convex-native-vectors',
110
+ deploymentUrl: process.env.CONVEX_URL!,
111
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
112
+ indexes: {
113
+ docs: {
114
+ tableName: 'docs_vectors',
115
+ vectorIndexName: 'by_embedding',
116
+ dimension: 1536,
117
+ },
118
+ },
119
+ });
120
+ ```
121
+
122
+ - Added `ConvexServerCache` so Convex-backed Mastra apps can keep durable stream replay and response cache state in Convex. ([#16736](https://github.com/mastra-ai/mastra/pull/16736))
123
+
124
+ ```ts
125
+ import { ConvexServerCache } from '@mastra/convex';
126
+
127
+ const cache = new ConvexServerCache({
128
+ deploymentUrl: process.env.CONVEX_URL!,
129
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
130
+ });
131
+ ```
132
+
133
+ The package also exports the Convex cache schema tables and server mutation for mounting the cache handler in a Convex app.
134
+ Existing Convex users who adopt the cache must add `mastra_cache` and `mastra_cache_list_items` to their Convex schema, mount the `mastraCache` handler, and deploy the schema update.
135
+
136
+ ### Patch Changes
137
+
138
+ - Updated dependencies [[`5556cc1`](https://github.com/mastra-ai/mastra/commit/5556cc1befec71518d84f826b3bfe3a079a9daf7), [`5499303`](https://github.com/mastra-ai/mastra/commit/54993032c1ebc09642625b78d2014e0cf84a3cae), [`e47bca7`](https://github.com/mastra-ai/mastra/commit/e47bca7b72866d3abd173b9f530ac4318113a8ff), [`0031d0f`](https://github.com/mastra-ai/mastra/commit/0031d0f13831d7843ac5d498734a7d92862e2ce3), [`3498b49`](https://github.com/mastra-ai/mastra/commit/3498b4946be94f4313cd817733589680dcda5278), [`359439b`](https://github.com/mastra-ai/mastra/commit/359439bb8c635e048176306828195f8297f50021)]:
139
+ - @mastra/core@1.36.0-alpha.3
140
+
3
141
  ## 1.0.11
4
142
 
5
143
  ### Patch Changes
package/README.md CHANGED
@@ -3,8 +3,10 @@
3
3
  Convex adapters for Mastra:
4
4
 
5
5
  - `ConvexStore` implements the Mastra storage contract (threads, messages, workflows, scores, resources).
6
- - `ConvexVector` stores embeddings inside Convex and performs cosine similarity search.
7
- - `@mastra/convex/server` exposes the required Convex table definitions and storage mutation.
6
+ - `ConvexVector` stores embeddings inside Convex and performs development-scale cosine similarity search.
7
+ - `ConvexNativeVector` uses Convex native vector search for production workloads.
8
+ - `ConvexServerCache` stores Mastra server cache entries in Convex for durable stream replay and response caching.
9
+ - `@mastra/convex/server` exposes the required Convex table definitions, storage mutation, cache handlers, and native vector handlers.
8
10
 
9
11
  ## Quick start
10
12
 
@@ -28,6 +30,8 @@ import {
28
30
  mastraScoresTable,
29
31
  mastraVectorIndexesTable,
30
32
  mastraVectorsTable,
33
+ mastraCacheTable,
34
+ mastraCacheListItemsTable,
31
35
  mastraDocumentsTable,
32
36
  } from '@mastra/convex/schema';
33
37
 
@@ -39,11 +43,13 @@ export default defineSchema({
39
43
  mastra_scorers: mastraScoresTable,
40
44
  mastra_vector_indexes: mastraVectorIndexesTable,
41
45
  mastra_vectors: mastraVectorsTable,
46
+ mastra_cache: mastraCacheTable,
47
+ mastra_cache_list_items: mastraCacheListItemsTable,
42
48
  mastra_documents: mastraDocumentsTable,
43
49
  });
44
50
  ```
45
51
 
46
- ### 3. Create the storage handler
52
+ ### 3. Create the storage and cache handlers
47
53
 
48
54
  In `convex/mastra/storage.ts`:
49
55
 
@@ -53,6 +59,14 @@ import { mastraStorage } from '@mastra/convex/server';
53
59
  export const handle = mastraStorage;
54
60
  ```
55
61
 
62
+ In `convex/mastra/cache.ts`:
63
+
64
+ ```ts
65
+ import { mastraCache } from '@mastra/convex/server';
66
+
67
+ export const handle = mastraCache;
68
+ ```
69
+
56
70
  ### 4. Deploy to Convex
57
71
 
58
72
  ```bash
@@ -64,7 +78,7 @@ npx convex deploy
64
78
  ### 5. Use in Mastra
65
79
 
66
80
  ```ts
67
- import { ConvexStore } from '@mastra/convex';
81
+ import { ConvexServerCache, ConvexStore } from '@mastra/convex';
68
82
 
69
83
  const storage = new ConvexStore({
70
84
  id: 'convex',
@@ -72,8 +86,18 @@ const storage = new ConvexStore({
72
86
  adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
73
87
  storageFunction: 'mastra/storage:handle', // default
74
88
  });
89
+
90
+ const cache = new ConvexServerCache({
91
+ deploymentUrl: process.env.CONVEX_URL!,
92
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
93
+ cacheFunction: 'mastra/cache:handle', // default
94
+ requestTimeoutMs: 30_000, // default
95
+ });
75
96
  ```
76
97
 
98
+ `clear()` removes rows whose stored prefix exactly matches the configured cache prefix. Cleanup runs in bounded batches, so reads for a key being cleared can return empty results until cleanup finishes. During cleanup, cache metadata can briefly use an internal `deleted` state before the next cleanup pass removes it. List pushes refresh the configured cache TTL.
99
+ Use this cache for durable replay of moderate-frequency events; batch high-frequency token streams or use a lower-latency cache backend.
100
+
77
101
  For vectors:
78
102
 
79
103
  ```ts
@@ -86,6 +110,52 @@ const vector = new ConvexVector({
86
110
  });
87
111
  ```
88
112
 
113
+ `ConvexVector` scans stored vectors through the storage handler and computes similarity in the adapter. Use it for local development, tests, and small datasets.
114
+
115
+ For native Convex vector search, define a dedicated table in `convex/schema.ts`:
116
+
117
+ ```ts
118
+ import { defineSchema } from 'convex/server';
119
+ import { defineMastraNativeVectorTable } from '@mastra/convex/schema';
120
+
121
+ export default defineSchema({
122
+ docs_vectors: defineMastraNativeVectorTable({
123
+ dimensions: 1536,
124
+ }),
125
+ });
126
+ ```
127
+
128
+ Export the native vector handlers in `convex/mastra/nativeVector.ts`:
129
+
130
+ ```ts
131
+ import { mastraNativeVectorAction, mastraNativeVectorMutation, mastraNativeVectorQuery } from '@mastra/convex/server';
132
+
133
+ export const query = mastraNativeVectorAction;
134
+ export const read = mastraNativeVectorQuery;
135
+ export const write = mastraNativeVectorMutation;
136
+ ```
137
+
138
+ Configure the native vector adapter:
139
+
140
+ ```ts
141
+ import { ConvexNativeVector } from '@mastra/convex';
142
+
143
+ const vector = new ConvexNativeVector({
144
+ id: 'convex-native-vectors',
145
+ deploymentUrl: process.env.CONVEX_URL!,
146
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
147
+ indexes: {
148
+ docs: {
149
+ tableName: 'docs_vectors',
150
+ vectorIndexName: 'by_embedding',
151
+ dimension: 1536,
152
+ },
153
+ },
154
+ });
155
+ ```
156
+
157
+ Native vector search uses Convex's schema-defined vector indexes and action-only `ctx.vectorSearch` API. It supports `topK` values from 1 to 256 and equality filters on fields declared in the Convex vector index `filterFields`.
158
+
89
159
  ## Architecture
90
160
 
91
161
  This adapter uses **typed Convex tables** for each Mastra domain:
@@ -99,6 +169,8 @@ This adapter uses **typed Convex tables** for each Mastra domain:
99
169
  | Scorers | `mastra_scorers` | Evaluation data |
100
170
  | Vector Indexes | `mastra_vector_indexes` | Index metadata |
101
171
  | Vectors | `mastra_vectors` | Embeddings |
172
+ | Cache | `mastra_cache` | Cache metadata |
173
+ | Cache Items | `mastra_cache_list_items` | Cache list entries |
102
174
  | Fallback | `mastra_documents` | Unknown tables |
103
175
 
104
176
  All typed tables include:
@@ -0,0 +1,21 @@
1
+ import type { CacheRequest } from './types.js';
2
+ export type ConvexCacheClientConfig = {
3
+ deploymentUrl: string;
4
+ adminAuthToken: string;
5
+ cacheFunction?: string;
6
+ requestTimeoutMs?: number;
7
+ };
8
+ export type RawCacheResult<T = unknown> = {
9
+ result: T;
10
+ hasMore?: boolean;
11
+ };
12
+ export declare class ConvexCacheClient {
13
+ private readonly deploymentUrl;
14
+ private readonly adminAuthToken;
15
+ private readonly cacheFunction;
16
+ private readonly requestTimeoutMs;
17
+ constructor({ deploymentUrl, adminAuthToken, cacheFunction, requestTimeoutMs }: ConvexCacheClientConfig);
18
+ callCacheRaw<T = unknown>(request: CacheRequest): Promise<RawCacheResult<T>>;
19
+ callCache<T = unknown>(request: CacheRequest): Promise<T>;
20
+ }
21
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cache/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,SAAS,CAAC;AAE3D,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI;IACxC,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAaF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,EAAE,uBAAuB;IAuBjG,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAgE5E,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;CAIhE"}
@@ -0,0 +1,35 @@
1
+ import { MastraServerCache } from '@mastra/core/cache';
2
+ import { ConvexCacheClient } from './client.js';
3
+ import type { ConvexCacheClientConfig } from './client.js';
4
+ export type ConvexServerCacheConfig = {
5
+ /**
6
+ * Prefix applied to all cache keys. `clear()` removes rows whose stored
7
+ * prefix exactly matches this value.
8
+ */
9
+ keyPrefix?: string;
10
+ /**
11
+ * Default cache TTL in milliseconds. Set to 0 to disable expiry.
12
+ */
13
+ ttlMs?: number;
14
+ } & ({
15
+ client: ConvexCacheClient;
16
+ } | ConvexCacheClientConfig);
17
+ export declare class ConvexServerCache extends MastraServerCache {
18
+ private readonly client;
19
+ private readonly keyPrefix;
20
+ private readonly ttlMs;
21
+ constructor(config: ConvexServerCacheConfig);
22
+ private getKey;
23
+ private getExpiresAt;
24
+ private callUntilSettled;
25
+ get(key: string): Promise<unknown>;
26
+ set(key: string, value: unknown, ttlMs?: number): Promise<void>;
27
+ listLength(key: string): Promise<number>;
28
+ listPush(key: string, value: unknown): Promise<void>;
29
+ listFromTo(key: string, from: number, to?: number): Promise<unknown[]>;
30
+ delete(key: string): Promise<void>;
31
+ clear(): Promise<void>;
32
+ increment(key: string): Promise<number>;
33
+ }
34
+ export { ConvexCacheClient, type ConvexCacheClientConfig };
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,CAAC;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAAG,uBAAuB,CAAC,CAAC;AAU9D,qBAAa,iBAAkB,SAAQ,iBAAiB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,uBAAuB;IAQ3C,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,YAAY;YAKN,gBAAgB;IAWxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOlC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,MAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAS1E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQ9C;AAED,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,46 @@
1
+ export type CacheRequest = {
2
+ op: 'get';
3
+ key: string;
4
+ } | {
5
+ op: 'set';
6
+ key: string;
7
+ keyPrefix: string;
8
+ value: unknown;
9
+ expiresAt: number | null;
10
+ } | {
11
+ op: 'listLength';
12
+ key: string;
13
+ } | {
14
+ op: 'listPush';
15
+ key: string;
16
+ keyPrefix: string;
17
+ value: unknown;
18
+ expiresAt: number | null;
19
+ } | {
20
+ op: 'listFromTo';
21
+ key: string;
22
+ from: number;
23
+ to: number;
24
+ } | {
25
+ op: 'delete';
26
+ key: string;
27
+ } | {
28
+ op: 'clear';
29
+ keyPrefix: string;
30
+ } | {
31
+ op: 'increment';
32
+ key: string;
33
+ keyPrefix: string;
34
+ expiresAt: number | null;
35
+ };
36
+ export type CacheResponse = {
37
+ ok: true;
38
+ result?: unknown;
39
+ hasMore?: boolean;
40
+ } | {
41
+ ok: false;
42
+ error: string;
43
+ code?: string;
44
+ details?: Record<string, unknown>;
45
+ };
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB;IACE,EAAE,EAAE,KAAK,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,GACD;IACE,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,EAAE,EAAE,WAAW,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,aAAa,GACrB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC"}
@@ -69,6 +69,45 @@ var mastraVectorsTable = server.defineTable({
69
69
  embedding: values.v.array(values.v.float64()),
70
70
  metadata: values.v.optional(values.v.any())
71
71
  }).index("by_index_id", ["indexName", "id"]).index("by_index", ["indexName"]);
72
+ function defineMastraNativeVectorTable({
73
+ dimensions,
74
+ vectorIndexName = "by_embedding",
75
+ staged = false
76
+ }) {
77
+ if (!Number.isInteger(dimensions) || dimensions < 2 || dimensions > 4096) {
78
+ throw new Error("defineMastraNativeVectorTable: dimensions must be an integer between 2 and 4096.");
79
+ }
80
+ const table = server.defineTable({
81
+ id: values.v.string(),
82
+ embedding: values.v.array(values.v.float64()),
83
+ metadata: values.v.optional(values.v.any())
84
+ }).index("by_record_id", ["id"]);
85
+ if (staged) {
86
+ return table.vectorIndex(vectorIndexName, {
87
+ vectorField: "embedding",
88
+ dimensions,
89
+ staged: true
90
+ });
91
+ }
92
+ return table.vectorIndex(vectorIndexName, {
93
+ vectorField: "embedding",
94
+ dimensions
95
+ });
96
+ }
97
+ var mastraCacheTable = server.defineTable({
98
+ key: values.v.string(),
99
+ keyPrefix: values.v.string(),
100
+ kind: values.v.union(values.v.literal("value"), values.v.literal("list"), values.v.literal("counter"), values.v.literal("deleted")),
101
+ value: values.v.optional(values.v.string()),
102
+ counter: values.v.optional(values.v.number()),
103
+ expiresAt: values.v.union(values.v.number(), values.v.null())
104
+ }).index("by_key", ["key"]).index("by_key_prefix", ["keyPrefix"]);
105
+ var mastraCacheListItemsTable = server.defineTable({
106
+ key: values.v.string(),
107
+ keyPrefix: values.v.string(),
108
+ index: values.v.number(),
109
+ value: values.v.string()
110
+ }).index("by_key_prefix", ["keyPrefix"]).index("by_key_index", ["key", "index"]);
72
111
  var mastraDocumentsTable = server.defineTable({
73
112
  table: values.v.string(),
74
113
  primaryKey: values.v.string(),
@@ -101,6 +140,9 @@ Object.defineProperty(exports, "TABLE_WORKFLOW_SNAPSHOT", {
101
140
  exports.TABLE_DOCUMENTS = TABLE_DOCUMENTS;
102
141
  exports.TABLE_VECTORS = TABLE_VECTORS;
103
142
  exports.TABLE_VECTOR_INDEXES = TABLE_VECTOR_INDEXES;
143
+ exports.defineMastraNativeVectorTable = defineMastraNativeVectorTable;
144
+ exports.mastraCacheListItemsTable = mastraCacheListItemsTable;
145
+ exports.mastraCacheTable = mastraCacheTable;
104
146
  exports.mastraDocumentsTable = mastraDocumentsTable;
105
147
  exports.mastraMessagesTable = mastraMessagesTable;
106
148
  exports.mastraResourcesTable = mastraResourcesTable;
@@ -109,5 +151,5 @@ exports.mastraThreadsTable = mastraThreadsTable;
109
151
  exports.mastraVectorIndexesTable = mastraVectorIndexesTable;
110
152
  exports.mastraVectorsTable = mastraVectorsTable;
111
153
  exports.mastraWorkflowSnapshotsTable = mastraWorkflowSnapshotsTable;
112
- //# sourceMappingURL=chunk-FTVDAP6U.cjs.map
113
- //# sourceMappingURL=chunk-FTVDAP6U.cjs.map
154
+ //# sourceMappingURL=chunk-CV23JOCS.cjs.map
155
+ //# sourceMappingURL=chunk-CV23JOCS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"names":["v","defineTable","TABLE_SCHEMAS","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","TABLE_SCORERS"],"mappings":"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","file":"chunk-CV23JOCS.cjs","sourcesContent":["/**\n * Convex schema definitions for Mastra tables.\n *\n * This file dynamically builds Convex table definitions from the canonical\n * TABLE_SCHEMAS in @mastra/core/storage/constants to ensure they stay in sync.\n *\n * The import path @mastra/core/storage/constants is specifically designed to\n * avoid pulling in Node.js dependencies, making it safe to use in Convex's\n * sandboxed schema evaluation environment.\n */\nimport {\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n} from '@mastra/core/storage/constants';\nimport { defineTable } from 'convex/server';\nimport { v } from 'convex/values';\n\n/**\n * Helper to convert Mastra StorageColumn type to Convex validator\n */\nfunction columnToValidator(column: { type: string; nullable?: boolean }) {\n let validator;\n switch (column.type) {\n case 'text':\n validator = v.string();\n break;\n case 'integer':\n case 'float':\n validator = v.number();\n break;\n case 'bigint':\n validator = v.int64();\n break;\n case 'boolean':\n validator = v.boolean();\n break;\n case 'timestamp':\n validator = v.string(); // Store as ISO string\n break;\n case 'jsonb':\n case 'json':\n validator = v.any();\n break;\n default:\n validator = v.any();\n }\n return column.nullable ? v.optional(validator) : validator;\n}\n\n/**\n * Build Convex table definition from Mastra schema.\n * Includes the `id` field as a regular field (Convex auto-generates _id).\n */\nfunction buildTableFromSchema(schema: Record<string, { type: string; nullable?: boolean; primaryKey?: boolean }>) {\n const fields: Record<string, any> = {};\n for (const [key, column] of Object.entries(schema)) {\n fields[key] = columnToValidator(column);\n }\n return fields;\n}\n\n// ============================================================================\n// Table Definitions - Built from @mastra/core TABLE_SCHEMAS\n// ============================================================================\n\n/**\n * Threads table - stores conversation threads\n * Schema: TABLE_SCHEMAS[TABLE_THREADS]\n */\nexport const mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS]))\n .index('by_record_id', ['id'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Messages table - stores conversation messages\n * Schema: TABLE_SCHEMAS[TABLE_MESSAGES]\n */\nexport const mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES]))\n .index('by_record_id', ['id'])\n .index('by_thread', ['thread_id'])\n .index('by_thread_created', ['thread_id', 'createdAt'])\n .index('by_resource', ['resourceId']);\n\n/**\n * Resources table - stores resource/user working memory\n * Schema: TABLE_SCHEMAS[TABLE_RESOURCES]\n */\nexport const mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES]))\n .index('by_record_id', ['id'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Workflow snapshots table - stores workflow execution state\n * Schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT]\n *\n * Note: The `id` field is added explicitly for Convex's by_record_id index.\n * The core schema uses (workflow_name, run_id) as a composite key, but Convex\n * requires a single-column index. The id value is generated at runtime as\n * `${workflow_name}-${run_id}` by the Convex storage adapter's normalizeRecord().\n *\n * Fields are defined explicitly (not using buildTableFromSchema) because TypeScript's\n * type inference doesn't work well with spread operators in Convex's defineTable.\n */\nexport const mastraWorkflowSnapshotsTable = defineTable({\n id: v.optional(v.string()), // Synthetic ID for Convex index, generated at runtime\n workflow_name: v.string(),\n run_id: v.string(),\n resourceId: v.optional(v.string()),\n snapshot: v.any(),\n createdAt: v.string(),\n updatedAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_workflow_run', ['workflow_name', 'run_id'])\n .index('by_workflow', ['workflow_name'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt']);\n\n/**\n * Scores table - stores evaluation scores\n * Schema: TABLE_SCHEMAS[TABLE_SCORERS]\n */\nexport const mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS]))\n .index('by_record_id', ['id'])\n .index('by_scorer', ['scorerId'])\n .index('by_entity', ['entityId', 'entityType'])\n .index('by_run', ['runId'])\n .index('by_created', ['createdAt']);\n\n// ============================================================================\n// Vector Tables - Not in core schemas (vector-specific)\n// ============================================================================\n\n/**\n * Vector indexes table - stores metadata about vector indexes\n */\nexport const mastraVectorIndexesTable = defineTable({\n id: v.string(), // Mastra record ID (same as indexName)\n indexName: v.string(),\n dimension: v.number(),\n metric: v.string(),\n createdAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_name', ['indexName']);\n\n/**\n * Vectors table - stores vector embeddings\n * Uses indexName field to support multiple indexes with different dimensions\n */\nexport const mastraVectorsTable = defineTable({\n id: v.string(), // Mastra record ID\n indexName: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n})\n .index('by_index_id', ['indexName', 'id']) // Composite for scoped lookups per index\n .index('by_index', ['indexName']);\n\nexport type MastraNativeVectorTableConfig = {\n /**\n * Vector dimensions for the deployed Convex vector index.\n */\n dimensions: number;\n /**\n * Convex vector index name.\n *\n * @default 'by_embedding'\n */\n vectorIndexName?: string;\n /**\n * Stage the vector index for a later backfill.\n *\n * @default false\n */\n staged?: boolean;\n};\n\n/**\n * Defines a dedicated Convex table for native vector search with the default\n * `ConvexNativeVector` field names.\n *\n * Use a custom `defineTable()` when you need native vector `filterFields`,\n * because filter fields must also be declared in the table schema.\n */\nexport function defineMastraNativeVectorTable({\n dimensions,\n vectorIndexName = 'by_embedding',\n staged = false,\n}: MastraNativeVectorTableConfig) {\n if (!Number.isInteger(dimensions) || dimensions < 2 || dimensions > 4096) {\n throw new Error('defineMastraNativeVectorTable: dimensions must be an integer between 2 and 4096.');\n }\n\n const table = defineTable({\n id: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n }).index('by_record_id', ['id']);\n\n if (staged) {\n return table.vectorIndex(vectorIndexName, {\n vectorField: 'embedding',\n dimensions,\n staged: true,\n });\n }\n\n return table.vectorIndex(vectorIndexName, {\n vectorField: 'embedding',\n dimensions,\n });\n}\n\n// ============================================================================\n// Server Cache Tables - Used by ConvexServerCache\n// ============================================================================\n\n/**\n * Cache metadata table - stores scalar cache values, list counters, and numeric\n * counters used by ConvexServerCache.\n */\nexport const mastraCacheTable = defineTable({\n key: v.string(),\n keyPrefix: v.string(),\n kind: v.union(v.literal('value'), v.literal('list'), v.literal('counter'), v.literal('deleted')),\n value: v.optional(v.string()),\n counter: v.optional(v.number()),\n expiresAt: v.union(v.number(), v.null()),\n})\n .index('by_key', ['key'])\n .index('by_key_prefix', ['keyPrefix']);\n\n/**\n * Cache list item table - stores each list entry as its own row so replay\n * history does not grow into a single large Convex document.\n */\nexport const mastraCacheListItemsTable = defineTable({\n key: v.string(),\n keyPrefix: v.string(),\n index: v.number(),\n value: v.string(),\n})\n .index('by_key_prefix', ['keyPrefix'])\n .index('by_key_index', ['key', 'index']);\n\n// ============================================================================\n// Fallback Table - For unknown/custom tables\n// ============================================================================\n\n/**\n * Generic documents table - fallback for unknown table types\n */\nexport const mastraDocumentsTable = defineTable({\n table: v.string(),\n primaryKey: v.string(),\n record: v.any(),\n})\n .index('by_table', ['table'])\n .index('by_table_primary', ['table', 'primaryKey']);\n\n// ============================================================================\n// Re-export table name constants for convenience\n// ============================================================================\n\nexport { TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, TABLE_SCORERS };\n\n// Additional table name constants for vector tables (not in core)\nexport const TABLE_VECTOR_INDEXES = 'mastra_vector_indexes';\nexport const TABLE_VECTORS = 'mastra_vectors';\nexport const TABLE_DOCUMENTS = 'mastra_documents';\n"]}