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

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 (106) hide show
  1. package/CHANGELOG.md +87 -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 +42 -1
  84. package/dist/server/server-adapter/index.cjs.map +1 -1
  85. package/dist/server/server-adapter/index.d.ts +37 -0
  86. package/dist/server/server-adapter/index.d.ts.map +1 -1
  87. package/dist/server/server-adapter/index.js +43 -3
  88. package/dist/server/server-adapter/index.js.map +1 -1
  89. package/dist/server/server-adapter/routes/a2a.d.ts +116 -8
  90. package/dist/server/server-adapter/routes/a2a.d.ts.map +1 -1
  91. package/dist/server/server-adapter/routes/workflows.d.ts +7 -1
  92. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  93. package/dist/{workflows-DPW6FrY0.js → workflows-CMU5dz_4.js} +7 -2
  94. package/dist/workflows-CMU5dz_4.js.map +1 -0
  95. package/dist/{workflows-XfiENvkF.cjs → workflows-Dzxr6cmf.cjs} +12 -1
  96. package/dist/workflows-Dzxr6cmf.cjs.map +1 -0
  97. package/package.json +6 -6
  98. package/dist/a2a-CHi9AJ0n.js.map +0 -1
  99. package/dist/a2a-CnU9zaGR.js.map +0 -1
  100. package/dist/a2a-D3ZYeXIx.cjs.map +0 -1
  101. package/dist/a2a-oM7aqLz4.cjs.map +0 -1
  102. package/dist/dist-DgY0llRv.cjs.map +0 -1
  103. package/dist/dist-IUXZtNBY.js.map +0 -1
  104. package/dist/routes-BzR8iVj4.cjs.map +0 -1
  105. package/dist/workflows-DPW6FrY0.js.map +0 -1
  106. package/dist/workflows-XfiENvkF.cjs.map +0 -1
@@ -5959,7 +5959,7 @@ function splitLines(text) {
5959
5959
  return result;
5960
5960
  }
5961
5961
  //#endregion
5962
- //#region ../memory/dist/src-Iw-V5CfD.js
5962
+ //#region ../memory/dist/src-CdqJP57F.js
5963
5963
  var __defProp$3 = Object.defineProperty;
