@mastra/server 1.9.0 → 1.10.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 (69) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{chunk-YMHD5QN4.cjs → chunk-4IA52F5N.cjs} +6 -6
  3. package/dist/{chunk-YMHD5QN4.cjs.map → chunk-4IA52F5N.cjs.map} +1 -1
  4. package/dist/{chunk-IXA4YZMV.js → chunk-4WMV5R64.js} +59 -11
  5. package/dist/chunk-4WMV5R64.js.map +1 -0
  6. package/dist/{chunk-ICZV5UXL.js → chunk-7Z23EFVZ.js} +248 -59
  7. package/dist/chunk-7Z23EFVZ.js.map +1 -0
  8. package/dist/{chunk-NZGPG5ZI.js → chunk-AC5X66E2.js} +3 -3
  9. package/dist/{chunk-NZGPG5ZI.js.map → chunk-AC5X66E2.js.map} +1 -1
  10. package/dist/{chunk-AAZLFKSD.js → chunk-B5GSYU7J.js} +9 -2
  11. package/dist/chunk-B5GSYU7J.js.map +1 -0
  12. package/dist/{chunk-4DEUEWUP.cjs → chunk-BF34CMII.cjs} +5 -5
  13. package/dist/{chunk-4DEUEWUP.cjs.map → chunk-BF34CMII.cjs.map} +1 -1
  14. package/dist/{chunk-QVQKUSBW.cjs → chunk-BZO7NV5A.cjs} +6 -6
  15. package/dist/{chunk-QVQKUSBW.cjs.map → chunk-BZO7NV5A.cjs.map} +1 -1
  16. package/dist/{chunk-EGWACN4Q.cjs → chunk-CARPBU5W.cjs} +9 -2
  17. package/dist/chunk-CARPBU5W.cjs.map +1 -0
  18. package/dist/{chunk-TXC7QU6O.cjs → chunk-E5I4COAV.cjs} +248 -59
  19. package/dist/chunk-E5I4COAV.cjs.map +1 -0
  20. package/dist/{chunk-HLFFDNMA.js → chunk-G4F3KPUR.js} +3 -3
  21. package/dist/{chunk-HLFFDNMA.js.map → chunk-G4F3KPUR.js.map} +1 -1
  22. package/dist/{chunk-P6HZ2B4Z.cjs → chunk-MHB5LKA4.cjs} +4 -4
  23. package/dist/{chunk-P6HZ2B4Z.cjs.map → chunk-MHB5LKA4.cjs.map} +1 -1
  24. package/dist/{chunk-QUZKXCTG.js → chunk-QITXZQID.js} +3 -3
  25. package/dist/{chunk-QUZKXCTG.js.map → chunk-QITXZQID.js.map} +1 -1
  26. package/dist/{chunk-PKBWZ2N5.js → chunk-QJ7ZMX7Y.js} +3 -3
  27. package/dist/{chunk-PKBWZ2N5.js.map → chunk-QJ7ZMX7Y.js.map} +1 -1
  28. package/dist/{chunk-OMLZSETB.cjs → chunk-TVJYM7U2.cjs} +59 -11
  29. package/dist/chunk-TVJYM7U2.cjs.map +1 -0
  30. package/dist/docs/SKILL.md +1 -1
  31. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  32. package/dist/docs/references/reference-server-create-route.md +14 -14
  33. package/dist/docs/references/reference-server-mastra-server.md +10 -10
  34. package/dist/{observational-memory-SR6G4HN5-G66HNVG4.cjs → observational-memory-QFQUF5EY-5VPKVXKI.cjs} +653 -532
  35. package/dist/observational-memory-QFQUF5EY-5VPKVXKI.cjs.map +1 -0
  36. package/dist/{observational-memory-SR6G4HN5-PSFX73LD.js → observational-memory-QFQUF5EY-GQK2OWVA.js} +653 -532
  37. package/dist/observational-memory-QFQUF5EY-GQK2OWVA.js.map +1 -0
  38. package/dist/server/handlers/a2a.cjs +9 -9
  39. package/dist/server/handlers/a2a.js +1 -1
  40. package/dist/server/handlers/agent-builder.cjs +16 -16
  41. package/dist/server/handlers/agent-builder.js +1 -1
  42. package/dist/server/handlers/agents.cjs +33 -33
  43. package/dist/server/handlers/agents.d.ts +3 -2
  44. package/dist/server/handlers/agents.d.ts.map +1 -1
  45. package/dist/server/handlers/agents.js +1 -1
  46. package/dist/server/handlers/auth.cjs +9 -9
  47. package/dist/server/handlers/auth.d.ts.map +1 -1
  48. package/dist/server/handlers/auth.js +1 -1
  49. package/dist/server/handlers/mcp.d.ts +1 -1
  50. package/dist/server/handlers/scores.cjs +7 -7
  51. package/dist/server/handlers/scores.js +1 -1
  52. package/dist/server/handlers/tools.cjs +6 -6
  53. package/dist/server/handlers/tools.js +1 -1
  54. package/dist/server/handlers/voice.cjs +8 -8
  55. package/dist/server/handlers/voice.js +1 -1
  56. package/dist/server/handlers.cjs +12 -12
  57. package/dist/server/handlers.js +6 -6
  58. package/dist/server/schemas/mcp.d.ts +2 -2
  59. package/dist/server/server-adapter/index.cjs +66 -66
  60. package/dist/server/server-adapter/index.js +7 -7
  61. package/package.json +6 -6
  62. package/dist/chunk-AAZLFKSD.js.map +0 -1
  63. package/dist/chunk-EGWACN4Q.cjs.map +0 -1
  64. package/dist/chunk-ICZV5UXL.js.map +0 -1
  65. package/dist/chunk-IXA4YZMV.js.map +0 -1
  66. package/dist/chunk-OMLZSETB.cjs.map +0 -1
  67. package/dist/chunk-TXC7QU6O.cjs.map +0 -1
  68. package/dist/observational-memory-SR6G4HN5-G66HNVG4.cjs.map +0 -1
  69. package/dist/observational-memory-SR6G4HN5-PSFX73LD.js.map +0 -1
