@mastra/server 1.58.0-alpha.1 → 1.58.0-alpha.3

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 (102) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/_types/@mastra_schema-compat/dist/provider-compats/anthropic.d.ts +1 -1
  3. package/dist/{a2a-CnU9zaGR.js → a2a-8C4O2dVJ.js} +41 -5
  4. package/dist/a2a-8C4O2dVJ.js.map +1 -0
  5. package/dist/{a2a-D3ZYeXIx.cjs → a2a-B6YkZ2i9.cjs} +277 -52
  6. package/dist/a2a-B6YkZ2i9.cjs.map +1 -0
  7. package/dist/{a2a-oM7aqLz4.cjs → a2a-MPoM5lzS.cjs} +41 -5
  8. package/dist/a2a-MPoM5lzS.cjs.map +1 -0
  9. package/dist/{a2a-CHi9AJ0n.js → a2a-_D2EA4oa.js} +266 -53
  10. package/dist/a2a-_D2EA4oa.js.map +1 -0
  11. package/dist/{agent-builder-BDYN3r89.cjs → agent-builder-DAiJH1u2.cjs} +2 -2
  12. package/dist/{agent-builder-BDYN3r89.cjs.map → agent-builder-DAiJH1u2.cjs.map} +1 -1
  13. package/dist/{agent-builder-Dqy_qumV.js → agent-builder-gGFywDVq.js} +2 -2
  14. package/dist/{agent-builder-Dqy_qumV.js.map → agent-builder-gGFywDVq.js.map} +1 -1
  15. package/dist/{api-schema-manifest-J5hfk5ZZ.cjs → api-schema-manifest-B3bC-D98.cjs} +2 -2
  16. package/dist/{api-schema-manifest-J5hfk5ZZ.cjs.map → api-schema-manifest-B3bC-D98.cjs.map} +1 -1
  17. package/dist/{api-schema-manifest-R8CsF6RX.js → api-schema-manifest-B4J_QYOr.js} +2 -2
  18. package/dist/{api-schema-manifest-R8CsF6RX.js.map → api-schema-manifest-B4J_QYOr.js.map} +1 -1
  19. package/dist/{dist-IUXZtNBY.js → dist-BKRMiJcn.js} +102 -49
  20. package/dist/dist-BKRMiJcn.js.map +1 -0
  21. package/dist/{dist-DgY0llRv.cjs → dist-C2-SedDQ.cjs} +102 -49
  22. package/dist/dist-C2-SedDQ.cjs.map +1 -0
  23. package/dist/docs/SKILL.md +1 -1
  24. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  25. package/dist/docs/references/docs-agents-a2a.md +39 -0
  26. package/dist/docs/references/reference-server-routes.md +25 -11
  27. package/dist/route-builder-CIk5k35M.js.map +1 -1
  28. package/dist/route-builder-CgLVYL1c.cjs.map +1 -1
  29. package/dist/{routes-BzR8iVj4.cjs → routes-CZwPlO3-.cjs} +3 -2
  30. package/dist/routes-CZwPlO3-.cjs.map +1 -0
  31. package/dist/{routes-C7iRCN_l.js → routes-HUaCyUb7.js} +4 -3
  32. package/dist/{routes-C7iRCN_l.js.map → routes-HUaCyUb7.js.map} +1 -1
  33. package/dist/server/a2a/store.cjs +4 -0
  34. package/dist/server/a2a/store.cjs.map +1 -1
  35. package/dist/server/a2a/store.d.ts +3 -0
  36. package/dist/server/a2a/store.d.ts.map +1 -1
  37. package/dist/server/a2a/store.js +4 -0
  38. package/dist/server/a2a/store.js.map +1 -1
  39. package/dist/server/handlers/a2a.cjs +3 -1
  40. package/dist/server/handlers/a2a.d.ts +152 -10
  41. package/dist/server/handlers/a2a.d.ts.map +1 -1
  42. package/dist/server/handlers/a2a.js +2 -2
  43. package/dist/server/handlers/agent-builder.cjs +3 -3
  44. package/dist/server/handlers/agent-builder.js +3 -3
  45. package/dist/server/handlers/agent-controller.cjs +25 -6
  46. package/dist/server/handlers/agent-controller.cjs.map +1 -1
  47. package/dist/server/handlers/agent-controller.d.ts +4 -3
  48. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  49. package/dist/server/handlers/agent-controller.js +25 -6
  50. package/dist/server/handlers/agent-controller.js.map +1 -1
  51. package/dist/server/handlers/mcp-client-versions.cjs +1 -1
  52. package/dist/server/handlers/mcp-client-versions.js +1 -1
  53. package/dist/server/handlers/prompt-block-versions.cjs +1 -1
  54. package/dist/server/handlers/prompt-block-versions.js +1 -1
  55. package/dist/server/handlers/scorer-versions.cjs +1 -1
  56. package/dist/server/handlers/scorer-versions.js +1 -1
  57. package/dist/server/handlers/stored-mcp-clients.cjs +1 -1
  58. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  59. package/dist/server/handlers/stored-prompt-blocks.cjs +1 -1
  60. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  61. package/dist/server/handlers/stored-scorers.cjs +1 -1
  62. package/dist/server/handlers/stored-scorers.js +1 -1
  63. package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
  64. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  65. package/dist/server/handlers/stored-skills.cjs +1 -1
  66. package/dist/server/handlers/stored-skills.js +1 -1
  67. package/dist/server/handlers/system.cjs +1 -1
  68. package/dist/server/handlers/system.js +1 -1
  69. package/dist/server/handlers/workflows.cjs +93 -2
  70. package/dist/server/handlers/workflows.cjs.map +1 -1
  71. package/dist/server/handlers/workflows.d.ts +9 -0
  72. package/dist/server/handlers/workflows.d.ts.map +1 -1
  73. package/dist/server/handlers/workflows.js +92 -3
  74. package/dist/server/handlers/workflows.js.map +1 -1
  75. package/dist/server/handlers.cjs +1 -1
  76. package/dist/server/handlers.js +1 -1
  77. package/dist/server/schemas/a2a.d.ts +70 -6
  78. package/dist/server/schemas/a2a.d.ts.map +1 -1
  79. package/dist/server/schemas/index.cjs +4 -4
  80. package/dist/server/schemas/index.js +4 -4
  81. package/dist/server/schemas/workflows.d.ts +8 -0
  82. package/dist/server/schemas/workflows.d.ts.map +1 -1
  83. package/dist/server/server-adapter/index.cjs +1 -1
  84. package/dist/server/server-adapter/index.js +1 -1
  85. package/dist/server/server-adapter/routes/a2a.d.ts +116 -8
  86. package/dist/server/server-adapter/routes/a2a.d.ts.map +1 -1
  87. package/dist/server/server-adapter/routes/workflows.d.ts +7 -1
  88. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  89. package/dist/{workflows-DPW6FrY0.js → workflows-CMU5dz_4.js} +7 -2
  90. package/dist/workflows-CMU5dz_4.js.map +1 -0
  91. package/dist/{workflows-XfiENvkF.cjs → workflows-Dzxr6cmf.cjs} +12 -1
  92. package/dist/workflows-Dzxr6cmf.cjs.map +1 -0
  93. package/package.json +7 -7
  94. package/dist/a2a-CHi9AJ0n.js.map +0 -1
  95. package/dist/a2a-CnU9zaGR.js.map +0 -1
  96. package/dist/a2a-D3ZYeXIx.cjs.map +0 -1
  97. package/dist/a2a-oM7aqLz4.cjs.map +0 -1
  98. package/dist/dist-DgY0llRv.cjs.map +0 -1
  99. package/dist/dist-IUXZtNBY.js.map +0 -1
  100. package/dist/routes-BzR8iVj4.cjs.map +0 -1
  101. package/dist/workflows-DPW6FrY0.js.map +0 -1
  102. package/dist/workflows-XfiENvkF.cjs.map +0 -1
