@mastra/duckdb 0.0.0-type-testing-20260120105120 → 0.0.0-workflow-timeout-issue-20260213181535
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 +10 -3
- package/dist/docs/SKILL.md +12 -22
- package/dist/docs/{SOURCE_MAP.json → assets/SOURCE_MAP.json} +1 -1
- package/dist/docs/{vectors/01-reference.md → references/reference-vectors-duckdb.md} +90 -21
- package/dist/index.cjs +26 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/package.json +8 -9
- package/dist/docs/README.md +0 -31
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# @mastra/duckdb
|
|
2
2
|
|
|
3
|
-
## 0.0.0-
|
|
3
|
+
## 0.0.0-workflow-timeout-issue-20260213181535
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`7ef618f`](https://github.com/mastra-ai/mastra/commit/7ef618f3c49c27e2f6b27d7f564c557c0734325b), [`b373564`](https://github.com/mastra-ai/mastra/commit/b37356491d43b4d53067f10cb669abaf2502f218), [`b896b41`](https://github.com/mastra-ai/mastra/commit/b896b41343de7fcc14442fb40fe82d189e65bbe2), [`6415277`](https://github.com/mastra-ai/mastra/commit/6415277a438faa00db2af850ead5dee25f40c428), [`0831bbb`](https://github.com/mastra-ai/mastra/commit/0831bbb5bc750c18e9b22b45f18687c964b70828), [`63f7eda`](https://github.com/mastra-ai/mastra/commit/63f7eda605eb3e0c8c35ee3912ffe7c999c69f69), [`a5b67a3`](https://github.com/mastra-ai/mastra/commit/a5b67a3589a74415feb663a55d1858324a2afde9), [`877b02c`](https://github.com/mastra-ai/mastra/commit/877b02cdbb15e199184c7f2b8f217be8d3ebada7), [`eb36bd8`](https://github.com/mastra-ai/mastra/commit/eb36bd8c52fcd6ec9674ac3b7a6412405b5983e1), [`3cbf121`](https://github.com/mastra-ai/mastra/commit/3cbf121f55418141924754a83102aade89835947)]:
|
|
8
|
+
- @mastra/core@0.0.0-workflow-timeout-issue-20260213181535
|
|
9
|
+
|
|
10
|
+
## 1.0.0
|
|
4
11
|
|
|
5
12
|
### Minor Changes
|
|
6
13
|
|
|
@@ -49,8 +56,8 @@
|
|
|
49
56
|
|
|
50
57
|
Documentation is driven by the `packages` frontmatter field in MDX files, which maps docs to their corresponding packages. CI validation ensures all docs include this field.
|
|
51
58
|
|
|
52
|
-
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`2319326`](https://github.com/mastra-ai/mastra/commit/2319326f8c64e503a09bbcf14be2dd65405445e0), [`d2d3e22`](https://github.com/mastra-ai/mastra/commit/d2d3e22a419ee243f8812a84e3453dd44365ecb0), [`08766f1`](https://github.com/mastra-ai/mastra/commit/08766f15e13ac0692fde2a8bd366c2e16e4321df), [`72df8ae`](https://github.com/mastra-ai/mastra/commit/72df8ae595584cdd7747d5c39ffaca45e4507227), [`ebae12a`](https://github.com/mastra-ai/mastra/commit/ebae12a2dd0212e75478981053b148a2c246962d), [`c8417b4`](https://github.com/mastra-ai/mastra/commit/c8417b41d9f3486854dc7842d977fbe5e2166264), [`bc72b52`](https://github.com/mastra-ai/mastra/commit/bc72b529ee4478fe89ecd85a8be47ce0127b82a0), [`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`c61a0a5`](https://github.com/mastra-ai/mastra/commit/c61a0a5de4904c88fd8b3718bc26d1be1c2ec6e7), [`05b8bee`](https://github.com/mastra-ai/mastra/commit/05b8bee9e50e6c2a4a2bf210eca25ee212ca24fa), [`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`3d93a15`](https://github.com/mastra-ai/mastra/commit/3d93a15796b158c617461c8b98bede476ebb43e2), [`9198899`](https://github.com/mastra-ai/mastra/commit/91988995c427b185c33714b7f3be955367911324), [`ed3e3dd`](https://github.com/mastra-ai/mastra/commit/ed3e3ddec69d564fe2b125e083437f76331f1283), [`c59e13c`](https://github.com/mastra-ai/mastra/commit/c59e13c7688284bd96b2baee3e314335003548de), [`c042bd0`](https://github.com/mastra-ai/mastra/commit/c042bd0b743e0e86199d0cb83344ca7690e34a9c), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`21a15de`](https://github.com/mastra-ai/mastra/commit/21a15de369fe82aac26bb642ed7be73505475e8b), [`e54953e`](https://github.com/mastra-ai/mastra/commit/e54953ed8ce1b28c0d62a19950163039af7834b4), [`ae8baf7`](https://github.com/mastra-ai/mastra/commit/ae8baf7d8adcb0ff9dac11880400452bc49b33ff), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`940a2b2`](https://github.com/mastra-ai/mastra/commit/940a2b27480626ed7e74f55806dcd2181c1dd0c2), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`d5ed981`](https://github.com/mastra-ai/mastra/commit/d5ed981c8701c1b8a27a5f35a9a2f7d9244e695f), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`33a4d2e`](https://github.com/mastra-ai/mastra/commit/33a4d2e4ed8af51f69256232f00c34d6b6b51d48), [`9650cce`](https://github.com/mastra-ai/mastra/commit/9650cce52a1d917ff9114653398e2a0f5c3ba808), [`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), [`4f94ed8`](https://github.com/mastra-ai/mastra/commit/4f94ed8177abfde3ec536e3574883e075423350c), [`feb7ee4`](https://github.com/mastra-ai/mastra/commit/feb7ee4d09a75edb46c6669a3beaceec78811747), [`4aaa844`](https://github.com/mastra-ai/mastra/commit/4aaa844a4f19d054490f43638a990cc57bda8d2f), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`38380b6`](https://github.com/mastra-ai/mastra/commit/38380b60fca905824bdf6b43df307a58efb1aa15), [`6833c69`](https://github.com/mastra-ai/mastra/commit/6833c69607418d257750bbcdd84638993d343539), [`932d63d`](https://github.com/mastra-ai/mastra/commit/932d63dd51be9c8bf1e00e3671fe65606c6fb9cd), [`4a1a6cb`](https://github.com/mastra-ai/mastra/commit/4a1a6cb3facad54b2bb6780b00ce91d6de1edc08), [`08c31c1`](https://github.com/mastra-ai/mastra/commit/08c31c188ebccd598acaf55e888b6397d01f7eae), [`919a22b`](https://github.com/mastra-ai/mastra/commit/919a22b25876f9ed5891efe5facbe682c30ff497), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`69136e7`](https://github.com/mastra-ai/mastra/commit/69136e748e32f57297728a4e0f9a75988462f1a7), [`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), [`0d41fe2`](https://github.com/mastra-ai/mastra/commit/0d41fe245355dfc66d61a0d9c85d9400aac351ff), [`b760b73`](https://github.com/mastra-ai/mastra/commit/b760b731aca7c8a3f041f61d57a7f125ae9cb215), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`449aed2`](https://github.com/mastra-ai/mastra/commit/449aed2ba9d507b75bf93d427646ea94f734dfd1), [`eb648a2`](https://github.com/mastra-ai/mastra/commit/eb648a2cc1728f7678768dd70cd77619b448dab9), [`695a621`](https://github.com/mastra-ai/mastra/commit/695a621528bdabeb87f83c2277cf2bb084c7f2b4), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`ac3cc23`](https://github.com/mastra-ai/mastra/commit/ac3cc2397d1966bc0fc2736a223abc449d3c7719), [`c456e01`](https://github.com/mastra-ai/mastra/commit/c456e0149e3c176afcefdbd9bb1d2c5917723725), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`a86f4df`](https://github.com/mastra-ai/mastra/commit/a86f4df0407311e0d2ea49b9a541f0938810d6a9), [`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), [`edb07e4`](https://github.com/mastra-ai/mastra/commit/edb07e49283e0c28bd094a60e03439bf6ecf0221), [`e0941c3`](https://github.com/mastra-ai/mastra/commit/e0941c3d7fc75695d5d258e7008fd5d6e650800c), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`2b459f4`](https://github.com/mastra-ai/mastra/commit/2b459f466fd91688eeb2a44801dc23f7f8a887ab), [`798d0c7`](https://github.com/mastra-ai/mastra/commit/798d0c740232653b1d754870e6b43a55c364ffe2), [`0c0580a`](https://github.com/mastra-ai/mastra/commit/0c0580a42f697cd2a7d5973f25bfe7da9055038a), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`ab035c2`](https://github.com/mastra-ai/mastra/commit/ab035c2ef6d8cc7bb25f06f1a38508bd9e6f126b), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`0131105`](https://github.com/mastra-ai/mastra/commit/0131105532e83bdcbb73352fc7d0879eebf140dc), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`47b1c16`](https://github.com/mastra-ai/mastra/commit/47b1c16a01c7ffb6765fe1e499b49092f8b7eba3), [`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), [`9d5059e`](https://github.com/mastra-ai/mastra/commit/9d5059eae810829935fb08e81a9bb7ecd5b144a7), [`ffe84d5`](https://github.com/mastra-ai/mastra/commit/ffe84d54f3b0f85167fe977efd027dba027eb998), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`24b76d8`](https://github.com/mastra-ai/mastra/commit/24b76d8e17656269c8ed09a0c038adb9cc2ae95a), [`31d13d5`](https://github.com/mastra-ai/mastra/commit/31d13d5fdc2e2380e2e3ee3ec9fb29d2a00f265d), [`ef756c6`](https://github.com/mastra-ai/mastra/commit/ef756c65f82d16531c43f49a27290a416611e526), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`243a823`](https://github.com/mastra-ai/mastra/commit/243a8239c5906f5c94e4f78b54676793f7510ae3), [`b00ccd3`](https://github.com/mastra-ai/mastra/commit/b00ccd325ebd5d9e37e34dd0a105caae67eb568f), [`28f5f89`](https://github.com/mastra-ai/mastra/commit/28f5f89705f2409921e3c45178796c0e0d0bbb64), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`4c62166`](https://github.com/mastra-ai/mastra/commit/4c621669f4a29b1f443eca3ba70b814afa286266), [`e601b27`](https://github.com/mastra-ai/mastra/commit/e601b272c70f3a5ecca610373aa6223012704892), [`7d56d92`](https://github.com/mastra-ai/mastra/commit/7d56d9213886e8353956d7d40df10045fd12b299), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7bcbf10`](https://github.com/mastra-ai/mastra/commit/7bcbf10133516e03df964b941f9a34e9e4ab4177), [`029540c`](https://github.com/mastra-ai/mastra/commit/029540ca1e582fc2dd8d288ecd4a9b0f31a954ef), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`4353600`](https://github.com/mastra-ai/mastra/commit/43536005a65988a8eede236f69122e7f5a284ba2), [`653e65a`](https://github.com/mastra-ai/mastra/commit/653e65ae1f9502c2958a32f47a5a2df11e612a92), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`6986fb0`](https://github.com/mastra-ai/mastra/commit/6986fb064f5db6ecc24aa655e1d26529087b43b3), [`3d3366f`](https://github.com/mastra-ai/mastra/commit/3d3366f31683e7137d126a3a57174a222c5801fb), [`5a4953f`](https://github.com/mastra-ai/mastra/commit/5a4953f7d25bb15ca31ed16038092a39cb3f98b3), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`efe406a`](https://github.com/mastra-ai/mastra/commit/efe406a1353c24993280ebc2ed61dd9f65b84b26), [`eb9e522`](https://github.com/mastra-ai/mastra/commit/eb9e522ce3070a405e5b949b7bf5609ca51d7fe2), [`fd3d338`](https://github.com/mastra-ai/mastra/commit/fd3d338a2c362174ed5b383f1f011ad9fb0302aa), [`20e6f19`](https://github.com/mastra-ai/mastra/commit/20e6f1971d51d3ff6dd7accad8aaaae826d540ed), [`053e979`](https://github.com/mastra-ai/mastra/commit/053e9793b28e970086b0507f7f3b76ea32c1e838), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`3bdfa75`](https://github.com/mastra-ai/mastra/commit/3bdfa7507a91db66f176ba8221aa28dd546e464a), [`119e5c6`](https://github.com/mastra-ai/mastra/commit/119e5c65008f3e5cfca954eefc2eb85e3bf40da4), [`c6fd6fe`](https://github.com/mastra-ai/mastra/commit/c6fd6fedd09e9cf8004b03a80925f5e94826ad7e), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`fdac646`](https://github.com/mastra-ai/mastra/commit/fdac646033a0930a1a4e00d13aa64c40bb7f1e02), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`d07b568`](https://github.com/mastra-ai/mastra/commit/d07b5687819ea8cb1dffa776d0c1765faf4aa1ae), [`e770de9`](https://github.com/mastra-ai/mastra/commit/e770de941a287a49b1964d44db5a5763d19890a6), [`e26dc9c`](https://github.com/mastra-ai/mastra/commit/e26dc9c3ccfec54ae3dc3e2b2589f741f9ae60a6), [`55edf73`](https://github.com/mastra-ai/mastra/commit/55edf7302149d6c964fbb7908b43babfc2b52145), [`c30400a`](https://github.com/mastra-ai/mastra/commit/c30400a49b994b1b97256fe785eb6c906fc2b232), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`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), [`b5dc973`](https://github.com/mastra-ai/mastra/commit/b5dc9733a5158850298dfb103acb3babdba8a318), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`52e2716`](https://github.com/mastra-ai/mastra/commit/52e2716b42df6eff443de72360ae83e86ec23993), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`4f0b3c6`](https://github.com/mastra-ai/mastra/commit/4f0b3c66f196c06448487f680ccbb614d281e2f7), [`27b4040`](https://github.com/mastra-ai/mastra/commit/27b4040bfa1a95d92546f420a02a626b1419a1d6), [`c61fac3`](https://github.com/mastra-ai/mastra/commit/c61fac3add96f0dcce0208c07415279e2537eb62), [`6f14f70`](https://github.com/mastra-ai/mastra/commit/6f14f706ccaaf81b69544b6c1b75ab66a41e5317), [`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), [`74c4f22`](https://github.com/mastra-ai/mastra/commit/74c4f22ed4c71e72598eacc346ba95cdbc00294f), [`3a76a80`](https://github.com/mastra-ai/mastra/commit/3a76a80284cb71a0faa975abb3d4b2a9631e60cd), [`898a972`](https://github.com/mastra-ai/mastra/commit/898a9727d286c2510d6b702dfd367e6aaf5c6b0f), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`2c212e7`](https://github.com/mastra-ai/mastra/commit/2c212e704c90e2db83d4109e62c03f0f6ebd2667), [`a97003a`](https://github.com/mastra-ai/mastra/commit/a97003aa1cf2f4022a41912324a1e77263b326b8), [`f9a2509`](https://github.com/mastra-ai/mastra/commit/f9a25093ea72d210a5e52cfcb3bcc8b5e02dc25c), [`66741d1`](https://github.com/mastra-ai/mastra/commit/66741d1a99c4f42cf23a16109939e8348ac6852e), [`ccc141e`](https://github.com/mastra-ai/mastra/commit/ccc141ed27da0abc3a3fc28e9e5128152e8e37f4), [`27c0009`](https://github.com/mastra-ai/mastra/commit/27c0009777a6073d7631b0eb7b481d94e165b5ca), [`01f8878`](https://github.com/mastra-ai/mastra/commit/01f88783de25e4de048c1c8aace43e26373c6ea5), [`dee388d`](https://github.com/mastra-ai/mastra/commit/dee388dde02f2e63c53385ae69252a47ab6825cc), [`610a70b`](https://github.com/mastra-ai/mastra/commit/610a70bdad282079f0c630e0d7bb284578f20151), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`b7e17d3`](https://github.com/mastra-ai/mastra/commit/b7e17d3f5390bb5a71efc112204413656fcdc18d), [`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), [`4ca4306`](https://github.com/mastra-ai/mastra/commit/4ca430614daa5fa04730205a302a43bf4accfe9f), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`74e504a`](https://github.com/mastra-ai/mastra/commit/74e504a3b584eafd2f198001c6a113bbec589fd3), [`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), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`3f3fc30`](https://github.com/mastra-ai/mastra/commit/3f3fc3096f24c4a26cffeecfe73085928f72aa63), [`d827d08`](https://github.com/mastra-ai/mastra/commit/d827d0808ffe1f3553a84e975806cc989b9735dd), [`e33fdbd`](https://github.com/mastra-ai/mastra/commit/e33fdbd07b33920d81e823122331b0c0bee0bb59), [`4524734`](https://github.com/mastra-ai/mastra/commit/45247343e384717a7c8404296275c56201d6470f), [`7a010c5`](https://github.com/mastra-ai/mastra/commit/7a010c56b846a313a49ae42fccd3d8de2b9f292d), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`2a53598`](https://github.com/mastra-ai/mastra/commit/2a53598c6d8cfeb904a7fc74e57e526d751c8fa6), [`81b6a8f`](https://github.com/mastra-ai/mastra/commit/81b6a8ff79f49a7549d15d66624ac1a0b8f5f971), [`8538a0d`](https://github.com/mastra-ai/mastra/commit/8538a0d232619bf55dad7ddc2a8b0ca77c679a87), [`d90ea65`](https://github.com/mastra-ai/mastra/commit/d90ea6536f7aa51c6545a4e9215b55858e98e16d), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`261473a`](https://github.com/mastra-ai/mastra/commit/261473ac637e633064a22076671e2e02b002214d), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`de8239b`](https://github.com/mastra-ai/mastra/commit/de8239bdcb1d8c0cfa06da21f1569912a66bbc8a), [`e4d366a`](https://github.com/mastra-ai/mastra/commit/e4d366aeb500371dd4210d6aa8361a4c21d87034), [`23c10a1`](https://github.com/mastra-ai/mastra/commit/23c10a1efdd9a693c405511ab2dc8a1236603162), [`b5e6cd7`](https://github.com/mastra-ai/mastra/commit/b5e6cd77fc8c8e64e0494c1d06cee3d84e795d1e), [`d171e55`](https://github.com/mastra-ai/mastra/commit/d171e559ead9f52ec728d424844c8f7b164c4510), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`a4f010b`](https://github.com/mastra-ai/mastra/commit/a4f010b22e4355a5fdee70a1fe0f6e4a692cc29e), [`c7cd3c7`](https://github.com/mastra-ai/mastra/commit/c7cd3c7a187d7aaf79e2ca139de328bf609a14b4), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`68ec97d`](https://github.com/mastra-ai/mastra/commit/68ec97d4c07c6393fcf95c2481fc5d73da99f8c8), [`8dc7f55`](https://github.com/mastra-ai/mastra/commit/8dc7f55900395771da851dc7d78d53ae84fe34ec), [`cfabdd4`](https://github.com/mastra-ai/mastra/commit/cfabdd4aae7a726b706942d6836eeca110fb6267), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`01b20fe`](https://github.com/mastra-ai/mastra/commit/01b20fefb7c67c2b7d79417598ef4e60256d1225), [`dd4f34c`](https://github.com/mastra-ai/mastra/commit/dd4f34c78cbae24063463475b0619575c415f9b8), [`8379099`](https://github.com/mastra-ai/mastra/commit/8379099fc467af6bef54dd7f80c9bd75bf8bbddf), [`0dbf199`](https://github.com/mastra-ai/mastra/commit/0dbf199110f22192ce5c95b1c8148d4872b4d119), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`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), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`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), [`929f69c`](https://github.com/mastra-ai/mastra/commit/929f69c3436fa20dd0f0e2f7ebe8270bd82a1529), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`10c2735`](https://github.com/mastra-ai/mastra/commit/10c27355edfdad1ee2b826b897df74125eb81fb8), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`8c0ec25`](https://github.com/mastra-ai/mastra/commit/8c0ec25646c8a7df253ed1e5ff4863a0d3f1316c), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`69ea758`](https://github.com/mastra-ai/mastra/commit/69ea758358edd7117f191c2e69c8bb5fc79e7a1a), [`73b0bb3`](https://github.com/mastra-ai/mastra/commit/73b0bb394dba7c9482eb467a97ab283dbc0ef4db), [`651e772`](https://github.com/mastra-ai/mastra/commit/651e772eb1475fb13e126d3fcc01751297a88214), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`6b3ba91`](https://github.com/mastra-ai/mastra/commit/6b3ba91494cc10394df96782f349a4f7b1e152cc), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`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), [`a0e437f`](https://github.com/mastra-ai/mastra/commit/a0e437fac561b28ee719e0302d72b2f9b4c138f0), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`5627a8c`](https://github.com/mastra-ai/mastra/commit/5627a8c6dc11fe3711b3fa7a6ffd6eb34100a306), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`c10398d`](https://github.com/mastra-ai/mastra/commit/c10398d5b88f1d4af556f4267ff06f1d11e89179), [`3ff45d1`](https://github.com/mastra-ai/mastra/commit/3ff45d10e0c80c5335a957ab563da72feb623520), [`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), [`251df45`](https://github.com/mastra-ai/mastra/commit/251df4531407dfa46d805feb40ff3fb49769f455), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`f894d14`](https://github.com/mastra-ai/mastra/commit/f894d148946629af7b1f452d65a9cf864cec3765), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`1924cf0`](https://github.com/mastra-ai/mastra/commit/1924cf06816e5e4d4d5333065ec0f4bb02a97799), [`c0b731f`](https://github.com/mastra-ai/mastra/commit/c0b731fb27d712dc8582e846df5c0332a6a0c5ba), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`c2b9547`](https://github.com/mastra-ai/mastra/commit/c2b9547bf435f56339f23625a743b2147ab1c7a6), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`9312dcd`](https://github.com/mastra-ai/mastra/commit/9312dcd1c6f5b321929e7d382e763d95fdc030f5), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`5d7000f`](https://github.com/mastra-ai/mastra/commit/5d7000f757cd65ea9dc5b05e662fd83dfd44e932), [`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), [`580b592`](https://github.com/mastra-ai/mastra/commit/580b5927afc82fe460dfdf9a38a902511b6b7e7f), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`ff4d9a6`](https://github.com/mastra-ai/mastra/commit/ff4d9a6704fc87b31a380a76ed22736fdedbba5a), [`847c212`](https://github.com/mastra-ai/mastra/commit/847c212caba7df0d6f2fc756b494ac3c75c3720d), [`69821ef`](https://github.com/mastra-ai/mastra/commit/69821ef806482e2c44e2197ac0b050c3fe3a5285), [`3a73998`](https://github.com/mastra-ai/mastra/commit/3a73998fa4ebeb7f3dc9301afe78095fc63e7999), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`58e3931`](https://github.com/mastra-ai/mastra/commit/58e3931af9baa5921688566210f00fb0c10479fa), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`0bed332`](https://github.com/mastra-ai/mastra/commit/0bed332843f627202c6520eaf671771313cd20f3), [`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), [`a7ce182`](https://github.com/mastra-ai/mastra/commit/a7ce1822a8785ce45d62dd5c911af465e144f7d7), [`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), [`bec5efd`](https://github.com/mastra-ai/mastra/commit/bec5efde96653ccae6604e68c696d1bc6c1a0bf5), [`5947fcd`](https://github.com/mastra-ai/mastra/commit/5947fcdd425531f29f9422026d466c2ee3113c93), [`4aa55b3`](https://github.com/mastra-ai/mastra/commit/4aa55b383cf06043943359ea316572fd969861a7), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`7907fd1`](https://github.com/mastra-ai/mastra/commit/7907fd1c5059813b7b870b81ca71041dc807331b), [`1ed5716`](https://github.com/mastra-ai/mastra/commit/1ed5716830867b3774c4a1b43cc0d82935f32b96), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`2ca67cc`](https://github.com/mastra-ai/mastra/commit/2ca67cc3bb1f6a617353fdcab197d9efebe60d6f), [`9eedf7d`](https://github.com/mastra-ai/mastra/commit/9eedf7de1d6e0022a2f4e5e9e6fe1ec468f9b43c), [`b339816`](https://github.com/mastra-ai/mastra/commit/b339816df0984d0243d944ac2655d6ba5f809cde), [`e16d553`](https://github.com/mastra-ai/mastra/commit/e16d55338403c7553531cc568125c63d53653dff), [`6f941c4`](https://github.com/mastra-ai/mastra/commit/6f941c438ca5f578619788acc7608fc2e23bd176), [`4186bdd`](https://github.com/mastra-ai/mastra/commit/4186bdd00731305726fa06adba0b076a1d50b49f), [`08bb631`](https://github.com/mastra-ai/mastra/commit/08bb631ae2b14684b2678e3549d0b399a6f0561e), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`4f0331a`](https://github.com/mastra-ai/mastra/commit/4f0331a79bf6eb5ee598a5086e55de4b5a0ada03), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b), [`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), [`7aaf973`](https://github.com/mastra-ai/mastra/commit/7aaf973f83fbbe9521f1f9e7a4fd99b8de464617), [`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), [`8a73529`](https://github.com/mastra-ai/mastra/commit/8a73529ca01187f604b1f3019d0a725ac63ae55f), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`4fba91b`](https://github.com/mastra-ai/mastra/commit/4fba91bec7c95911dc28e369437596b152b04cd0), [`465ac05`](https://github.com/mastra-ai/mastra/commit/465ac0526a91d175542091c675181f1a96c98c46), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`8a000da`](https://github.com/mastra-ai/mastra/commit/8a000da0c09c679a2312f6b3aa05b2ca78ca7393), [`e7266a2`](https://github.com/mastra-ai/mastra/commit/e7266a278db02035c97a5e9cd9d1669a6b7a535d), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019), [`12b0cc4`](https://github.com/mastra-ai/mastra/commit/12b0cc4077d886b1a552637dedb70a7ade93528c), [`3bf6c5f`](https://github.com/mastra-ai/mastra/commit/3bf6c5f104c25226cd84e0c77f9dec15f2cac2db)]:
|
|
53
|
-
- @mastra/core@
|
|
59
|
+
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`2319326`](https://github.com/mastra-ai/mastra/commit/2319326f8c64e503a09bbcf14be2dd65405445e0), [`d2d3e22`](https://github.com/mastra-ai/mastra/commit/d2d3e22a419ee243f8812a84e3453dd44365ecb0), [`08766f1`](https://github.com/mastra-ai/mastra/commit/08766f15e13ac0692fde2a8bd366c2e16e4321df), [`72df8ae`](https://github.com/mastra-ai/mastra/commit/72df8ae595584cdd7747d5c39ffaca45e4507227), [`ebae12a`](https://github.com/mastra-ai/mastra/commit/ebae12a2dd0212e75478981053b148a2c246962d), [`c8417b4`](https://github.com/mastra-ai/mastra/commit/c8417b41d9f3486854dc7842d977fbe5e2166264), [`bc72b52`](https://github.com/mastra-ai/mastra/commit/bc72b529ee4478fe89ecd85a8be47ce0127b82a0), [`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`c61a0a5`](https://github.com/mastra-ai/mastra/commit/c61a0a5de4904c88fd8b3718bc26d1be1c2ec6e7), [`05b8bee`](https://github.com/mastra-ai/mastra/commit/05b8bee9e50e6c2a4a2bf210eca25ee212ca24fa), [`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`3d93a15`](https://github.com/mastra-ai/mastra/commit/3d93a15796b158c617461c8b98bede476ebb43e2), [`9198899`](https://github.com/mastra-ai/mastra/commit/91988995c427b185c33714b7f3be955367911324), [`ed3e3dd`](https://github.com/mastra-ai/mastra/commit/ed3e3ddec69d564fe2b125e083437f76331f1283), [`c59e13c`](https://github.com/mastra-ai/mastra/commit/c59e13c7688284bd96b2baee3e314335003548de), [`c042bd0`](https://github.com/mastra-ai/mastra/commit/c042bd0b743e0e86199d0cb83344ca7690e34a9c), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`21a15de`](https://github.com/mastra-ai/mastra/commit/21a15de369fe82aac26bb642ed7be73505475e8b), [`e54953e`](https://github.com/mastra-ai/mastra/commit/e54953ed8ce1b28c0d62a19950163039af7834b4), [`ae8baf7`](https://github.com/mastra-ai/mastra/commit/ae8baf7d8adcb0ff9dac11880400452bc49b33ff), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`940a2b2`](https://github.com/mastra-ai/mastra/commit/940a2b27480626ed7e74f55806dcd2181c1dd0c2), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`d5ed981`](https://github.com/mastra-ai/mastra/commit/d5ed981c8701c1b8a27a5f35a9a2f7d9244e695f), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`33a4d2e`](https://github.com/mastra-ai/mastra/commit/33a4d2e4ed8af51f69256232f00c34d6b6b51d48), [`9650cce`](https://github.com/mastra-ai/mastra/commit/9650cce52a1d917ff9114653398e2a0f5c3ba808), [`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), [`4f94ed8`](https://github.com/mastra-ai/mastra/commit/4f94ed8177abfde3ec536e3574883e075423350c), [`feb7ee4`](https://github.com/mastra-ai/mastra/commit/feb7ee4d09a75edb46c6669a3beaceec78811747), [`4aaa844`](https://github.com/mastra-ai/mastra/commit/4aaa844a4f19d054490f43638a990cc57bda8d2f), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`38380b6`](https://github.com/mastra-ai/mastra/commit/38380b60fca905824bdf6b43df307a58efb1aa15), [`6833c69`](https://github.com/mastra-ai/mastra/commit/6833c69607418d257750bbcdd84638993d343539), [`932d63d`](https://github.com/mastra-ai/mastra/commit/932d63dd51be9c8bf1e00e3671fe65606c6fb9cd), [`4a1a6cb`](https://github.com/mastra-ai/mastra/commit/4a1a6cb3facad54b2bb6780b00ce91d6de1edc08), [`08c31c1`](https://github.com/mastra-ai/mastra/commit/08c31c188ebccd598acaf55e888b6397d01f7eae), [`919a22b`](https://github.com/mastra-ai/mastra/commit/919a22b25876f9ed5891efe5facbe682c30ff497), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`69136e7`](https://github.com/mastra-ai/mastra/commit/69136e748e32f57297728a4e0f9a75988462f1a7), [`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), [`0d41fe2`](https://github.com/mastra-ai/mastra/commit/0d41fe245355dfc66d61a0d9c85d9400aac351ff), [`b760b73`](https://github.com/mastra-ai/mastra/commit/b760b731aca7c8a3f041f61d57a7f125ae9cb215), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`449aed2`](https://github.com/mastra-ai/mastra/commit/449aed2ba9d507b75bf93d427646ea94f734dfd1), [`eb648a2`](https://github.com/mastra-ai/mastra/commit/eb648a2cc1728f7678768dd70cd77619b448dab9), [`695a621`](https://github.com/mastra-ai/mastra/commit/695a621528bdabeb87f83c2277cf2bb084c7f2b4), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`ac3cc23`](https://github.com/mastra-ai/mastra/commit/ac3cc2397d1966bc0fc2736a223abc449d3c7719), [`c456e01`](https://github.com/mastra-ai/mastra/commit/c456e0149e3c176afcefdbd9bb1d2c5917723725), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`a86f4df`](https://github.com/mastra-ai/mastra/commit/a86f4df0407311e0d2ea49b9a541f0938810d6a9), [`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), [`edb07e4`](https://github.com/mastra-ai/mastra/commit/edb07e49283e0c28bd094a60e03439bf6ecf0221), [`e0941c3`](https://github.com/mastra-ai/mastra/commit/e0941c3d7fc75695d5d258e7008fd5d6e650800c), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`2b459f4`](https://github.com/mastra-ai/mastra/commit/2b459f466fd91688eeb2a44801dc23f7f8a887ab), [`798d0c7`](https://github.com/mastra-ai/mastra/commit/798d0c740232653b1d754870e6b43a55c364ffe2), [`0c0580a`](https://github.com/mastra-ai/mastra/commit/0c0580a42f697cd2a7d5973f25bfe7da9055038a), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`ab035c2`](https://github.com/mastra-ai/mastra/commit/ab035c2ef6d8cc7bb25f06f1a38508bd9e6f126b), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`0131105`](https://github.com/mastra-ai/mastra/commit/0131105532e83bdcbb73352fc7d0879eebf140dc), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`47b1c16`](https://github.com/mastra-ai/mastra/commit/47b1c16a01c7ffb6765fe1e499b49092f8b7eba3), [`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), [`9d5059e`](https://github.com/mastra-ai/mastra/commit/9d5059eae810829935fb08e81a9bb7ecd5b144a7), [`ffe84d5`](https://github.com/mastra-ai/mastra/commit/ffe84d54f3b0f85167fe977efd027dba027eb998), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`24b76d8`](https://github.com/mastra-ai/mastra/commit/24b76d8e17656269c8ed09a0c038adb9cc2ae95a), [`31d13d5`](https://github.com/mastra-ai/mastra/commit/31d13d5fdc2e2380e2e3ee3ec9fb29d2a00f265d), [`ef756c6`](https://github.com/mastra-ai/mastra/commit/ef756c65f82d16531c43f49a27290a416611e526), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`243a823`](https://github.com/mastra-ai/mastra/commit/243a8239c5906f5c94e4f78b54676793f7510ae3), [`b00ccd3`](https://github.com/mastra-ai/mastra/commit/b00ccd325ebd5d9e37e34dd0a105caae67eb568f), [`28f5f89`](https://github.com/mastra-ai/mastra/commit/28f5f89705f2409921e3c45178796c0e0d0bbb64), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`4c62166`](https://github.com/mastra-ai/mastra/commit/4c621669f4a29b1f443eca3ba70b814afa286266), [`e601b27`](https://github.com/mastra-ai/mastra/commit/e601b272c70f3a5ecca610373aa6223012704892), [`7d56d92`](https://github.com/mastra-ai/mastra/commit/7d56d9213886e8353956d7d40df10045fd12b299), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7bcbf10`](https://github.com/mastra-ai/mastra/commit/7bcbf10133516e03df964b941f9a34e9e4ab4177), [`029540c`](https://github.com/mastra-ai/mastra/commit/029540ca1e582fc2dd8d288ecd4a9b0f31a954ef), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`4353600`](https://github.com/mastra-ai/mastra/commit/43536005a65988a8eede236f69122e7f5a284ba2), [`653e65a`](https://github.com/mastra-ai/mastra/commit/653e65ae1f9502c2958a32f47a5a2df11e612a92), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`6986fb0`](https://github.com/mastra-ai/mastra/commit/6986fb064f5db6ecc24aa655e1d26529087b43b3), [`3d3366f`](https://github.com/mastra-ai/mastra/commit/3d3366f31683e7137d126a3a57174a222c5801fb), [`5a4953f`](https://github.com/mastra-ai/mastra/commit/5a4953f7d25bb15ca31ed16038092a39cb3f98b3), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`efe406a`](https://github.com/mastra-ai/mastra/commit/efe406a1353c24993280ebc2ed61dd9f65b84b26), [`eb9e522`](https://github.com/mastra-ai/mastra/commit/eb9e522ce3070a405e5b949b7bf5609ca51d7fe2), [`fd3d338`](https://github.com/mastra-ai/mastra/commit/fd3d338a2c362174ed5b383f1f011ad9fb0302aa), [`20e6f19`](https://github.com/mastra-ai/mastra/commit/20e6f1971d51d3ff6dd7accad8aaaae826d540ed), [`053e979`](https://github.com/mastra-ai/mastra/commit/053e9793b28e970086b0507f7f3b76ea32c1e838), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`3bdfa75`](https://github.com/mastra-ai/mastra/commit/3bdfa7507a91db66f176ba8221aa28dd546e464a), [`119e5c6`](https://github.com/mastra-ai/mastra/commit/119e5c65008f3e5cfca954eefc2eb85e3bf40da4), [`c6fd6fe`](https://github.com/mastra-ai/mastra/commit/c6fd6fedd09e9cf8004b03a80925f5e94826ad7e), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`fdac646`](https://github.com/mastra-ai/mastra/commit/fdac646033a0930a1a4e00d13aa64c40bb7f1e02), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`d07b568`](https://github.com/mastra-ai/mastra/commit/d07b5687819ea8cb1dffa776d0c1765faf4aa1ae), [`e770de9`](https://github.com/mastra-ai/mastra/commit/e770de941a287a49b1964d44db5a5763d19890a6), [`e26dc9c`](https://github.com/mastra-ai/mastra/commit/e26dc9c3ccfec54ae3dc3e2b2589f741f9ae60a6), [`55edf73`](https://github.com/mastra-ai/mastra/commit/55edf7302149d6c964fbb7908b43babfc2b52145), [`c30400a`](https://github.com/mastra-ai/mastra/commit/c30400a49b994b1b97256fe785eb6c906fc2b232), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`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), [`b5dc973`](https://github.com/mastra-ai/mastra/commit/b5dc9733a5158850298dfb103acb3babdba8a318), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`52e2716`](https://github.com/mastra-ai/mastra/commit/52e2716b42df6eff443de72360ae83e86ec23993), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`4f0b3c6`](https://github.com/mastra-ai/mastra/commit/4f0b3c66f196c06448487f680ccbb614d281e2f7), [`27b4040`](https://github.com/mastra-ai/mastra/commit/27b4040bfa1a95d92546f420a02a626b1419a1d6), [`c61fac3`](https://github.com/mastra-ai/mastra/commit/c61fac3add96f0dcce0208c07415279e2537eb62), [`6f14f70`](https://github.com/mastra-ai/mastra/commit/6f14f706ccaaf81b69544b6c1b75ab66a41e5317), [`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), [`74c4f22`](https://github.com/mastra-ai/mastra/commit/74c4f22ed4c71e72598eacc346ba95cdbc00294f), [`3a76a80`](https://github.com/mastra-ai/mastra/commit/3a76a80284cb71a0faa975abb3d4b2a9631e60cd), [`898a972`](https://github.com/mastra-ai/mastra/commit/898a9727d286c2510d6b702dfd367e6aaf5c6b0f), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`026b848`](https://github.com/mastra-ai/mastra/commit/026b8483fbf5b6d977be8f7e6aac8d15c75558ac), [`2c212e7`](https://github.com/mastra-ai/mastra/commit/2c212e704c90e2db83d4109e62c03f0f6ebd2667), [`a97003a`](https://github.com/mastra-ai/mastra/commit/a97003aa1cf2f4022a41912324a1e77263b326b8), [`f9a2509`](https://github.com/mastra-ai/mastra/commit/f9a25093ea72d210a5e52cfcb3bcc8b5e02dc25c), [`66741d1`](https://github.com/mastra-ai/mastra/commit/66741d1a99c4f42cf23a16109939e8348ac6852e), [`ccc141e`](https://github.com/mastra-ai/mastra/commit/ccc141ed27da0abc3a3fc28e9e5128152e8e37f4), [`27c0009`](https://github.com/mastra-ai/mastra/commit/27c0009777a6073d7631b0eb7b481d94e165b5ca), [`01f8878`](https://github.com/mastra-ai/mastra/commit/01f88783de25e4de048c1c8aace43e26373c6ea5), [`dee388d`](https://github.com/mastra-ai/mastra/commit/dee388dde02f2e63c53385ae69252a47ab6825cc), [`610a70b`](https://github.com/mastra-ai/mastra/commit/610a70bdad282079f0c630e0d7bb284578f20151), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`b7e17d3`](https://github.com/mastra-ai/mastra/commit/b7e17d3f5390bb5a71efc112204413656fcdc18d), [`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), [`4ca4306`](https://github.com/mastra-ai/mastra/commit/4ca430614daa5fa04730205a302a43bf4accfe9f), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`74e504a`](https://github.com/mastra-ai/mastra/commit/74e504a3b584eafd2f198001c6a113bbec589fd3), [`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), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`3f3fc30`](https://github.com/mastra-ai/mastra/commit/3f3fc3096f24c4a26cffeecfe73085928f72aa63), [`d827d08`](https://github.com/mastra-ai/mastra/commit/d827d0808ffe1f3553a84e975806cc989b9735dd), [`e33fdbd`](https://github.com/mastra-ai/mastra/commit/e33fdbd07b33920d81e823122331b0c0bee0bb59), [`4524734`](https://github.com/mastra-ai/mastra/commit/45247343e384717a7c8404296275c56201d6470f), [`7a010c5`](https://github.com/mastra-ai/mastra/commit/7a010c56b846a313a49ae42fccd3d8de2b9f292d), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`2a53598`](https://github.com/mastra-ai/mastra/commit/2a53598c6d8cfeb904a7fc74e57e526d751c8fa6), [`81b6a8f`](https://github.com/mastra-ai/mastra/commit/81b6a8ff79f49a7549d15d66624ac1a0b8f5f971), [`8538a0d`](https://github.com/mastra-ai/mastra/commit/8538a0d232619bf55dad7ddc2a8b0ca77c679a87), [`d90ea65`](https://github.com/mastra-ai/mastra/commit/d90ea6536f7aa51c6545a4e9215b55858e98e16d), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`261473a`](https://github.com/mastra-ai/mastra/commit/261473ac637e633064a22076671e2e02b002214d), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`de8239b`](https://github.com/mastra-ai/mastra/commit/de8239bdcb1d8c0cfa06da21f1569912a66bbc8a), [`e4d366a`](https://github.com/mastra-ai/mastra/commit/e4d366aeb500371dd4210d6aa8361a4c21d87034), [`23c10a1`](https://github.com/mastra-ai/mastra/commit/23c10a1efdd9a693c405511ab2dc8a1236603162), [`b5e6cd7`](https://github.com/mastra-ai/mastra/commit/b5e6cd77fc8c8e64e0494c1d06cee3d84e795d1e), [`d171e55`](https://github.com/mastra-ai/mastra/commit/d171e559ead9f52ec728d424844c8f7b164c4510), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`a4f010b`](https://github.com/mastra-ai/mastra/commit/a4f010b22e4355a5fdee70a1fe0f6e4a692cc29e), [`c7cd3c7`](https://github.com/mastra-ai/mastra/commit/c7cd3c7a187d7aaf79e2ca139de328bf609a14b4), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`68ec97d`](https://github.com/mastra-ai/mastra/commit/68ec97d4c07c6393fcf95c2481fc5d73da99f8c8), [`8dc7f55`](https://github.com/mastra-ai/mastra/commit/8dc7f55900395771da851dc7d78d53ae84fe34ec), [`cfabdd4`](https://github.com/mastra-ai/mastra/commit/cfabdd4aae7a726b706942d6836eeca110fb6267), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`01b20fe`](https://github.com/mastra-ai/mastra/commit/01b20fefb7c67c2b7d79417598ef4e60256d1225), [`dd4f34c`](https://github.com/mastra-ai/mastra/commit/dd4f34c78cbae24063463475b0619575c415f9b8), [`8379099`](https://github.com/mastra-ai/mastra/commit/8379099fc467af6bef54dd7f80c9bd75bf8bbddf), [`0dbf199`](https://github.com/mastra-ai/mastra/commit/0dbf199110f22192ce5c95b1c8148d4872b4d119), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`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), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`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), [`929f69c`](https://github.com/mastra-ai/mastra/commit/929f69c3436fa20dd0f0e2f7ebe8270bd82a1529), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`10c2735`](https://github.com/mastra-ai/mastra/commit/10c27355edfdad1ee2b826b897df74125eb81fb8), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`8c0ec25`](https://github.com/mastra-ai/mastra/commit/8c0ec25646c8a7df253ed1e5ff4863a0d3f1316c), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`69ea758`](https://github.com/mastra-ai/mastra/commit/69ea758358edd7117f191c2e69c8bb5fc79e7a1a), [`73b0bb3`](https://github.com/mastra-ai/mastra/commit/73b0bb394dba7c9482eb467a97ab283dbc0ef4db), [`651e772`](https://github.com/mastra-ai/mastra/commit/651e772eb1475fb13e126d3fcc01751297a88214), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`6b3ba91`](https://github.com/mastra-ai/mastra/commit/6b3ba91494cc10394df96782f349a4f7b1e152cc), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`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), [`a0e437f`](https://github.com/mastra-ai/mastra/commit/a0e437fac561b28ee719e0302d72b2f9b4c138f0), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`5627a8c`](https://github.com/mastra-ai/mastra/commit/5627a8c6dc11fe3711b3fa7a6ffd6eb34100a306), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`c10398d`](https://github.com/mastra-ai/mastra/commit/c10398d5b88f1d4af556f4267ff06f1d11e89179), [`3ff45d1`](https://github.com/mastra-ai/mastra/commit/3ff45d10e0c80c5335a957ab563da72feb623520), [`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), [`251df45`](https://github.com/mastra-ai/mastra/commit/251df4531407dfa46d805feb40ff3fb49769f455), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`f894d14`](https://github.com/mastra-ai/mastra/commit/f894d148946629af7b1f452d65a9cf864cec3765), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`1924cf0`](https://github.com/mastra-ai/mastra/commit/1924cf06816e5e4d4d5333065ec0f4bb02a97799), [`c0b731f`](https://github.com/mastra-ai/mastra/commit/c0b731fb27d712dc8582e846df5c0332a6a0c5ba), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`c2b9547`](https://github.com/mastra-ai/mastra/commit/c2b9547bf435f56339f23625a743b2147ab1c7a6), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`9312dcd`](https://github.com/mastra-ai/mastra/commit/9312dcd1c6f5b321929e7d382e763d95fdc030f5), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`5d7000f`](https://github.com/mastra-ai/mastra/commit/5d7000f757cd65ea9dc5b05e662fd83dfd44e932), [`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), [`580b592`](https://github.com/mastra-ai/mastra/commit/580b5927afc82fe460dfdf9a38a902511b6b7e7f), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`ff4d9a6`](https://github.com/mastra-ai/mastra/commit/ff4d9a6704fc87b31a380a76ed22736fdedbba5a), [`50fd320`](https://github.com/mastra-ai/mastra/commit/50fd320003d0d93831c230ef531bef41f5ba7b3a), [`847c212`](https://github.com/mastra-ai/mastra/commit/847c212caba7df0d6f2fc756b494ac3c75c3720d), [`69821ef`](https://github.com/mastra-ai/mastra/commit/69821ef806482e2c44e2197ac0b050c3fe3a5285), [`3a73998`](https://github.com/mastra-ai/mastra/commit/3a73998fa4ebeb7f3dc9301afe78095fc63e7999), [`ffa553a`](https://github.com/mastra-ai/mastra/commit/ffa553a3edc1bd17d73669fba66d6b6f4ac10897), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`58e3931`](https://github.com/mastra-ai/mastra/commit/58e3931af9baa5921688566210f00fb0c10479fa), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`0bed332`](https://github.com/mastra-ai/mastra/commit/0bed332843f627202c6520eaf671771313cd20f3), [`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), [`a7ce182`](https://github.com/mastra-ai/mastra/commit/a7ce1822a8785ce45d62dd5c911af465e144f7d7), [`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), [`bec5efd`](https://github.com/mastra-ai/mastra/commit/bec5efde96653ccae6604e68c696d1bc6c1a0bf5), [`5947fcd`](https://github.com/mastra-ai/mastra/commit/5947fcdd425531f29f9422026d466c2ee3113c93), [`4aa55b3`](https://github.com/mastra-ai/mastra/commit/4aa55b383cf06043943359ea316572fd969861a7), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`7907fd1`](https://github.com/mastra-ai/mastra/commit/7907fd1c5059813b7b870b81ca71041dc807331b), [`1ed5716`](https://github.com/mastra-ai/mastra/commit/1ed5716830867b3774c4a1b43cc0d82935f32b96), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`2ca67cc`](https://github.com/mastra-ai/mastra/commit/2ca67cc3bb1f6a617353fdcab197d9efebe60d6f), [`9eedf7d`](https://github.com/mastra-ai/mastra/commit/9eedf7de1d6e0022a2f4e5e9e6fe1ec468f9b43c), [`b339816`](https://github.com/mastra-ai/mastra/commit/b339816df0984d0243d944ac2655d6ba5f809cde), [`e16d553`](https://github.com/mastra-ai/mastra/commit/e16d55338403c7553531cc568125c63d53653dff), [`6f941c4`](https://github.com/mastra-ai/mastra/commit/6f941c438ca5f578619788acc7608fc2e23bd176), [`4186bdd`](https://github.com/mastra-ai/mastra/commit/4186bdd00731305726fa06adba0b076a1d50b49f), [`08bb631`](https://github.com/mastra-ai/mastra/commit/08bb631ae2b14684b2678e3549d0b399a6f0561e), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`4f0331a`](https://github.com/mastra-ai/mastra/commit/4f0331a79bf6eb5ee598a5086e55de4b5a0ada03), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b), [`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), [`7aaf973`](https://github.com/mastra-ai/mastra/commit/7aaf973f83fbbe9521f1f9e7a4fd99b8de464617), [`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), [`8a73529`](https://github.com/mastra-ai/mastra/commit/8a73529ca01187f604b1f3019d0a725ac63ae55f), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`4fba91b`](https://github.com/mastra-ai/mastra/commit/4fba91bec7c95911dc28e369437596b152b04cd0), [`465ac05`](https://github.com/mastra-ai/mastra/commit/465ac0526a91d175542091c675181f1a96c98c46), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`8a000da`](https://github.com/mastra-ai/mastra/commit/8a000da0c09c679a2312f6b3aa05b2ca78ca7393), [`e7266a2`](https://github.com/mastra-ai/mastra/commit/e7266a278db02035c97a5e9cd9d1669a6b7a535d), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019), [`12b0cc4`](https://github.com/mastra-ai/mastra/commit/12b0cc4077d886b1a552637dedb70a7ade93528c), [`3bf6c5f`](https://github.com/mastra-ai/mastra/commit/3bf6c5f104c25226cd84e0c77f9dec15f2cac2db)]:
|
|
60
|
+
- @mastra/core@1.0.0
|
|
54
61
|
|
|
55
62
|
## 1.0.0-beta.3
|
|
56
63
|
|
package/dist/docs/SKILL.md
CHANGED
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: mastra-duckdb
|
|
3
|
-
description: Documentation for @mastra/duckdb.
|
|
2
|
+
name: mastra-duckdb
|
|
3
|
+
description: Documentation for @mastra/duckdb. Use when working with @mastra/duckdb APIs, configuration, or implementation.
|
|
4
|
+
metadata:
|
|
5
|
+
package: "@mastra/duckdb"
|
|
6
|
+
version: "0.0.0-workflow-timeout-issue-20260213181535"
|
|
4
7
|
---
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
## When to use
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
> **Package**: @mastra/duckdb
|
|
11
|
+
Use this skill whenever you are working with @mastra/duckdb to obtain the domain-specific knowledge.
|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## How to use
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
Read the individual reference documents for detailed explanations and code examples.
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
cat docs/SOURCE_MAP.json
|
|
17
|
-
```
|
|
17
|
+
### Reference
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
- **types**: `.d.ts` file with JSDoc and API signatures
|
|
21
|
-
- **implementation**: `.js` chunk file with readable source
|
|
22
|
-
- **docs**: Conceptual documentation in `docs/`
|
|
19
|
+
- [Reference: DuckDBVector Store](references/reference-vectors-duckdb.md) - Documentation for the DuckDBVector class in Mastra, which provides embedded high-performance vector search using DuckDB with HNSW indexing.
|
|
23
20
|
|
|
24
|
-
## Top Exports
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
See SOURCE_MAP.json for the complete list.
|
|
29
|
-
|
|
30
|
-
## Available Topics
|
|
31
|
-
|
|
32
|
-
- [Vectors](vectors/) - 1 file(s)
|
|
22
|
+
Read [assets/SOURCE_MAP.json](assets/SOURCE_MAP.json) for source code references.
|
|
@@ -1,22 +1,33 @@
|
|
|
1
|
-
#
|
|
1
|
+
# DuckDBVector Store
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The DuckDB storage implementation provides an embedded high-performance vector search solution using [DuckDB](https://duckdb.org/), an in-process analytical database. It uses the VSS extension for vector similarity search with HNSW indexing, offering a lightweight and efficient vector database that requires no external server.
|
|
4
4
|
|
|
5
|
+
It's part of the `@mastra/duckdb` package and offers efficient vector similarity search with metadata filtering.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
## Installation
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
**npm**:
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
```bash
|
|
12
|
+
npm install @mastra/duckdb@latest
|
|
13
|
+
```
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
**pnpm**:
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add @mastra/duckdb@latest
|
|
19
|
+
```
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
**Yarn**:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
yarn add @mastra/duckdb@latest
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Bun**:
|
|
17
28
|
|
|
18
29
|
```bash
|
|
19
|
-
|
|
30
|
+
bun add @mastra/duckdb@latest
|
|
20
31
|
```
|
|
21
32
|
|
|
22
33
|
## Usage
|
|
@@ -64,24 +75,58 @@ await store.close();
|
|
|
64
75
|
|
|
65
76
|
## Constructor Options
|
|
66
77
|
|
|
78
|
+
**id:** (`string`): Unique identifier for the vector store instance
|
|
79
|
+
|
|
80
|
+
**path?:** (`string`): Database file path. Use ':memory:' for in-memory database, or a file path like './vectors.duckdb' for persistence. (Default: `':memory:'`)
|
|
81
|
+
|
|
82
|
+
**dimensions?:** (`number`): Default dimension for vector embeddings (Default: `1536`)
|
|
83
|
+
|
|
84
|
+
**metric?:** (`'cosine' | 'euclidean' | 'dotproduct'`): Default distance metric for similarity search (Default: `cosine`)
|
|
85
|
+
|
|
67
86
|
## Methods
|
|
68
87
|
|
|
69
88
|
### createIndex()
|
|
70
89
|
|
|
71
90
|
Creates a new vector collection with optional HNSW index for fast approximate nearest neighbor search.
|
|
72
91
|
|
|
92
|
+
**indexName:** (`string`): Name of the index to create
|
|
93
|
+
|
|
94
|
+
**dimension:** (`number`): Vector dimension size (must match your embedding model)
|
|
95
|
+
|
|
96
|
+
**metric?:** (`'cosine' | 'euclidean' | 'dotproduct'`): Distance metric for similarity search (Default: `cosine`)
|
|
97
|
+
|
|
73
98
|
### upsert()
|
|
74
99
|
|
|
75
100
|
Adds or updates vectors and their metadata in the index.
|
|
76
101
|
|
|
102
|
+
**indexName:** (`string`): Name of the index to insert into
|
|
103
|
+
|
|
104
|
+
**vectors:** (`number[][]`): Array of embedding vectors
|
|
105
|
+
|
|
106
|
+
**metadata?:** (`Record<string, any>[]`): Metadata for each vector
|
|
107
|
+
|
|
108
|
+
**ids?:** (`string[]`): Optional vector IDs (auto-generated UUIDs if not provided)
|
|
109
|
+
|
|
77
110
|
### query()
|
|
78
111
|
|
|
79
112
|
Searches for similar vectors with optional metadata filtering.
|
|
80
113
|
|
|
114
|
+
**indexName:** (`string`): Name of the index to search in
|
|
115
|
+
|
|
116
|
+
**queryVector:** (`number[]`): Query vector to find similar vectors for
|
|
117
|
+
|
|
118
|
+
**topK?:** (`number`): Number of results to return (Default: `10`)
|
|
119
|
+
|
|
120
|
+
**filter?:** (`Filter`): Metadata filters using MongoDB-like query syntax
|
|
121
|
+
|
|
122
|
+
**includeVector?:** (`boolean`): Whether to include vector data in results (Default: `false`)
|
|
123
|
+
|
|
81
124
|
### describeIndex()
|
|
82
125
|
|
|
83
126
|
Gets information about an index.
|
|
84
127
|
|
|
128
|
+
**indexName:** (`string`): Name of the index to describe
|
|
129
|
+
|
|
85
130
|
Returns:
|
|
86
131
|
|
|
87
132
|
```typescript
|
|
@@ -96,6 +141,8 @@ interface IndexStats {
|
|
|
96
141
|
|
|
97
142
|
Deletes an index and all its data.
|
|
98
143
|
|
|
144
|
+
**indexName:** (`string`): Name of the index to delete
|
|
145
|
+
|
|
99
146
|
### listIndexes()
|
|
100
147
|
|
|
101
148
|
Lists all vector indexes in the database.
|
|
@@ -106,14 +153,36 @@ Returns: `Promise<string[]>`
|
|
|
106
153
|
|
|
107
154
|
Update a single vector by ID or by metadata filter. Either `id` or `filter` must be provided, but not both.
|
|
108
155
|
|
|
156
|
+
**indexName:** (`string`): Name of the index containing the vector
|
|
157
|
+
|
|
158
|
+
**id?:** (`string`): ID of the vector entry to update (mutually exclusive with filter)
|
|
159
|
+
|
|
160
|
+
**filter?:** (`Record<string, any>`): Metadata filter to identify vector(s) to update (mutually exclusive with id)
|
|
161
|
+
|
|
162
|
+
**update:** (`object`): Update data containing vector and/or metadata
|
|
163
|
+
|
|
164
|
+
**update.vector?:** (`number[]`): New vector data to update
|
|
165
|
+
|
|
166
|
+
**update.metadata?:** (`Record<string, any>`): New metadata to update
|
|
167
|
+
|
|
109
168
|
### deleteVector()
|
|
110
169
|
|
|
111
170
|
Deletes a specific vector entry from an index by its ID.
|
|
112
171
|
|
|
172
|
+
**indexName:** (`string`): Name of the index containing the vector
|
|
173
|
+
|
|
174
|
+
**id:** (`string`): ID of the vector entry to delete
|
|
175
|
+
|
|
113
176
|
### deleteVectors()
|
|
114
177
|
|
|
115
178
|
Delete multiple vectors by IDs or by metadata filter. Either `ids` or `filter` must be provided, but not both.
|
|
116
179
|
|
|
180
|
+
**indexName:** (`string`): Name of the index containing the vectors to delete
|
|
181
|
+
|
|
182
|
+
**ids?:** (`string[]`): Array of vector IDs to delete (mutually exclusive with filter)
|
|
183
|
+
|
|
184
|
+
**filter?:** (`Record<string, any>`): Metadata filter to identify vectors to delete (mutually exclusive with ids)
|
|
185
|
+
|
|
117
186
|
### close()
|
|
118
187
|
|
|
119
188
|
Closes the database connection and releases resources.
|
|
@@ -139,13 +208,13 @@ interface QueryResult {
|
|
|
139
208
|
|
|
140
209
|
DuckDB vector store supports MongoDB-like filter operators:
|
|
141
210
|
|
|
142
|
-
| Category | Operators
|
|
143
|
-
| ---------- |
|
|
211
|
+
| Category | Operators |
|
|
212
|
+
| ---------- | ------------------------------------------ |
|
|
144
213
|
| Comparison | `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte` |
|
|
145
|
-
| Logical | `$and`, `$or`, `$not`, `$nor`
|
|
146
|
-
| Array | `$in`, `$nin`
|
|
147
|
-
| Element | `$exists`
|
|
148
|
-
| Text | `$contains`
|
|
214
|
+
| Logical | `$and`, `$or`, `$not`, `$nor` |
|
|
215
|
+
| Array | `$in`, `$nin` |
|
|
216
|
+
| Element | `$exists` |
|
|
217
|
+
| Text | `$contains` |
|
|
149
218
|
|
|
150
219
|
### Filter Examples
|
|
151
220
|
|
|
@@ -172,11 +241,11 @@ const results = await store.query({
|
|
|
172
241
|
|
|
173
242
|
## Distance Metrics
|
|
174
243
|
|
|
175
|
-
| Metric | Description | Score Interpretation
|
|
176
|
-
| ------------ | ----------------- |
|
|
177
|
-
| `cosine` | Cosine similarity | 0-1 (1 = most similar)
|
|
178
|
-
| `euclidean` | L2 distance | 0-∞ (0 = most similar)
|
|
179
|
-
| `dotproduct` | Inner product | Higher = more similar
|
|
244
|
+
| Metric | Description | Score Interpretation | Best For |
|
|
245
|
+
| ------------ | ----------------- | ---------------------- | ----------------------------------- |
|
|
246
|
+
| `cosine` | Cosine similarity | 0-1 (1 = most similar) | Text embeddings, normalized vectors |
|
|
247
|
+
| `euclidean` | L2 distance | 0-∞ (0 = most similar) | Image embeddings, spatial data |
|
|
248
|
+
| `dotproduct` | Inner product | Higher = more similar | When vector magnitude matters |
|
|
180
249
|
|
|
181
250
|
## Error Handling
|
|
182
251
|
|
|
@@ -245,5 +314,5 @@ const store = new DuckDBVector({
|
|
|
245
314
|
|
|
246
315
|
## Related
|
|
247
316
|
|
|
248
|
-
- [Metadata Filters](
|
|
317
|
+
- [Metadata Filters](https://mastra.ai/reference/rag/metadata-filters)
|
|
249
318
|
- [DuckDB Documentation](https://duckdb.org/docs/)
|
package/dist/index.cjs
CHANGED
|
@@ -89,10 +89,18 @@ function buildOperatorCondition(field, operators) {
|
|
|
89
89
|
for (const [op, value] of Object.entries(operators)) {
|
|
90
90
|
switch (op) {
|
|
91
91
|
case "$eq":
|
|
92
|
-
|
|
92
|
+
if (value === null) {
|
|
93
|
+
conditions.push(`${fieldPath} IS NULL`);
|
|
94
|
+
} else {
|
|
95
|
+
conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);
|
|
96
|
+
}
|
|
93
97
|
break;
|
|
94
98
|
case "$ne":
|
|
95
|
-
|
|
99
|
+
if (value === null) {
|
|
100
|
+
conditions.push(`${fieldPath} IS NOT NULL`);
|
|
101
|
+
} else {
|
|
102
|
+
conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);
|
|
103
|
+
}
|
|
96
104
|
break;
|
|
97
105
|
case "$gt":
|
|
98
106
|
conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);
|
|
@@ -108,8 +116,12 @@ function buildOperatorCondition(field, operators) {
|
|
|
108
116
|
break;
|
|
109
117
|
case "$in":
|
|
110
118
|
if (Array.isArray(value) && value.length > 0) {
|
|
119
|
+
const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;
|
|
111
120
|
const literals = value.map((v) => toSqlLiteral(v)).join(", ");
|
|
112
|
-
|
|
121
|
+
const stringLiterals = value.map((v) => toSqlLiteral(String(v))).join(", ");
|
|
122
|
+
conditions.push(
|
|
123
|
+
`(list_has_any(TRY_CAST(${jsonPath} AS VARCHAR[]), [${stringLiterals}]) OR ${fieldPath} IN (${literals}))`
|
|
124
|
+
);
|
|
113
125
|
} else {
|
|
114
126
|
conditions.push("1=0");
|
|
115
127
|
}
|
|
@@ -140,6 +152,15 @@ function buildOperatorCondition(field, operators) {
|
|
|
140
152
|
conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);
|
|
141
153
|
}
|
|
142
154
|
break;
|
|
155
|
+
case "$all":
|
|
156
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
157
|
+
const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;
|
|
158
|
+
const arrayConditions = value.map((v) => {
|
|
159
|
+
return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;
|
|
160
|
+
});
|
|
161
|
+
conditions.push(`(${arrayConditions.join(" AND ")})`);
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
143
164
|
case "$not":
|
|
144
165
|
if (typeof value === "object" && value !== null) {
|
|
145
166
|
const subResult = buildOperatorCondition(field, value);
|
|
@@ -289,6 +310,7 @@ var DuckDBVector = class extends vector.MastraVector {
|
|
|
289
310
|
async query(params) {
|
|
290
311
|
await this.initialize();
|
|
291
312
|
const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;
|
|
313
|
+
vector.validateTopK("DUCKDB", topK);
|
|
292
314
|
const tableName = this.escapeIdentifier(indexName);
|
|
293
315
|
const distanceFunc = this.getDistanceFunction();
|
|
294
316
|
const vectorLiteral = `[${queryVector.join(", ")}]::FLOAT[${queryVector.length}]`;
|
|
@@ -334,6 +356,7 @@ var DuckDBVector = class extends vector.MastraVector {
|
|
|
334
356
|
async upsert(params) {
|
|
335
357
|
await this.initialize();
|
|
336
358
|
const { indexName, vectors, metadata, ids } = params;
|
|
359
|
+
vector.validateUpsertInput("DUCKDB", vectors, metadata, ids);
|
|
337
360
|
const tableName = this.escapeIdentifier(indexName);
|
|
338
361
|
const vectorIds = ids || vectors.map(() => crypto.randomUUID());
|
|
339
362
|
for (let i = 0; i < vectors.length; i++) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector/filter-builder.ts","../src/vector/index.ts"],"names":["MastraVector","DuckDBInstance"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DuckDBVectorFilter } from './types.js';\n\nexport interface FilterResult {\n clause: string;\n params: unknown[];\n}\n\n/**\n * Escape a string for safe use in SQL.\n */\nfunction escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Convert a value to a SQL literal for comparison with JSON-extracted values.\n * DuckDB's ->> operator returns the raw value without JSON quoting.\n */\nfunction toSqlLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'string') {\n return `'${escapeString(value)}'`;\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n // For objects/arrays, JSON stringify but don't add extra quotes\n return `'${escapeString(JSON.stringify(value))}'`;\n}\n\n/**\n * Build a SQL WHERE clause from a filter object.\n * Supports MongoDB-style query operators.\n */\nexport function buildFilterClause(filter: DuckDBVectorFilter): FilterResult {\n if (!filter || Object.keys(filter).length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n // Handle logical operators\n if (key === '$and') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const andClause = subConditions.map(sc => `(${sc.clause})`).join(' AND ');\n conditions.push(`(${andClause})`);\n }\n continue;\n }\n\n if (key === '$or') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const orClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`(${orClause})`);\n }\n continue;\n }\n\n if (key === '$not') {\n if (typeof value === 'object' && value !== null) {\n const subResult = buildFilterClause(value);\n conditions.push(`NOT (${subResult.clause})`);\n }\n continue;\n }\n\n if (key === '$nor') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const norClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`NOT (${norClause})`);\n }\n continue;\n }\n\n // Handle field conditions\n const fieldPath = buildJsonPath(key);\n\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n // Handle operators\n const operatorResult = buildOperatorCondition(key, value);\n if (operatorResult) {\n conditions.push(operatorResult);\n }\n } else {\n // Direct equality - for strings, compare directly; for others, use SQL literal\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n }\n\n if (conditions.length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n return { clause: conditions.join(' AND '), params: [] };\n}\n\n/**\n * Build a JSON path expression for accessing nested fields in metadata.\n * DuckDB uses json_extract_string for extracting string values from JSON.\n */\nfunction buildJsonPath(field: string): string {\n // Handle nested paths with dot notation\n const parts = field.split('.');\n\n // Build the JSON path with $ prefix for DuckDB\n const jsonPath = '$.' + parts.map(p => escapeString(p)).join('.');\n\n // Use json_extract_string for proper string extraction in DuckDB\n return `json_extract_string(metadata, '${jsonPath}')`;\n}\n\n/**\n * Build a condition from an operator object.\n */\nfunction buildOperatorCondition(field: string, operators: Record<string, unknown>): string | null {\n const conditions: string[] = [];\n const fieldPath = buildJsonPath(field);\n\n for (const [op, value] of Object.entries(operators)) {\n switch (op) {\n case '$eq':\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n break;\n\n case '$ne':\n conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);\n break;\n\n case '$gt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);\n break;\n\n case '$gte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) >= ${toSqlLiteral(value)}`);\n break;\n\n case '$lt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) < ${toSqlLiteral(value)}`);\n break;\n\n case '$lte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) <= ${toSqlLiteral(value)}`);\n break;\n\n case '$in':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} IN (${literals})`);\n } else {\n // Empty array - no matches\n conditions.push('1=0');\n }\n break;\n\n case '$nin':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} NOT IN (${literals})`);\n }\n // Empty array - all matches (no condition added)\n break;\n\n case '$exists':\n if (value) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} IS NULL`);\n }\n break;\n\n case '$contains':\n // Check if the field contains the value (for arrays or strings)\n if (typeof value === 'string') {\n conditions.push(`${fieldPath} LIKE '%${escapeString(value)}%'`);\n } else if (Array.isArray(value)) {\n // Check if array contains all specified elements\n // Use TRY_CAST to handle type mismatches gracefully (returns NULL if not an array)\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n } else {\n // Fallback to equality\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$not':\n if (typeof value === 'object' && value !== null) {\n const subResult = buildOperatorCondition(field, value as Record<string, unknown>);\n if (subResult) {\n conditions.push(`NOT (${subResult})`);\n }\n }\n break;\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (conditions.length === 0) {\n return null;\n }\n\n return conditions.join(' AND ');\n}\n","import { DuckDBInstance } from '@duckdb/node-api';\nimport type { DuckDBValue } from '@duckdb/node-api';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { buildFilterClause } from './filter-builder.js';\nimport type { DuckDBVectorConfig, DuckDBVectorFilter } from './types.js';\n\n/**\n * DuckDB vector store implementation for Mastra.\n *\n * Provides embedded high-performance vector storage with HNSW indexing\n * using the DuckDB VSS extension for vector similarity search.\n *\n * Key features:\n * - Embedded database (no server required)\n * - HNSW indexing for fast similarity search\n * - SQL interface for metadata filtering\n * - Native Parquet support\n */\nexport class DuckDBVector extends MastraVector<DuckDBVectorFilter> {\n private config: DuckDBVectorConfig;\n private instance: DuckDBInstance | null = null;\n private initialized: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: DuckDBVectorConfig) {\n super({ id: config.id });\n this.config = {\n path: ':memory:',\n dimensions: 1536,\n metric: 'cosine',\n ...config,\n };\n }\n\n /**\n * Initialize the database connection and load required extensions.\n */\n private async initialize(): Promise<void> {\n if (this.initialized && this.instance) return;\n\n // If there's an existing initPromise, wait for it, but verify instance exists\n if (this.initPromise) {\n await this.initPromise;\n // If instance was closed while initializing, reset and retry\n if (!this.instance) {\n this.initPromise = null;\n this.initialized = false;\n } else {\n return;\n }\n }\n\n this.initPromise = (async () => {\n try {\n // Create DuckDB instance\n this.instance = await DuckDBInstance.create(this.config.path!);\n const connection = await this.instance.connect();\n\n try {\n // Install and load the VSS extension for vector operations\n await connection.run('INSTALL vss;');\n await connection.run('LOAD vss;');\n } catch {\n // VSS might already be installed, try just loading it\n try {\n await connection.run('LOAD vss;');\n } catch {\n // Continue without VSS - will use basic array operations\n this.logger.warn('VSS extension not available, using basic array operations');\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // Reset state on error to allow retry\n this.instance = null;\n this.initialized = false;\n this.initPromise = null;\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Get a database connection.\n */\n private async getConnection() {\n await this.initialize();\n if (!this.instance) {\n throw new Error('DuckDB instance not initialized');\n }\n return this.instance.connect();\n }\n\n /**\n * Execute a SQL query and return results.\n */\n private async runQuery<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n const connection = await this.getConnection();\n try {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n const result = await stmt.run();\n const rows = await result.getRows();\n\n // Convert rows to objects\n const columns = result.columnNames();\n return rows.map(row => {\n const obj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n obj[col] = row[i];\n });\n return obj as T;\n });\n } finally {\n // Connection cleanup is automatic in @duckdb/node-api\n }\n }\n\n /**\n * Execute a SQL statement without returning results.\n */\n private async runStatement(sql: string, params: unknown[] = []): Promise<void> {\n const connection = await this.getConnection();\n try {\n if (params.length === 0) {\n await connection.run(sql);\n } else {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n await stmt.run();\n }\n } finally {\n // Connection cleanup is automatic\n }\n }\n\n /**\n * Validate and escape a SQL identifier (table name, column name).\n */\n private escapeIdentifier(name: string): string {\n // Validate identifier format\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid identifier: ${name}. Only alphanumeric characters and underscores are allowed.`);\n }\n return `\"${name}\"`;\n }\n\n /**\n * Get the distance function for the configured metric.\n */\n private getDistanceFunction(): string {\n switch (this.config.metric) {\n case 'cosine':\n return 'array_cosine_distance';\n case 'euclidean':\n return 'array_distance';\n case 'dotproduct':\n return 'array_inner_product';\n default:\n return 'array_cosine_distance';\n }\n }\n\n async query(params: QueryVectorParams<DuckDBVectorFilter>): Promise<QueryResult[]> {\n await this.initialize();\n\n const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;\n\n const tableName = this.escapeIdentifier(indexName);\n const distanceFunc = this.getDistanceFunction();\n\n // Build the vector literal\n const vectorLiteral = `[${queryVector.join(', ')}]::FLOAT[${queryVector.length}]`;\n\n // Build filter clause\n const { clause: filterClause } = filter ? buildFilterClause(filter) : { clause: '' };\n\n // Build query\n const selectCols = includeVector ? 'id, vector, metadata, distance' : 'id, metadata, distance';\n\n const sql = `\n SELECT ${selectCols}\n FROM (\n SELECT \n id,\n ${includeVector ? 'vector,' : ''}\n metadata,\n ${distanceFunc}(vector, ${vectorLiteral}) as distance\n FROM ${tableName}\n ${filterClause ? `WHERE ${filterClause}` : ''}\n ) subq\n ORDER BY distance ${this.config.metric === 'dotproduct' ? 'DESC' : 'ASC'}\n LIMIT ${topK}\n `;\n\n const connection = await this.getConnection();\n const result = await connection.run(sql);\n const rows = await result.getRows();\n const columns = result.columnNames();\n\n return rows.map(row => {\n const rowObj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n rowObj[col] = row[i];\n });\n\n const distance = rowObj.distance as number;\n const score =\n this.config.metric === 'cosine'\n ? 1 - distance\n : this.config.metric === 'euclidean'\n ? 1 / (1 + distance)\n : distance;\n\n const metadata = typeof rowObj.metadata === 'string' ? JSON.parse(rowObj.metadata as string) : rowObj.metadata;\n\n const queryResult: QueryResult = {\n id: rowObj.id as string,\n score,\n metadata: metadata as Record<string, unknown>,\n };\n\n if (includeVector && rowObj.vector) {\n queryResult.vector = Array.isArray(rowObj.vector)\n ? (rowObj.vector as number[])\n : JSON.parse(rowObj.vector as string);\n }\n\n return queryResult;\n });\n }\n\n async upsert(params: UpsertVectorParams): Promise<string[]> {\n await this.initialize();\n\n const { indexName, vectors, metadata, ids } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Generate IDs if not provided\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Insert each vector using parameterized queries for IDs\n for (let i = 0; i < vectors.length; i++) {\n const id = vectorIds[i]!;\n const vector = vectors[i]!;\n const meta = metadata?.[i] || {};\n\n const vectorLiteral = `[${vector.join(', ')}]::FLOAT[${vector.length}]`;\n const metadataJson = JSON.stringify(meta);\n\n // Use INSERT OR REPLACE for upsert behavior with parameterized ID\n const sql = `\n INSERT OR REPLACE INTO ${tableName} (id, vector, metadata)\n VALUES (?, ${vectorLiteral}, '${metadataJson.replace(/'/g, \"''\")}')\n `;\n\n await this.runStatement(sql, [id]);\n }\n\n return vectorIds;\n }\n\n async createIndex(params: CreateIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName, dimension, metric } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Store the metric for this index if provided\n if (metric) {\n this.config.metric = metric;\n }\n\n const connection = await this.getConnection();\n\n // Create table with vector column\n const createTableSql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id VARCHAR PRIMARY KEY,\n vector FLOAT[${dimension}],\n metadata JSON\n )\n `;\n\n await connection.run(createTableSql);\n\n // Create HNSW index for fast similarity search\n try {\n const indexNameStr = `${indexName}_hnsw_idx`;\n const createIndexSql = `\n CREATE INDEX IF NOT EXISTS \"${indexNameStr}\"\n ON ${tableName}\n USING HNSW (vector)\n `;\n await connection.run(createIndexSql);\n } catch {\n // HNSW index creation might fail if not supported, continue without it\n this.logger.warn(`Could not create HNSW index for ${indexName}, falling back to linear scan`);\n }\n }\n\n async listIndexes(): Promise<string[]> {\n await this.initialize();\n\n const connection = await this.getConnection();\n const result = await connection.run(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'main'\n AND table_type = 'BASE TABLE'\n `);\n\n const rows = await result.getRows();\n return rows.map(row => row[0] as string);\n }\n\n async describeIndex(params: DescribeIndexParams): Promise<IndexStats> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n\n // Get vector dimension from table schema\n const schemaResult = await connection.run(`\n SELECT data_type\n FROM information_schema.columns\n WHERE table_name = '${indexName}' AND column_name = 'vector'\n `);\n\n const schemaRows = await schemaResult.getRows();\n\n if (schemaRows.length === 0) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n\n // Parse dimension from type like \"FLOAT[1536]\"\n const dataType = schemaRows[0]![0] as string;\n const dimensionMatch = dataType.match(/\\[(\\d+)\\]/);\n const dimension = dimensionMatch ? parseInt(dimensionMatch[1]!, 10) : 0;\n\n // Get row count\n const countResult = await connection.run(`SELECT COUNT(*) as count FROM ${tableName}`);\n const countRows = await countResult.getRows();\n const count = Number(countRows[0]?.[0] || 0);\n\n return {\n dimension,\n count,\n metric: this.config.metric || 'cosine',\n };\n }\n\n async deleteIndex(params: DeleteIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n await connection.run(`DROP TABLE IF EXISTS ${tableName}`);\n }\n\n async updateVector(params: UpdateVectorParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, update } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter;\n\n // Check for mutual exclusivity\n if (hasId && hasFilter) {\n throw new Error('id and filter are mutually exclusive - provide only one');\n }\n\n if (!hasId && !hasFilter) {\n throw new Error('Either id or filter must be provided');\n }\n\n const updates: string[] = [];\n\n if (update.vector) {\n updates.push(`vector = [${update.vector.join(', ')}]::FLOAT[${update.vector.length}]`);\n }\n\n if (update.metadata) {\n const metadataJson = JSON.stringify(update.metadata).replace(/'/g, \"''\");\n updates.push(`metadata = '${metadataJson}'`);\n }\n\n if (hasId) {\n // Update by ID with parameterized query\n const sql = `UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = ?`;\n await this.runStatement(sql, [params.id]);\n } else if (hasFilter) {\n // Update by filter - check for empty filter\n const filter = params.filter!;\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot update with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n // Update ALL matching vectors, not just the first one\n await this.runStatement(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE ${clause}`);\n }\n }\n\n async deleteVector(params: DeleteVectorParams): Promise<void> {\n await this.initialize();\n\n const { indexName, id } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Use parameterized query for ID\n const sql = `DELETE FROM ${tableName} WHERE id = ?`;\n await this.runStatement(sql, [id]);\n }\n\n async deleteVectors(params: DeleteVectorsParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, ids, filter } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!ids && !filter) {\n throw new Error('Either filter or ids must be provided');\n }\n\n if (ids && filter) {\n throw new Error('ids and filter are mutually exclusive - provide only one');\n }\n\n if (ids) {\n // Delete by IDs with parameterized query\n if (ids.length === 0) {\n throw new Error('Cannot delete with empty ids array');\n }\n\n // Create placeholders for each ID\n const placeholders = ids.map(() => '?').join(', ');\n const sql = `DELETE FROM ${tableName} WHERE id IN (${placeholders})`;\n await this.runStatement(sql, ids);\n } else if (filter) {\n // Delete by filter - check for empty filter\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot delete with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n await this.runStatement(`DELETE FROM ${tableName} WHERE ${clause}`);\n }\n }\n\n /**\n * Close the database connection.\n * After closing, the vector store can be reused by calling methods that require initialization.\n */\n async close(): Promise<void> {\n if (this.instance) {\n // DuckDBInstance doesn't have a close method - just reset the reference\n // The garbage collector will handle cleanup\n this.instance = null;\n this.initialized = false;\n this.initPromise = null; // Reset initPromise to allow re-initialization\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/vector/filter-builder.ts","../src/vector/index.ts"],"names":["MastraVector","DuckDBInstance","validateTopK","validateUpsertInput"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DuckDBVectorFilter } from './types.js';\n\nexport interface FilterResult {\n clause: string;\n params: unknown[];\n}\n\n/**\n * Escape a string for safe use in SQL.\n */\nfunction escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Convert a value to a SQL literal for comparison with JSON-extracted values.\n * DuckDB's ->> operator returns the raw value without JSON quoting.\n */\nfunction toSqlLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'string') {\n return `'${escapeString(value)}'`;\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n // For objects/arrays, JSON stringify but don't add extra quotes\n return `'${escapeString(JSON.stringify(value))}'`;\n}\n\n/**\n * Build a SQL WHERE clause from a filter object.\n * Supports MongoDB-style query operators.\n */\nexport function buildFilterClause(filter: DuckDBVectorFilter): FilterResult {\n if (!filter || Object.keys(filter).length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n // Handle logical operators\n if (key === '$and') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const andClause = subConditions.map(sc => `(${sc.clause})`).join(' AND ');\n conditions.push(`(${andClause})`);\n }\n continue;\n }\n\n if (key === '$or') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const orClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`(${orClause})`);\n }\n continue;\n }\n\n if (key === '$not') {\n if (typeof value === 'object' && value !== null) {\n const subResult = buildFilterClause(value);\n conditions.push(`NOT (${subResult.clause})`);\n }\n continue;\n }\n\n if (key === '$nor') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const norClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`NOT (${norClause})`);\n }\n continue;\n }\n\n // Handle field conditions\n const fieldPath = buildJsonPath(key);\n\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n // Handle operators\n const operatorResult = buildOperatorCondition(key, value);\n if (operatorResult) {\n conditions.push(operatorResult);\n }\n } else {\n // Direct equality - for strings, compare directly; for others, use SQL literal\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n }\n\n if (conditions.length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n return { clause: conditions.join(' AND '), params: [] };\n}\n\n/**\n * Build a JSON path expression for accessing nested fields in metadata.\n * DuckDB uses json_extract_string for extracting string values from JSON.\n */\nfunction buildJsonPath(field: string): string {\n // Handle nested paths with dot notation\n const parts = field.split('.');\n\n // Build the JSON path with $ prefix for DuckDB\n const jsonPath = '$.' + parts.map(p => escapeString(p)).join('.');\n\n // Use json_extract_string for proper string extraction in DuckDB\n return `json_extract_string(metadata, '${jsonPath}')`;\n}\n\n/**\n * Build a condition from an operator object.\n */\nfunction buildOperatorCondition(field: string, operators: Record<string, unknown>): string | null {\n const conditions: string[] = [];\n const fieldPath = buildJsonPath(field);\n\n for (const [op, value] of Object.entries(operators)) {\n switch (op) {\n case '$eq':\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else {\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$ne':\n if (value === null) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$gt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);\n break;\n\n case '$gte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) >= ${toSqlLiteral(value)}`);\n break;\n\n case '$lt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) < ${toSqlLiteral(value)}`);\n break;\n\n case '$lte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) <= ${toSqlLiteral(value)}`);\n break;\n\n case '$in':\n if (Array.isArray(value) && value.length > 0) {\n // Try to handle both scalar and array fields\n // For array fields: check if any value in the array is in the specified list\n // For scalar fields: check if the field value is in the specified list\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n // For list_has_any, need to ensure types match - cast all to VARCHAR\n const stringLiterals = value.map(v => toSqlLiteral(String(v))).join(', ');\n\n // Use list_has_any to check if array field contains any of the values\n // TRY_CAST returns NULL if not an array, so we also check scalar field with IN\n conditions.push(\n `(list_has_any(TRY_CAST(${jsonPath} AS VARCHAR[]), [${stringLiterals}]) OR ${fieldPath} IN (${literals}))`,\n );\n } else {\n // Empty array - no matches\n conditions.push('1=0');\n }\n break;\n\n case '$nin':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} NOT IN (${literals})`);\n }\n // Empty array - all matches (no condition added)\n break;\n\n case '$exists':\n if (value) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} IS NULL`);\n }\n break;\n\n case '$contains':\n // Check if the field contains the value (for arrays or strings)\n if (typeof value === 'string') {\n conditions.push(`${fieldPath} LIKE '%${escapeString(value)}%'`);\n } else if (Array.isArray(value)) {\n // Check if array contains all specified elements\n // Use TRY_CAST to handle type mismatches gracefully (returns NULL if not an array)\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n } else {\n // Fallback to equality\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$all':\n // Check if array field contains all specified elements\n if (Array.isArray(value) && value.length > 0) {\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n }\n break;\n\n case '$not':\n if (typeof value === 'object' && value !== null) {\n const subResult = buildOperatorCondition(field, value as Record<string, unknown>);\n if (subResult) {\n conditions.push(`NOT (${subResult})`);\n }\n }\n break;\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (conditions.length === 0) {\n return null;\n }\n\n return conditions.join(' AND ');\n}\n","import { DuckDBInstance } from '@duckdb/node-api';\nimport type { DuckDBValue } from '@duckdb/node-api';\nimport { MastraVector, validateUpsertInput, validateTopK } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { buildFilterClause } from './filter-builder.js';\nimport type { DuckDBVectorConfig, DuckDBVectorFilter } from './types.js';\n\n/**\n * DuckDB vector store implementation for Mastra.\n *\n * Provides embedded high-performance vector storage with HNSW indexing\n * using the DuckDB VSS extension for vector similarity search.\n *\n * Key features:\n * - Embedded database (no server required)\n * - HNSW indexing for fast similarity search\n * - SQL interface for metadata filtering\n * - Native Parquet support\n */\nexport class DuckDBVector extends MastraVector<DuckDBVectorFilter> {\n private config: DuckDBVectorConfig;\n private instance: DuckDBInstance | null = null;\n private initialized: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: DuckDBVectorConfig) {\n super({ id: config.id });\n this.config = {\n path: ':memory:',\n dimensions: 1536,\n metric: 'cosine',\n ...config,\n };\n }\n\n /**\n * Initialize the database connection and load required extensions.\n */\n private async initialize(): Promise<void> {\n if (this.initialized && this.instance) return;\n\n // If there's an existing initPromise, wait for it, but verify instance exists\n if (this.initPromise) {\n await this.initPromise;\n // If instance was closed while initializing, reset and retry\n if (!this.instance) {\n this.initPromise = null;\n this.initialized = false;\n } else {\n return;\n }\n }\n\n this.initPromise = (async () => {\n try {\n // Create DuckDB instance\n this.instance = await DuckDBInstance.create(this.config.path!);\n const connection = await this.instance.connect();\n\n try {\n // Install and load the VSS extension for vector operations\n await connection.run('INSTALL vss;');\n await connection.run('LOAD vss;');\n } catch {\n // VSS might already be installed, try just loading it\n try {\n await connection.run('LOAD vss;');\n } catch {\n // Continue without VSS - will use basic array operations\n this.logger.warn('VSS extension not available, using basic array operations');\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // Reset state on error to allow retry\n this.instance = null;\n this.initialized = false;\n this.initPromise = null;\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Get a database connection.\n */\n private async getConnection() {\n await this.initialize();\n if (!this.instance) {\n throw new Error('DuckDB instance not initialized');\n }\n return this.instance.connect();\n }\n\n /**\n * Execute a SQL query and return results.\n */\n private async runQuery<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n const connection = await this.getConnection();\n try {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n const result = await stmt.run();\n const rows = await result.getRows();\n\n // Convert rows to objects\n const columns = result.columnNames();\n return rows.map(row => {\n const obj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n obj[col] = row[i];\n });\n return obj as T;\n });\n } finally {\n // Connection cleanup is automatic in @duckdb/node-api\n }\n }\n\n /**\n * Execute a SQL statement without returning results.\n */\n private async runStatement(sql: string, params: unknown[] = []): Promise<void> {\n const connection = await this.getConnection();\n try {\n if (params.length === 0) {\n await connection.run(sql);\n } else {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n await stmt.run();\n }\n } finally {\n // Connection cleanup is automatic\n }\n }\n\n /**\n * Validate and escape a SQL identifier (table name, column name).\n */\n private escapeIdentifier(name: string): string {\n // Validate identifier format\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid identifier: ${name}. Only alphanumeric characters and underscores are allowed.`);\n }\n return `\"${name}\"`;\n }\n\n /**\n * Get the distance function for the configured metric.\n */\n private getDistanceFunction(): string {\n switch (this.config.metric) {\n case 'cosine':\n return 'array_cosine_distance';\n case 'euclidean':\n return 'array_distance';\n case 'dotproduct':\n return 'array_inner_product';\n default:\n return 'array_cosine_distance';\n }\n }\n\n async query(params: QueryVectorParams<DuckDBVectorFilter>): Promise<QueryResult[]> {\n await this.initialize();\n\n const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;\n\n // Validate topK parameter\n validateTopK('DUCKDB', topK);\n\n const tableName = this.escapeIdentifier(indexName);\n const distanceFunc = this.getDistanceFunction();\n\n // Build the vector literal\n const vectorLiteral = `[${queryVector.join(', ')}]::FLOAT[${queryVector.length}]`;\n\n // Build filter clause\n const { clause: filterClause } = filter ? buildFilterClause(filter) : { clause: '' };\n\n // Build query\n const selectCols = includeVector ? 'id, vector, metadata, distance' : 'id, metadata, distance';\n\n const sql = `\n SELECT ${selectCols}\n FROM (\n SELECT \n id,\n ${includeVector ? 'vector,' : ''}\n metadata,\n ${distanceFunc}(vector, ${vectorLiteral}) as distance\n FROM ${tableName}\n ${filterClause ? `WHERE ${filterClause}` : ''}\n ) subq\n ORDER BY distance ${this.config.metric === 'dotproduct' ? 'DESC' : 'ASC'}\n LIMIT ${topK}\n `;\n\n const connection = await this.getConnection();\n const result = await connection.run(sql);\n const rows = await result.getRows();\n const columns = result.columnNames();\n\n return rows.map(row => {\n const rowObj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n rowObj[col] = row[i];\n });\n\n const distance = rowObj.distance as number;\n const score =\n this.config.metric === 'cosine'\n ? 1 - distance\n : this.config.metric === 'euclidean'\n ? 1 / (1 + distance)\n : distance;\n\n const metadata = typeof rowObj.metadata === 'string' ? JSON.parse(rowObj.metadata as string) : rowObj.metadata;\n\n const queryResult: QueryResult = {\n id: rowObj.id as string,\n score,\n metadata: metadata as Record<string, unknown>,\n };\n\n if (includeVector && rowObj.vector) {\n queryResult.vector = Array.isArray(rowObj.vector)\n ? (rowObj.vector as number[])\n : JSON.parse(rowObj.vector as string);\n }\n\n return queryResult;\n });\n }\n\n async upsert(params: UpsertVectorParams): Promise<string[]> {\n await this.initialize();\n\n const { indexName, vectors, metadata, ids } = params;\n\n // Validate input parameters\n validateUpsertInput('DUCKDB', vectors, metadata, ids);\n\n const tableName = this.escapeIdentifier(indexName);\n\n // Generate IDs if not provided\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Insert each vector using parameterized queries for IDs\n for (let i = 0; i < vectors.length; i++) {\n const id = vectorIds[i]!;\n const vector = vectors[i]!;\n const meta = metadata?.[i] || {};\n\n const vectorLiteral = `[${vector.join(', ')}]::FLOAT[${vector.length}]`;\n const metadataJson = JSON.stringify(meta);\n\n // Use INSERT OR REPLACE for upsert behavior with parameterized ID\n const sql = `\n INSERT OR REPLACE INTO ${tableName} (id, vector, metadata)\n VALUES (?, ${vectorLiteral}, '${metadataJson.replace(/'/g, \"''\")}')\n `;\n\n await this.runStatement(sql, [id]);\n }\n\n return vectorIds;\n }\n\n async createIndex(params: CreateIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName, dimension, metric } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Store the metric for this index if provided\n if (metric) {\n this.config.metric = metric;\n }\n\n const connection = await this.getConnection();\n\n // Create table with vector column\n const createTableSql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id VARCHAR PRIMARY KEY,\n vector FLOAT[${dimension}],\n metadata JSON\n )\n `;\n\n await connection.run(createTableSql);\n\n // Create HNSW index for fast similarity search\n try {\n const indexNameStr = `${indexName}_hnsw_idx`;\n const createIndexSql = `\n CREATE INDEX IF NOT EXISTS \"${indexNameStr}\"\n ON ${tableName}\n USING HNSW (vector)\n `;\n await connection.run(createIndexSql);\n } catch {\n // HNSW index creation might fail if not supported, continue without it\n this.logger.warn(`Could not create HNSW index for ${indexName}, falling back to linear scan`);\n }\n }\n\n async listIndexes(): Promise<string[]> {\n await this.initialize();\n\n const connection = await this.getConnection();\n const result = await connection.run(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'main'\n AND table_type = 'BASE TABLE'\n `);\n\n const rows = await result.getRows();\n return rows.map(row => row[0] as string);\n }\n\n async describeIndex(params: DescribeIndexParams): Promise<IndexStats> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n\n // Get vector dimension from table schema\n const schemaResult = await connection.run(`\n SELECT data_type\n FROM information_schema.columns\n WHERE table_name = '${indexName}' AND column_name = 'vector'\n `);\n\n const schemaRows = await schemaResult.getRows();\n\n if (schemaRows.length === 0) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n\n // Parse dimension from type like \"FLOAT[1536]\"\n const dataType = schemaRows[0]![0] as string;\n const dimensionMatch = dataType.match(/\\[(\\d+)\\]/);\n const dimension = dimensionMatch ? parseInt(dimensionMatch[1]!, 10) : 0;\n\n // Get row count\n const countResult = await connection.run(`SELECT COUNT(*) as count FROM ${tableName}`);\n const countRows = await countResult.getRows();\n const count = Number(countRows[0]?.[0] || 0);\n\n return {\n dimension,\n count,\n metric: this.config.metric || 'cosine',\n };\n }\n\n async deleteIndex(params: DeleteIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n await connection.run(`DROP TABLE IF EXISTS ${tableName}`);\n }\n\n async updateVector(params: UpdateVectorParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, update } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter;\n\n // Check for mutual exclusivity\n if (hasId && hasFilter) {\n throw new Error('id and filter are mutually exclusive - provide only one');\n }\n\n if (!hasId && !hasFilter) {\n throw new Error('Either id or filter must be provided');\n }\n\n const updates: string[] = [];\n\n if (update.vector) {\n updates.push(`vector = [${update.vector.join(', ')}]::FLOAT[${update.vector.length}]`);\n }\n\n if (update.metadata) {\n const metadataJson = JSON.stringify(update.metadata).replace(/'/g, \"''\");\n updates.push(`metadata = '${metadataJson}'`);\n }\n\n if (hasId) {\n // Update by ID with parameterized query\n const sql = `UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = ?`;\n await this.runStatement(sql, [params.id]);\n } else if (hasFilter) {\n // Update by filter - check for empty filter\n const filter = params.filter!;\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot update with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n // Update ALL matching vectors, not just the first one\n await this.runStatement(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE ${clause}`);\n }\n }\n\n async deleteVector(params: DeleteVectorParams): Promise<void> {\n await this.initialize();\n\n const { indexName, id } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Use parameterized query for ID\n const sql = `DELETE FROM ${tableName} WHERE id = ?`;\n await this.runStatement(sql, [id]);\n }\n\n async deleteVectors(params: DeleteVectorsParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, ids, filter } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!ids && !filter) {\n throw new Error('Either filter or ids must be provided');\n }\n\n if (ids && filter) {\n throw new Error('ids and filter are mutually exclusive - provide only one');\n }\n\n if (ids) {\n // Delete by IDs with parameterized query\n if (ids.length === 0) {\n throw new Error('Cannot delete with empty ids array');\n }\n\n // Create placeholders for each ID\n const placeholders = ids.map(() => '?').join(', ');\n const sql = `DELETE FROM ${tableName} WHERE id IN (${placeholders})`;\n await this.runStatement(sql, ids);\n } else if (filter) {\n // Delete by filter - check for empty filter\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot delete with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n await this.runStatement(`DELETE FROM ${tableName} WHERE ${clause}`);\n }\n }\n\n /**\n * Close the database connection.\n * After closing, the vector store can be reused by calling methods that require initialization.\n */\n async close(): Promise<void> {\n if (this.instance) {\n // DuckDBInstance doesn't have a close method - just reset the reference\n // The garbage collector will handle cleanup\n this.instance = null;\n this.initialized = false;\n this.initPromise = null; // Reset initPromise to allow re-initialization\n }\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DuckDBInstance } from '@duckdb/node-api';
|
|
2
|
-
import { MastraVector } from '@mastra/core/vector';
|
|
2
|
+
import { MastraVector, validateTopK, validateUpsertInput } from '@mastra/core/vector';
|
|
3
3
|
|
|
4
4
|
// src/vector/index.ts
|
|
5
5
|
|
|
@@ -87,10 +87,18 @@ function buildOperatorCondition(field, operators) {
|
|
|
87
87
|
for (const [op, value] of Object.entries(operators)) {
|
|
88
88
|
switch (op) {
|
|
89
89
|
case "$eq":
|
|
90
|
-
|
|
90
|
+
if (value === null) {
|
|
91
|
+
conditions.push(`${fieldPath} IS NULL`);
|
|
92
|
+
} else {
|
|
93
|
+
conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);
|
|
94
|
+
}
|
|
91
95
|
break;
|
|
92
96
|
case "$ne":
|
|
93
|
-
|
|
97
|
+
if (value === null) {
|
|
98
|
+
conditions.push(`${fieldPath} IS NOT NULL`);
|
|
99
|
+
} else {
|
|
100
|
+
conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);
|
|
101
|
+
}
|
|
94
102
|
break;
|
|
95
103
|
case "$gt":
|
|
96
104
|
conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);
|
|
@@ -106,8 +114,12 @@ function buildOperatorCondition(field, operators) {
|
|
|
106
114
|
break;
|
|
107
115
|
case "$in":
|
|
108
116
|
if (Array.isArray(value) && value.length > 0) {
|
|
117
|
+
const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;
|
|
109
118
|
const literals = value.map((v) => toSqlLiteral(v)).join(", ");
|
|
110
|
-
|
|
119
|
+
const stringLiterals = value.map((v) => toSqlLiteral(String(v))).join(", ");
|
|
120
|
+
conditions.push(
|
|
121
|
+
`(list_has_any(TRY_CAST(${jsonPath} AS VARCHAR[]), [${stringLiterals}]) OR ${fieldPath} IN (${literals}))`
|
|
122
|
+
);
|
|
111
123
|
} else {
|
|
112
124
|
conditions.push("1=0");
|
|
113
125
|
}
|
|
@@ -138,6 +150,15 @@ function buildOperatorCondition(field, operators) {
|
|
|
138
150
|
conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);
|
|
139
151
|
}
|
|
140
152
|
break;
|
|
153
|
+
case "$all":
|
|
154
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
155
|
+
const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;
|
|
156
|
+
const arrayConditions = value.map((v) => {
|
|
157
|
+
return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;
|
|
158
|
+
});
|
|
159
|
+
conditions.push(`(${arrayConditions.join(" AND ")})`);
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
141
162
|
case "$not":
|
|
142
163
|
if (typeof value === "object" && value !== null) {
|
|
143
164
|
const subResult = buildOperatorCondition(field, value);
|
|
@@ -287,6 +308,7 @@ var DuckDBVector = class extends MastraVector {
|
|
|
287
308
|
async query(params) {
|
|
288
309
|
await this.initialize();
|
|
289
310
|
const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;
|
|
311
|
+
validateTopK("DUCKDB", topK);
|
|
290
312
|
const tableName = this.escapeIdentifier(indexName);
|
|
291
313
|
const distanceFunc = this.getDistanceFunction();
|
|
292
314
|
const vectorLiteral = `[${queryVector.join(", ")}]::FLOAT[${queryVector.length}]`;
|
|
@@ -332,6 +354,7 @@ var DuckDBVector = class extends MastraVector {
|
|
|
332
354
|
async upsert(params) {
|
|
333
355
|
await this.initialize();
|
|
334
356
|
const { indexName, vectors, metadata, ids } = params;
|
|
357
|
+
validateUpsertInput("DUCKDB", vectors, metadata, ids);
|
|
335
358
|
const tableName = this.escapeIdentifier(indexName);
|
|
336
359
|
const vectorIds = ids || vectors.map(() => crypto.randomUUID());
|
|
337
360
|
for (let i = 0; i < vectors.length; i++) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector/filter-builder.ts","../src/vector/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { DuckDBVectorFilter } from './types.js';\n\nexport interface FilterResult {\n clause: string;\n params: unknown[];\n}\n\n/**\n * Escape a string for safe use in SQL.\n */\nfunction escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Convert a value to a SQL literal for comparison with JSON-extracted values.\n * DuckDB's ->> operator returns the raw value without JSON quoting.\n */\nfunction toSqlLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'string') {\n return `'${escapeString(value)}'`;\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n // For objects/arrays, JSON stringify but don't add extra quotes\n return `'${escapeString(JSON.stringify(value))}'`;\n}\n\n/**\n * Build a SQL WHERE clause from a filter object.\n * Supports MongoDB-style query operators.\n */\nexport function buildFilterClause(filter: DuckDBVectorFilter): FilterResult {\n if (!filter || Object.keys(filter).length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n // Handle logical operators\n if (key === '$and') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const andClause = subConditions.map(sc => `(${sc.clause})`).join(' AND ');\n conditions.push(`(${andClause})`);\n }\n continue;\n }\n\n if (key === '$or') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const orClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`(${orClause})`);\n }\n continue;\n }\n\n if (key === '$not') {\n if (typeof value === 'object' && value !== null) {\n const subResult = buildFilterClause(value);\n conditions.push(`NOT (${subResult.clause})`);\n }\n continue;\n }\n\n if (key === '$nor') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const norClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`NOT (${norClause})`);\n }\n continue;\n }\n\n // Handle field conditions\n const fieldPath = buildJsonPath(key);\n\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n // Handle operators\n const operatorResult = buildOperatorCondition(key, value);\n if (operatorResult) {\n conditions.push(operatorResult);\n }\n } else {\n // Direct equality - for strings, compare directly; for others, use SQL literal\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n }\n\n if (conditions.length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n return { clause: conditions.join(' AND '), params: [] };\n}\n\n/**\n * Build a JSON path expression for accessing nested fields in metadata.\n * DuckDB uses json_extract_string for extracting string values from JSON.\n */\nfunction buildJsonPath(field: string): string {\n // Handle nested paths with dot notation\n const parts = field.split('.');\n\n // Build the JSON path with $ prefix for DuckDB\n const jsonPath = '$.' + parts.map(p => escapeString(p)).join('.');\n\n // Use json_extract_string for proper string extraction in DuckDB\n return `json_extract_string(metadata, '${jsonPath}')`;\n}\n\n/**\n * Build a condition from an operator object.\n */\nfunction buildOperatorCondition(field: string, operators: Record<string, unknown>): string | null {\n const conditions: string[] = [];\n const fieldPath = buildJsonPath(field);\n\n for (const [op, value] of Object.entries(operators)) {\n switch (op) {\n case '$eq':\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n break;\n\n case '$ne':\n conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);\n break;\n\n case '$gt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);\n break;\n\n case '$gte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) >= ${toSqlLiteral(value)}`);\n break;\n\n case '$lt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) < ${toSqlLiteral(value)}`);\n break;\n\n case '$lte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) <= ${toSqlLiteral(value)}`);\n break;\n\n case '$in':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} IN (${literals})`);\n } else {\n // Empty array - no matches\n conditions.push('1=0');\n }\n break;\n\n case '$nin':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} NOT IN (${literals})`);\n }\n // Empty array - all matches (no condition added)\n break;\n\n case '$exists':\n if (value) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} IS NULL`);\n }\n break;\n\n case '$contains':\n // Check if the field contains the value (for arrays or strings)\n if (typeof value === 'string') {\n conditions.push(`${fieldPath} LIKE '%${escapeString(value)}%'`);\n } else if (Array.isArray(value)) {\n // Check if array contains all specified elements\n // Use TRY_CAST to handle type mismatches gracefully (returns NULL if not an array)\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n } else {\n // Fallback to equality\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$not':\n if (typeof value === 'object' && value !== null) {\n const subResult = buildOperatorCondition(field, value as Record<string, unknown>);\n if (subResult) {\n conditions.push(`NOT (${subResult})`);\n }\n }\n break;\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (conditions.length === 0) {\n return null;\n }\n\n return conditions.join(' AND ');\n}\n","import { DuckDBInstance } from '@duckdb/node-api';\nimport type { DuckDBValue } from '@duckdb/node-api';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { buildFilterClause } from './filter-builder.js';\nimport type { DuckDBVectorConfig, DuckDBVectorFilter } from './types.js';\n\n/**\n * DuckDB vector store implementation for Mastra.\n *\n * Provides embedded high-performance vector storage with HNSW indexing\n * using the DuckDB VSS extension for vector similarity search.\n *\n * Key features:\n * - Embedded database (no server required)\n * - HNSW indexing for fast similarity search\n * - SQL interface for metadata filtering\n * - Native Parquet support\n */\nexport class DuckDBVector extends MastraVector<DuckDBVectorFilter> {\n private config: DuckDBVectorConfig;\n private instance: DuckDBInstance | null = null;\n private initialized: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: DuckDBVectorConfig) {\n super({ id: config.id });\n this.config = {\n path: ':memory:',\n dimensions: 1536,\n metric: 'cosine',\n ...config,\n };\n }\n\n /**\n * Initialize the database connection and load required extensions.\n */\n private async initialize(): Promise<void> {\n if (this.initialized && this.instance) return;\n\n // If there's an existing initPromise, wait for it, but verify instance exists\n if (this.initPromise) {\n await this.initPromise;\n // If instance was closed while initializing, reset and retry\n if (!this.instance) {\n this.initPromise = null;\n this.initialized = false;\n } else {\n return;\n }\n }\n\n this.initPromise = (async () => {\n try {\n // Create DuckDB instance\n this.instance = await DuckDBInstance.create(this.config.path!);\n const connection = await this.instance.connect();\n\n try {\n // Install and load the VSS extension for vector operations\n await connection.run('INSTALL vss;');\n await connection.run('LOAD vss;');\n } catch {\n // VSS might already be installed, try just loading it\n try {\n await connection.run('LOAD vss;');\n } catch {\n // Continue without VSS - will use basic array operations\n this.logger.warn('VSS extension not available, using basic array operations');\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // Reset state on error to allow retry\n this.instance = null;\n this.initialized = false;\n this.initPromise = null;\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Get a database connection.\n */\n private async getConnection() {\n await this.initialize();\n if (!this.instance) {\n throw new Error('DuckDB instance not initialized');\n }\n return this.instance.connect();\n }\n\n /**\n * Execute a SQL query and return results.\n */\n private async runQuery<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n const connection = await this.getConnection();\n try {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n const result = await stmt.run();\n const rows = await result.getRows();\n\n // Convert rows to objects\n const columns = result.columnNames();\n return rows.map(row => {\n const obj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n obj[col] = row[i];\n });\n return obj as T;\n });\n } finally {\n // Connection cleanup is automatic in @duckdb/node-api\n }\n }\n\n /**\n * Execute a SQL statement without returning results.\n */\n private async runStatement(sql: string, params: unknown[] = []): Promise<void> {\n const connection = await this.getConnection();\n try {\n if (params.length === 0) {\n await connection.run(sql);\n } else {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n await stmt.run();\n }\n } finally {\n // Connection cleanup is automatic\n }\n }\n\n /**\n * Validate and escape a SQL identifier (table name, column name).\n */\n private escapeIdentifier(name: string): string {\n // Validate identifier format\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid identifier: ${name}. Only alphanumeric characters and underscores are allowed.`);\n }\n return `\"${name}\"`;\n }\n\n /**\n * Get the distance function for the configured metric.\n */\n private getDistanceFunction(): string {\n switch (this.config.metric) {\n case 'cosine':\n return 'array_cosine_distance';\n case 'euclidean':\n return 'array_distance';\n case 'dotproduct':\n return 'array_inner_product';\n default:\n return 'array_cosine_distance';\n }\n }\n\n async query(params: QueryVectorParams<DuckDBVectorFilter>): Promise<QueryResult[]> {\n await this.initialize();\n\n const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;\n\n const tableName = this.escapeIdentifier(indexName);\n const distanceFunc = this.getDistanceFunction();\n\n // Build the vector literal\n const vectorLiteral = `[${queryVector.join(', ')}]::FLOAT[${queryVector.length}]`;\n\n // Build filter clause\n const { clause: filterClause } = filter ? buildFilterClause(filter) : { clause: '' };\n\n // Build query\n const selectCols = includeVector ? 'id, vector, metadata, distance' : 'id, metadata, distance';\n\n const sql = `\n SELECT ${selectCols}\n FROM (\n SELECT \n id,\n ${includeVector ? 'vector,' : ''}\n metadata,\n ${distanceFunc}(vector, ${vectorLiteral}) as distance\n FROM ${tableName}\n ${filterClause ? `WHERE ${filterClause}` : ''}\n ) subq\n ORDER BY distance ${this.config.metric === 'dotproduct' ? 'DESC' : 'ASC'}\n LIMIT ${topK}\n `;\n\n const connection = await this.getConnection();\n const result = await connection.run(sql);\n const rows = await result.getRows();\n const columns = result.columnNames();\n\n return rows.map(row => {\n const rowObj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n rowObj[col] = row[i];\n });\n\n const distance = rowObj.distance as number;\n const score =\n this.config.metric === 'cosine'\n ? 1 - distance\n : this.config.metric === 'euclidean'\n ? 1 / (1 + distance)\n : distance;\n\n const metadata = typeof rowObj.metadata === 'string' ? JSON.parse(rowObj.metadata as string) : rowObj.metadata;\n\n const queryResult: QueryResult = {\n id: rowObj.id as string,\n score,\n metadata: metadata as Record<string, unknown>,\n };\n\n if (includeVector && rowObj.vector) {\n queryResult.vector = Array.isArray(rowObj.vector)\n ? (rowObj.vector as number[])\n : JSON.parse(rowObj.vector as string);\n }\n\n return queryResult;\n });\n }\n\n async upsert(params: UpsertVectorParams): Promise<string[]> {\n await this.initialize();\n\n const { indexName, vectors, metadata, ids } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Generate IDs if not provided\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Insert each vector using parameterized queries for IDs\n for (let i = 0; i < vectors.length; i++) {\n const id = vectorIds[i]!;\n const vector = vectors[i]!;\n const meta = metadata?.[i] || {};\n\n const vectorLiteral = `[${vector.join(', ')}]::FLOAT[${vector.length}]`;\n const metadataJson = JSON.stringify(meta);\n\n // Use INSERT OR REPLACE for upsert behavior with parameterized ID\n const sql = `\n INSERT OR REPLACE INTO ${tableName} (id, vector, metadata)\n VALUES (?, ${vectorLiteral}, '${metadataJson.replace(/'/g, \"''\")}')\n `;\n\n await this.runStatement(sql, [id]);\n }\n\n return vectorIds;\n }\n\n async createIndex(params: CreateIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName, dimension, metric } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Store the metric for this index if provided\n if (metric) {\n this.config.metric = metric;\n }\n\n const connection = await this.getConnection();\n\n // Create table with vector column\n const createTableSql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id VARCHAR PRIMARY KEY,\n vector FLOAT[${dimension}],\n metadata JSON\n )\n `;\n\n await connection.run(createTableSql);\n\n // Create HNSW index for fast similarity search\n try {\n const indexNameStr = `${indexName}_hnsw_idx`;\n const createIndexSql = `\n CREATE INDEX IF NOT EXISTS \"${indexNameStr}\"\n ON ${tableName}\n USING HNSW (vector)\n `;\n await connection.run(createIndexSql);\n } catch {\n // HNSW index creation might fail if not supported, continue without it\n this.logger.warn(`Could not create HNSW index for ${indexName}, falling back to linear scan`);\n }\n }\n\n async listIndexes(): Promise<string[]> {\n await this.initialize();\n\n const connection = await this.getConnection();\n const result = await connection.run(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'main'\n AND table_type = 'BASE TABLE'\n `);\n\n const rows = await result.getRows();\n return rows.map(row => row[0] as string);\n }\n\n async describeIndex(params: DescribeIndexParams): Promise<IndexStats> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n\n // Get vector dimension from table schema\n const schemaResult = await connection.run(`\n SELECT data_type\n FROM information_schema.columns\n WHERE table_name = '${indexName}' AND column_name = 'vector'\n `);\n\n const schemaRows = await schemaResult.getRows();\n\n if (schemaRows.length === 0) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n\n // Parse dimension from type like \"FLOAT[1536]\"\n const dataType = schemaRows[0]![0] as string;\n const dimensionMatch = dataType.match(/\\[(\\d+)\\]/);\n const dimension = dimensionMatch ? parseInt(dimensionMatch[1]!, 10) : 0;\n\n // Get row count\n const countResult = await connection.run(`SELECT COUNT(*) as count FROM ${tableName}`);\n const countRows = await countResult.getRows();\n const count = Number(countRows[0]?.[0] || 0);\n\n return {\n dimension,\n count,\n metric: this.config.metric || 'cosine',\n };\n }\n\n async deleteIndex(params: DeleteIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n await connection.run(`DROP TABLE IF EXISTS ${tableName}`);\n }\n\n async updateVector(params: UpdateVectorParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, update } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter;\n\n // Check for mutual exclusivity\n if (hasId && hasFilter) {\n throw new Error('id and filter are mutually exclusive - provide only one');\n }\n\n if (!hasId && !hasFilter) {\n throw new Error('Either id or filter must be provided');\n }\n\n const updates: string[] = [];\n\n if (update.vector) {\n updates.push(`vector = [${update.vector.join(', ')}]::FLOAT[${update.vector.length}]`);\n }\n\n if (update.metadata) {\n const metadataJson = JSON.stringify(update.metadata).replace(/'/g, \"''\");\n updates.push(`metadata = '${metadataJson}'`);\n }\n\n if (hasId) {\n // Update by ID with parameterized query\n const sql = `UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = ?`;\n await this.runStatement(sql, [params.id]);\n } else if (hasFilter) {\n // Update by filter - check for empty filter\n const filter = params.filter!;\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot update with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n // Update ALL matching vectors, not just the first one\n await this.runStatement(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE ${clause}`);\n }\n }\n\n async deleteVector(params: DeleteVectorParams): Promise<void> {\n await this.initialize();\n\n const { indexName, id } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Use parameterized query for ID\n const sql = `DELETE FROM ${tableName} WHERE id = ?`;\n await this.runStatement(sql, [id]);\n }\n\n async deleteVectors(params: DeleteVectorsParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, ids, filter } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!ids && !filter) {\n throw new Error('Either filter or ids must be provided');\n }\n\n if (ids && filter) {\n throw new Error('ids and filter are mutually exclusive - provide only one');\n }\n\n if (ids) {\n // Delete by IDs with parameterized query\n if (ids.length === 0) {\n throw new Error('Cannot delete with empty ids array');\n }\n\n // Create placeholders for each ID\n const placeholders = ids.map(() => '?').join(', ');\n const sql = `DELETE FROM ${tableName} WHERE id IN (${placeholders})`;\n await this.runStatement(sql, ids);\n } else if (filter) {\n // Delete by filter - check for empty filter\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot delete with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n await this.runStatement(`DELETE FROM ${tableName} WHERE ${clause}`);\n }\n }\n\n /**\n * Close the database connection.\n * After closing, the vector store can be reused by calling methods that require initialization.\n */\n async close(): Promise<void> {\n if (this.instance) {\n // DuckDBInstance doesn't have a close method - just reset the reference\n // The garbage collector will handle cleanup\n this.instance = null;\n this.initialized = false;\n this.initPromise = null; // Reset initPromise to allow re-initialization\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/vector/filter-builder.ts","../src/vector/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { DuckDBVectorFilter } from './types.js';\n\nexport interface FilterResult {\n clause: string;\n params: unknown[];\n}\n\n/**\n * Escape a string for safe use in SQL.\n */\nfunction escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Convert a value to a SQL literal for comparison with JSON-extracted values.\n * DuckDB's ->> operator returns the raw value without JSON quoting.\n */\nfunction toSqlLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'string') {\n return `'${escapeString(value)}'`;\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n // For objects/arrays, JSON stringify but don't add extra quotes\n return `'${escapeString(JSON.stringify(value))}'`;\n}\n\n/**\n * Build a SQL WHERE clause from a filter object.\n * Supports MongoDB-style query operators.\n */\nexport function buildFilterClause(filter: DuckDBVectorFilter): FilterResult {\n if (!filter || Object.keys(filter).length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(filter)) {\n // Handle logical operators\n if (key === '$and') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const andClause = subConditions.map(sc => `(${sc.clause})`).join(' AND ');\n conditions.push(`(${andClause})`);\n }\n continue;\n }\n\n if (key === '$or') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const orClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`(${orClause})`);\n }\n continue;\n }\n\n if (key === '$not') {\n if (typeof value === 'object' && value !== null) {\n const subResult = buildFilterClause(value);\n conditions.push(`NOT (${subResult.clause})`);\n }\n continue;\n }\n\n if (key === '$nor') {\n if (Array.isArray(value) && value.length > 0) {\n const subConditions = value.map(subFilter => buildFilterClause(subFilter));\n const norClause = subConditions.map(sc => `(${sc.clause})`).join(' OR ');\n conditions.push(`NOT (${norClause})`);\n }\n continue;\n }\n\n // Handle field conditions\n const fieldPath = buildJsonPath(key);\n\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n // Handle operators\n const operatorResult = buildOperatorCondition(key, value);\n if (operatorResult) {\n conditions.push(operatorResult);\n }\n } else {\n // Direct equality - for strings, compare directly; for others, use SQL literal\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n }\n\n if (conditions.length === 0) {\n return { clause: '1=1', params: [] };\n }\n\n return { clause: conditions.join(' AND '), params: [] };\n}\n\n/**\n * Build a JSON path expression for accessing nested fields in metadata.\n * DuckDB uses json_extract_string for extracting string values from JSON.\n */\nfunction buildJsonPath(field: string): string {\n // Handle nested paths with dot notation\n const parts = field.split('.');\n\n // Build the JSON path with $ prefix for DuckDB\n const jsonPath = '$.' + parts.map(p => escapeString(p)).join('.');\n\n // Use json_extract_string for proper string extraction in DuckDB\n return `json_extract_string(metadata, '${jsonPath}')`;\n}\n\n/**\n * Build a condition from an operator object.\n */\nfunction buildOperatorCondition(field: string, operators: Record<string, unknown>): string | null {\n const conditions: string[] = [];\n const fieldPath = buildJsonPath(field);\n\n for (const [op, value] of Object.entries(operators)) {\n switch (op) {\n case '$eq':\n if (value === null) {\n conditions.push(`${fieldPath} IS NULL`);\n } else {\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$ne':\n if (value === null) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} != ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$gt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) > ${toSqlLiteral(value)}`);\n break;\n\n case '$gte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) >= ${toSqlLiteral(value)}`);\n break;\n\n case '$lt':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) < ${toSqlLiteral(value)}`);\n break;\n\n case '$lte':\n conditions.push(`CAST(${fieldPath} AS DOUBLE) <= ${toSqlLiteral(value)}`);\n break;\n\n case '$in':\n if (Array.isArray(value) && value.length > 0) {\n // Try to handle both scalar and array fields\n // For array fields: check if any value in the array is in the specified list\n // For scalar fields: check if the field value is in the specified list\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n // For list_has_any, need to ensure types match - cast all to VARCHAR\n const stringLiterals = value.map(v => toSqlLiteral(String(v))).join(', ');\n\n // Use list_has_any to check if array field contains any of the values\n // TRY_CAST returns NULL if not an array, so we also check scalar field with IN\n conditions.push(\n `(list_has_any(TRY_CAST(${jsonPath} AS VARCHAR[]), [${stringLiterals}]) OR ${fieldPath} IN (${literals}))`,\n );\n } else {\n // Empty array - no matches\n conditions.push('1=0');\n }\n break;\n\n case '$nin':\n if (Array.isArray(value) && value.length > 0) {\n const literals = value.map(v => toSqlLiteral(v)).join(', ');\n conditions.push(`${fieldPath} NOT IN (${literals})`);\n }\n // Empty array - all matches (no condition added)\n break;\n\n case '$exists':\n if (value) {\n conditions.push(`${fieldPath} IS NOT NULL`);\n } else {\n conditions.push(`${fieldPath} IS NULL`);\n }\n break;\n\n case '$contains':\n // Check if the field contains the value (for arrays or strings)\n if (typeof value === 'string') {\n conditions.push(`${fieldPath} LIKE '%${escapeString(value)}%'`);\n } else if (Array.isArray(value)) {\n // Check if array contains all specified elements\n // Use TRY_CAST to handle type mismatches gracefully (returns NULL if not an array)\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n } else {\n // Fallback to equality\n conditions.push(`${fieldPath} = ${toSqlLiteral(value)}`);\n }\n break;\n\n case '$all':\n // Check if array field contains all specified elements\n if (Array.isArray(value) && value.length > 0) {\n const jsonPath = `json_extract(metadata, '$.${escapeString(field)}')`;\n const arrayConditions = value.map(v => {\n return `list_contains(TRY_CAST(${jsonPath} AS VARCHAR[]), ${toSqlLiteral(v)})`;\n });\n conditions.push(`(${arrayConditions.join(' AND ')})`);\n }\n break;\n\n case '$not':\n if (typeof value === 'object' && value !== null) {\n const subResult = buildOperatorCondition(field, value as Record<string, unknown>);\n if (subResult) {\n conditions.push(`NOT (${subResult})`);\n }\n }\n break;\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (conditions.length === 0) {\n return null;\n }\n\n return conditions.join(' AND ');\n}\n","import { DuckDBInstance } from '@duckdb/node-api';\nimport type { DuckDBValue } from '@duckdb/node-api';\nimport { MastraVector, validateUpsertInput, validateTopK } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { buildFilterClause } from './filter-builder.js';\nimport type { DuckDBVectorConfig, DuckDBVectorFilter } from './types.js';\n\n/**\n * DuckDB vector store implementation for Mastra.\n *\n * Provides embedded high-performance vector storage with HNSW indexing\n * using the DuckDB VSS extension for vector similarity search.\n *\n * Key features:\n * - Embedded database (no server required)\n * - HNSW indexing for fast similarity search\n * - SQL interface for metadata filtering\n * - Native Parquet support\n */\nexport class DuckDBVector extends MastraVector<DuckDBVectorFilter> {\n private config: DuckDBVectorConfig;\n private instance: DuckDBInstance | null = null;\n private initialized: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: DuckDBVectorConfig) {\n super({ id: config.id });\n this.config = {\n path: ':memory:',\n dimensions: 1536,\n metric: 'cosine',\n ...config,\n };\n }\n\n /**\n * Initialize the database connection and load required extensions.\n */\n private async initialize(): Promise<void> {\n if (this.initialized && this.instance) return;\n\n // If there's an existing initPromise, wait for it, but verify instance exists\n if (this.initPromise) {\n await this.initPromise;\n // If instance was closed while initializing, reset and retry\n if (!this.instance) {\n this.initPromise = null;\n this.initialized = false;\n } else {\n return;\n }\n }\n\n this.initPromise = (async () => {\n try {\n // Create DuckDB instance\n this.instance = await DuckDBInstance.create(this.config.path!);\n const connection = await this.instance.connect();\n\n try {\n // Install and load the VSS extension for vector operations\n await connection.run('INSTALL vss;');\n await connection.run('LOAD vss;');\n } catch {\n // VSS might already be installed, try just loading it\n try {\n await connection.run('LOAD vss;');\n } catch {\n // Continue without VSS - will use basic array operations\n this.logger.warn('VSS extension not available, using basic array operations');\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // Reset state on error to allow retry\n this.instance = null;\n this.initialized = false;\n this.initPromise = null;\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Get a database connection.\n */\n private async getConnection() {\n await this.initialize();\n if (!this.instance) {\n throw new Error('DuckDB instance not initialized');\n }\n return this.instance.connect();\n }\n\n /**\n * Execute a SQL query and return results.\n */\n private async runQuery<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n const connection = await this.getConnection();\n try {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n const result = await stmt.run();\n const rows = await result.getRows();\n\n // Convert rows to objects\n const columns = result.columnNames();\n return rows.map(row => {\n const obj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n obj[col] = row[i];\n });\n return obj as T;\n });\n } finally {\n // Connection cleanup is automatic in @duckdb/node-api\n }\n }\n\n /**\n * Execute a SQL statement without returning results.\n */\n private async runStatement(sql: string, params: unknown[] = []): Promise<void> {\n const connection = await this.getConnection();\n try {\n if (params.length === 0) {\n await connection.run(sql);\n } else {\n // Replace ? placeholders with $1, $2, etc. for DuckDB\n let paramIndex = 0;\n const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n\n const stmt = await connection.prepare(preparedSql);\n // Bind parameters as array - DuckDB Node API bind() accepts array\n stmt.bind(params as DuckDBValue[]);\n await stmt.run();\n }\n } finally {\n // Connection cleanup is automatic\n }\n }\n\n /**\n * Validate and escape a SQL identifier (table name, column name).\n */\n private escapeIdentifier(name: string): string {\n // Validate identifier format\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid identifier: ${name}. Only alphanumeric characters and underscores are allowed.`);\n }\n return `\"${name}\"`;\n }\n\n /**\n * Get the distance function for the configured metric.\n */\n private getDistanceFunction(): string {\n switch (this.config.metric) {\n case 'cosine':\n return 'array_cosine_distance';\n case 'euclidean':\n return 'array_distance';\n case 'dotproduct':\n return 'array_inner_product';\n default:\n return 'array_cosine_distance';\n }\n }\n\n async query(params: QueryVectorParams<DuckDBVectorFilter>): Promise<QueryResult[]> {\n await this.initialize();\n\n const { indexName, queryVector, topK = 10, filter, includeVector = false } = params;\n\n // Validate topK parameter\n validateTopK('DUCKDB', topK);\n\n const tableName = this.escapeIdentifier(indexName);\n const distanceFunc = this.getDistanceFunction();\n\n // Build the vector literal\n const vectorLiteral = `[${queryVector.join(', ')}]::FLOAT[${queryVector.length}]`;\n\n // Build filter clause\n const { clause: filterClause } = filter ? buildFilterClause(filter) : { clause: '' };\n\n // Build query\n const selectCols = includeVector ? 'id, vector, metadata, distance' : 'id, metadata, distance';\n\n const sql = `\n SELECT ${selectCols}\n FROM (\n SELECT \n id,\n ${includeVector ? 'vector,' : ''}\n metadata,\n ${distanceFunc}(vector, ${vectorLiteral}) as distance\n FROM ${tableName}\n ${filterClause ? `WHERE ${filterClause}` : ''}\n ) subq\n ORDER BY distance ${this.config.metric === 'dotproduct' ? 'DESC' : 'ASC'}\n LIMIT ${topK}\n `;\n\n const connection = await this.getConnection();\n const result = await connection.run(sql);\n const rows = await result.getRows();\n const columns = result.columnNames();\n\n return rows.map(row => {\n const rowObj: Record<string, unknown> = {};\n columns.forEach((col, i) => {\n rowObj[col] = row[i];\n });\n\n const distance = rowObj.distance as number;\n const score =\n this.config.metric === 'cosine'\n ? 1 - distance\n : this.config.metric === 'euclidean'\n ? 1 / (1 + distance)\n : distance;\n\n const metadata = typeof rowObj.metadata === 'string' ? JSON.parse(rowObj.metadata as string) : rowObj.metadata;\n\n const queryResult: QueryResult = {\n id: rowObj.id as string,\n score,\n metadata: metadata as Record<string, unknown>,\n };\n\n if (includeVector && rowObj.vector) {\n queryResult.vector = Array.isArray(rowObj.vector)\n ? (rowObj.vector as number[])\n : JSON.parse(rowObj.vector as string);\n }\n\n return queryResult;\n });\n }\n\n async upsert(params: UpsertVectorParams): Promise<string[]> {\n await this.initialize();\n\n const { indexName, vectors, metadata, ids } = params;\n\n // Validate input parameters\n validateUpsertInput('DUCKDB', vectors, metadata, ids);\n\n const tableName = this.escapeIdentifier(indexName);\n\n // Generate IDs if not provided\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Insert each vector using parameterized queries for IDs\n for (let i = 0; i < vectors.length; i++) {\n const id = vectorIds[i]!;\n const vector = vectors[i]!;\n const meta = metadata?.[i] || {};\n\n const vectorLiteral = `[${vector.join(', ')}]::FLOAT[${vector.length}]`;\n const metadataJson = JSON.stringify(meta);\n\n // Use INSERT OR REPLACE for upsert behavior with parameterized ID\n const sql = `\n INSERT OR REPLACE INTO ${tableName} (id, vector, metadata)\n VALUES (?, ${vectorLiteral}, '${metadataJson.replace(/'/g, \"''\")}')\n `;\n\n await this.runStatement(sql, [id]);\n }\n\n return vectorIds;\n }\n\n async createIndex(params: CreateIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName, dimension, metric } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Store the metric for this index if provided\n if (metric) {\n this.config.metric = metric;\n }\n\n const connection = await this.getConnection();\n\n // Create table with vector column\n const createTableSql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id VARCHAR PRIMARY KEY,\n vector FLOAT[${dimension}],\n metadata JSON\n )\n `;\n\n await connection.run(createTableSql);\n\n // Create HNSW index for fast similarity search\n try {\n const indexNameStr = `${indexName}_hnsw_idx`;\n const createIndexSql = `\n CREATE INDEX IF NOT EXISTS \"${indexNameStr}\"\n ON ${tableName}\n USING HNSW (vector)\n `;\n await connection.run(createIndexSql);\n } catch {\n // HNSW index creation might fail if not supported, continue without it\n this.logger.warn(`Could not create HNSW index for ${indexName}, falling back to linear scan`);\n }\n }\n\n async listIndexes(): Promise<string[]> {\n await this.initialize();\n\n const connection = await this.getConnection();\n const result = await connection.run(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'main'\n AND table_type = 'BASE TABLE'\n `);\n\n const rows = await result.getRows();\n return rows.map(row => row[0] as string);\n }\n\n async describeIndex(params: DescribeIndexParams): Promise<IndexStats> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n\n // Get vector dimension from table schema\n const schemaResult = await connection.run(`\n SELECT data_type\n FROM information_schema.columns\n WHERE table_name = '${indexName}' AND column_name = 'vector'\n `);\n\n const schemaRows = await schemaResult.getRows();\n\n if (schemaRows.length === 0) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n\n // Parse dimension from type like \"FLOAT[1536]\"\n const dataType = schemaRows[0]![0] as string;\n const dimensionMatch = dataType.match(/\\[(\\d+)\\]/);\n const dimension = dimensionMatch ? parseInt(dimensionMatch[1]!, 10) : 0;\n\n // Get row count\n const countResult = await connection.run(`SELECT COUNT(*) as count FROM ${tableName}`);\n const countRows = await countResult.getRows();\n const count = Number(countRows[0]?.[0] || 0);\n\n return {\n dimension,\n count,\n metric: this.config.metric || 'cosine',\n };\n }\n\n async deleteIndex(params: DeleteIndexParams): Promise<void> {\n await this.initialize();\n\n const { indexName } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n const connection = await this.getConnection();\n await connection.run(`DROP TABLE IF EXISTS ${tableName}`);\n }\n\n async updateVector(params: UpdateVectorParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, update } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter;\n\n // Check for mutual exclusivity\n if (hasId && hasFilter) {\n throw new Error('id and filter are mutually exclusive - provide only one');\n }\n\n if (!hasId && !hasFilter) {\n throw new Error('Either id or filter must be provided');\n }\n\n const updates: string[] = [];\n\n if (update.vector) {\n updates.push(`vector = [${update.vector.join(', ')}]::FLOAT[${update.vector.length}]`);\n }\n\n if (update.metadata) {\n const metadataJson = JSON.stringify(update.metadata).replace(/'/g, \"''\");\n updates.push(`metadata = '${metadataJson}'`);\n }\n\n if (hasId) {\n // Update by ID with parameterized query\n const sql = `UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = ?`;\n await this.runStatement(sql, [params.id]);\n } else if (hasFilter) {\n // Update by filter - check for empty filter\n const filter = params.filter!;\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot update with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n // Update ALL matching vectors, not just the first one\n await this.runStatement(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE ${clause}`);\n }\n }\n\n async deleteVector(params: DeleteVectorParams): Promise<void> {\n await this.initialize();\n\n const { indexName, id } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n // Use parameterized query for ID\n const sql = `DELETE FROM ${tableName} WHERE id = ?`;\n await this.runStatement(sql, [id]);\n }\n\n async deleteVectors(params: DeleteVectorsParams<DuckDBVectorFilter>): Promise<void> {\n await this.initialize();\n\n const { indexName, ids, filter } = params;\n const tableName = this.escapeIdentifier(indexName);\n\n if (!ids && !filter) {\n throw new Error('Either filter or ids must be provided');\n }\n\n if (ids && filter) {\n throw new Error('ids and filter are mutually exclusive - provide only one');\n }\n\n if (ids) {\n // Delete by IDs with parameterized query\n if (ids.length === 0) {\n throw new Error('Cannot delete with empty ids array');\n }\n\n // Create placeholders for each ID\n const placeholders = ids.map(() => '?').join(', ');\n const sql = `DELETE FROM ${tableName} WHERE id IN (${placeholders})`;\n await this.runStatement(sql, ids);\n } else if (filter) {\n // Delete by filter - check for empty filter\n if (Object.keys(filter).length === 0) {\n throw new Error('Cannot delete with empty filter');\n }\n\n const { clause } = buildFilterClause(filter);\n await this.runStatement(`DELETE FROM ${tableName} WHERE ${clause}`);\n }\n }\n\n /**\n * Close the database connection.\n * After closing, the vector store can be reused by calling methods that require initialization.\n */\n async close(): Promise<void> {\n if (this.instance) {\n // DuckDBInstance doesn't have a close method - just reset the reference\n // The garbage collector will handle cleanup\n this.instance = null;\n this.initialized = false;\n this.initPromise = null; // Reset initPromise to allow re-initialization\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAqC,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,EAAE,kBAAkB;IAUtC;;OAEG;YACW,UAAU;IAgDxB;;OAEG;YACW,aAAa;IAQ3B;;OAEG;YACW,QAAQ;IA2BtB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAarB,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAwE5E,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkCrD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCrD,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAehC,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsC/D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD3E,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,aAAa,CAAC,MAAM,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCnF;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/duckdb",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-workflow-timeout-issue-20260213181535",
|
|
4
4
|
"description": "DuckDB vector store provider for Mastra - embedded high-performance vector storage with HNSW indexing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,21 +23,21 @@
|
|
|
23
23
|
"@duckdb/node-api": "1.4.2-r.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@types/node": "22.
|
|
26
|
+
"@types/node": "22.19.7",
|
|
27
27
|
"@vitest/coverage-v8": "4.0.12",
|
|
28
28
|
"@vitest/ui": "4.0.12",
|
|
29
29
|
"eslint": "^9.37.0",
|
|
30
30
|
"rimraf": "^5.0.7",
|
|
31
|
-
"tsup": "^8.5.
|
|
31
|
+
"tsup": "^8.5.1",
|
|
32
32
|
"typescript": "^5.9.3",
|
|
33
33
|
"vitest": "4.0.16",
|
|
34
|
-
"@internal/lint": "0.0.0-
|
|
35
|
-
"@internal/
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
34
|
+
"@internal/lint": "0.0.0-workflow-timeout-issue-20260213181535",
|
|
35
|
+
"@internal/types-builder": "0.0.0-workflow-timeout-issue-20260213181535",
|
|
36
|
+
"@mastra/core": "0.0.0-workflow-timeout-issue-20260213181535",
|
|
37
|
+
"@internal/storage-test-utils": "0.0.54"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@mastra/core": "0.0.0-
|
|
40
|
+
"@mastra/core": "0.0.0-workflow-timeout-issue-20260213181535"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
43
|
"dist",
|
|
@@ -57,7 +57,6 @@
|
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build:lib": "tsup --silent --config tsup.config.ts",
|
|
60
|
-
"build:docs": "pnpx tsx ../../scripts/generate-package-docs.ts stores/duckdb",
|
|
61
60
|
"build:watch": "tsup --watch --silent --config tsup.config.ts",
|
|
62
61
|
"test": "vitest run",
|
|
63
62
|
"lint": "eslint .",
|
package/dist/docs/README.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# @mastra/duckdb Documentation
|
|
2
|
-
|
|
3
|
-
> Embedded documentation for coding agents
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Read the skill overview
|
|
9
|
-
cat docs/SKILL.md
|
|
10
|
-
|
|
11
|
-
# Get the source map
|
|
12
|
-
cat docs/SOURCE_MAP.json
|
|
13
|
-
|
|
14
|
-
# Read topic documentation
|
|
15
|
-
cat docs/<topic>/01-overview.md
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Structure
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
docs/
|
|
22
|
-
├── SKILL.md # Entry point
|
|
23
|
-
├── README.md # This file
|
|
24
|
-
├── SOURCE_MAP.json # Export index
|
|
25
|
-
├── vectors/ (1 files)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Version
|
|
29
|
-
|
|
30
|
-
Package: @mastra/duckdb
|
|
31
|
-
Version: 1.0.0-beta.3
|