@mastra/core 0.9.4 → 0.9.5-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +2 -2
- package/dist/agent/index.d.cts +5 -5
- package/dist/agent/index.d.ts +5 -5
- package/dist/agent/index.js +1 -1
- package/dist/{base-CAEcd6q2.d.cts → base-BV8SNIdm.d.cts} +301 -42
- package/dist/{base-BCfssGt6.d.ts → base-CI7Uz2GO.d.ts} +301 -42
- package/dist/{chunk-H4CEZSRM.js → chunk-6EPEYXAE.js} +1 -1
- package/dist/{chunk-XRGDVLM4.cjs → chunk-BATBI3D4.cjs} +5 -5
- package/dist/{chunk-WIKOYZ63.js → chunk-BZUIFK6C.js} +1 -1
- package/dist/{chunk-GXKODTLA.cjs → chunk-EYQLTWRJ.cjs} +55 -15
- package/dist/{chunk-EJITEVAB.cjs → chunk-F7HNPG53.cjs} +24 -1
- package/dist/{chunk-WE36CRQV.cjs → chunk-HKCSQI7G.cjs} +2 -2
- package/dist/{chunk-4WABQORE.js → chunk-JMJXBE7L.js} +139 -77
- package/dist/{chunk-5JUWUTPJ.cjs → chunk-LF5CE7LU.cjs} +2 -2
- package/dist/{chunk-S34QVMKE.js → chunk-MF5BUJO6.js} +21 -2
- package/dist/{chunk-WQKOM7XM.cjs → chunk-NQE264UM.cjs} +1 -1
- package/dist/{chunk-PEK4TY3P.js → chunk-PU2TNRKO.js} +1 -1
- package/dist/{chunk-SOLXHDNQ.js → chunk-RVKA5VUT.js} +51 -11
- package/dist/{chunk-FW5RS6WV.js → chunk-RWWUZTAK.js} +4 -4
- package/dist/{chunk-66GQROSI.cjs → chunk-S3Y7QBO7.cjs} +15 -15
- package/dist/{chunk-NZV4OA6P.js → chunk-SU4O2A72.js} +1 -1
- package/dist/{chunk-QHDPLMHB.cjs → chunk-UCZWRJRW.cjs} +8 -8
- package/dist/{chunk-QDAMIZY3.cjs → chunk-YNOTY72R.cjs} +140 -78
- package/dist/{chunk-CIEPFV6B.js → chunk-ZY2DW2VQ.js} +3 -3
- package/dist/eval/index.d.cts +4 -4
- package/dist/eval/index.d.ts +4 -4
- package/dist/index.cjs +87 -71
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +12 -12
- package/dist/integration/index.cjs +3 -3
- package/dist/integration/index.d.cts +4 -4
- package/dist/integration/index.d.ts +4 -4
- package/dist/integration/index.js +1 -1
- package/dist/llm/index.d.cts +6 -6
- package/dist/llm/index.d.ts +6 -6
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.cts +3 -3
- package/dist/mastra/index.d.ts +3 -3
- package/dist/mastra/index.js +1 -1
- package/dist/mcp/index.cjs +71 -13
- package/dist/mcp/index.d.cts +5 -5
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +67 -13
- package/dist/memory/index.cjs +4 -4
- package/dist/memory/index.d.cts +4 -4
- package/dist/memory/index.d.ts +4 -4
- package/dist/memory/index.js +1 -1
- package/dist/network/index.cjs +5 -5
- package/dist/network/index.d.cts +4 -4
- package/dist/network/index.d.ts +4 -4
- package/dist/network/index.js +3 -3
- package/dist/relevance/index.cjs +4 -4
- package/dist/relevance/index.d.cts +4 -4
- package/dist/relevance/index.d.ts +4 -4
- package/dist/relevance/index.js +1 -1
- package/dist/server/index.d.cts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/storage/index.d.cts +4 -4
- package/dist/storage/index.d.ts +4 -4
- package/dist/storage/libsql/index.cjs +15 -8
- package/dist/storage/libsql/index.d.cts +4 -4
- package/dist/storage/libsql/index.d.ts +4 -4
- package/dist/storage/libsql/index.js +15 -8
- package/dist/telemetry/index.d.cts +4 -4
- package/dist/telemetry/index.d.ts +4 -4
- package/dist/tools/index.cjs +4 -4
- package/dist/tools/index.d.cts +4 -4
- package/dist/tools/index.d.ts +4 -4
- package/dist/tools/index.js +1 -1
- package/dist/utils.cjs +28 -12
- package/dist/utils.d.cts +46 -2
- package/dist/utils.d.ts +46 -2
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +2 -2
- package/dist/vector/index.d.cts +31 -9
- package/dist/vector/index.d.ts +31 -9
- package/dist/vector/index.js +1 -1
- package/dist/vector/libsql/index.cjs +3 -3
- package/dist/vector/libsql/index.d.cts +13 -9
- package/dist/vector/libsql/index.d.ts +13 -9
- package/dist/vector/libsql/index.js +1 -1
- package/dist/voice/index.d.cts +4 -4
- package/dist/voice/index.d.ts +4 -4
- package/dist/workflows/index.cjs +22 -22
- package/dist/workflows/index.d.cts +7 -7
- package/dist/workflows/index.d.ts +7 -7
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/vNext/index.cjs +8 -6
- package/dist/workflows/vNext/index.d.cts +5 -5
- package/dist/workflows/vNext/index.d.ts +5 -5
- package/dist/workflows/vNext/index.js +6 -4
- package/package.json +2 -1
- /package/dist/{chunk-CTKNWYK2.js → chunk-GH6EMQSO.js} +0 -0
- /package/dist/{chunk-RAQBTCIR.cjs → chunk-T6DN4C76.cjs} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var chunkLABUWBKX_cjs = require('./chunk-LABUWBKX.cjs');
|
|
4
3
|
var chunkEG74VBSP_cjs = require('./chunk-EG74VBSP.cjs');
|
|
4
|
+
var chunkLABUWBKX_cjs = require('./chunk-LABUWBKX.cjs');
|
|
5
5
|
var crypto = require('crypto');
|
|
6
6
|
var ai = require('ai');
|
|
7
7
|
var jsonSchemaToZod = require('json-schema-to-zod');
|
|
@@ -951,6 +951,25 @@ ${JSON.stringify(message, null, 2)}
|
|
|
951
951
|
);
|
|
952
952
|
}).flat();
|
|
953
953
|
}
|
|
954
|
+
var SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
955
|
+
function parseSqlIdentifier(name, kind = "identifier") {
|
|
956
|
+
if (!SQL_IDENTIFIER_PATTERN.test(name) || name.length > 63) {
|
|
957
|
+
throw new Error(
|
|
958
|
+
`Invalid ${kind}: ${name}. Must start with a letter or underscore, contain only letters, numbers, or underscores, and be at most 63 characters long.`
|
|
959
|
+
);
|
|
960
|
+
}
|
|
961
|
+
return name;
|
|
962
|
+
}
|
|
963
|
+
function parseFieldKey(key) {
|
|
964
|
+
if (!key) throw new Error("Field key cannot be empty");
|
|
965
|
+
const segments = key.split(".");
|
|
966
|
+
for (const segment of segments) {
|
|
967
|
+
if (!SQL_IDENTIFIER_PATTERN.test(segment) || segment.length > 63) {
|
|
968
|
+
throw new Error(`Invalid field key segment: ${segment} in ${key}`);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
return key;
|
|
972
|
+
}
|
|
954
973
|
|
|
955
974
|
exports.Tool = Tool;
|
|
956
975
|
exports.checkEvalStorageFields = checkEvalStorageFields;
|
|
@@ -960,8 +979,12 @@ exports.deepMerge = deepMerge;
|
|
|
960
979
|
exports.delay = delay;
|
|
961
980
|
exports.ensureAllMessagesAreCoreMessages = ensureAllMessagesAreCoreMessages;
|
|
962
981
|
exports.ensureToolProperties = ensureToolProperties;
|
|
982
|
+
exports.isCoreMessage = isCoreMessage;
|
|
983
|
+
exports.isUiMessage = isUiMessage;
|
|
963
984
|
exports.isVercelTool = isVercelTool;
|
|
964
985
|
exports.isZodType = isZodType;
|
|
965
986
|
exports.makeCoreTool = makeCoreTool;
|
|
966
987
|
exports.maskStreamTags = maskStreamTags;
|
|
988
|
+
exports.parseFieldKey = parseFieldKey;
|
|
989
|
+
exports.parseSqlIdentifier = parseSqlIdentifier;
|
|
967
990
|
exports.resolveSerializedZodOutput = resolveSerializedZodOutput;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkS3Y7QBO7_cjs = require('./chunk-S3Y7QBO7.cjs');
|
|
4
4
|
var cohereAi = require('cohere-ai');
|
|
5
5
|
|
|
6
6
|
var CohereRelevanceScorer = class {
|
|
@@ -38,7 +38,7 @@ Relevance score (0-1):`;
|
|
|
38
38
|
var MastraAgentRelevanceScorer = class {
|
|
39
39
|
agent;
|
|
40
40
|
constructor(name, model) {
|
|
41
|
-
this.agent = new
|
|
41
|
+
this.agent = new chunkS3Y7QBO7_cjs.Agent({
|
|
42
42
|
name: `Relevance Scorer ${name}`,
|
|
43
43
|
instructions: `You are a specialized agent for evaluating the relevance of text to queries.
|
|
44
44
|
Your task is to rate how well a text passage answers a given query.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { MastraVector } from './chunk-
|
|
1
|
+
import { MastraVector } from './chunk-SU4O2A72.js';
|
|
2
2
|
import { BaseFilterTranslator } from './chunk-LGERQTJM.js';
|
|
3
|
+
import { parseSqlIdentifier, parseFieldKey } from './chunk-MF5BUJO6.js';
|
|
3
4
|
import { isAbsolute, join, resolve } from 'path';
|
|
4
5
|
import { createClient } from '@libsql/client';
|
|
5
6
|
|
|
@@ -73,44 +74,52 @@ var LibSQLFilterTranslator = class extends BaseFilterTranslator {
|
|
|
73
74
|
|
|
74
75
|
// src/vector/libsql/sql-builder.ts
|
|
75
76
|
var createBasicOperator = (symbol) => {
|
|
76
|
-
return (key, value) =>
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
return (key, value) => {
|
|
78
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
79
|
+
return {
|
|
80
|
+
sql: `CASE
|
|
81
|
+
WHEN ? IS NULL THEN json_extract(metadata, '$."${jsonPathKey}"') IS ${symbol === "=" ? "" : "NOT"} NULL
|
|
82
|
+
ELSE json_extract(metadata, '$."${jsonPathKey}"') ${symbol} ?
|
|
83
|
+
END`,
|
|
84
|
+
needsValue: true,
|
|
85
|
+
transformValue: () => {
|
|
86
|
+
return [value, value];
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
};
|
|
84
90
|
};
|
|
85
91
|
var createNumericOperator = (symbol) => {
|
|
86
|
-
return (key) =>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
92
|
+
return (key) => {
|
|
93
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
94
|
+
return {
|
|
95
|
+
sql: `CAST(json_extract(metadata, '$."${jsonPathKey}"') AS NUMERIC) ${symbol} ?`,
|
|
96
|
+
needsValue: true
|
|
97
|
+
};
|
|
98
|
+
};
|
|
90
99
|
};
|
|
100
|
+
var validateJsonArray = (key) => `json_valid(json_extract(metadata, '$."${key}"'))
|
|
101
|
+
AND json_type(json_extract(metadata, '$."${key}"')) = 'array'`;
|
|
102
|
+
var pattern = /json_extract\(metadata, '\$\."[^"]*"(\."[^"]*")*'\)/g;
|
|
91
103
|
function buildElemMatchConditions(value) {
|
|
92
104
|
const conditions = Object.entries(value).map(([field, fieldValue]) => {
|
|
93
105
|
if (field.startsWith("$")) {
|
|
94
106
|
const { sql, values } = buildCondition("elem.value", { [field]: fieldValue });
|
|
95
|
-
const pattern = /json_extract\(metadata, '\$\."[^"]*"(\."[^"]*")*'\)/g;
|
|
96
107
|
const elemSql = sql.replace(pattern, "elem.value");
|
|
97
108
|
return { sql: elemSql, values };
|
|
98
109
|
} else if (typeof fieldValue === "object" && !Array.isArray(fieldValue)) {
|
|
99
110
|
const { sql, values } = buildCondition(field, fieldValue);
|
|
100
|
-
const pattern = /json_extract\(metadata, '\$\."[^"]*"(\."[^"]*")*'\)/g;
|
|
101
111
|
const elemSql = sql.replace(pattern, `json_extract(elem.value, '$."${field}"')`);
|
|
102
112
|
return { sql: elemSql, values };
|
|
103
113
|
} else {
|
|
114
|
+
const parsedFieldKey = parseFieldKey(field);
|
|
104
115
|
return {
|
|
105
|
-
sql: `json_extract(elem.value, '$."${
|
|
116
|
+
sql: `json_extract(elem.value, '$."${parsedFieldKey}"') = ?`,
|
|
106
117
|
values: [fieldValue]
|
|
107
118
|
};
|
|
108
119
|
}
|
|
109
120
|
});
|
|
110
121
|
return conditions;
|
|
111
122
|
}
|
|
112
|
-
var validateJsonArray = (key) => `json_valid(json_extract(metadata, '$."${handleKey(key)}"'))
|
|
113
|
-
AND json_type(json_extract(metadata, '$."${handleKey(key)}"')) = 'array'`;
|
|
114
123
|
var FILTER_OPERATORS = {
|
|
115
124
|
$eq: createBasicOperator("="),
|
|
116
125
|
$ne: createBasicOperator("!="),
|
|
@@ -120,6 +129,7 @@ var FILTER_OPERATORS = {
|
|
|
120
129
|
$lte: createNumericOperator("<="),
|
|
121
130
|
// Array Operators
|
|
122
131
|
$in: (key, value) => {
|
|
132
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
123
133
|
const arr = Array.isArray(value) ? value : [value];
|
|
124
134
|
if (arr.length === 0) {
|
|
125
135
|
return { sql: "1 = 0", needsValue: true, transformValue: () => [] };
|
|
@@ -128,12 +138,12 @@ var FILTER_OPERATORS = {
|
|
|
128
138
|
return {
|
|
129
139
|
sql: `(
|
|
130
140
|
CASE
|
|
131
|
-
WHEN ${validateJsonArray(
|
|
141
|
+
WHEN ${validateJsonArray(jsonPathKey)} THEN
|
|
132
142
|
EXISTS (
|
|
133
|
-
SELECT 1 FROM json_each(json_extract(metadata, '$."${
|
|
143
|
+
SELECT 1 FROM json_each(json_extract(metadata, '$."${jsonPathKey}"')) as elem
|
|
134
144
|
WHERE elem.value IN (SELECT value FROM json_each(?))
|
|
135
145
|
)
|
|
136
|
-
ELSE json_extract(metadata, '$."${
|
|
146
|
+
ELSE json_extract(metadata, '$."${jsonPathKey}"') IN (${paramPlaceholders})
|
|
137
147
|
END
|
|
138
148
|
)`,
|
|
139
149
|
needsValue: true,
|
|
@@ -141,6 +151,7 @@ var FILTER_OPERATORS = {
|
|
|
141
151
|
};
|
|
142
152
|
},
|
|
143
153
|
$nin: (key, value) => {
|
|
154
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
144
155
|
const arr = Array.isArray(value) ? value : [value];
|
|
145
156
|
if (arr.length === 0) {
|
|
146
157
|
return { sql: "1 = 1", needsValue: true, transformValue: () => [] };
|
|
@@ -149,12 +160,12 @@ var FILTER_OPERATORS = {
|
|
|
149
160
|
return {
|
|
150
161
|
sql: `(
|
|
151
162
|
CASE
|
|
152
|
-
WHEN ${validateJsonArray(
|
|
163
|
+
WHEN ${validateJsonArray(jsonPathKey)} THEN
|
|
153
164
|
NOT EXISTS (
|
|
154
|
-
SELECT 1 FROM json_each(json_extract(metadata, '$."${
|
|
165
|
+
SELECT 1 FROM json_each(json_extract(metadata, '$."${jsonPathKey}"')) as elem
|
|
155
166
|
WHERE elem.value IN (SELECT value FROM json_each(?))
|
|
156
167
|
)
|
|
157
|
-
ELSE json_extract(metadata, '$."${
|
|
168
|
+
ELSE json_extract(metadata, '$."${jsonPathKey}"') NOT IN (${paramPlaceholders})
|
|
158
169
|
END
|
|
159
170
|
)`,
|
|
160
171
|
needsValue: true,
|
|
@@ -162,6 +173,7 @@ var FILTER_OPERATORS = {
|
|
|
162
173
|
};
|
|
163
174
|
},
|
|
164
175
|
$all: (key, value) => {
|
|
176
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
165
177
|
let sql;
|
|
166
178
|
const arrayValue = Array.isArray(value) ? value : [value];
|
|
167
179
|
if (arrayValue.length === 0) {
|
|
@@ -169,13 +181,13 @@ var FILTER_OPERATORS = {
|
|
|
169
181
|
} else {
|
|
170
182
|
sql = `(
|
|
171
183
|
CASE
|
|
172
|
-
WHEN ${validateJsonArray(
|
|
184
|
+
WHEN ${validateJsonArray(jsonPathKey)} THEN
|
|
173
185
|
NOT EXISTS (
|
|
174
186
|
SELECT value
|
|
175
187
|
FROM json_each(?)
|
|
176
188
|
WHERE value NOT IN (
|
|
177
189
|
SELECT value
|
|
178
|
-
FROM json_each(json_extract(metadata, '$."${
|
|
190
|
+
FROM json_each(json_extract(metadata, '$."${jsonPathKey}"'))
|
|
179
191
|
)
|
|
180
192
|
)
|
|
181
193
|
ELSE FALSE
|
|
@@ -194,6 +206,7 @@ var FILTER_OPERATORS = {
|
|
|
194
206
|
};
|
|
195
207
|
},
|
|
196
208
|
$elemMatch: (key, value) => {
|
|
209
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
197
210
|
if (typeof value !== "object" || Array.isArray(value)) {
|
|
198
211
|
throw new Error("$elemMatch requires an object with conditions");
|
|
199
212
|
}
|
|
@@ -201,10 +214,10 @@ var FILTER_OPERATORS = {
|
|
|
201
214
|
return {
|
|
202
215
|
sql: `(
|
|
203
216
|
CASE
|
|
204
|
-
WHEN ${validateJsonArray(
|
|
217
|
+
WHEN ${validateJsonArray(jsonPathKey)} THEN
|
|
205
218
|
EXISTS (
|
|
206
219
|
SELECT 1
|
|
207
|
-
FROM json_each(json_extract(metadata, '$."${
|
|
220
|
+
FROM json_each(json_extract(metadata, '$."${jsonPathKey}"')) as elem
|
|
208
221
|
WHERE ${conditions.map((c) => c.sql).join(" AND ")}
|
|
209
222
|
)
|
|
210
223
|
ELSE FALSE
|
|
@@ -215,10 +228,13 @@ var FILTER_OPERATORS = {
|
|
|
215
228
|
};
|
|
216
229
|
},
|
|
217
230
|
// Element Operators
|
|
218
|
-
$exists: (key) =>
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
231
|
+
$exists: (key) => {
|
|
232
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
233
|
+
return {
|
|
234
|
+
sql: `json_extract(metadata, '$."${jsonPathKey}"') IS NOT NULL`,
|
|
235
|
+
needsValue: false
|
|
236
|
+
};
|
|
237
|
+
},
|
|
222
238
|
// Logical Operators
|
|
223
239
|
$and: (key) => ({
|
|
224
240
|
sql: `(${key})`,
|
|
@@ -233,27 +249,30 @@ var FILTER_OPERATORS = {
|
|
|
233
249
|
sql: `NOT (${key})`,
|
|
234
250
|
needsValue: false
|
|
235
251
|
}),
|
|
236
|
-
$size: (key, paramIndex) =>
|
|
237
|
-
|
|
252
|
+
$size: (key, paramIndex) => {
|
|
253
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
254
|
+
return {
|
|
255
|
+
sql: `(
|
|
238
256
|
CASE
|
|
239
|
-
WHEN json_type(json_extract(metadata, '$."${
|
|
240
|
-
json_array_length(json_extract(metadata, '$."${
|
|
257
|
+
WHEN json_type(json_extract(metadata, '$."${jsonPathKey}"')) = 'array' THEN
|
|
258
|
+
json_array_length(json_extract(metadata, '$."${jsonPathKey}"')) = $${paramIndex}
|
|
241
259
|
ELSE FALSE
|
|
242
260
|
END
|
|
243
261
|
)`,
|
|
244
|
-
|
|
245
|
-
|
|
262
|
+
needsValue: true
|
|
263
|
+
};
|
|
264
|
+
},
|
|
246
265
|
// /**
|
|
247
266
|
// * Regex Operators
|
|
248
267
|
// * Supports case insensitive and multiline
|
|
249
268
|
// */
|
|
250
269
|
// $regex: (key: string): FilterOperator => ({
|
|
251
|
-
// sql: `json_extract(metadata, '$."${
|
|
270
|
+
// sql: `json_extract(metadata, '$."${toJsonPathKey(key)}"') = ?`,
|
|
252
271
|
// needsValue: true,
|
|
253
272
|
// transformValue: (value: any) => {
|
|
254
273
|
// const pattern = typeof value === 'object' ? value.$regex : value;
|
|
255
274
|
// const options = typeof value === 'object' ? value.$options || '' : '';
|
|
256
|
-
// let sql = `json_extract(metadata, '$."${
|
|
275
|
+
// let sql = `json_extract(metadata, '$."${toJsonPathKey(key)}"')`;
|
|
257
276
|
// // Handle multiline
|
|
258
277
|
// // if (options.includes('m')) {
|
|
259
278
|
// // sql = `REPLACE(${sql}, CHAR(10), '\n')`;
|
|
@@ -303,20 +322,21 @@ var FILTER_OPERATORS = {
|
|
|
303
322
|
// },
|
|
304
323
|
// }),
|
|
305
324
|
$contains: (key, value) => {
|
|
325
|
+
const jsonPathKey = parseJsonPathKey(key);
|
|
306
326
|
let sql;
|
|
307
327
|
if (Array.isArray(value)) {
|
|
308
328
|
sql = `(
|
|
309
|
-
SELECT ${validateJsonArray(
|
|
329
|
+
SELECT ${validateJsonArray(jsonPathKey)}
|
|
310
330
|
AND EXISTS (
|
|
311
331
|
SELECT 1
|
|
312
|
-
FROM json_each(json_extract(metadata, '$."${
|
|
332
|
+
FROM json_each(json_extract(metadata, '$."${jsonPathKey}"')) as m
|
|
313
333
|
WHERE m.value IN (SELECT value FROM json_each(?))
|
|
314
334
|
)
|
|
315
335
|
)`;
|
|
316
336
|
} else if (typeof value === "string") {
|
|
317
|
-
sql = `lower(json_extract(metadata, '$."${
|
|
337
|
+
sql = `lower(json_extract(metadata, '$."${jsonPathKey}"')) LIKE '%' || lower(?) || '%' ESCAPE '\\'`;
|
|
318
338
|
} else {
|
|
319
|
-
sql = `json_extract(metadata, '$."${
|
|
339
|
+
sql = `json_extract(metadata, '$."${jsonPathKey}"') = ?`;
|
|
320
340
|
}
|
|
321
341
|
return {
|
|
322
342
|
sql,
|
|
@@ -328,6 +348,9 @@ var FILTER_OPERATORS = {
|
|
|
328
348
|
if (typeof value === "object" && value !== null) {
|
|
329
349
|
return [JSON.stringify(value)];
|
|
330
350
|
}
|
|
351
|
+
if (typeof value === "string") {
|
|
352
|
+
return [escapeLikePattern(value)];
|
|
353
|
+
}
|
|
331
354
|
return [value];
|
|
332
355
|
}
|
|
333
356
|
};
|
|
@@ -340,15 +363,22 @@ var FILTER_OPERATORS = {
|
|
|
340
363
|
// sql: '', // Will be overridden by transformValue
|
|
341
364
|
// needsValue: true,
|
|
342
365
|
// transformValue: (value: any) => ({
|
|
343
|
-
// sql: `json_type(json_extract(metadata, '$."${
|
|
344
|
-
// AND json_patch(json_extract(metadata, '$."${
|
|
366
|
+
// sql: `json_type(json_extract(metadata, '$."${toJsonPathKey(key)}"')) = 'object'
|
|
367
|
+
// AND json_patch(json_extract(metadata, '$."${toJsonPathKey(key)}"'), ?) = json_extract(metadata, '$."${toJsonPathKey(key)}"')`,
|
|
345
368
|
// values: [JSON.stringify(value)],
|
|
346
369
|
// }),
|
|
347
370
|
// }),
|
|
348
371
|
};
|
|
349
|
-
|
|
350
|
-
return
|
|
372
|
+
function isFilterResult(obj) {
|
|
373
|
+
return obj && typeof obj === "object" && typeof obj.sql === "string" && Array.isArray(obj.values);
|
|
374
|
+
}
|
|
375
|
+
var parseJsonPathKey = (key) => {
|
|
376
|
+
const parsedKey = parseFieldKey(key);
|
|
377
|
+
return parsedKey.replace(/\./g, '"."');
|
|
351
378
|
};
|
|
379
|
+
function escapeLikePattern(str) {
|
|
380
|
+
return str.replace(/([%_\\])/g, "\\$1");
|
|
381
|
+
}
|
|
352
382
|
function buildFilterQuery(filter) {
|
|
353
383
|
if (!filter) {
|
|
354
384
|
return { sql: "", values: [] };
|
|
@@ -442,6 +472,9 @@ var processOperator = (key, operator, operatorValue) => {
|
|
|
442
472
|
return { sql: operatorResult.sql, values: [] };
|
|
443
473
|
}
|
|
444
474
|
const transformed = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;
|
|
475
|
+
if (isFilterResult(transformed)) {
|
|
476
|
+
return transformed;
|
|
477
|
+
}
|
|
445
478
|
return {
|
|
446
479
|
sql: operatorResult.sql,
|
|
447
480
|
values: Array.isArray(transformed) ? transformed : [transformed]
|
|
@@ -508,10 +541,18 @@ var LibSQLVector = class extends MastraVector {
|
|
|
508
541
|
const params = this.normalizeArgs("query", args, ["minScore"]);
|
|
509
542
|
try {
|
|
510
543
|
const { indexName, queryVector, topK = 10, filter, includeVector = false, minScore = 0 } = params;
|
|
544
|
+
if (!Number.isInteger(topK) || topK <= 0) {
|
|
545
|
+
throw new Error("topK must be a positive integer");
|
|
546
|
+
}
|
|
547
|
+
if (!Array.isArray(queryVector) || !queryVector.every((x) => typeof x === "number" && Number.isFinite(x))) {
|
|
548
|
+
throw new Error("queryVector must be an array of finite numbers");
|
|
549
|
+
}
|
|
550
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
511
551
|
const vectorStr = `[${queryVector.join(",")}]`;
|
|
512
552
|
const translatedFilter = this.transformFilter(filter);
|
|
513
553
|
const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter);
|
|
514
554
|
filterValues.push(minScore);
|
|
555
|
+
filterValues.push(topK);
|
|
515
556
|
const query = `
|
|
516
557
|
WITH vector_scores AS (
|
|
517
558
|
SELECT
|
|
@@ -519,14 +560,14 @@ var LibSQLVector = class extends MastraVector {
|
|
|
519
560
|
(1-vector_distance_cos(embedding, '${vectorStr}')) as score,
|
|
520
561
|
metadata
|
|
521
562
|
${includeVector ? ", vector_extract(embedding) as embedding" : ""}
|
|
522
|
-
FROM ${
|
|
563
|
+
FROM ${parsedIndexName}
|
|
523
564
|
${filterQuery}
|
|
524
565
|
)
|
|
525
566
|
SELECT *
|
|
526
567
|
FROM vector_scores
|
|
527
568
|
WHERE score > ?
|
|
528
569
|
ORDER BY score DESC
|
|
529
|
-
LIMIT
|
|
570
|
+
LIMIT ?`;
|
|
530
571
|
const result = await this.turso.execute({
|
|
531
572
|
sql: query,
|
|
532
573
|
args: filterValues
|
|
@@ -545,10 +586,11 @@ var LibSQLVector = class extends MastraVector {
|
|
|
545
586
|
const { indexName, vectors, metadata, ids } = params;
|
|
546
587
|
const tx = await this.turso.transaction("write");
|
|
547
588
|
try {
|
|
589
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
548
590
|
const vectorIds = ids || vectors.map(() => crypto.randomUUID());
|
|
549
591
|
for (let i = 0; i < vectors.length; i++) {
|
|
550
592
|
const query = `
|
|
551
|
-
INSERT INTO ${
|
|
593
|
+
INSERT INTO ${parsedIndexName} (vector_id, embedding, metadata)
|
|
552
594
|
VALUES (?, vector32(?), ?)
|
|
553
595
|
ON CONFLICT(vector_id) DO UPDATE SET
|
|
554
596
|
embedding = vector32(?),
|
|
@@ -586,15 +628,13 @@ var LibSQLVector = class extends MastraVector {
|
|
|
586
628
|
const params = this.normalizeArgs("createIndex", args);
|
|
587
629
|
const { indexName, dimension } = params;
|
|
588
630
|
try {
|
|
589
|
-
if (!indexName.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {
|
|
590
|
-
throw new Error("Invalid index name format");
|
|
591
|
-
}
|
|
592
631
|
if (!Number.isInteger(dimension) || dimension <= 0) {
|
|
593
632
|
throw new Error("Dimension must be a positive integer");
|
|
594
633
|
}
|
|
634
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
595
635
|
await this.turso.execute({
|
|
596
636
|
sql: `
|
|
597
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
637
|
+
CREATE TABLE IF NOT EXISTS ${parsedIndexName} (
|
|
598
638
|
id SERIAL PRIMARY KEY,
|
|
599
639
|
vector_id TEXT UNIQUE NOT NULL,
|
|
600
640
|
embedding F32_BLOB(${dimension}),
|
|
@@ -605,8 +645,8 @@ var LibSQLVector = class extends MastraVector {
|
|
|
605
645
|
});
|
|
606
646
|
await this.turso.execute({
|
|
607
647
|
sql: `
|
|
608
|
-
CREATE INDEX IF NOT EXISTS ${
|
|
609
|
-
ON ${
|
|
648
|
+
CREATE INDEX IF NOT EXISTS ${parsedIndexName}_vector_idx
|
|
649
|
+
ON ${parsedIndexName} (libsql_vector_idx(embedding))
|
|
610
650
|
`,
|
|
611
651
|
args: []
|
|
612
652
|
});
|
|
@@ -616,10 +656,13 @@ var LibSQLVector = class extends MastraVector {
|
|
|
616
656
|
} finally {
|
|
617
657
|
}
|
|
618
658
|
}
|
|
619
|
-
async deleteIndex(
|
|
659
|
+
async deleteIndex(...args) {
|
|
660
|
+
const params = this.normalizeArgs("deleteIndex", args);
|
|
661
|
+
const { indexName } = params;
|
|
620
662
|
try {
|
|
663
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
621
664
|
await this.turso.execute({
|
|
622
|
-
sql: `DROP TABLE IF EXISTS ${
|
|
665
|
+
sql: `DROP TABLE IF EXISTS ${parsedIndexName}`,
|
|
623
666
|
args: []
|
|
624
667
|
});
|
|
625
668
|
} catch (error) {
|
|
@@ -644,8 +687,17 @@ var LibSQLVector = class extends MastraVector {
|
|
|
644
687
|
throw new Error(`Failed to list vector tables: ${error.message}`);
|
|
645
688
|
}
|
|
646
689
|
}
|
|
647
|
-
|
|
690
|
+
/**
|
|
691
|
+
* Retrieves statistics about a vector index.
|
|
692
|
+
*
|
|
693
|
+
* @param params - The parameters for describing an index
|
|
694
|
+
* @param params.indexName - The name of the index to describe
|
|
695
|
+
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
696
|
+
*/
|
|
697
|
+
async describeIndex(...args) {
|
|
648
698
|
try {
|
|
699
|
+
const { indexName } = this.normalizeArgs("describeIndex", args);
|
|
700
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
649
701
|
const tableInfoQuery = `
|
|
650
702
|
SELECT sql
|
|
651
703
|
FROM sqlite_master
|
|
@@ -654,15 +706,15 @@ var LibSQLVector = class extends MastraVector {
|
|
|
654
706
|
`;
|
|
655
707
|
const tableInfo = await this.turso.execute({
|
|
656
708
|
sql: tableInfoQuery,
|
|
657
|
-
args: [
|
|
709
|
+
args: [parsedIndexName]
|
|
658
710
|
});
|
|
659
711
|
if (!tableInfo.rows[0]?.sql) {
|
|
660
|
-
throw new Error(`Table ${
|
|
712
|
+
throw new Error(`Table ${parsedIndexName} not found`);
|
|
661
713
|
}
|
|
662
714
|
const dimension = parseInt(tableInfo.rows[0].sql.match(/F32_BLOB\((\d+)\)/)?.[1] || "0");
|
|
663
715
|
const countQuery = `
|
|
664
716
|
SELECT COUNT(*) as count
|
|
665
|
-
FROM ${
|
|
717
|
+
FROM ${parsedIndexName};
|
|
666
718
|
`;
|
|
667
719
|
const countResult = await this.turso.execute({
|
|
668
720
|
sql: countQuery,
|
|
@@ -692,9 +744,11 @@ var LibSQLVector = class extends MastraVector {
|
|
|
692
744
|
*/
|
|
693
745
|
async updateIndexById(indexName, id, update) {
|
|
694
746
|
this.logger.warn(
|
|
695
|
-
`Deprecation Warning: updateIndexById() is deprecated.
|
|
747
|
+
`Deprecation Warning: updateIndexById() is deprecated.
|
|
748
|
+
Please use updateVector() instead.
|
|
749
|
+
updateIndexById() will be removed on May 20th, 2025.`
|
|
696
750
|
);
|
|
697
|
-
await this.updateVector(indexName, id, update);
|
|
751
|
+
await this.updateVector({ indexName, id, update });
|
|
698
752
|
}
|
|
699
753
|
/**
|
|
700
754
|
* Updates a vector by its ID with the provided vector and/or metadata.
|
|
@@ -707,30 +761,33 @@ var LibSQLVector = class extends MastraVector {
|
|
|
707
761
|
* @returns A promise that resolves when the update is complete.
|
|
708
762
|
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
709
763
|
*/
|
|
710
|
-
async updateVector(
|
|
764
|
+
async updateVector(...args) {
|
|
765
|
+
const params = this.normalizeArgs("updateVector", args);
|
|
766
|
+
const { indexName, id, update } = params;
|
|
711
767
|
try {
|
|
768
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
712
769
|
const updates = [];
|
|
713
|
-
const
|
|
770
|
+
const args2 = [];
|
|
714
771
|
if (update.vector) {
|
|
715
772
|
updates.push("embedding = vector32(?)");
|
|
716
|
-
|
|
773
|
+
args2.push(JSON.stringify(update.vector));
|
|
717
774
|
}
|
|
718
775
|
if (update.metadata) {
|
|
719
776
|
updates.push("metadata = ?");
|
|
720
|
-
|
|
777
|
+
args2.push(JSON.stringify(update.metadata));
|
|
721
778
|
}
|
|
722
779
|
if (updates.length === 0) {
|
|
723
780
|
throw new Error("No updates provided");
|
|
724
781
|
}
|
|
725
|
-
|
|
782
|
+
args2.push(id);
|
|
726
783
|
const query = `
|
|
727
|
-
UPDATE ${
|
|
784
|
+
UPDATE ${parsedIndexName}
|
|
728
785
|
SET ${updates.join(", ")}
|
|
729
786
|
WHERE vector_id = ?;
|
|
730
787
|
`;
|
|
731
788
|
await this.turso.execute({
|
|
732
789
|
sql: query,
|
|
733
|
-
args
|
|
790
|
+
args: args2
|
|
734
791
|
});
|
|
735
792
|
} catch (error) {
|
|
736
793
|
throw new Error(`Failed to update vector by id: ${id} for index: ${indexName}: ${error.message}`);
|
|
@@ -751,7 +808,7 @@ var LibSQLVector = class extends MastraVector {
|
|
|
751
808
|
Please use deleteVector() instead.
|
|
752
809
|
deleteIndexById() will be removed on May 20th, 2025.`
|
|
753
810
|
);
|
|
754
|
-
await this.deleteVector(indexName, id);
|
|
811
|
+
await this.deleteVector({ indexName, id });
|
|
755
812
|
}
|
|
756
813
|
/**
|
|
757
814
|
* Deletes a vector by its ID.
|
|
@@ -760,19 +817,24 @@ var LibSQLVector = class extends MastraVector {
|
|
|
760
817
|
* @returns A promise that resolves when the deletion is complete.
|
|
761
818
|
* @throws Will throw an error if the deletion operation fails.
|
|
762
819
|
*/
|
|
763
|
-
async deleteVector(
|
|
820
|
+
async deleteVector(...args) {
|
|
821
|
+
const params = this.normalizeArgs("deleteVector", args);
|
|
822
|
+
const { indexName, id } = params;
|
|
764
823
|
try {
|
|
824
|
+
const parsedIndexName = parseSqlIdentifier(indexName, "index name");
|
|
765
825
|
await this.turso.execute({
|
|
766
|
-
sql: `DELETE FROM ${
|
|
826
|
+
sql: `DELETE FROM ${parsedIndexName} WHERE vector_id = ?`,
|
|
767
827
|
args: [id]
|
|
768
828
|
});
|
|
769
829
|
} catch (error) {
|
|
770
830
|
throw new Error(`Failed to delete vector by id: ${id} for index: ${indexName}: ${error.message}`);
|
|
771
831
|
}
|
|
772
832
|
}
|
|
773
|
-
async truncateIndex(
|
|
833
|
+
async truncateIndex(...args) {
|
|
834
|
+
const params = this.normalizeArgs("truncateIndex", args);
|
|
835
|
+
const { indexName } = params;
|
|
774
836
|
await this.turso.execute({
|
|
775
|
-
sql: `DELETE FROM ${indexName}`,
|
|
837
|
+
sql: `DELETE FROM ${parseSqlIdentifier(indexName, "index name")}`,
|
|
776
838
|
args: []
|
|
777
839
|
});
|
|
778
840
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkF7HNPG53_cjs = require('./chunk-F7HNPG53.cjs');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
6
|
// src/integration/integration.ts
|
|
@@ -68,7 +68,7 @@ var OpenAPIToolset = class {
|
|
|
68
68
|
const tools = Object.keys(clientMethods).reduce((acc, key) => {
|
|
69
69
|
const comment = documentations[key]?.comment;
|
|
70
70
|
const fallbackComment = `Execute ${key}`;
|
|
71
|
-
const tool =
|
|
71
|
+
const tool = chunkF7HNPG53_cjs.createTool({
|
|
72
72
|
id: key,
|
|
73
73
|
inputSchema: schemas[key] || zod.z.object({}),
|
|
74
74
|
description: comment || fallbackComment,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RuntimeContext } from './chunk-SGGPJWRQ.js';
|
|
2
1
|
import { MastraBase } from './chunk-235X76GC.js';
|
|
2
|
+
import { RuntimeContext } from './chunk-SGGPJWRQ.js';
|
|
3
3
|
import { createHash } from 'crypto';
|
|
4
4
|
import { convertToCoreMessages, jsonSchema, zodSchema } from 'ai';
|
|
5
5
|
import jsonSchemaToZod from 'json-schema-to-zod';
|
|
@@ -945,5 +945,24 @@ ${JSON.stringify(message, null, 2)}
|
|
|
945
945
|
);
|
|
946
946
|
}).flat();
|
|
947
947
|
}
|
|
948
|
+
var SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
949
|
+
function parseSqlIdentifier(name, kind = "identifier") {
|
|
950
|
+
if (!SQL_IDENTIFIER_PATTERN.test(name) || name.length > 63) {
|
|
951
|
+
throw new Error(
|
|
952
|
+
`Invalid ${kind}: ${name}. Must start with a letter or underscore, contain only letters, numbers, or underscores, and be at most 63 characters long.`
|
|
953
|
+
);
|
|
954
|
+
}
|
|
955
|
+
return name;
|
|
956
|
+
}
|
|
957
|
+
function parseFieldKey(key) {
|
|
958
|
+
if (!key) throw new Error("Field key cannot be empty");
|
|
959
|
+
const segments = key.split(".");
|
|
960
|
+
for (const segment of segments) {
|
|
961
|
+
if (!SQL_IDENTIFIER_PATTERN.test(segment) || segment.length > 63) {
|
|
962
|
+
throw new Error(`Invalid field key segment: ${segment} in ${key}`);
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
return key;
|
|
966
|
+
}
|
|
948
967
|
|
|
949
|
-
export { Tool, checkEvalStorageFields, createMastraProxy, createTool, deepMerge, delay, ensureAllMessagesAreCoreMessages, ensureToolProperties, isVercelTool, isZodType, makeCoreTool, maskStreamTags, resolveSerializedZodOutput };
|
|
968
|
+
export { Tool, checkEvalStorageFields, createMastraProxy, createTool, deepMerge, delay, ensureAllMessagesAreCoreMessages, ensureToolProperties, isCoreMessage, isUiMessage, isVercelTool, isZodType, makeCoreTool, maskStreamTags, parseFieldKey, parseSqlIdentifier, resolveSerializedZodOutput };
|
|
@@ -34,7 +34,7 @@ var MastraVector = class extends chunkEG74VBSP_cjs.MastraBase {
|
|
|
34
34
|
async validateExistingIndex(indexName, dimension, metric) {
|
|
35
35
|
let info;
|
|
36
36
|
try {
|
|
37
|
-
info = await this.describeIndex(indexName);
|
|
37
|
+
info = await this.describeIndex({ indexName });
|
|
38
38
|
} catch (infoError) {
|
|
39
39
|
const message = `Index "${indexName}" already exists, but failed to fetch index info for dimension check: ${infoError}`;
|
|
40
40
|
this.logger?.error(message);
|