@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.
Files changed (95) hide show
  1. package/dist/agent/index.cjs +2 -2
  2. package/dist/agent/index.d.cts +5 -5
  3. package/dist/agent/index.d.ts +5 -5
  4. package/dist/agent/index.js +1 -1
  5. package/dist/{base-CAEcd6q2.d.cts → base-BV8SNIdm.d.cts} +301 -42
  6. package/dist/{base-BCfssGt6.d.ts → base-CI7Uz2GO.d.ts} +301 -42
  7. package/dist/{chunk-H4CEZSRM.js → chunk-6EPEYXAE.js} +1 -1
  8. package/dist/{chunk-XRGDVLM4.cjs → chunk-BATBI3D4.cjs} +5 -5
  9. package/dist/{chunk-WIKOYZ63.js → chunk-BZUIFK6C.js} +1 -1
  10. package/dist/{chunk-GXKODTLA.cjs → chunk-EYQLTWRJ.cjs} +55 -15
  11. package/dist/{chunk-EJITEVAB.cjs → chunk-F7HNPG53.cjs} +24 -1
  12. package/dist/{chunk-WE36CRQV.cjs → chunk-HKCSQI7G.cjs} +2 -2
  13. package/dist/{chunk-4WABQORE.js → chunk-JMJXBE7L.js} +139 -77
  14. package/dist/{chunk-5JUWUTPJ.cjs → chunk-LF5CE7LU.cjs} +2 -2
  15. package/dist/{chunk-S34QVMKE.js → chunk-MF5BUJO6.js} +21 -2
  16. package/dist/{chunk-WQKOM7XM.cjs → chunk-NQE264UM.cjs} +1 -1
  17. package/dist/{chunk-PEK4TY3P.js → chunk-PU2TNRKO.js} +1 -1
  18. package/dist/{chunk-SOLXHDNQ.js → chunk-RVKA5VUT.js} +51 -11
  19. package/dist/{chunk-FW5RS6WV.js → chunk-RWWUZTAK.js} +4 -4
  20. package/dist/{chunk-66GQROSI.cjs → chunk-S3Y7QBO7.cjs} +15 -15
  21. package/dist/{chunk-NZV4OA6P.js → chunk-SU4O2A72.js} +1 -1
  22. package/dist/{chunk-QHDPLMHB.cjs → chunk-UCZWRJRW.cjs} +8 -8
  23. package/dist/{chunk-QDAMIZY3.cjs → chunk-YNOTY72R.cjs} +140 -78
  24. package/dist/{chunk-CIEPFV6B.js → chunk-ZY2DW2VQ.js} +3 -3
  25. package/dist/eval/index.d.cts +4 -4
  26. package/dist/eval/index.d.ts +4 -4
  27. package/dist/index.cjs +87 -71
  28. package/dist/index.d.cts +4 -4
  29. package/dist/index.d.ts +4 -4
  30. package/dist/index.js +12 -12
  31. package/dist/integration/index.cjs +3 -3
  32. package/dist/integration/index.d.cts +4 -4
  33. package/dist/integration/index.d.ts +4 -4
  34. package/dist/integration/index.js +1 -1
  35. package/dist/llm/index.d.cts +6 -6
  36. package/dist/llm/index.d.ts +6 -6
  37. package/dist/mastra/index.cjs +2 -2
  38. package/dist/mastra/index.d.cts +3 -3
  39. package/dist/mastra/index.d.ts +3 -3
  40. package/dist/mastra/index.js +1 -1
  41. package/dist/mcp/index.cjs +71 -13
  42. package/dist/mcp/index.d.cts +5 -5
  43. package/dist/mcp/index.d.ts +5 -5
  44. package/dist/mcp/index.js +67 -13
  45. package/dist/memory/index.cjs +4 -4
  46. package/dist/memory/index.d.cts +4 -4
  47. package/dist/memory/index.d.ts +4 -4
  48. package/dist/memory/index.js +1 -1
  49. package/dist/network/index.cjs +5 -5
  50. package/dist/network/index.d.cts +4 -4
  51. package/dist/network/index.d.ts +4 -4
  52. package/dist/network/index.js +3 -3
  53. package/dist/relevance/index.cjs +4 -4
  54. package/dist/relevance/index.d.cts +4 -4
  55. package/dist/relevance/index.d.ts +4 -4
  56. package/dist/relevance/index.js +1 -1
  57. package/dist/server/index.d.cts +3 -3
  58. package/dist/server/index.d.ts +3 -3
  59. package/dist/storage/index.d.cts +4 -4
  60. package/dist/storage/index.d.ts +4 -4
  61. package/dist/storage/libsql/index.cjs +15 -8
  62. package/dist/storage/libsql/index.d.cts +4 -4
  63. package/dist/storage/libsql/index.d.ts +4 -4
  64. package/dist/storage/libsql/index.js +15 -8
  65. package/dist/telemetry/index.d.cts +4 -4
  66. package/dist/telemetry/index.d.ts +4 -4
  67. package/dist/tools/index.cjs +4 -4
  68. package/dist/tools/index.d.cts +4 -4
  69. package/dist/tools/index.d.ts +4 -4
  70. package/dist/tools/index.js +1 -1
  71. package/dist/utils.cjs +28 -12
  72. package/dist/utils.d.cts +46 -2
  73. package/dist/utils.d.ts +46 -2
  74. package/dist/utils.js +1 -1
  75. package/dist/vector/index.cjs +2 -2
  76. package/dist/vector/index.d.cts +31 -9
  77. package/dist/vector/index.d.ts +31 -9
  78. package/dist/vector/index.js +1 -1
  79. package/dist/vector/libsql/index.cjs +3 -3
  80. package/dist/vector/libsql/index.d.cts +13 -9
  81. package/dist/vector/libsql/index.d.ts +13 -9
  82. package/dist/vector/libsql/index.js +1 -1
  83. package/dist/voice/index.d.cts +4 -4
  84. package/dist/voice/index.d.ts +4 -4
  85. package/dist/workflows/index.cjs +22 -22
  86. package/dist/workflows/index.d.cts +7 -7
  87. package/dist/workflows/index.d.ts +7 -7
  88. package/dist/workflows/index.js +1 -1
  89. package/dist/workflows/vNext/index.cjs +8 -6
  90. package/dist/workflows/vNext/index.d.cts +5 -5
  91. package/dist/workflows/vNext/index.d.ts +5 -5
  92. package/dist/workflows/vNext/index.js +6 -4
  93. package/package.json +2 -1
  94. /package/dist/{chunk-CTKNWYK2.js → chunk-GH6EMQSO.js} +0 -0
  95. /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 chunk66GQROSI_cjs = require('./chunk-66GQROSI.cjs');
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 chunk66GQROSI_cjs.Agent({
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-NZV4OA6P.js';
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
- sql: `CASE
78
- WHEN ? IS NULL THEN json_extract(metadata, '$."${handleKey(key)}"') IS ${symbol === "=" ? "" : "NOT"} NULL
79
- ELSE json_extract(metadata, '$."${handleKey(key)}"') ${symbol} ?
80
- END`,
81
- needsValue: true,
82
- transformValue: () => [value, value]
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
- sql: `CAST(json_extract(metadata, '$."${handleKey(key)}"') AS NUMERIC) ${symbol} ?`,
88
- needsValue: true
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, '$."${field}"') = ?`,
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(key)} THEN
141
+ WHEN ${validateJsonArray(jsonPathKey)} THEN
132
142
  EXISTS (
133
- SELECT 1 FROM json_each(json_extract(metadata, '$."${handleKey(key)}"')) as elem
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, '$."${handleKey(key)}"') IN (${paramPlaceholders})
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(key)} THEN
163
+ WHEN ${validateJsonArray(jsonPathKey)} THEN
153
164
  NOT EXISTS (
154
- SELECT 1 FROM json_each(json_extract(metadata, '$."${handleKey(key)}"')) as elem
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, '$."${handleKey(key)}"') NOT IN (${paramPlaceholders})
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(key)} THEN
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, '$."${handleKey(key)}"'))
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(key)} THEN
217
+ WHEN ${validateJsonArray(jsonPathKey)} THEN
205
218
  EXISTS (
206
219
  SELECT 1
207
- FROM json_each(json_extract(metadata, '$."${handleKey(key)}"')) as elem
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
- sql: `json_extract(metadata, '$."${handleKey(key)}"') IS NOT NULL`,
220
- needsValue: false
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
- sql: `(
252
+ $size: (key, paramIndex) => {
253
+ const jsonPathKey = parseJsonPathKey(key);
254
+ return {
255
+ sql: `(
238
256
  CASE
239
- WHEN json_type(json_extract(metadata, '$."${handleKey(key)}"')) = 'array' THEN
240
- json_array_length(json_extract(metadata, '$."${handleKey(key)}"')) = $${paramIndex}
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
- needsValue: true
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, '$."${handleKey(key)}"') = ?`,
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, '$."${handleKey(key)}"')`;
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(key)}
329
+ SELECT ${validateJsonArray(jsonPathKey)}
310
330
  AND EXISTS (
311
331
  SELECT 1
312
- FROM json_each(json_extract(metadata, '$."${handleKey(key)}"')) as m
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, '$."${handleKey(key)}"')) LIKE '%' || lower(?) || '%'`;
337
+ sql = `lower(json_extract(metadata, '$."${jsonPathKey}"')) LIKE '%' || lower(?) || '%' ESCAPE '\\'`;
318
338
  } else {
319
- sql = `json_extract(metadata, '$."${handleKey(key)}"') = ?`;
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, '$."${handleKey(key)}"')) = 'object'
344
- // AND json_patch(json_extract(metadata, '$."${handleKey(key)}"'), ?) = json_extract(metadata, '$."${handleKey(key)}"')`,
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
- var handleKey = (key) => {
350
- return key.replace(/\./g, '"."');
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 ${indexName}
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 ${topK}`;
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 ${indexName} (vector_id, embedding, metadata)
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 ${indexName} (
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 ${indexName}_vector_idx
609
- ON ${indexName} (libsql_vector_idx(embedding))
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(indexName) {
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 ${indexName}`,
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
- async describeIndex(indexName) {
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: [indexName]
709
+ args: [parsedIndexName]
658
710
  });
659
711
  if (!tableInfo.rows[0]?.sql) {
660
- throw new Error(`Table ${indexName} not found`);
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 ${indexName};
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. Please use updateVector() instead. updateIndexById() will be removed on May 20th, 2025.`
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(indexName, id, update) {
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 args = [];
770
+ const args2 = [];
714
771
  if (update.vector) {
715
772
  updates.push("embedding = vector32(?)");
716
- args.push(JSON.stringify(update.vector));
773
+ args2.push(JSON.stringify(update.vector));
717
774
  }
718
775
  if (update.metadata) {
719
776
  updates.push("metadata = ?");
720
- args.push(JSON.stringify(update.metadata));
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
- args.push(id);
782
+ args2.push(id);
726
783
  const query = `
727
- UPDATE ${indexName}
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(indexName, id) {
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 ${indexName} WHERE vector_id = ?`,
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(indexName) {
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 chunkEJITEVAB_cjs = require('./chunk-EJITEVAB.cjs');
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 = chunkEJITEVAB_cjs.createTool({
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);
@@ -1,4 +1,4 @@
1
- import { createTool } from './chunk-S34QVMKE.js';
1
+ import { createTool } from './chunk-MF5BUJO6.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  // src/integration/integration.ts