@@ -22472,7 +22472,7 @@ function withUserAgentSuffix2(headers, ...userAgentSuffixParts) {
22472
22472
  );
22473
22473
  return Object.fromEntries(normalizedHeaders.entries());
22474
22474
  }
22475
- var VERSION4 = "4.0.15";
22475
+ var VERSION4 = "4.0.19";
22476
22476
  var getOriginalFetch3 = () => globalThis.fetch;
22477
22477
  var getFromApi2 = async ({
22478
22478
  url,
@@ -22557,8 +22557,8 @@ function loadOptionalSetting2({
22557
22557
  }
22558
22558
  return settingValue;
22559
22559
  }
22560
- var suspectProtoRx2 = /"__proto__"\s*:/;
22561
- var suspectConstructorRx2 = /"constructor"\s*:/;
22560
+ var suspectProtoRx2 = /"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/;
22561
+ var suspectConstructorRx2 = /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/;
22562
22562
  function _parse2(text42) {
22563
22563
  const obj = JSON.parse(text42);
22564
22564
  if (obj === null || typeof obj !== "object") {
@@ -22578,7 +22578,7 @@ function filter2(obj) {
22578
22578
  if (Object.prototype.hasOwnProperty.call(node, "__proto__")) {
22579
22579
  throw new SyntaxError("Object contains forbidden prototype property");
22580
22580
  }
22581
- if (Object.prototype.hasOwnProperty.call(node, "constructor") && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
22581
+ if (Object.prototype.hasOwnProperty.call(node, "constructor") && node.constructor !== null && typeof node.constructor === "object" && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
22582
22582
  throw new SyntaxError("Object contains forbidden prototype property");
22583
22583
  }
22584
22584
  for (const key in node) {
@@ -25142,16 +25142,14 @@ var GatewayVideoModel = class {
25142
25142
  var _a932;
25143
25143
  const resolvedHeaders = await resolve2(this.config.headers());
25144
25144
  try {
25145
- const {
25146
- responseHeaders,
25147
- value: responseBody
25148
- } = await postJsonToApi2({
25145
+ const { responseHeaders, value: responseBody } = await postJsonToApi2({
25149
25146
  url: this.getUrl(),
25150
25147
  headers: combineHeaders2(
25151
25148
  resolvedHeaders,
25152
25149
  headers != null ? headers : {},
25153
25150
  this.getModelConfigHeaders(),
25154
- await resolve2(this.config.o11yHeaders)
25151
+ await resolve2(this.config.o11yHeaders),
25152
+ { accept: "text/event-stream" }
25155
25153
  ),
25156
25154
  body: {
25157
25155
  prompt,
@@ -25164,9 +25162,70 @@ var GatewayVideoModel = class {
25164
25162
  ...providerOptions && { providerOptions },
25165
25163
  ...image && { image: maybeEncodeVideoFile(image) }
25166
25164
  },
25167
- successfulResponseHandler: createJsonResponseHandler2(
25168
- gatewayVideoResponseSchema
25169
- ),
25165
+ successfulResponseHandler: async ({
25166
+ response,
25167
+ url,
25168
+ requestBodyValues
25169
+ }) => {
25170
+ if (response.body == null) {
25171
+ throw new APICallError3({
25172
+ message: "SSE response body is empty",
25173
+ url,
25174
+ requestBodyValues,
25175
+ statusCode: response.status
25176
+ });
25177
+ }
25178
+ const eventStream = parseJsonEventStream2({
25179
+ stream: response.body,
25180
+ schema: gatewayVideoEventSchema
25181
+ });
25182
+ const reader = eventStream.getReader();
25183
+ const { done, value: parseResult } = await reader.read();
25184
+ reader.releaseLock();
25185
+ if (done || !parseResult) {
25186
+ throw new APICallError3({
25187
+ message: "SSE stream ended without a data event",
25188
+ url,
25189
+ requestBodyValues,
25190
+ statusCode: response.status
25191
+ });
25192
+ }
25193
+ if (!parseResult.success) {
25194
+ throw new APICallError3({
25195
+ message: "Failed to parse video SSE event",
25196
+ cause: parseResult.error,
25197
+ url,
25198
+ requestBodyValues,
25199
+ statusCode: response.status
25200
+ });
25201
+ }
25202
+ const event = parseResult.value;
25203
+ if (event.type === "error") {
25204
+ throw new APICallError3({
25205
+ message: event.message,
25206
+ statusCode: event.statusCode,
25207
+ url,
25208
+ requestBodyValues,
25209
+ responseHeaders: Object.fromEntries([...response.headers]),
25210
+ responseBody: JSON.stringify(event),
25211
+ data: {
25212
+ error: {
25213
+ message: event.message,
25214
+ type: event.errorType,
25215
+ param: event.param
25216
+ }
25217
+ }
25218
+ });
25219
+ }
25220
+ return {
25221
+ value: {
25222
+ videos: event.videos,
25223
+ warnings: event.warnings,
25224
+ providerMetadata: event.providerMetadata
25225
+ },
25226
+ responseHeaders: Object.fromEntries([...response.headers])
25227
+ };
25228
+ },
25170
25229
  failedResponseHandler: createJsonErrorResponseHandler2({
25171
25230
  errorSchema: z$1.any(),
25172
25231
  errorToMessage: (data) => data
@@ -25238,11 +25297,21 @@ var gatewayVideoWarningSchema = z$1.discriminatedUnion("type", [
25238
25297
  message: z$1.string()
25239
25298
  })
25240
25299
  ]);
25241
- var gatewayVideoResponseSchema = z$1.object({
25242
- videos: z$1.array(gatewayVideoDataSchema),
25243
- warnings: z$1.array(gatewayVideoWarningSchema).optional(),
25244
- providerMetadata: z$1.record(z$1.string(), providerMetadataEntrySchema22).optional()
25245
- });
25300
+ var gatewayVideoEventSchema = z$1.discriminatedUnion("type", [
25301
+ z$1.object({
25302
+ type: z$1.literal("result"),
25303
+ videos: z$1.array(gatewayVideoDataSchema),
25304
+ warnings: z$1.array(gatewayVideoWarningSchema).optional(),
25305
+ providerMetadata: z$1.record(z$1.string(), providerMetadataEntrySchema22).optional()
25306
+ }),
25307
+ z$1.object({
25308
+ type: z$1.literal("error"),
25309
+ message: z$1.string(),
25310
+ errorType: z$1.string(),
25311
+ statusCode: z$1.number(),
25312
+ param: z$1.unknown().nullable()
25313
+ })
25314
+ ]);
25246
25315
  var parallelSearchInputSchema = lazySchema(
25247
25316
  () => zodSchema3(
25248
25317
  z.object({
@@ -25419,7 +25488,7 @@ async function getVercelRequestId2() {
25419
25488
  var _a932;
25420
25489
  return (_a932 = (0, import_oidc3.getContext)().headers) == null ? void 0 : _a932["x-vercel-id"];
25421
25490
  }
25422
- var VERSION5 = "3.0.52";
25491
+ var VERSION5 = "3.0.66";
25423
25492
  var AI_GATEWAY_PROTOCOL_VERSION2 = "0.0.1";
25424
25493
  function createGatewayProvider2(options = {}) {
25425
25494
  var _a932, _b92;
@@ -25462,13 +25531,18 @@ function createGatewayProvider2(options = {}) {
25462
25531
  settingValue: void 0,
25463
25532
  environmentVariableName: "VERCEL_REGION"
25464
25533
  });
25534
+ const projectId = loadOptionalSetting2({
25535
+ settingValue: void 0,
25536
+ environmentVariableName: "VERCEL_PROJECT_ID"
25537
+ });
25465
25538
  return async () => {
25466
25539
  const requestId = await getVercelRequestId2();
25467
25540
  return {
25468
25541
  ...deploymentId && { "ai-o11y-deployment-id": deploymentId },
25469
25542
  ...environment && { "ai-o11y-environment": environment },
25470
25543
  ...region && { "ai-o11y-region": region },
25471
- ...requestId && { "ai-o11y-request-id": requestId }
25544
+ ...requestId && { "ai-o11y-request-id": requestId },
25545
+ ...projectId && { "ai-o11y-project-id": projectId }
25472
25546
  };
25473
25547
  };
25474
25548
  };
@@ -26487,7 +26561,7 @@ function getTotalTimeoutMs(timeout) {
26487
26561
  }
26488
26562
  return timeout.totalMs;
26489
26563
  }
26490
- var VERSION33 = "6.0.94";
26564
+ var VERSION33 = "6.0.116";
26491
26565
  var dataContentSchema3 = z$1.union([
26492
26566
  z$1.string(),
26493
26567
  z$1.instanceof(Uint8Array),
@@ -28037,6 +28111,25 @@ var updateWorkingMemoryTool = (memoryConfig) => {
28037
28111
  workingMemory = JSON.stringify(mergedData);
28038
28112
  } else {
28039
28113
  workingMemory = typeof inputData.memory === "string" ? inputData.memory : JSON.stringify(inputData.memory);
28114
+ const existingRaw = await memory.getWorkingMemory({
28115
+ threadId,
28116
+ resourceId,
28117
+ memoryConfig
28118
+ });
28119
+ if (existingRaw) {
28120
+ const template = await memory.getWorkingMemoryTemplate({ memoryConfig });
28121
+ if (template?.content) {
28122
+ const normalizedNew = workingMemory.replace(/\s+/g, " ").trim();
28123
+ const normalizedTemplate = template.content.replace(/\s+/g, " ").trim();
28124
+ const normalizedExisting = existingRaw.replace(/\s+/g, " ").trim();
28125
+ if (normalizedNew === normalizedTemplate && normalizedExisting !== normalizedTemplate) {
28126
+ return {
28127
+ success: false,
28128
+ message: "Attempted to replace existing working memory with empty template. Update skipped to prevent data loss."
28129
+ };
28130
+ }
28131
+ }
28132
+ }
28040
28133
  }
28041
28134
  await memory.updateWorkingMemory({
28042
28135
  threadId,
@@ -28127,6 +28220,7 @@ function normalizeObservationalMemoryConfig(config) {
28127
28220
  var CHARS_PER_TOKEN = 4;
28128
28221
  var DEFAULT_MESSAGE_RANGE = { before: 1, after: 1 };
28129
28222
  var DEFAULT_TOP_K = 4;
28223
+ var VECTOR_DELETE_BATCH_SIZE = 100;
28130
28224
  var isZodObject = (v) => v instanceof ZodObject;
28131
28225
  var Memory = class extends MastraMemory {
28132
28226
  constructor(config = {}) {
@@ -28316,6 +28410,45 @@ var Memory = class extends MastraMemory {
28316
28410
  async deleteThread(threadId) {
28317
28411
  const memoryStore = await this.getMemoryStore();
28318
28412
  await memoryStore.deleteThread({ threadId });
28413
+ if (this.vector) {
28414
+ void this.deleteThreadVectors(threadId);
28415
+ }
28416
+ }
28417
+ /**
28418
+ * Lists all vector indexes that match the memory messages prefix.
28419
+ * Handles separator differences across vector store backends (e.g. '_' vs '-').
28420
+ */
28421
+ async getMemoryVectorIndexes() {
28422
+ if (!this.vector) return [];
28423
+ const separator = this.vector.indexSeparator ?? "_";
28424
+ const prefix = `memory${separator}messages`;
28425
+ const indexes = await this.vector.listIndexes();
28426
+ return indexes.filter((name21) => name21.startsWith(prefix));
28427
+ }
28428
+ /**
28429
+ * Deletes all vector embeddings associated with a thread.
28430
+ * This is called internally by deleteThread to clean up orphaned vectors.
28431
+ *
28432
+ * @param threadId - The ID of the thread whose vectors should be deleted
28433
+ */
28434
+ async deleteThreadVectors(threadId) {
28435
+ try {
28436
+ const memoryIndexes = await this.getMemoryVectorIndexes();
28437
+ await Promise.all(
28438
+ memoryIndexes.map(async (indexName) => {
28439
+ try {
28440
+ await this.vector.deleteVectors({
28441
+ indexName,
28442
+ filter: { thread_id: threadId }
28443
+ });
28444
+ } catch {
28445
+ this.logger.debug(`Failed to delete vectors for thread ${threadId} in ${indexName}, skipping`);
28446
+ }
28447
+ })
28448
+ );
28449
+ } catch {
28450
+ this.logger.debug(`Failed to clean up vectors for thread ${threadId}`);
28451
+ }
28319
28452
  }
28320
28453
  async updateWorkingMemory({
28321
28454
  threadId,
@@ -28333,25 +28466,33 @@ var Memory = class extends MastraMemory {
28333
28466
  `Memory error: Resource-scoped working memory is enabled but no resourceId was provided. Either provide a resourceId or explicitly set workingMemory.scope to 'thread'.`
28334
28467
  );
28335
28468
  }
28336
- const memoryStore = await this.getMemoryStore();
28337
- if (scope === "resource" && resourceId) {
28338
- await memoryStore.updateResource({
28339
- resourceId,
28340
- workingMemory
28341
- });
28342
- } else {
28343
- const thread = await this.getThreadById({ threadId });
28344
- if (!thread) {
28345
- throw new Error(`Thread ${threadId} not found`);
28346
- }
28347
- await memoryStore.updateThread({
28348
- id: threadId,
28349
- title: thread.title || "",
28350
- metadata: {
28351
- ...thread.metadata,
28469
+ const mutexKey = scope === "resource" ? `resource-${resourceId}` : `thread-${threadId}`;
28470
+ const mutex = this.updateWorkingMemoryMutexes.has(mutexKey) ? this.updateWorkingMemoryMutexes.get(mutexKey) : new Mutex();
28471
+ this.updateWorkingMemoryMutexes.set(mutexKey, mutex);
28472
+ const release = await mutex.acquire();
28473
+ try {
28474
+ const memoryStore = await this.getMemoryStore();
28475
+ if (scope === "resource" && resourceId) {
28476
+ await memoryStore.updateResource({
28477
+ resourceId,
28352
28478
  workingMemory
28479
+ });
28480
+ } else {
28481
+ const thread = await this.getThreadById({ threadId });
28482
+ if (!thread) {
28483
+ throw new Error(`Thread ${threadId} not found`);
28353
28484
  }
28354
- });
28485
+ await memoryStore.updateThread({
28486
+ id: threadId,
28487
+ title: thread.title || "",
28488
+ metadata: {
28489
+ ...thread.metadata,
28490
+ workingMemory
28491
+ }
28492
+ });
28493
+ }
28494
+ } finally {
28495
+ release();
28355
28496
  }
28356
28497
  }
28357
28498
  updateWorkingMemoryMutexes = /* @__PURE__ */ new Map();
@@ -28377,16 +28518,26 @@ var Memory = class extends MastraMemory {
28377
28518
  const existingWorkingMemory = await this.getWorkingMemory({ threadId, resourceId, memoryConfig }) || "";
28378
28519
  const template = await this.getWorkingMemoryTemplate({ memoryConfig });
28379
28520
  let reason = "";
28521
+ const normalizeForComparison = (str) => str.replace(/\s+/g, " ").trim();
28522
+ const normalizedNewMemory = normalizeForComparison(workingMemory);
28523
+ const normalizedTemplate = template?.content ? normalizeForComparison(template.content) : "";
28380
28524
  if (existingWorkingMemory) {
28381
28525
  if (searchString && existingWorkingMemory?.includes(searchString)) {
28382
28526
  workingMemory = existingWorkingMemory.replace(searchString, workingMemory);
28383
28527
  reason = `found and replaced searchString with newMemory`;
28384
- } else if (existingWorkingMemory.includes(workingMemory) || template?.content?.trim() === workingMemory.trim()) {
28528
+ } else if (existingWorkingMemory.includes(workingMemory) || template?.content?.trim() === workingMemory.trim() || // Also check normalized versions to catch template variations with different whitespace
28529
+ normalizedNewMemory === normalizedTemplate) {
28385
28530
  return {
28386
28531
  success: false,
28387
28532
  reason: `attempted to insert duplicate data into working memory. this entry was skipped`
28388
28533
  };
28389
28534
  } else {
28535
+ if (normalizedNewMemory === normalizedTemplate) {
28536
+ return {
28537
+ success: false,
28538
+ reason: `attempted to append empty template to working memory. this entry was skipped`
28539
+ };
28540
+ }
28390
28541
  if (searchString) {
28391
28542
  reason = `attempted to replace working memory string that doesn't exist. Appending to working memory instead.`;
28392
28543
  } else {
@@ -28395,7 +28546,7 @@ var Memory = class extends MastraMemory {
28395
28546
  workingMemory = existingWorkingMemory + `
28396
28547
  ${workingMemory}`;
28397
28548
  }
28398
- } else if (workingMemory === template?.content) {
28549
+ } else if (workingMemory === template?.content || normalizedNewMemory === normalizedTemplate) {
28399
28550
  return {
28400
28551
  success: false,
28401
28552
  reason: `try again when you have data to add. newMemory was equal to the working memory template`
@@ -28403,7 +28554,13 @@ ${workingMemory}`;
28403
28554
  } else {
28404
28555
  reason = `started new working memory`;
28405
28556
  }
28406
- workingMemory = template?.content ? workingMemory.replaceAll(template?.content, "") : workingMemory;
28557
+ if (template?.content) {
28558
+ workingMemory = workingMemory.replaceAll(template.content, "");
28559
+ const templateWithUnixLineEndings = template.content.replace(/\r\n/g, "\n");
28560
+ const templateWithWindowsLineEndings = template.content.replace(/\n/g, "\r\n");
28561
+ workingMemory = workingMemory.replaceAll(templateWithUnixLineEndings, "");
28562
+ workingMemory = workingMemory.replaceAll(templateWithWindowsLineEndings, "");
28563
+ }
28407
28564
  const scope = config.workingMemory.scope || "resource";
28408
28565
  if (scope === "resource" && !resourceId) {
28409
28566
  throw new Error(
@@ -28879,24 +29036,25 @@ Notes:
28879
29036
  const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
28880
29037
  if (messageIdsNeedingDeletion.size > 0) {
28881
29038
  try {
28882
- const indexes = await this.vector.listIndexes();
28883
- const memoryIndexes = indexes.filter((name21) => name21.startsWith("memory_messages"));
28884
- for (const indexName of memoryIndexes) {
28885
- for (const messageId of messageIdsNeedingDeletion) {
28886
- try {
28887
- await this.vector.deleteVectors({
28888
- indexName,
28889
- filter: { message_id: messageId }
28890
- });
28891
- } catch {
28892
- this.logger.debug(
28893
- `No existing vectors found for message ${messageId} in ${indexName}, skipping delete`
28894
- );
29039
+ const memoryIndexes = await this.getMemoryVectorIndexes();
29040
+ const idsToDelete = [...messageIdsNeedingDeletion];
29041
+ await Promise.all(
29042
+ memoryIndexes.map(async (indexName) => {
29043
+ for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
29044
+ const batch = idsToDelete.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
29045
+ try {
29046
+ await this.vector.deleteVectors({
29047
+ indexName,
29048
+ filter: { message_id: { $in: batch } }
29049
+ });
29050
+ } catch {
29051
+ this.logger.debug(`Failed to delete vector batch in ${indexName} (batch offset ${i}), skipping`);
29052
+ }
28895
29053
  }
28896
- }
28897
- }
29054
+ })
29055
+ );
28898
29056
  } catch {
28899
- this.logger.debug(`No memory indexes found to delete from`);
29057
+ this.logger.debug(`Failed to clean up old vectors during message update`);
28900
29058
  }
28901
29059
  }
28902
29060
  if (embeddingData.length > 0 && dimension !== void 0) {
@@ -28947,6 +29105,37 @@ Notes:
28947
29105
  }
28948
29106
  const memoryStore = await this.getMemoryStore();
28949
29107
  await memoryStore.deleteMessages(messageIds);
29108
+ if (this.vector) {
29109
+ void this.deleteMessageVectors(messageIds);
29110
+ }
29111
+ }
29112
+ /**
29113
+ * Deletes vector embeddings for specific messages.
29114
+ * This is called internally by deleteMessages to clean up orphaned vectors.
29115
+ *
29116
+ * @param messageIds - The IDs of the messages whose vectors should be deleted
29117
+ */
29118
+ async deleteMessageVectors(messageIds) {
29119
+ try {
29120
+ const memoryIndexes = await this.getMemoryVectorIndexes();
29121
+ await Promise.all(
29122
+ memoryIndexes.map(async (indexName) => {
29123
+ for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
29124
+ const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
29125
+ try {
29126
+ await this.vector.deleteVectors({
29127
+ indexName,
29128
+ filter: { message_id: { $in: batch } }
29129
+ });
29130
+ } catch {
29131
+ this.logger.debug(`Failed to delete vector batch in ${indexName} (batch offset ${i}), skipping`);
29132
+ }
29133
+ }
29134
+ })
29135
+ );
29136
+ } catch {
29137
+ this.logger.debug(`Failed to clean up vectors for deleted messages`);
29138
+ }
28950
29139
  }
28951
29140
  /**
28952
29141
  * Clone a thread and its messages to create a new independent thread.
@@ -29361,7 +29550,7 @@ Notes:
29361
29550
  "Observational memory async buffering is enabled by default but the installed version of @mastra/core does not support it. Either upgrade @mastra/core, @mastra/memory, and your storage adapter (@mastra/libsql, @mastra/pg, or @mastra/mongodb) to the latest version, or explicitly disable async buffering by setting `observation: { bufferTokens: false }` in your observationalMemory config."
29362
29551
  );
29363
29552
  }
29364
- const { ObservationalMemory } = await import('./observational-memory-SR6G4HN5-PSFX73LD.js');
29553
+ const { ObservationalMemory } = await import('./observational-memory-QFQUF5EY-GQK2OWVA.js');
29365
29554
  return new ObservationalMemory({
29366
29555
  storage: memoryStore,
29367
29556
  scope: omConfig.scope,
@@ -40264,5 +40453,5 @@ var OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE = createRoute({
40264
40453
  });
40265
40454
 
40266
40455
  export { CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE, CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE, GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE, GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE, LIST_AGENT_BUILDER_ACTIONS_ROUTE, LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE, OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE, OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, RESUME_AGENT_BUILDER_ACTION_ROUTE, RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE, RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE, START_AGENT_BUILDER_ACTION_RUN_ROUTE, START_ASYNC_AGENT_BUILDER_ACTION_ROUTE, STREAM_AGENT_BUILDER_ACTION_ROUTE, STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, agent_builder_exports };
40267
- //# sourceMappingURL=chunk-ICZV5UXL.js.map
40268
- //# sourceMappingURL=chunk-ICZV5UXL.js.map
40456
+ //# sourceMappingURL=chunk-7Z23EFVZ.js.map
40457
+ //# sourceMappingURL=chunk-7Z23EFVZ.js.map