@@ -5962,7 +5962,7 @@ function splitLines(text) {
5962
5962
  return result;
5963
5963
  }
5964
5964
  //#endregion
5965
- //#region ../memory/dist/src-Iw-V5CfD.js
5965
+ //#region ../memory/dist/src-CdqJP57F.js
5966
5966
  var __defProp$3 = Object.defineProperty;
5967
5967
  var __exportAll = (all, no_symbols) => {
5968
5968
  let target = {};
@@ -24815,9 +24815,10 @@ async function listThreadsForResource({ memory, resourceId, currentThreadId, pag
24815
24815
  hasMore
24816
24816
  };
24817
24817
  }
24818
+ const SEARCH_NOT_CONFIGURED_MESSAGE = "Search is not configured. Enable it with `retrieval: { vector: true }` and configure a vector store and embedder on your Memory instance.";
24818
24819
  async function searchMessagesForResource({ memory, resourceId, currentThreadId, query, topK = 10, maxTokens = DEFAULT_MAX_RESULT_TOKENS, before, after, threadScope }) {
24819
24820
  if (!memory.searchMessages) return {
24820
- results: "Search is not configured. Enable it with `retrieval: { vector: true }` and configure a vector store and embedder on your Memory instance.",
24821
+ results: SEARCH_NOT_CONFIGURED_MESSAGE,
24821
24822
  count: 0
24822
24823
  };
24823
24824
  const MAX_TOPK = 20;
@@ -25363,9 +25364,16 @@ async function recallThreadFromStart({ memory, threadId, resourceId, page = 1, l
25363
25364
  }
25364
25365
  const recallTool = (_memoryConfig, options) => {
25365
25366
  const isResourceScope = (options?.retrievalScope ?? "thread") === "resource";
25367
+ const searchEnabled = options?.searchEnabled ?? true;
25368
+ const description = isResourceScope ? `Browse conversation history. Use mode="threads" to list all threads for the current user. Use mode="messages" (default) to browse messages in the current thread or pass threadId to browse another thread in the active resource. When mode="messages" has no cursor or threadId, it defaults to the current thread and says so at the top of the result. If you pass only a cursor, it must belong to the current thread.${searchEnabled ? " Use mode=\"search\" to find messages by content across all threads." : ""}` : `Browse conversation history in the current thread. Use mode="messages" (default) to page through messages near a cursor.${searchEnabled ? " Use mode=\"search\" to find messages by content in this thread." : ""} Use mode="threads" to get the current thread's ID and title.`;
25369
+ const modeEnum = searchEnabled ? [
25370
+ "messages",
25371
+ "threads",
25372
+ "search"
25373
+ ] : ["messages", "threads"];
25366
25374
  return (0, _mastra_core_tools.createTool)({
25367
25375
  id: "recall",
25368
- description: isResourceScope ? "Browse conversation history. Use mode=\"threads\" to list all threads for the current user. Use mode=\"messages\" (default) to browse messages in the current thread or pass threadId to browse another thread in the active resource. When mode=\"messages\" has no cursor or threadId, it defaults to the current thread and says so at the top of the result. If you pass only a cursor, it must belong to the current thread. Use mode=\"search\" to find messages by content across all threads." : "Browse conversation history in the current thread. Use mode=\"messages\" (default) to page through messages near a cursor. Use mode=\"search\" to find messages by content in this thread. Use mode=\"threads\" to get the current thread's ID and title.",
25376
+ description,
25369
25377
  inputSchema: {
25370
25378
  $schema: "http://json-schema.org/draft-07/schema#",
25371
25379
  type: "object",
@@ -25373,12 +25381,8 @@ const recallTool = (_memoryConfig, options) => {
25373
25381
  ...isResourceScope ? {
25374
25382
  mode: {
25375
25383
  type: "string",
25376
- enum: [
25377
- "messages",
25378
- "threads",
25379
- "search"
25380
- ],
25381
- description: "What to retrieve. \"messages\" (default) pages through message history. \"threads\" lists all threads for the current user. \"search\" finds messages by semantic similarity across all threads."
25384
+ enum: modeEnum,
25385
+ description: `What to retrieve. "messages" (default) pages through message history. "threads" lists all threads for the current user.${searchEnabled ? " \"search\" finds messages by semantic similarity across all threads." : ""}`
25382
25386
  },
25383
25387
  threadId: {
25384
25388
  type: "string",
@@ -25395,18 +25399,14 @@ const recallTool = (_memoryConfig, options) => {
25395
25399
  }
25396
25400
  } : { mode: {
25397
25401
  type: "string",
25398
- enum: [
25399
- "messages",
25400
- "threads",
25401
- "search"
25402
- ],
25403
- description: "What to retrieve. \"messages\" (default) pages through message history. \"threads\" returns info about the current thread. \"search\" finds messages by semantic similarity in this thread."
25402
+ enum: modeEnum,
25403
+ description: `What to retrieve. "messages" (default) pages through message history. "threads" returns info about the current thread.${searchEnabled ? " \"search\" finds messages by semantic similarity in this thread." : ""}`
25404
25404
  } },
25405
- query: {
25405
+ ...searchEnabled ? { query: {
25406
25406
  type: "string",
25407
25407
  minLength: 1,
25408
25408
  description: "Search query for mode=\"search\". Finds messages semantically similar to this text."
25409
- },
25409
+ } } : {},
25410
25410
  cursor: {
25411
25411
  type: "string",
25412
25412
  minLength: 1,
@@ -25467,6 +25467,10 @@ const recallTool = (_memoryConfig, options) => {
25467
25467
  if (!memory) throw new Error("Memory instance is required for recall");
25468
25468
  if (explicitThreadId === "current" && !currentThreadId) throw new Error("Could not resolve current thread.");
25469
25469
  if (mode === "search") {
25470
+ if (!searchEnabled) return {
25471
+ results: SEARCH_NOT_CONFIGURED_MESSAGE,
25472
+ count: 0
25473
+ };
25470
25474
  if (!query) throw new Error("query is required for mode=\"search\"");
25471
25475
  if (!resourceId) throw new Error("Resource ID is required for recall");
25472
25476
  return searchMessagesForResource({
@@ -26410,6 +26414,24 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
26410
26414
  return preservedCalls.length > 0 ? [...preservedCalls, ...unobservedParts] : unobservedParts;
26411
26415
  }
26412
26416
  /**
26417
+ * Get the messages Observational Memory is allowed to work with.
26418
+ *
26419
+ * Messages supplied through the `context` option are per-run ephemeral input. Core's
26420
+ * persistence contract already treats them as never-persist: `MessageStateManager` routes
26421
+ * them into `userContextMessages`, and `drainUnsavedMessages` only drains input/response.
26422
+ *
26423
+ * OM builds its windows from `get.all.db()`, which includes context messages, and then
26424
+ * seals and persists candidates directly — turning ephemeral context into durable user
26425
+ * messages. Excluding them here keeps OM's window, sealing, persistence and token
26426
+ * accounting consistent with that contract.
26427
+ */
26428
+ function getObservableMessages(messageList) {
26429
+ const allMessages = messageList.get.all.db();
26430
+ const contextMessageIds = messageList.makeMessageSourceChecker().context;
26431
+ if (contextMessageIds.size === 0) return allMessages;
26432
+ return allMessages.filter((message) => !contextMessageIds.has(message.id));
26433
+ }
26434
+ /**
26413
26435
  * Safely extract buffered observation chunks from a record.
26414
26436
  * Handles both array and JSON-string formats, returning empty array if malformed.
26415
26437
  */
@@ -26422,7 +26444,7 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
26422
26444
  */
26423
26445
  function filterObservedMessages(opts) {
26424
26446
  const { messageList, record } = opts;
26425
- const allMessages = messageList.get.all.db();
26447
+ const allMessages = getObservableMessages(messageList);
26426
26448
  const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;
26427
26449
  const preserveMessageIds = opts.preserveMessageIds ?? /* @__PURE__ */ new Set();
26428
26450
  const observedIds = new Set(Array.isArray(record?.observedMessageIds) ? record.observedMessageIds : []);
@@ -26969,7 +26991,7 @@ var ObservationStrategy = class ObservationStrategy {
26969
26991
  */
26970
26992
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
26971
26993
  if (!messageList) return false;
26972
- const allMsgs = messageList.get.all.db();
26994
+ const allMsgs = getObservableMessages(messageList);
26973
26995
  for (let i = allMsgs.length - 1; i >= 0; i--) {
26974
26996
  const msg = allMsgs[i];
26975
26997
  if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
@@ -27836,7 +27858,7 @@ var ObservationStep = class {
27836
27858
  let didThresholdCleanup = false;
27837
27859
  let observerExchange;
27838
27860
  if (this.stepNumber === 0) {
27839
- const step0Messages = messageList.get.all.db();
27861
+ const step0Messages = getObservableMessages(messageList);
27840
27862
  const activation = await om.activate({
27841
27863
  threadId,
27842
27864
  resourceId,
@@ -27868,7 +27890,7 @@ var ObservationStep = class {
27868
27890
  currentModel: this.turn.actorModelContext,
27869
27891
  requestContext: this.turn.requestContext,
27870
27892
  observabilityContext: this.turn.observabilityContext,
27871
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27893
+ lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
27872
27894
  reflectionHooks: om.composeHooks(void 0, {
27873
27895
  threadId,
27874
27896
  resourceId,
@@ -27878,7 +27900,7 @@ var ObservationStep = class {
27878
27900
  await this.turn.refreshRecord();
27879
27901
  if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
27880
27902
  }
27881
- const allMsgsForToolCheck = messageList.get.all.db();
27903
+ const allMsgsForToolCheck = getObservableMessages(messageList);
27882
27904
  const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];
27883
27905
  const pendingStepMessages = [...messageList.get.input.db(), ...messageList.get.response.db()];
27884
27906
  const latestStepParts = [...getLatestStepParts(lastMessage?.content?.parts ?? []), ...pendingStepMessages.flatMap((msg) => getLatestStepParts(msg.content?.parts ?? []))];
@@ -27887,10 +27909,10 @@ var ObservationStep = class {
27887
27909
  let statusSnapshot = await om.getStatus({
27888
27910
  threadId,
27889
27911
  resourceId,
27890
- messages: messageList.get.all.db()
27912
+ messages: getObservableMessages(messageList)
27891
27913
  });
27892
27914
  if (statusSnapshot.shouldBuffer && !hasIncompleteToolCalls) {
27893
- const allMessages = messageList.get.all.db();
27915
+ const allMessages = getObservableMessages(messageList);
27894
27916
  const unobservedMessages = om.getUnobservedMessages(allMessages, statusSnapshot.record);
27895
27917
  const candidates = om.getUnobservedMessages(unobservedMessages, statusSnapshot.record, { excludeBuffered: true });
27896
27918
  if (candidates.length > 0) {
@@ -27982,7 +28004,7 @@ var ObservationStep = class {
27982
28004
  statusSnapshot = await om.getStatus({
27983
28005
  threadId,
27984
28006
  resourceId,
27985
- messages: messageList.get.all.db()
28007
+ messages: getObservableMessages(messageList)
27986
28008
  });
27987
28009
  }
27988
28010
  const otherThreadsContext = await this.turn.refreshOtherThreadsContext();
@@ -28031,7 +28053,7 @@ var ObservationStep = class {
28031
28053
  const { threadId, resourceId, messageList } = this.turn;
28032
28054
  const om = this.turn.om;
28033
28055
  await om.waitForBuffering(threadId, resourceId);
28034
- const observableMessages = this.seededResponseMessage ? messageList.get.all.db().filter((msg) => msg.id !== this.turn.responseMessageId) : messageList.get.all.db();
28056
+ const observableMessages = this.seededResponseMessage ? getObservableMessages(messageList).filter((msg) => msg.id !== this.turn.responseMessageId) : getObservableMessages(messageList);
28035
28057
  const freshStatus = await om.getStatus({
28036
28058
  threadId,
28037
28059
  resourceId,
@@ -28061,7 +28083,7 @@ var ObservationStep = class {
28061
28083
  currentModel: this.turn.actorModelContext,
28062
28084
  requestContext: this.turn.requestContext,
28063
28085
  observabilityContext: this.turn.observabilityContext,
28064
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
28086
+ lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
28065
28087
  reflectionHooks: om.composeHooks(void 0, {
28066
28088
  threadId,
28067
28089
  resourceId,
@@ -28087,7 +28109,7 @@ var ObservationStep = class {
28087
28109
  });
28088
28110
  if (obsResult.observed) {
28089
28111
  const observedMessageIds = new Set(obsResult.record.observedMessageIds ?? []);
28090
- const liveMessages = messageList.get.all.db();
28112
+ const liveMessages = getObservableMessages(messageList);
28091
28113
  let latestObservedIndex = -1;
28092
28114
  for (let i = liveMessages.length - 1; i >= 0; i--) {
28093
28115
  const message = liveMessages[i];
@@ -28260,7 +28282,7 @@ var ObservationTurn = class {
28260
28282
  const asyncObservationEnabled = this.om.buffering.isAsyncObservationEnabled();
28261
28283
  const bufferOnIdle = this.om.getObservationConfig().bufferOnIdle;
28262
28284
  if (asyncObservationEnabled && bufferOnIdle) {
28263
- const allMessages = this.messageList.get.all.db();
28285
+ const allMessages = getObservableMessages(this.messageList);
28264
28286
  const record = this._record;
28265
28287
  const unobservedMessages = this.om.getUnobservedMessages(allMessages, record);
28266
28288
  if (unobservedMessages.length > 0) this.om.buffer({
@@ -28626,7 +28648,7 @@ function getCurrentModel$1(model) {
28626
28648
  return formatModelContext$1(model?.provider, model?.modelId);
28627
28649
  }
28628
28650
  function getLastModelFromMessageList(messageList) {
28629
- const messages = messageList?.get.all.db();
28651
+ const messages = messageList ? getObservableMessages(messageList) : void 0;
28630
28652
  if (!messages) return void 0;
28631
28653
  for (let i = messages.length - 1; i >= 0; i--) {
28632
28654
  const message = messages[i];
@@ -30206,7 +30228,7 @@ var ObservationalMemory = class ObservationalMemory {
30206
30228
  */
30207
30229
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
30208
30230
  if (!messageList) return;
30209
- const allMsgs = messageList.get.all.db();
30231
+ const allMsgs = getObservableMessages(messageList);
30210
30232
  for (let i = allMsgs.length - 1; i >= 0; i--) {
30211
30233
  const msg = allMsgs[i];
30212
30234
  if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
@@ -30884,7 +30906,7 @@ ${formattedMessages}
30884
30906
  async cleanupMessages(opts) {
30885
30907
  const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
30886
30908
  const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
30887
- const allMsgs = messageList ? messageList.get.all.db() : opts.messages;
30909
+ const allMsgs = messageList ? getObservableMessages(messageList) : opts.messages;
30888
30910
  let markerIdx = -1;
30889
30911
  let markerMsg = null;
30890
30912
  for (let i = allMsgs.length - 1; i >= 0; i--) {
@@ -31998,7 +32020,7 @@ function isTemporalGapMarkerForMessage(message, targetMessageId) {
31998
32020
  async function insertTemporalGapMarkers({ messageList, sendSignal }) {
31999
32021
  const latestInputMessage = messageList.get.input.db().filter((message) => Boolean(message)).at(-1);
32000
32022
  if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) return;
32001
- const allMessages = messageList.get.all.db().filter((message) => Boolean(message));
32023
+ const allMessages = getObservableMessages(messageList).filter((message) => Boolean(message));
32002
32024
  const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
32003
32025
  if (latestInputIndex <= 0) return;
32004
32026
  if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) return;
@@ -32220,7 +32242,7 @@ var ObservationalMemoryProcessor = class {
32220
32242
  threadId,
32221
32243
  resourceId
32222
32244
  });
32223
- const allDbMsgs = messageList.get.all.db();
32245
+ const allDbMsgs = getObservableMessages(messageList);
32224
32246
  const tokenCounter = this.engine.getTokenCounter();
32225
32247
  const contextTokens = await tokenCounter.countMessagesAsync(allDbMsgs);
32226
32248
  const otherThreadsContext = this.turn.context.otherThreadsContext;
@@ -32567,6 +32589,18 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
32567
32589
  _omEngine;
32568
32590
  _omEngineInstance;
32569
32591
  _mastraInstance;
32592
+ /**
32593
+ * Every vector cleanup that deleteThread or deleteMessages started in the background.
32594
+ * Callers do not wait for the cleanup, so this handle is the only join point.
32595
+ */
32596
+ pendingVectorCleanup = Promise.resolve();
32597
+ /**
32598
+ * Adds a background vector cleanup to the join handle.
32599
+ * The handle keeps the earlier cleanups, so it settles only after all of them end.
32600
+ */
32601
+ trackVectorCleanup(cleanup) {
32602
+ this.pendingVectorCleanup = Promise.allSettled([this.pendingVectorCleanup, cleanup]).then(() => void 0);
32603
+ }
32570
32604
  /** The shared ObservationalMemory engine. Lazily created on first access. */
32571
32605
  get omEngine() {
32572
32606
  if (!this._omEngine) this._omEngine = this._initOMEngine().then((engine) => {
@@ -32831,26 +32865,40 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
32831
32865
  const thread = await memoryStore.getThreadById({ threadId });
32832
32866
  await memoryStore.deleteThread({ threadId });
32833
32867
  if (thread?.resourceId && memoryStore.supportsObservationalMemory) await memoryStore.clearObservationalMemory(threadId, thread.resourceId);
32834
- if (this.vector) this.deleteThreadVectors(threadId);
32868
+ if (this.vector) this.trackVectorCleanup(this.deleteThreadVectors(threadId));
32835
32869
  }
32836
32870
  /**
32837
- * Lists all vector indexes that match the memory messages prefix.
32838
- * Handles separator differences across vector store backends (e.g. '_' vs '-').
32871
+ * Prefix shared by every message index. The index for the default embedding
32872
+ * dimension is named with the bare prefix; other dimensions add a suffix.
32839
32873
  */
32840
- async getMemoryVectorIndexes() {
32874
+ get messageIndexPrefix() {
32875
+ return this.getEmbeddingIndexName();
32876
+ }
32877
+ /**
32878
+ * Prefix shared by every observation index. Each observation index adds a dimension suffix.
32879
+ */
32880
+ get observationIndexPrefix() {
32881
+ return `memory${this.vector?.indexSeparator ?? "_"}observations`;
32882
+ }
32883
+ /**
32884
+ * Lists the vector indexes whose name starts with one of the given prefixes.
32885
+ * Index names can carry a dimension suffix, so discovery matches on the prefix.
32886
+ */
32887
+ async getMemoryVectorIndexes(prefixes) {
32841
32888
  if (!this.vector) return [];
32842
- const prefix = `memory${this.vector.indexSeparator ?? "_"}messages`;
32843
- return (await this.vector.listIndexes()).filter((name) => name.startsWith(prefix));
32889
+ return (await this.vector.listIndexes()).filter((name) => prefixes.some((prefix) => name.startsWith(prefix)));
32844
32890
  }
32845
32891
  /**
32846
32892
  * Deletes all vector embeddings associated with a thread.
32847
32893
  * This is called internally by deleteThread to clean up orphaned vectors.
32894
+ * Both message and observation vectors are removed, so no text of the deleted
32895
+ * thread stays reachable through resource-scoped retrieval.
32848
32896
  *
32849
32897
  * @param threadId - The ID of the thread whose vectors should be deleted
32850
32898
  */
32851
32899
  async deleteThreadVectors(threadId) {
32852
32900
  try {
32853
- const memoryIndexes = await this.getMemoryVectorIndexes();
32901
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix, this.observationIndexPrefix]);
32854
32902
  await Promise.all(memoryIndexes.map(async (indexName) => {
32855
32903
  try {
32856
32904
  await this.vector.deleteVectors({
@@ -32858,14 +32906,14 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
32858
32906
  filter: { thread_id: threadId }
32859
32907
  });
32860
32908
  } catch {
32861
- this.logger.debug("Failed to delete vectors for thread, skipping", {
32909
+ this.logger.warn("Failed to delete vectors of the deleted thread from index", {
32862
32910
  threadId,
32863
32911
  indexName
32864
32912
  });
32865
32913
  }
32866
32914
  }));
32867
32915
  } catch {
32868
- this.logger.debug("Failed to clean up vectors for thread", { threadId });
32916
+ this.logger.warn("Failed to clean up vectors of the deleted thread", { threadId });
32869
32917
  }
32870
32918
  }
32871
32919
  async updateWorkingMemory({ threadId, resourceId, workingMemory, memoryConfig, observabilityContext }) {
@@ -33538,7 +33586,7 @@ Notes:
33538
33586
  getObservationEmbeddingIndexName(dimensions) {
33539
33587
  const usedDimensions = dimensions ?? 384;
33540
33588
  const separator = this.vector?.indexSeparator ?? "_";
33541
- return `memory${separator}observations${separator}${usedDimensions}`;
33589
+ return `${this.observationIndexPrefix}${separator}${usedDimensions}`;
33542
33590
  }
33543
33591
  async createObservationEmbeddingIndex(dimensions) {
33544
33592
  const usedDimensions = dimensions ?? 384;
@@ -33784,7 +33832,10 @@ Notes:
33784
33832
  tools[name] = tool;
33785
33833
  }
33786
33834
  const omConfig = normalizeObservationalMemoryConfig(mergedConfig.observationalMemory);
33787
- if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, { retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource" });
33835
+ if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
33836
+ retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource",
33837
+ searchEnabled: this.hasRetrievalSearch(omConfig.retrieval)
33838
+ });
33788
33839
  return tools;
33789
33840
  }
33790
33841
  /**
@@ -33840,7 +33891,7 @@ Notes:
33840
33891
  }));
33841
33892
  const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
33842
33893
  if (messageIdsNeedingDeletion.size > 0) try {
33843
- const memoryIndexes = await this.getMemoryVectorIndexes();
33894
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
33844
33895
  const idsToDelete = [...messageIdsNeedingDeletion];
33845
33896
  await Promise.all(memoryIndexes.map(async (indexName) => {
33846
33897
  for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
@@ -33899,7 +33950,7 @@ Notes:
33899
33950
  const span = this.createMemorySpan("delete", observabilityContext, void 0, { messageCount: messageIds.length });
33900
33951
  try {
33901
33952
  await (await this.getMemoryStore()).deleteMessages(messageIds);
33902
- if (this.vector) this.deleteMessageVectors(messageIds);
33953
+ if (this.vector) this.trackVectorCleanup(this.deleteMessageVectors(messageIds));
33903
33954
  span?.end({
33904
33955
  output: { success: true },
33905
33956
  attributes: { messageCount: messageIds.length }
@@ -33915,12 +33966,14 @@ Notes:
33915
33966
  /**
33916
33967
  * Deletes vector embeddings for specific messages.
33917
33968
  * This is called internally by deleteMessages to clean up orphaned vectors.
33969
+ * Only the message indexes are touched, because observation vectors can hold
33970
+ * text of other messages of the thread.
33918
33971
  *
33919
33972
  * @param messageIds - The IDs of the messages whose vectors should be deleted
33920
33973
  */
33921
33974
  async deleteMessageVectors(messageIds) {
33922
33975
  try {
33923
- const memoryIndexes = await this.getMemoryVectorIndexes();
33976
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
33924
33977
  await Promise.all(memoryIndexes.map(async (indexName) => {
33925
33978
  for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
33926
33979
  const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
@@ -44696,4 +44749,4 @@ const agentBuilderWorkflows = {
44696
44749
  //#endregion
44697
44750
  exports.agentBuilderWorkflows = agentBuilderWorkflows;
44698
44751
 
44699
- //# sourceMappingURL=dist-DgY0llRv.cjs.map
44752
+ //# sourceMappingURL=dist-C2-SedDQ.cjs.map