@mastra/convex 0.0.0-feat-improve-processors-20251205191721
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/CHANGELOG.md +29 -0
- package/LICENSE.md +15 -0
- package/README.md +123 -0
- package/dist/chunk-NZCHEPNU.js +362 -0
- package/dist/chunk-NZCHEPNU.js.map +1 -0
- package/dist/chunk-QKN2PWR2.cjs +391 -0
- package/dist/chunk-QKN2PWR2.cjs.map +1 -0
- package/dist/index.cjs +1350 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1287 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.cjs +64 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/schema.d.ts +115 -0
- package/dist/server/schema.d.ts.map +1 -0
- package/dist/server/storage.d.ts +7 -0
- package/dist/server/storage.d.ts.map +1 -0
- package/dist/storage/client.d.ts +24 -0
- package/dist/storage/client.d.ts.map +1 -0
- package/dist/storage/domains/memory.d.ts +59 -0
- package/dist/storage/domains/memory.d.ts.map +1 -0
- package/dist/storage/domains/scores.d.ts +42 -0
- package/dist/storage/domains/scores.d.ts.map +1 -0
- package/dist/storage/domains/workflows.d.ts +44 -0
- package/dist/storage/domains/workflows.d.ts.map +1 -0
- package/dist/storage/index.d.ts +161 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/operations.d.ts +40 -0
- package/dist/storage/operations.d.ts.map +1 -0
- package/dist/storage/types.d.ts +42 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/vector/index.d.ts +35 -0
- package/dist/vector/index.d.ts.map +1 -0
- package/package.json +75 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @mastra/convex
|
|
2
|
+
|
|
3
|
+
## 0.0.0-feat-improve-processors-20251205191721
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- feat(storage): support querying messages from multiple threads ([#10663](https://github.com/mastra-ai/mastra/pull/10663))
|
|
8
|
+
- Fixed TypeScript errors where `threadId: string | string[]` was being passed to places expecting `Scalar` type
|
|
9
|
+
- Added proper multi-thread support for `listMessages` across all adapters when `threadId` is an array
|
|
10
|
+
- Updated `_getIncludedMessages` to look up message threadId by ID (since message IDs are globally unique)
|
|
11
|
+
- **upstash**: Added `msg-idx:{messageId}` index for O(1) message lookups (backwards compatible with fallback to scan for old messages, with automatic backfill)
|
|
12
|
+
|
|
13
|
+
- Convex storage and vector adapter improvements: ([#10421](https://github.com/mastra-ai/mastra/pull/10421))
|
|
14
|
+
- Refactored to use typed Convex tables for each Mastra domain (threads, messages, resources, workflows, scorers, vectors)
|
|
15
|
+
- All tables now include `id` field for Mastra record ID and `by_record_id` index for efficient lookups
|
|
16
|
+
- Fixed 32k document limit issues by using batched operations and indexed queries
|
|
17
|
+
- Updated `saveMessages` and `updateMessages` to automatically update thread `updatedAt` timestamps
|
|
18
|
+
- Fixed `listMessages` to properly fetch messages from different threads when using `include`
|
|
19
|
+
- Fixed `saveResource` to preserve `undefined` metadata instead of converting to empty object
|
|
20
|
+
- Rewrote `ConvexAdminClient` to use Convex HTTP API directly with proper admin authentication
|
|
21
|
+
- Added comprehensive documentation for storage and vector adapters
|
|
22
|
+
- Exported pre-built table definitions from `@mastra/convex/server` for easy schema setup
|
|
23
|
+
|
|
24
|
+
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`2319326`](https://github.com/mastra-ai/mastra/commit/2319326f8c64e503a09bbcf14be2dd65405445e0), [`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`21a15de`](https://github.com/mastra-ai/mastra/commit/21a15de369fe82aac26bb642ed7be73505475e8b), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`6c049d9`](https://github.com/mastra-ai/mastra/commit/6c049d94063fdcbd5b81c4912a2bf82a92c9cc0b), [`910db9e`](https://github.com/mastra-ai/mastra/commit/910db9e0312888495eb5617b567f247d03303814), [`2f897df`](https://github.com/mastra-ai/mastra/commit/2f897df208508f46f51b7625e5dd20c37f93e0e3), [`d629361`](https://github.com/mastra-ai/mastra/commit/d629361a60f6565b5bfb11976fdaf7308af858e2), [`feb7ee4`](https://github.com/mastra-ai/mastra/commit/feb7ee4d09a75edb46c6669a3beaceec78811747), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`08c31c1`](https://github.com/mastra-ai/mastra/commit/08c31c188ebccd598acaf55e888b6397d01f7eae), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`b0e2ea5`](https://github.com/mastra-ai/mastra/commit/b0e2ea5b52c40fae438b9e2f7baee6f0f89c5442), [`f0a07e0`](https://github.com/mastra-ai/mastra/commit/f0a07e0111b3307c5fabfa4094c5c2cfb734fbe6), [`ff94dea`](https://github.com/mastra-ai/mastra/commit/ff94dea935f4e34545c63bcb6c29804732698809), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`c456e01`](https://github.com/mastra-ai/mastra/commit/c456e0149e3c176afcefdbd9bb1d2c5917723725), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`dd1c38d`](https://github.com/mastra-ai/mastra/commit/dd1c38d1b75f1b695c27b40d8d9d6ed00d5e0f6f), [`5948e6a`](https://github.com/mastra-ai/mastra/commit/5948e6a5146c83666ba3f294b2be576c82a513fb), [`5b2ff46`](https://github.com/mastra-ai/mastra/commit/5b2ff4651df70c146523a7fca773f8eb0a2272f8), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`ab035c2`](https://github.com/mastra-ai/mastra/commit/ab035c2ef6d8cc7bb25f06f1a38508bd9e6f126b), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`4c6b492`](https://github.com/mastra-ai/mastra/commit/4c6b492c4dd591c6a592520c1f6855d6e936d71f), [`bff1145`](https://github.com/mastra-ai/mastra/commit/bff114556b3cbadad9b2768488708f8ad0e91475), [`dff01d8`](https://github.com/mastra-ai/mastra/commit/dff01d81ce1f4e4087cfac20fa868e6db138dd14), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`fd3d338`](https://github.com/mastra-ai/mastra/commit/fd3d338a2c362174ed5b383f1f011ad9fb0302aa), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`c30400a`](https://github.com/mastra-ai/mastra/commit/c30400a49b994b1b97256fe785eb6c906fc2b232), [`00f4921`](https://github.com/mastra-ai/mastra/commit/00f4921dd2c91a1e5446799599ef7116a8214a1a), [`1a46a56`](https://github.com/mastra-ai/mastra/commit/1a46a566f45a3fcbadc1cf36bf86d351f264bfa3), [`ca8041c`](https://github.com/mastra-ai/mastra/commit/ca8041cce0379fda22ed293a565bcb5b6ddca68a), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`69e0a87`](https://github.com/mastra-ai/mastra/commit/69e0a878896a2da9494945d86e056a5f8f05b851), [`cd29ad2`](https://github.com/mastra-ai/mastra/commit/cd29ad23a255534e8191f249593849ed29160886), [`bdf4d8c`](https://github.com/mastra-ai/mastra/commit/bdf4d8cdc656d8a2c21d81834bfa3bfa70f56c16), [`854e3da`](https://github.com/mastra-ai/mastra/commit/854e3dad5daac17a91a20986399d3a51f54bf68b), [`ce18d38`](https://github.com/mastra-ai/mastra/commit/ce18d38678c65870350d123955014a8432075fd9), [`3cf540b`](https://github.com/mastra-ai/mastra/commit/3cf540b9fbfea8f4fc8d3a2319a4e6c0b0cbfd52), [`352a5d6`](https://github.com/mastra-ai/mastra/commit/352a5d625cfe09849b21e8f52a24c9f0366759d5), [`1c6ce51`](https://github.com/mastra-ai/mastra/commit/1c6ce51f875915ab57fd36873623013699a2a65d), [`898a972`](https://github.com/mastra-ai/mastra/commit/898a9727d286c2510d6b702dfd367e6aaf5c6b0f), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`a97003a`](https://github.com/mastra-ai/mastra/commit/a97003aa1cf2f4022a41912324a1e77263b326b8), [`ccc141e`](https://github.com/mastra-ai/mastra/commit/ccc141ed27da0abc3a3fc28e9e5128152e8e37f4), [`01f8878`](https://github.com/mastra-ai/mastra/commit/01f88783de25e4de048c1c8aace43e26373c6ea5), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`4c77209`](https://github.com/mastra-ai/mastra/commit/4c77209e6c11678808b365d545845918c40045c8), [`a854ede`](https://github.com/mastra-ai/mastra/commit/a854ede62bf5ac0945a624ac48913dd69c73aabf), [`fe3b897`](https://github.com/mastra-ai/mastra/commit/fe3b897c2ccbcd2b10e81b099438c7337feddf89), [`c576fc0`](https://github.com/mastra-ai/mastra/commit/c576fc0b100b2085afded91a37c97a0ea0ec09c7), [`3defc80`](https://github.com/mastra-ai/mastra/commit/3defc80cf2b88a1b7fc1cc4ddcb91e982a614609), [`00123ba`](https://github.com/mastra-ai/mastra/commit/00123ba96dc9e5cd0b110420ebdba56d8f237b25), [`16153fe`](https://github.com/mastra-ai/mastra/commit/16153fe7eb13c99401f48e6ca32707c965ee28b9), [`9f4a683`](https://github.com/mastra-ai/mastra/commit/9f4a6833e88b52574665c028fd5508ad5c2f6004), [`bc94344`](https://github.com/mastra-ai/mastra/commit/bc943444a1342d8a662151b7bce1df7dae32f59c), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`29c4309`](https://github.com/mastra-ai/mastra/commit/29c4309f818b24304c041bcb4a8f19b5f13f6b62), [`16785ce`](https://github.com/mastra-ai/mastra/commit/16785ced928f6f22638f4488cf8a125d99211799), [`57d157f`](https://github.com/mastra-ai/mastra/commit/57d157f0b163a95c3e6c9eae31bdb11d1bfc64f9), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`d827d08`](https://github.com/mastra-ai/mastra/commit/d827d0808ffe1f3553a84e975806cc989b9735dd), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`de8239b`](https://github.com/mastra-ai/mastra/commit/de8239bdcb1d8c0cfa06da21f1569912a66bbc8a), [`23c10a1`](https://github.com/mastra-ai/mastra/commit/23c10a1efdd9a693c405511ab2dc8a1236603162), [`b5e6cd7`](https://github.com/mastra-ai/mastra/commit/b5e6cd77fc8c8e64e0494c1d06cee3d84e795d1e), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`a1bd7b8`](https://github.com/mastra-ai/mastra/commit/a1bd7b8571db16b94eb01588f451a74758c96d65), [`d78b38d`](https://github.com/mastra-ai/mastra/commit/d78b38d898fce285260d3bbb4befade54331617f), [`a0a5b4b`](https://github.com/mastra-ai/mastra/commit/a0a5b4bbebe6c701ebbadf744873aa0d5ca01371), [`5d171ad`](https://github.com/mastra-ai/mastra/commit/5d171ad9ef340387276b77c2bb3e83e83332d729), [`0633100`](https://github.com/mastra-ai/mastra/commit/0633100a911ad22f5256471bdf753da21c104742), [`3759cb0`](https://github.com/mastra-ai/mastra/commit/3759cb064935b5f74c65ac2f52a1145f7352899d), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`69ea758`](https://github.com/mastra-ai/mastra/commit/69ea758358edd7117f191c2e69c8bb5fc79e7a1a), [`651e772`](https://github.com/mastra-ai/mastra/commit/651e772eb1475fb13e126d3fcc01751297a88214), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`993ad98`](https://github.com/mastra-ai/mastra/commit/993ad98d7ad3bebda9ecef5fec5c94349a0d04bc), [`676ccc7`](https://github.com/mastra-ai/mastra/commit/676ccc7fe92468d2d45d39c31a87825c89fd1ea0), [`3ff2c17`](https://github.com/mastra-ai/mastra/commit/3ff2c17a58e312fad5ea37377262c12d92ca0908), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`c10398d`](https://github.com/mastra-ai/mastra/commit/c10398d5b88f1d4af556f4267ff06f1d11e89179), [`f0f8f12`](https://github.com/mastra-ai/mastra/commit/f0f8f125c308f2d0fd36942ef652fd852df7522f), [`b61b93f`](https://github.com/mastra-ai/mastra/commit/b61b93f9e058b11dd2eec169853175d31dbdd567), [`bae33d9`](https://github.com/mastra-ai/mastra/commit/bae33d91a63fbb64d1e80519e1fc1acaed1e9013), [`39e7869`](https://github.com/mastra-ai/mastra/commit/39e7869bc7d0ee391077ce291474d8a84eedccff), [`0d7618b`](https://github.com/mastra-ai/mastra/commit/0d7618bc650bf2800934b243eca5648f4aeed9c2), [`7b763e5`](https://github.com/mastra-ai/mastra/commit/7b763e52fc3eaf699c2a99f2adf418dd46e4e9a5), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`c0b731f`](https://github.com/mastra-ai/mastra/commit/c0b731fb27d712dc8582e846df5c0332a6a0c5ba), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`43ca8f2`](https://github.com/mastra-ai/mastra/commit/43ca8f2c7334851cc7b4d3d2f037d8784bfbdd5f), [`d6d49f7`](https://github.com/mastra-ai/mastra/commit/d6d49f7b8714fa19a52ff9c7cf7fb7e73751901e), [`00c2387`](https://github.com/mastra-ai/mastra/commit/00c2387f5f04a365316f851e58666ac43f8c4edf), [`a534e95`](https://github.com/mastra-ai/mastra/commit/a534e9591f83b3cc1ebff99c67edf4cda7bf81d3), [`9d0e7fe`](https://github.com/mastra-ai/mastra/commit/9d0e7feca8ed98de959f53476ee1456073673348), [`53d927c`](https://github.com/mastra-ai/mastra/commit/53d927cc6f03bff33655b7e2b788da445a08731d), [`ad6250d`](https://github.com/mastra-ai/mastra/commit/ad6250dbdaad927e29f74a27b83f6c468b50a705), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`3a73998`](https://github.com/mastra-ai/mastra/commit/3a73998fa4ebeb7f3dc9301afe78095fc63e7999), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`887f0b4`](https://github.com/mastra-ai/mastra/commit/887f0b4746cdbd7cb7d6b17ac9f82aeb58037ea5), [`2562143`](https://github.com/mastra-ai/mastra/commit/256214336b4faa78646c9c1776612393790d8784), [`b7959e6`](https://github.com/mastra-ai/mastra/commit/b7959e6e25a46b480f9ea2217c4c6c588c423791), [`bda6370`](https://github.com/mastra-ai/mastra/commit/bda637009360649aaf579919e7873e33553c273e), [`d7acd8e`](https://github.com/mastra-ai/mastra/commit/d7acd8e987b5d7eff4fd98b0906c17c06a2e83d5), [`c7f1f7d`](https://github.com/mastra-ai/mastra/commit/c7f1f7d24f61f247f018cc2d1f33bf63212959a7), [`0bddc6d`](https://github.com/mastra-ai/mastra/commit/0bddc6d8dbd6f6008c0cba2e4960a2da75a55af1), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`2ca67cc`](https://github.com/mastra-ai/mastra/commit/2ca67cc3bb1f6a617353fdcab197d9efebe60d6f), [`e16d553`](https://github.com/mastra-ai/mastra/commit/e16d55338403c7553531cc568125c63d53653dff), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`cc34739`](https://github.com/mastra-ai/mastra/commit/cc34739c34b6266a91bea561119240a7acf47887), [`c218bd3`](https://github.com/mastra-ai/mastra/commit/c218bd3759e32423735b04843a09404572631014), [`9e67002`](https://github.com/mastra-ai/mastra/commit/9e67002b52c9be19936c420a489dbee9c5fd6a78), [`2c4438b`](https://github.com/mastra-ai/mastra/commit/2c4438b87817ab7eed818c7990fef010475af1a3), [`35edc49`](https://github.com/mastra-ai/mastra/commit/35edc49ac0556db609189641d6341e76771b81fc), [`4d59f58`](https://github.com/mastra-ai/mastra/commit/4d59f58de2d90d6e2810a19d4518e38ddddb9038), [`ef11a61`](https://github.com/mastra-ai/mastra/commit/ef11a61920fa0ed08a5b7ceedd192875af119749), [`2b8893c`](https://github.com/mastra-ai/mastra/commit/2b8893cb108ef9acb72ee7835cd625610d2c1a4a), [`8e5c75b`](https://github.com/mastra-ai/mastra/commit/8e5c75bdb1d08a42d45309a4c72def4b6890230f), [`e1bb9c9`](https://github.com/mastra-ai/mastra/commit/e1bb9c94b4eb68b019ae275981be3feb769b5365), [`351a11f`](https://github.com/mastra-ai/mastra/commit/351a11fcaf2ed1008977fa9b9a489fc422e51cd4), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`465ac05`](https://github.com/mastra-ai/mastra/commit/465ac0526a91d175542091c675181f1a96c98c46), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`e7266a2`](https://github.com/mastra-ai/mastra/commit/e7266a278db02035c97a5e9cd9d1669a6b7a535d), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019)]:
|
|
25
|
+
- @mastra/core@0.0.0-feat-improve-processors-20251205191721
|
|
26
|
+
|
|
27
|
+
## Unreleased
|
|
28
|
+
|
|
29
|
+
- Initial release.
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Apache License 2.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Kepler Software, Inc.
|
|
4
|
+
|
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
you may not use this file except in compliance with the License.
|
|
7
|
+
You may obtain a copy of the License at
|
|
8
|
+
|
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
See the License for the specific language governing permissions and
|
|
15
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# @mastra/convex
|
|
2
|
+
|
|
3
|
+
Convex adapters for Mastra:
|
|
4
|
+
|
|
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.
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
### 1. Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @mastra/convex
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. Set up Convex schema
|
|
18
|
+
|
|
19
|
+
In `convex/schema.ts`:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { defineSchema } from 'convex/server';
|
|
23
|
+
import {
|
|
24
|
+
mastraThreadsTable,
|
|
25
|
+
mastraMessagesTable,
|
|
26
|
+
mastraResourcesTable,
|
|
27
|
+
mastraWorkflowSnapshotsTable,
|
|
28
|
+
mastraScoresTable,
|
|
29
|
+
mastraVectorIndexesTable,
|
|
30
|
+
mastraVectorsTable,
|
|
31
|
+
mastraDocumentsTable,
|
|
32
|
+
} from '@mastra/convex/server';
|
|
33
|
+
|
|
34
|
+
export default defineSchema({
|
|
35
|
+
mastra_threads: mastraThreadsTable,
|
|
36
|
+
mastra_messages: mastraMessagesTable,
|
|
37
|
+
mastra_resources: mastraResourcesTable,
|
|
38
|
+
mastra_workflow_snapshots: mastraWorkflowSnapshotsTable,
|
|
39
|
+
mastra_scorers: mastraScoresTable,
|
|
40
|
+
mastra_vector_indexes: mastraVectorIndexesTable,
|
|
41
|
+
mastra_vectors: mastraVectorsTable,
|
|
42
|
+
mastra_documents: mastraDocumentsTable,
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 3. Create the storage handler
|
|
47
|
+
|
|
48
|
+
In `convex/mastra/storage.ts`:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import { mastraStorage } from '@mastra/convex/server';
|
|
52
|
+
|
|
53
|
+
export const handle = mastraStorage;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 4. Deploy to Convex
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx convex dev
|
|
60
|
+
# or for production
|
|
61
|
+
npx convex deploy
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 5. Use in Mastra
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { ConvexStore } from '@mastra/convex';
|
|
68
|
+
|
|
69
|
+
const storage = new ConvexStore({
|
|
70
|
+
id: 'convex',
|
|
71
|
+
deploymentUrl: process.env.CONVEX_URL!,
|
|
72
|
+
adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
|
|
73
|
+
storageFunction: 'mastra/storage:handle', // default
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For vectors:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { ConvexVector } from '@mastra/convex';
|
|
81
|
+
|
|
82
|
+
const vector = new ConvexVector({
|
|
83
|
+
id: 'convex-vectors',
|
|
84
|
+
deploymentUrl: process.env.CONVEX_URL!,
|
|
85
|
+
adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Architecture
|
|
90
|
+
|
|
91
|
+
This adapter uses **typed Convex tables** for each Mastra domain:
|
|
92
|
+
|
|
93
|
+
| Domain | Convex Table | Purpose |
|
|
94
|
+
| -------------- | --------------------------- | -------------------- |
|
|
95
|
+
| Threads | `mastra_threads` | Conversation threads |
|
|
96
|
+
| Messages | `mastra_messages` | Chat messages |
|
|
97
|
+
| Resources | `mastra_resources` | User working memory |
|
|
98
|
+
| Workflows | `mastra_workflow_snapshots` | Workflow state |
|
|
99
|
+
| Scorers | `mastra_scorers` | Evaluation data |
|
|
100
|
+
| Vector Indexes | `mastra_vector_indexes` | Index metadata |
|
|
101
|
+
| Vectors | `mastra_vectors` | Embeddings |
|
|
102
|
+
| Fallback | `mastra_documents` | Unknown tables |
|
|
103
|
+
|
|
104
|
+
All typed tables include:
|
|
105
|
+
|
|
106
|
+
- An `id` field for Mastra's record ID (distinct from Convex's auto-generated `_id`)
|
|
107
|
+
- A `by_record_id` index for efficient lookups by Mastra ID
|
|
108
|
+
|
|
109
|
+
## Testing
|
|
110
|
+
|
|
111
|
+
Set the following environment variables before running tests:
|
|
112
|
+
|
|
113
|
+
- `CONVEX_TEST_URL` – the Convex deployment URL (e.g., `https://your-name.convex.cloud`)
|
|
114
|
+
- `CONVEX_TEST_ADMIN_KEY` – an admin token for that deployment
|
|
115
|
+
- `CONVEX_TEST_STORAGE_FUNCTION` _(optional)_ – override if you mounted `mastraStorage` elsewhere
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pnpm --filter @mastra/convex test
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Status
|
|
122
|
+
|
|
123
|
+
Experimental – expect breaking changes while the adapter matures.
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { TABLE_SCORERS, TABLE_WORKFLOW_SNAPSHOT, TABLE_RESOURCES, TABLE_MESSAGES, TABLE_THREADS, TABLE_SCHEMAS } from '@mastra/core/storage';
|
|
2
|
+
export { TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCORERS, TABLE_THREADS, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';
|
|
3
|
+
import { mutationGeneric, defineTable } from 'convex/server';
|
|
4
|
+
import { v } from 'convex/values';
|
|
5
|
+
|
|
6
|
+
// src/server/storage.ts
|
|
7
|
+
var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
|
|
8
|
+
var VECTOR_TABLE_PREFIX = "mastra_vector_";
|
|
9
|
+
function resolveTable(tableName) {
|
|
10
|
+
switch (tableName) {
|
|
11
|
+
case TABLE_THREADS:
|
|
12
|
+
return { convexTable: "mastra_threads", isTyped: true };
|
|
13
|
+
case TABLE_MESSAGES:
|
|
14
|
+
return { convexTable: "mastra_messages", isTyped: true };
|
|
15
|
+
case TABLE_RESOURCES:
|
|
16
|
+
return { convexTable: "mastra_resources", isTyped: true };
|
|
17
|
+
case TABLE_WORKFLOW_SNAPSHOT:
|
|
18
|
+
return { convexTable: "mastra_workflow_snapshots", isTyped: true };
|
|
19
|
+
case TABLE_SCORERS:
|
|
20
|
+
return { convexTable: "mastra_scorers", isTyped: true };
|
|
21
|
+
case TABLE_VECTOR_INDEXES:
|
|
22
|
+
return { convexTable: "mastra_vector_indexes", isTyped: true };
|
|
23
|
+
default:
|
|
24
|
+
if (tableName.startsWith(VECTOR_TABLE_PREFIX)) {
|
|
25
|
+
return { convexTable: "mastra_vectors", isTyped: true };
|
|
26
|
+
}
|
|
27
|
+
return { convexTable: "mastra_documents", isTyped: false };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
var mastraStorage = mutationGeneric(async (ctx, request) => {
|
|
31
|
+
try {
|
|
32
|
+
const { convexTable, isTyped } = resolveTable(request.tableName);
|
|
33
|
+
if (request.tableName.startsWith(VECTOR_TABLE_PREFIX) && request.tableName !== TABLE_VECTOR_INDEXES) {
|
|
34
|
+
return handleVectorOperation(ctx, request);
|
|
35
|
+
}
|
|
36
|
+
if (isTyped) {
|
|
37
|
+
return handleTypedOperation(ctx, convexTable, request);
|
|
38
|
+
}
|
|
39
|
+
return handleGenericOperation(ctx, request);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
const err = error;
|
|
42
|
+
return {
|
|
43
|
+
ok: false,
|
|
44
|
+
error: err.message
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
async function handleTypedOperation(ctx, convexTable, request) {
|
|
49
|
+
switch (request.op) {
|
|
50
|
+
case "insert": {
|
|
51
|
+
const record = request.record;
|
|
52
|
+
const id = record.id;
|
|
53
|
+
if (!id) {
|
|
54
|
+
throw new Error(`Record is missing an id`);
|
|
55
|
+
}
|
|
56
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique();
|
|
57
|
+
if (existing) {
|
|
58
|
+
const { id: _, ...updateData } = record;
|
|
59
|
+
await ctx.db.patch(existing._id, updateData);
|
|
60
|
+
} else {
|
|
61
|
+
await ctx.db.insert(convexTable, record);
|
|
62
|
+
}
|
|
63
|
+
return { ok: true };
|
|
64
|
+
}
|
|
65
|
+
case "batchInsert": {
|
|
66
|
+
for (const record of request.records) {
|
|
67
|
+
const id = record.id;
|
|
68
|
+
if (!id) continue;
|
|
69
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique();
|
|
70
|
+
if (existing) {
|
|
71
|
+
const { id: _, ...updateData } = record;
|
|
72
|
+
await ctx.db.patch(existing._id, updateData);
|
|
73
|
+
} else {
|
|
74
|
+
await ctx.db.insert(convexTable, record);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { ok: true };
|
|
78
|
+
}
|
|
79
|
+
case "load": {
|
|
80
|
+
const keys = request.keys;
|
|
81
|
+
if (keys.id) {
|
|
82
|
+
const doc = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", keys.id)).unique();
|
|
83
|
+
return { ok: true, result: doc || null };
|
|
84
|
+
}
|
|
85
|
+
const docs = await ctx.db.query(convexTable).take(1e4);
|
|
86
|
+
const match = docs.find((doc) => Object.entries(keys).every(([key, value]) => doc[key] === value));
|
|
87
|
+
return { ok: true, result: match || null };
|
|
88
|
+
}
|
|
89
|
+
case "queryTable": {
|
|
90
|
+
const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
|
|
91
|
+
let docs = await ctx.db.query(convexTable).take(maxDocs);
|
|
92
|
+
if (request.filters && request.filters.length > 0) {
|
|
93
|
+
docs = docs.filter((doc) => request.filters.every((filter) => doc[filter.field] === filter.value));
|
|
94
|
+
}
|
|
95
|
+
if (request.limit) {
|
|
96
|
+
docs = docs.slice(0, request.limit);
|
|
97
|
+
}
|
|
98
|
+
return { ok: true, result: docs };
|
|
99
|
+
}
|
|
100
|
+
case "clearTable":
|
|
101
|
+
case "dropTable": {
|
|
102
|
+
const BATCH_SIZE = 25;
|
|
103
|
+
const docs = await ctx.db.query(convexTable).take(BATCH_SIZE + 1);
|
|
104
|
+
const hasMore = docs.length > BATCH_SIZE;
|
|
105
|
+
const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;
|
|
106
|
+
for (const doc of docsToDelete) {
|
|
107
|
+
await ctx.db.delete(doc._id);
|
|
108
|
+
}
|
|
109
|
+
return { ok: true, hasMore };
|
|
110
|
+
}
|
|
111
|
+
case "deleteMany": {
|
|
112
|
+
for (const id of request.ids) {
|
|
113
|
+
const doc = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique();
|
|
114
|
+
if (doc) {
|
|
115
|
+
await ctx.db.delete(doc._id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { ok: true };
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
return { ok: false, error: `Unsupported operation ${request.op}` };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function handleVectorOperation(ctx, request) {
|
|
125
|
+
const indexName = request.tableName.replace(VECTOR_TABLE_PREFIX, "");
|
|
126
|
+
const convexTable = "mastra_vectors";
|
|
127
|
+
switch (request.op) {
|
|
128
|
+
case "insert": {
|
|
129
|
+
const record = request.record;
|
|
130
|
+
const id = record.id;
|
|
131
|
+
if (!id) {
|
|
132
|
+
throw new Error(`Vector record is missing an id`);
|
|
133
|
+
}
|
|
134
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique();
|
|
135
|
+
if (existing) {
|
|
136
|
+
await ctx.db.patch(existing._id, {
|
|
137
|
+
embedding: record.embedding,
|
|
138
|
+
metadata: record.metadata
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
await ctx.db.insert(convexTable, {
|
|
142
|
+
id,
|
|
143
|
+
indexName,
|
|
144
|
+
embedding: record.embedding,
|
|
145
|
+
metadata: record.metadata
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return { ok: true };
|
|
149
|
+
}
|
|
150
|
+
case "batchInsert": {
|
|
151
|
+
for (const record of request.records) {
|
|
152
|
+
const id = record.id;
|
|
153
|
+
if (!id) continue;
|
|
154
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique();
|
|
155
|
+
if (existing) {
|
|
156
|
+
await ctx.db.patch(existing._id, {
|
|
157
|
+
embedding: record.embedding,
|
|
158
|
+
metadata: record.metadata
|
|
159
|
+
});
|
|
160
|
+
} else {
|
|
161
|
+
await ctx.db.insert(convexTable, {
|
|
162
|
+
id,
|
|
163
|
+
indexName,
|
|
164
|
+
embedding: record.embedding,
|
|
165
|
+
metadata: record.metadata
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { ok: true };
|
|
170
|
+
}
|
|
171
|
+
case "load": {
|
|
172
|
+
const keys = request.keys;
|
|
173
|
+
if (keys.id) {
|
|
174
|
+
const doc = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", keys.id)).unique();
|
|
175
|
+
return { ok: true, result: doc || null };
|
|
176
|
+
}
|
|
177
|
+
return { ok: true, result: null };
|
|
178
|
+
}
|
|
179
|
+
case "queryTable": {
|
|
180
|
+
const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
|
|
181
|
+
let docs = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).take(maxDocs);
|
|
182
|
+
if (request.filters && request.filters.length > 0) {
|
|
183
|
+
docs = docs.filter((doc) => request.filters.every((filter) => doc[filter.field] === filter.value));
|
|
184
|
+
}
|
|
185
|
+
if (request.limit) {
|
|
186
|
+
docs = docs.slice(0, request.limit);
|
|
187
|
+
}
|
|
188
|
+
return { ok: true, result: docs };
|
|
189
|
+
}
|
|
190
|
+
case "clearTable":
|
|
191
|
+
case "dropTable": {
|
|
192
|
+
const BATCH_SIZE = 25;
|
|
193
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).take(BATCH_SIZE + 1);
|
|
194
|
+
const hasMore = docs.length > BATCH_SIZE;
|
|
195
|
+
const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;
|
|
196
|
+
for (const doc of docsToDelete) {
|
|
197
|
+
await ctx.db.delete(doc._id);
|
|
198
|
+
}
|
|
199
|
+
return { ok: true, hasMore };
|
|
200
|
+
}
|
|
201
|
+
case "deleteMany": {
|
|
202
|
+
for (const id of request.ids) {
|
|
203
|
+
const doc = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique();
|
|
204
|
+
if (doc) {
|
|
205
|
+
await ctx.db.delete(doc._id);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { ok: true };
|
|
209
|
+
}
|
|
210
|
+
default:
|
|
211
|
+
return { ok: false, error: `Unsupported operation ${request.op}` };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function handleGenericOperation(ctx, request) {
|
|
215
|
+
const tableName = request.tableName;
|
|
216
|
+
const convexTable = "mastra_documents";
|
|
217
|
+
switch (request.op) {
|
|
218
|
+
case "insert": {
|
|
219
|
+
const record = request.record;
|
|
220
|
+
if (!record.id) {
|
|
221
|
+
throw new Error(`Record for table ${tableName} is missing an id`);
|
|
222
|
+
}
|
|
223
|
+
const primaryKey = String(record.id);
|
|
224
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", primaryKey)).unique();
|
|
225
|
+
if (existing) {
|
|
226
|
+
await ctx.db.patch(existing._id, { record });
|
|
227
|
+
} else {
|
|
228
|
+
await ctx.db.insert(convexTable, {
|
|
229
|
+
table: tableName,
|
|
230
|
+
primaryKey,
|
|
231
|
+
record
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return { ok: true };
|
|
235
|
+
}
|
|
236
|
+
case "batchInsert": {
|
|
237
|
+
for (const record of request.records) {
|
|
238
|
+
if (!record.id) continue;
|
|
239
|
+
const primaryKey = String(record.id);
|
|
240
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", primaryKey)).unique();
|
|
241
|
+
if (existing) {
|
|
242
|
+
await ctx.db.patch(existing._id, { record });
|
|
243
|
+
} else {
|
|
244
|
+
await ctx.db.insert(convexTable, {
|
|
245
|
+
table: tableName,
|
|
246
|
+
primaryKey,
|
|
247
|
+
record
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { ok: true };
|
|
252
|
+
}
|
|
253
|
+
case "load": {
|
|
254
|
+
const keys = request.keys;
|
|
255
|
+
if (keys.id) {
|
|
256
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", String(keys.id))).unique();
|
|
257
|
+
return { ok: true, result: existing ? existing.record : null };
|
|
258
|
+
}
|
|
259
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(1e4);
|
|
260
|
+
const match = docs.find((doc) => Object.entries(keys).every(([key, value]) => doc.record?.[key] === value));
|
|
261
|
+
return { ok: true, result: match ? match.record : null };
|
|
262
|
+
}
|
|
263
|
+
case "queryTable": {
|
|
264
|
+
const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
|
|
265
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(maxDocs);
|
|
266
|
+
let records = docs.map((doc) => doc.record);
|
|
267
|
+
if (request.filters && request.filters.length > 0) {
|
|
268
|
+
records = records.filter(
|
|
269
|
+
(record) => request.filters.every((filter) => record?.[filter.field] === filter.value)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
if (request.limit) {
|
|
273
|
+
records = records.slice(0, request.limit);
|
|
274
|
+
}
|
|
275
|
+
return { ok: true, result: records };
|
|
276
|
+
}
|
|
277
|
+
case "clearTable":
|
|
278
|
+
case "dropTable": {
|
|
279
|
+
const BATCH_SIZE = 25;
|
|
280
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(BATCH_SIZE + 1);
|
|
281
|
+
const hasMore = docs.length > BATCH_SIZE;
|
|
282
|
+
const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;
|
|
283
|
+
for (const doc of docsToDelete) {
|
|
284
|
+
await ctx.db.delete(doc._id);
|
|
285
|
+
}
|
|
286
|
+
return { ok: true, hasMore };
|
|
287
|
+
}
|
|
288
|
+
case "deleteMany": {
|
|
289
|
+
for (const id of request.ids) {
|
|
290
|
+
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", String(id))).unique();
|
|
291
|
+
if (existing) {
|
|
292
|
+
await ctx.db.delete(existing._id);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return { ok: true };
|
|
296
|
+
}
|
|
297
|
+
default:
|
|
298
|
+
return { ok: false, error: `Unsupported operation ${request.op}` };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function columnToValidator(column) {
|
|
302
|
+
let validator;
|
|
303
|
+
switch (column.type) {
|
|
304
|
+
case "text":
|
|
305
|
+
validator = v.string();
|
|
306
|
+
break;
|
|
307
|
+
case "integer":
|
|
308
|
+
case "bigint":
|
|
309
|
+
case "float":
|
|
310
|
+
validator = v.number();
|
|
311
|
+
break;
|
|
312
|
+
case "boolean":
|
|
313
|
+
validator = v.boolean();
|
|
314
|
+
break;
|
|
315
|
+
case "timestamp":
|
|
316
|
+
validator = v.string();
|
|
317
|
+
break;
|
|
318
|
+
case "jsonb":
|
|
319
|
+
case "json":
|
|
320
|
+
validator = v.any();
|
|
321
|
+
break;
|
|
322
|
+
default:
|
|
323
|
+
validator = v.any();
|
|
324
|
+
}
|
|
325
|
+
return column.nullable ? v.optional(validator) : validator;
|
|
326
|
+
}
|
|
327
|
+
function buildTableFromSchema(schema) {
|
|
328
|
+
const fields = {};
|
|
329
|
+
for (const [key, column] of Object.entries(schema)) {
|
|
330
|
+
fields[key] = columnToValidator(column);
|
|
331
|
+
}
|
|
332
|
+
return fields;
|
|
333
|
+
}
|
|
334
|
+
var mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS])).index("by_record_id", ["id"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]).index("by_updated", ["updatedAt"]);
|
|
335
|
+
var mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES])).index("by_record_id", ["id"]).index("by_thread", ["thread_id"]).index("by_thread_created", ["thread_id", "createdAt"]).index("by_resource", ["resourceId"]);
|
|
336
|
+
var mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES])).index("by_record_id", ["id"]).index("by_updated", ["updatedAt"]);
|
|
337
|
+
var mastraWorkflowSnapshotsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT])).index("by_record_id", ["id"]).index("by_workflow_run", ["workflow_name", "run_id"]).index("by_workflow", ["workflow_name"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]);
|
|
338
|
+
var mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS])).index("by_record_id", ["id"]).index("by_scorer", ["scorerId"]).index("by_entity", ["entityId", "entityType"]).index("by_run", ["runId"]).index("by_created", ["createdAt"]);
|
|
339
|
+
var mastraVectorIndexesTable = defineTable({
|
|
340
|
+
id: v.string(),
|
|
341
|
+
// Mastra record ID (same as indexName)
|
|
342
|
+
indexName: v.string(),
|
|
343
|
+
dimension: v.number(),
|
|
344
|
+
metric: v.string(),
|
|
345
|
+
createdAt: v.string()
|
|
346
|
+
}).index("by_record_id", ["id"]).index("by_name", ["indexName"]);
|
|
347
|
+
var mastraVectorsTable = defineTable({
|
|
348
|
+
id: v.string(),
|
|
349
|
+
// Mastra record ID
|
|
350
|
+
indexName: v.string(),
|
|
351
|
+
embedding: v.array(v.float64()),
|
|
352
|
+
metadata: v.optional(v.any())
|
|
353
|
+
}).index("by_index_id", ["indexName", "id"]).index("by_index", ["indexName"]);
|
|
354
|
+
var mastraDocumentsTable = defineTable({
|
|
355
|
+
table: v.string(),
|
|
356
|
+
primaryKey: v.string(),
|
|
357
|
+
record: v.any()
|
|
358
|
+
}).index("by_table", ["table"]).index("by_table_primary", ["table", "primaryKey"]);
|
|
359
|
+
|
|
360
|
+
export { mastraDocumentsTable, mastraMessagesTable, mastraResourcesTable, mastraScoresTable, mastraStorage, mastraThreadsTable, mastraVectorIndexesTable, mastraVectorsTable, mastraWorkflowSnapshotsTable };
|
|
361
|
+
//# sourceMappingURL=chunk-NZCHEPNU.js.map
|
|
362
|
+
//# sourceMappingURL=chunk-NZCHEPNU.js.map
|