5964
5964
  var __exportAll = (all, no_symbols) => {
5965
5965
  let target = {};
@@ -24812,9 +24812,10 @@ async function listThreadsForResource({ memory, resourceId, currentThreadId, pag
24812
24812
  hasMore
24813
24813
  };
24814
24814
  }
24815
+ 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.";
24815
24816
  async function searchMessagesForResource({ memory, resourceId, currentThreadId, query, topK = 10, maxTokens = DEFAULT_MAX_RESULT_TOKENS, before, after, threadScope }) {
24816
24817
  if (!memory.searchMessages) return {
24817
- results: "Search is not configured. Enable it with `retrieval: { vector: true }` and configure a vector store and embedder on your Memory instance.",
24818
+ results: SEARCH_NOT_CONFIGURED_MESSAGE,
24818
24819
  count: 0
24819
24820
  };
24820
24821
  const MAX_TOPK = 20;
@@ -25360,9 +25361,16 @@ async function recallThreadFromStart({ memory, threadId, resourceId, page = 1, l
25360
25361
  }
25361
25362
  const recallTool = (_memoryConfig, options) => {
25362
25363
  const isResourceScope = (options?.retrievalScope ?? "thread") === "resource";
25364
+ const searchEnabled = options?.searchEnabled ?? true;
25365
+ 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.`;
25366
+ const modeEnum = searchEnabled ? [
25367
+ "messages",
25368
+ "threads",
25369
+ "search"
25370
+ ] : ["messages", "threads"];
25363
25371
  return createTool({
25364
25372
  id: "recall",
25365
- 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.",
25373
+ description,
25366
25374
  inputSchema: {
25367
25375
  $schema: "http://json-schema.org/draft-07/schema#",
25368
25376
  type: "object",
@@ -25370,12 +25378,8 @@ const recallTool = (_memoryConfig, options) => {
25370
25378
  ...isResourceScope ? {
25371
25379
  mode: {
25372
25380
  type: "string",
25373
- enum: [
25374
- "messages",
25375
- "threads",
25376
- "search"
25377
- ],
25378
- 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."
25381
+ enum: modeEnum,
25382
+ 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." : ""}`
25379
25383
  },
25380
25384
  threadId: {
25381
25385
  type: "string",
@@ -25392,18 +25396,14 @@ const recallTool = (_memoryConfig, options) => {
25392
25396
  }
25393
25397
  } : { mode: {
25394
25398
  type: "string",
25395
- enum: [
25396
- "messages",
25397
- "threads",
25398
- "search"
25399
- ],
25400
- 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."
25399
+ enum: modeEnum,
25400
+ 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." : ""}`
25401
25401
  } },
25402
- query: {
25402
+ ...searchEnabled ? { query: {
25403
25403
  type: "string",
25404
25404
  minLength: 1,
25405
25405
  description: "Search query for mode=\"search\". Finds messages semantically similar to this text."
25406
- },
25406
+ } } : {},
25407
25407
  cursor: {
25408
25408
  type: "string",
25409
25409
  minLength: 1,
@@ -25464,6 +25464,10 @@ const recallTool = (_memoryConfig, options) => {
25464
25464
  if (!memory) throw new Error("Memory instance is required for recall");
25465
25465
  if (explicitThreadId === "current" && !currentThreadId) throw new Error("Could not resolve current thread.");
25466
25466
  if (mode === "search") {
25467
+ if (!searchEnabled) return {
25468
+ results: SEARCH_NOT_CONFIGURED_MESSAGE,
25469
+ count: 0
25470
+ };
25467
25471
  if (!query) throw new Error("query is required for mode=\"search\"");
25468
25472
  if (!resourceId) throw new Error("Resource ID is required for recall");
25469
25473
  return searchMessagesForResource({
@@ -26407,6 +26411,24 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
26407
26411
  return preservedCalls.length > 0 ? [...preservedCalls, ...unobservedParts] : unobservedParts;
26408
26412
  }
26409
26413
  /**
26414
+ * Get the messages Observational Memory is allowed to work with.
26415
+ *
26416
+ * Messages supplied through the `context` option are per-run ephemeral input. Core's
26417
+ * persistence contract already treats them as never-persist: `MessageStateManager` routes
26418
+ * them into `userContextMessages`, and `drainUnsavedMessages` only drains input/response.
26419
+ *
26420
+ * OM builds its windows from `get.all.db()`, which includes context messages, and then
26421
+ * seals and persists candidates directly — turning ephemeral context into durable user
26422
+ * messages. Excluding them here keeps OM's window, sealing, persistence and token
26423
+ * accounting consistent with that contract.
26424
+ */
26425
+ function getObservableMessages(messageList) {
26426
+ const allMessages = messageList.get.all.db();
26427
+ const contextMessageIds = messageList.makeMessageSourceChecker().context;
26428
+ if (contextMessageIds.size === 0) return allMessages;
26429
+ return allMessages.filter((message) => !contextMessageIds.has(message.id));
26430
+ }
26431
+ /**
26410
26432
  * Safely extract buffered observation chunks from a record.
26411
26433
  * Handles both array and JSON-string formats, returning empty array if malformed.
26412
26434
  */
@@ -26419,7 +26441,7 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
26419
26441
  */
26420
26442
  function filterObservedMessages(opts) {
26421
26443
  const { messageList, record } = opts;
26422
- const allMessages = messageList.get.all.db();
26444
+ const allMessages = getObservableMessages(messageList);
26423
26445
  const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;
26424
26446
  const preserveMessageIds = opts.preserveMessageIds ?? /* @__PURE__ */ new Set();
26425
26447
  const observedIds = new Set(Array.isArray(record?.observedMessageIds) ? record.observedMessageIds : []);
@@ -26966,7 +26988,7 @@ var ObservationStrategy = class ObservationStrategy {
26966
26988
  */
26967
26989
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
26968
26990
  if (!messageList) return false;
26969
- const allMsgs = messageList.get.all.db();
26991
+ const allMsgs = getObservableMessages(messageList);
26970
26992
  for (let i = allMsgs.length - 1; i >= 0; i--) {
26971
26993
  const msg = allMsgs[i];
26972
26994
  if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
@@ -27833,7 +27855,7 @@ var ObservationStep = class {
27833
27855
  let didThresholdCleanup = false;
27834
27856
  let observerExchange;
27835
27857
  if (this.stepNumber === 0) {
27836
- const step0Messages = messageList.get.all.db();
27858
+ const step0Messages = getObservableMessages(messageList);
27837
27859
  const activation = await om.activate({
27838
27860
  threadId,
27839
27861
  resourceId,
@@ -27865,7 +27887,7 @@ var ObservationStep = class {
27865
27887
  currentModel: this.turn.actorModelContext,
27866
27888
  requestContext: this.turn.requestContext,
27867
27889
  observabilityContext: this.turn.observabilityContext,
27868
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27890
+ lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
27869
27891
  reflectionHooks: om.composeHooks(void 0, {
27870
27892
  threadId,
27871
27893
  resourceId,
@@ -27875,7 +27897,7 @@ var ObservationStep = class {
27875
27897
  await this.turn.refreshRecord();
27876
27898
  if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
27877
27899
  }
27878
- const allMsgsForToolCheck = messageList.get.all.db();
27900
+ const allMsgsForToolCheck = getObservableMessages(messageList);
27879
27901
  const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];
27880
27902
  const pendingStepMessages = [...messageList.get.input.db(), ...messageList.get.response.db()];
27881
27903
  const latestStepParts = [...getLatestStepParts(lastMessage?.content?.parts ?? []), ...pendingStepMessages.flatMap((msg) => getLatestStepParts(msg.content?.parts ?? []))];
@@ -27884,10 +27906,10 @@ var ObservationStep = class {
27884
27906
  let statusSnapshot = await om.getStatus({
27885
27907
  threadId,
27886
27908
  resourceId,
27887
- messages: messageList.get.all.db()
27909
+ messages: getObservableMessages(messageList)
27888
27910
  });
27889
27911
  if (statusSnapshot.shouldBuffer && !hasIncompleteToolCalls) {
27890
- const allMessages = messageList.get.all.db();
27912
+ const allMessages = getObservableMessages(messageList);
27891
27913
  const unobservedMessages = om.getUnobservedMessages(allMessages, statusSnapshot.record);
27892
27914
  const candidates = om.getUnobservedMessages(unobservedMessages, statusSnapshot.record, { excludeBuffered: true });
27893
27915
  if (candidates.length > 0) {
@@ -27979,7 +28001,7 @@ var ObservationStep = class {
27979
28001
  statusSnapshot = await om.getStatus({
27980
28002
  threadId,
27981
28003
  resourceId,
27982
- messages: messageList.get.all.db()
28004
+ messages: getObservableMessages(messageList)
27983
28005
  });
27984
28006
  }
27985
28007
  const otherThreadsContext = await this.turn.refreshOtherThreadsContext();
@@ -28028,7 +28050,7 @@ var ObservationStep = class {
28028
28050
  const { threadId, resourceId, messageList } = this.turn;
28029
28051
  const om = this.turn.om;
28030
28052
  await om.waitForBuffering(threadId, resourceId);
28031
- const observableMessages = this.seededResponseMessage ? messageList.get.all.db().filter((msg) => msg.id !== this.turn.responseMessageId) : messageList.get.all.db();
28053
+ const observableMessages = this.seededResponseMessage ? getObservableMessages(messageList).filter((msg) => msg.id !== this.turn.responseMessageId) : getObservableMessages(messageList);
28032
28054
  const freshStatus = await om.getStatus({
28033
28055
  threadId,
28034
28056
  resourceId,
@@ -28058,7 +28080,7 @@ var ObservationStep = class {
28058
28080
  currentModel: this.turn.actorModelContext,
28059
28081
  requestContext: this.turn.requestContext,
28060
28082
  observabilityContext: this.turn.observabilityContext,
28061
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
28083
+ lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
28062
28084
  reflectionHooks: om.composeHooks(void 0, {
28063
28085
  threadId,
28064
28086
  resourceId,
@@ -28084,7 +28106,7 @@ var ObservationStep = class {
28084
28106
  });
28085
28107
  if (obsResult.observed) {
28086
28108
  const observedMessageIds = new Set(obsResult.record.observedMessageIds ?? []);
28087
- const liveMessages = messageList.get.all.db();
28109
+ const liveMessages = getObservableMessages(messageList);
28088
28110
  let latestObservedIndex = -1;
28089
28111
  for (let i = liveMessages.length - 1; i >= 0; i--) {
28090
28112
  const message = liveMessages[i];
@@ -28257,7 +28279,7 @@ var ObservationTurn = class {
28257
28279
  const asyncObservationEnabled = this.om.buffering.isAsyncObservationEnabled();
28258
28280
  const bufferOnIdle = this.om.getObservationConfig().bufferOnIdle;
28259
28281
  if (asyncObservationEnabled && bufferOnIdle) {
28260
- const allMessages = this.messageList.get.all.db();
28282
+ const allMessages = getObservableMessages(this.messageList);
28261
28283
  const record = this._record;
28262
28284
  const unobservedMessages = this.om.getUnobservedMessages(allMessages, record);
28263
28285
  if (unobservedMessages.length > 0) this.om.buffer({
@@ -28623,7 +28645,7 @@ function getCurrentModel$1(model) {
28623
28645
  return formatModelContext$1(model?.provider, model?.modelId);
28624
28646
  }
28625
28647
  function getLastModelFromMessageList(messageList) {
28626
- const messages = messageList?.get.all.db();
28648
+ const messages = messageList ? getObservableMessages(messageList) : void 0;
28627
28649
  if (!messages) return void 0;
28628
28650
  for (let i = messages.length - 1; i >= 0; i--) {
28629
28651
  const message = messages[i];
@@ -30203,7 +30225,7 @@ var ObservationalMemory = class ObservationalMemory {
30203
30225
  */
30204
30226
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
30205
30227
  if (!messageList) return;
30206
- const allMsgs = messageList.get.all.db();
30228
+ const allMsgs = getObservableMessages(messageList);
30207
30229
  for (let i = allMsgs.length - 1; i >= 0; i--) {
30208
30230
  const msg = allMsgs[i];
30209
30231
  if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
@@ -30881,7 +30903,7 @@ ${formattedMessages}
30881
30903
  async cleanupMessages(opts) {
30882
30904
  const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
30883
30905
  const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
30884
- const allMsgs = messageList ? messageList.get.all.db() : opts.messages;
30906
+ const allMsgs = messageList ? getObservableMessages(messageList) : opts.messages;
30885
30907
  let markerIdx = -1;
30886
30908
  let markerMsg = null;
30887
30909
  for (let i = allMsgs.length - 1; i >= 0; i--) {
@@ -31995,7 +32017,7 @@ function isTemporalGapMarkerForMessage(message, targetMessageId) {
31995
32017
  async function insertTemporalGapMarkers({ messageList, sendSignal }) {
31996
32018
  const latestInputMessage = messageList.get.input.db().filter((message) => Boolean(message)).at(-1);
31997
32019
  if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) return;
31998
- const allMessages = messageList.get.all.db().filter((message) => Boolean(message));
32020
+ const allMessages = getObservableMessages(messageList).filter((message) => Boolean(message));
31999
32021
  const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
32000
32022
  if (latestInputIndex <= 0) return;
32001
32023
  if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) return;
@@ -32217,7 +32239,7 @@ var ObservationalMemoryProcessor = class {
32217
32239
  threadId,
32218
32240
  resourceId
32219
32241
  });
32220
- const allDbMsgs = messageList.get.all.db();
32242
+ const allDbMsgs = getObservableMessages(messageList);
32221
32243
  const tokenCounter = this.engine.getTokenCounter();
32222
32244
  const contextTokens = await tokenCounter.countMessagesAsync(allDbMsgs);
32223
32245
  const otherThreadsContext = this.turn.context.otherThreadsContext;
@@ -32564,6 +32586,18 @@ var Memory = class extends MastraMemory {
32564
32586
  _omEngine;
32565
32587
  _omEngineInstance;
32566
32588
  _mastraInstance;
32589
+ /**
32590
+ * Every vector cleanup that deleteThread or deleteMessages started in the background.
32591
+ * Callers do not wait for the cleanup, so this handle is the only join point.
32592
+ */
32593
+ pendingVectorCleanup = Promise.resolve();
32594
+ /**
32595
+ * Adds a background vector cleanup to the join handle.
32596
+ * The handle keeps the earlier cleanups, so it settles only after all of them end.
32597
+ */
32598
+ trackVectorCleanup(cleanup) {
32599
+ this.pendingVectorCleanup = Promise.allSettled([this.pendingVectorCleanup, cleanup]).then(() => void 0);
32600
+ }
32567
32601
  /** The shared ObservationalMemory engine. Lazily created on first access. */
32568
32602
  get omEngine() {
32569
32603
  if (!this._omEngine) this._omEngine = this._initOMEngine().then((engine) => {
@@ -32828,26 +32862,40 @@ var Memory = class extends MastraMemory {
32828
32862
  const thread = await memoryStore.getThreadById({ threadId });
32829
32863
  await memoryStore.deleteThread({ threadId });
32830
32864
  if (thread?.resourceId && memoryStore.supportsObservationalMemory) await memoryStore.clearObservationalMemory(threadId, thread.resourceId);
32831
- if (this.vector) this.deleteThreadVectors(threadId);
32865
+ if (this.vector) this.trackVectorCleanup(this.deleteThreadVectors(threadId));
32832
32866
  }
32833
32867
  /**
32834
- * Lists all vector indexes that match the memory messages prefix.
32835
- * Handles separator differences across vector store backends (e.g. '_' vs '-').
32868
+ * Prefix shared by every message index. The index for the default embedding
32869
+ * dimension is named with the bare prefix; other dimensions add a suffix.
32836
32870
  */
32837
- async getMemoryVectorIndexes() {
32871
+ get messageIndexPrefix() {
32872
+ return this.getEmbeddingIndexName();
32873
+ }
32874
+ /**
32875
+ * Prefix shared by every observation index. Each observation index adds a dimension suffix.
32876
+ */
32877
+ get observationIndexPrefix() {
32878
+ return `memory${this.vector?.indexSeparator ?? "_"}observations`;
32879
+ }
32880
+ /**
32881
+ * Lists the vector indexes whose name starts with one of the given prefixes.
32882
+ * Index names can carry a dimension suffix, so discovery matches on the prefix.
32883
+ */
32884
+ async getMemoryVectorIndexes(prefixes) {
32838
32885
  if (!this.vector) return [];
32839
- const prefix = `memory${this.vector.indexSeparator ?? "_"}messages`;
32840
- return (await this.vector.listIndexes()).filter((name) => name.startsWith(prefix));
32886
+ return (await this.vector.listIndexes()).filter((name) => prefixes.some((prefix) => name.startsWith(prefix)));
32841
32887
  }
32842
32888
  /**
32843
32889
  * Deletes all vector embeddings associated with a thread.
32844
32890
  * This is called internally by deleteThread to clean up orphaned vectors.
32891
+ * Both message and observation vectors are removed, so no text of the deleted
32892
+ * thread stays reachable through resource-scoped retrieval.
32845
32893
  *
32846
32894
  * @param threadId - The ID of the thread whose vectors should be deleted
32847
32895
  */
32848
32896
  async deleteThreadVectors(threadId) {
32849
32897
  try {
32850
- const memoryIndexes = await this.getMemoryVectorIndexes();
32898
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix, this.observationIndexPrefix]);
32851
32899
  await Promise.all(memoryIndexes.map(async (indexName) => {
32852
32900
  try {
32853
32901
  await this.vector.deleteVectors({
@@ -32855,14 +32903,14 @@ var Memory = class extends MastraMemory {
32855
32903
  filter: { thread_id: threadId }
32856
32904
  });
32857
32905
  } catch {
32858
- this.logger.debug("Failed to delete vectors for thread, skipping", {
32906
+ this.logger.warn("Failed to delete vectors of the deleted thread from index", {
32859
32907
  threadId,
32860
32908
  indexName
32861
32909
  });
32862
32910
  }
32863
32911
  }));
32864
32912
  } catch {
32865
- this.logger.debug("Failed to clean up vectors for thread", { threadId });
32913
+ this.logger.warn("Failed to clean up vectors of the deleted thread", { threadId });
32866
32914
  }
32867
32915
  }
32868
32916
  async updateWorkingMemory({ threadId, resourceId, workingMemory, memoryConfig, observabilityContext }) {
@@ -33535,7 +33583,7 @@ Notes:
33535
33583
  getObservationEmbeddingIndexName(dimensions) {
33536
33584
  const usedDimensions = dimensions ?? 384;
33537
33585
  const separator = this.vector?.indexSeparator ?? "_";
33538
- return `memory${separator}observations${separator}${usedDimensions}`;
33586
+ return `${this.observationIndexPrefix}${separator}${usedDimensions}`;
33539
33587
  }
33540
33588
  async createObservationEmbeddingIndex(dimensions) {
33541
33589
  const usedDimensions = dimensions ?? 384;
@@ -33781,7 +33829,10 @@ Notes:
33781
33829
  tools[name] = tool;
33782
33830
  }
33783
33831
  const omConfig = normalizeObservationalMemoryConfig(mergedConfig.observationalMemory);
33784
- if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, { retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource" });
33832
+ if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
33833
+ retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource",
33834
+ searchEnabled: this.hasRetrievalSearch(omConfig.retrieval)
33835
+ });
33785
33836
  return tools;
33786
33837
  }
33787
33838
  /**
@@ -33837,7 +33888,7 @@ Notes:
33837
33888
  }));
33838
33889
  const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
33839
33890
  if (messageIdsNeedingDeletion.size > 0) try {
33840
- const memoryIndexes = await this.getMemoryVectorIndexes();
33891
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
33841
33892
  const idsToDelete = [...messageIdsNeedingDeletion];
33842
33893
  await Promise.all(memoryIndexes.map(async (indexName) => {
33843
33894
  for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
@@ -33896,7 +33947,7 @@ Notes:
33896
33947
  const span = this.createMemorySpan("delete", observabilityContext, void 0, { messageCount: messageIds.length });
33897
33948
  try {
33898
33949
  await (await this.getMemoryStore()).deleteMessages(messageIds);
33899
- if (this.vector) this.deleteMessageVectors(messageIds);
33950
+ if (this.vector) this.trackVectorCleanup(this.deleteMessageVectors(messageIds));
33900
33951
  span?.end({
33901
33952
  output: { success: true },
33902
33953
  attributes: { messageCount: messageIds.length }
@@ -33912,12 +33963,14 @@ Notes:
33912
33963
  /**
33913
33964
  * Deletes vector embeddings for specific messages.
33914
33965
  * This is called internally by deleteMessages to clean up orphaned vectors.
33966
+ * Only the message indexes are touched, because observation vectors can hold
33967
+ * text of other messages of the thread.
33915
33968
  *
33916
33969
  * @param messageIds - The IDs of the messages whose vectors should be deleted
33917
33970
  */
33918
33971
  async deleteMessageVectors(messageIds) {
33919
33972
  try {
33920
- const memoryIndexes = await this.getMemoryVectorIndexes();
33973
+ const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
33921
33974
  await Promise.all(memoryIndexes.map(async (indexName) => {
33922
33975
  for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
33923
33976
  const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
@@ -44690,4 +44743,4 @@ const agentBuilderWorkflows = {
44690
44743
  //#endregion
44691
44744
  export { agentBuilderWorkflows };
44692
44745
 
44693
- //# sourceMappingURL=dist-IUXZtNBY.js.map
44746
+ //# sourceMappingURL=dist-BKRMiJcn.js.map