@mastra/server 1.57.0 → 1.58.0-alpha.1

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 (109) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/{a2a-uPi5sPwb.js → a2a-CHi9AJ0n.js} +598 -178
  3. package/dist/a2a-CHi9AJ0n.js.map +1 -0
  4. package/dist/{a2a-DKnwIgiw.cjs → a2a-D3ZYeXIx.cjs} +598 -178
  5. package/dist/a2a-D3ZYeXIx.cjs.map +1 -0
  6. package/dist/{api-schema-manifest-7-NC9Dyc.cjs → api-schema-manifest-J5hfk5ZZ.cjs} +2 -2
  7. package/dist/{api-schema-manifest-7-NC9Dyc.cjs.map → api-schema-manifest-J5hfk5ZZ.cjs.map} +1 -1
  8. package/dist/{api-schema-manifest-C5hpdIE_.js → api-schema-manifest-R8CsF6RX.js} +2 -2
  9. package/dist/{api-schema-manifest-C5hpdIE_.js.map → api-schema-manifest-R8CsF6RX.js.map} +1 -1
  10. package/dist/{datasets-Cvix7Rms.cjs → datasets-BMeFvFwT.cjs} +43 -1
  11. package/dist/datasets-BMeFvFwT.cjs.map +1 -0
  12. package/dist/{datasets-dhXnHLAL.js → datasets-BeBH9Seg.js} +38 -2
  13. package/dist/datasets-BeBH9Seg.js.map +1 -0
  14. package/dist/{dist-COHIL6fR.cjs → dist-DgY0llRv.cjs} +116 -28
  15. package/dist/dist-DgY0llRv.cjs.map +1 -0
  16. package/dist/{dist-DGqlUp0b.js → dist-IUXZtNBY.js} +116 -28
  17. package/dist/dist-IUXZtNBY.js.map +1 -0
  18. package/dist/docs/SKILL.md +1 -1
  19. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  20. package/dist/docs/references/docs-agents-a2a.md +36 -2
  21. package/dist/route-builder-CIk5k35M.js.map +1 -1
  22. package/dist/route-builder-CgLVYL1c.cjs.map +1 -1
  23. package/dist/{routes-hSY4wTeS.cjs → routes-BzR8iVj4.cjs} +2 -2
  24. package/dist/{routes-hSY4wTeS.cjs.map → routes-BzR8iVj4.cjs.map} +1 -1
  25. package/dist/{routes-CRoTKPvQ.js → routes-C7iRCN_l.js} +2 -2
  26. package/dist/{routes-CRoTKPvQ.js.map → routes-C7iRCN_l.js.map} +1 -1
  27. package/dist/server/a2a/store.cjs +26 -2
  28. package/dist/server/a2a/store.cjs.map +1 -1
  29. package/dist/server/a2a/store.d.ts +18 -2
  30. package/dist/server/a2a/store.d.ts.map +1 -1
  31. package/dist/server/a2a/store.js +26 -3
  32. package/dist/server/a2a/store.js.map +1 -1
  33. package/dist/server/a2a/task-state.d.ts +4 -0
  34. package/dist/server/a2a/task-state.d.ts.map +1 -0
  35. package/dist/server/a2a/tasks.d.ts +1 -1
  36. package/dist/server/a2a/tasks.d.ts.map +1 -1
  37. package/dist/server/handlers/a2a.cjs +1 -1
  38. package/dist/server/handlers/a2a.d.ts +3 -2
  39. package/dist/server/handlers/a2a.d.ts.map +1 -1
  40. package/dist/server/handlers/a2a.js +1 -1
  41. package/dist/server/handlers/agent-builder.cjs +1 -1
  42. package/dist/server/handlers/agent-builder.js +1 -1
  43. package/dist/server/handlers/agent-versions.cjs +6 -0
  44. package/dist/server/handlers/agent-versions.cjs.map +1 -1
  45. package/dist/server/handlers/agent-versions.d.ts.map +1 -1
  46. package/dist/server/handlers/agent-versions.js +6 -0
  47. package/dist/server/handlers/agent-versions.js.map +1 -1
  48. package/dist/server/handlers/datasets.cjs +26 -11
  49. package/dist/server/handlers/datasets.cjs.map +1 -1
  50. package/dist/server/handlers/datasets.d.ts +136 -0
  51. package/dist/server/handlers/datasets.d.ts.map +1 -1
  52. package/dist/server/handlers/datasets.js +26 -11
  53. package/dist/server/handlers/datasets.js.map +1 -1
  54. package/dist/server/handlers/mcp-client-versions.cjs +1 -1
  55. package/dist/server/handlers/mcp-client-versions.js +1 -1
  56. package/dist/server/handlers/observability.cjs +20 -9
  57. package/dist/server/handlers/observability.cjs.map +1 -1
  58. package/dist/server/handlers/observability.d.ts.map +1 -1
  59. package/dist/server/handlers/observability.js +20 -9
  60. package/dist/server/handlers/observability.js.map +1 -1
  61. package/dist/server/handlers/prompt-block-versions.cjs +1 -1
  62. package/dist/server/handlers/prompt-block-versions.js +1 -1
  63. package/dist/server/handlers/scorer-versions.cjs +1 -1
  64. package/dist/server/handlers/scorer-versions.js +1 -1
  65. package/dist/server/handlers/stored-agents.cjs +16 -1
  66. package/dist/server/handlers/stored-agents.cjs.map +1 -1
  67. package/dist/server/handlers/stored-agents.d.ts.map +1 -1
  68. package/dist/server/handlers/stored-agents.js +16 -1
  69. package/dist/server/handlers/stored-agents.js.map +1 -1
  70. package/dist/server/handlers/stored-mcp-clients.cjs +1 -1
  71. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  72. package/dist/server/handlers/stored-prompt-blocks.cjs +1 -1
  73. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  74. package/dist/server/handlers/stored-scorers.cjs +1 -1
  75. package/dist/server/handlers/stored-scorers.js +1 -1
  76. package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
  77. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  78. package/dist/server/handlers/stored-skills.cjs +1 -1
  79. package/dist/server/handlers/stored-skills.js +1 -1
  80. package/dist/server/handlers/system.cjs +1 -1
  81. package/dist/server/handlers/system.js +1 -1
  82. package/dist/server/handlers/validate-agent-instructions.cjs +52 -0
  83. package/dist/server/handlers/validate-agent-instructions.cjs.map +1 -0
  84. package/dist/server/handlers/validate-agent-instructions.d.ts +13 -0
  85. package/dist/server/handlers/validate-agent-instructions.d.ts.map +1 -0
  86. package/dist/server/handlers/validate-agent-instructions.js +51 -0
  87. package/dist/server/handlers/validate-agent-instructions.js.map +1 -0
  88. package/dist/server/handlers/workflows.cjs +12 -0
  89. package/dist/server/handlers/workflows.cjs.map +1 -1
  90. package/dist/server/handlers/workflows.d.ts.map +1 -1
  91. package/dist/server/handlers/workflows.js +12 -0
  92. package/dist/server/handlers/workflows.js.map +1 -1
  93. package/dist/server/handlers.cjs +1 -1
  94. package/dist/server/handlers.js +1 -1
  95. package/dist/server/schemas/datasets.d.ts +53 -0
  96. package/dist/server/schemas/datasets.d.ts.map +1 -1
  97. package/dist/server/schemas/index.cjs +3 -2
  98. package/dist/server/schemas/index.js +3 -3
  99. package/dist/server/server-adapter/index.cjs +1 -1
  100. package/dist/server/server-adapter/index.js +1 -1
  101. package/dist/server/server-adapter/routes/datasets.d.ts +136 -0
  102. package/dist/server/server-adapter/routes/datasets.d.ts.map +1 -1
  103. package/package.json +5 -5
  104. package/dist/a2a-DKnwIgiw.cjs.map +0 -1
  105. package/dist/a2a-uPi5sPwb.js.map +0 -1
  106. package/dist/datasets-Cvix7Rms.cjs.map +0 -1
  107. package/dist/datasets-dhXnHLAL.js.map +0 -1
  108. package/dist/dist-COHIL6fR.cjs.map +0 -1
  109. package/dist/dist-DGqlUp0b.js.map +0 -1
@@ -5959,7 +5959,7 @@ function splitLines(text) {
5959
5959
  return result;
5960
5960
  }
5961
5961
  //#endregion
5962
- //#region ../memory/dist/src-Cwt9gefz.js
5962
+ //#region ../memory/dist/src-Iw-V5CfD.js
5963
5963
  var __defProp$3 = Object.defineProperty;
5964
5964
  var __exportAll = (all, no_symbols) => {
5965
5965
  let target = {};
@@ -20722,6 +20722,7 @@ var Extractor = class Extractor {
20722
20722
  includePreviousExtraction;
20723
20723
  metadataKeyPath;
20724
20724
  onExtracted;
20725
+ retryStructuredExtractionOnEmptyObject;
20725
20726
  /** @internal */
20726
20727
  internal;
20727
20728
  instructionsConfig;
@@ -20744,6 +20745,7 @@ var Extractor = class Extractor {
20744
20745
  this.includePreviousExtraction = config.includePreviousExtraction ?? true;
20745
20746
  this.metadataKeyPath = config.metadataKeyPath ?? `extracted.${slug}`;
20746
20747
  this.onExtracted = config.onExtracted;
20748
+ this.retryStructuredExtractionOnEmptyObject = config.retryStructuredExtractionOnEmptyObject ?? false;
20747
20749
  this.internal = internal;
20748
20750
  }
20749
20751
  async resolve(context) {
@@ -20756,7 +20758,8 @@ var Extractor = class Extractor {
20756
20758
  ...schema ? { schema } : {},
20757
20759
  includePreviousExtraction: this.includePreviousExtraction,
20758
20760
  metadataKeyPath: this.metadataKeyPath,
20759
- onExtracted: this.onExtracted
20761
+ onExtracted: this.onExtracted,
20762
+ retryStructuredExtractionOnEmptyObject: this.retryStructuredExtractionOnEmptyObject
20760
20763
  }, this.internal);
20761
20764
  }
20762
20765
  };
@@ -21075,6 +21078,9 @@ if (OM_DEBUG_LOG) {
21075
21078
  function isAbortError$1(error, abortSignal) {
21076
21079
  return abortSignal?.aborted === true || error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
21077
21080
  }
21081
+ function shouldRetryEmptyStructuredObject(object, extractors) {
21082
+ return Object.keys(object).length === 0 && extractors.some((extractor) => extractor.retryStructuredExtractionOnEmptyObject);
21083
+ }
21078
21084
  async function extractStructuredValues(opts) {
21079
21085
  const structuredExtractors = (opts.extractors ?? []).filter((extractor) => extractor.mode === "structured");
21080
21086
  if (structuredExtractors.length === 0) return {
@@ -21111,8 +21117,10 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
21111
21117
  return output.object;
21112
21118
  };
21113
21119
  let object;
21120
+ let retryEmptyObject = false;
21114
21121
  try {
21115
21122
  object = await generateWithStructuredOutput();
21123
+ retryEmptyObject = shouldRetryEmptyStructuredObject(object, structuredExtractors);
21116
21124
  } catch (error) {
21117
21125
  if (isAbortError$1(error, opts.abortSignal)) throw error;
21118
21126
  try {
@@ -21129,6 +21137,19 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
21129
21137
  };
21130
21138
  }
21131
21139
  }
21140
+ if (retryEmptyObject) try {
21141
+ object = await generateWithStructuredOutput(coreFeatures.has("json-prompt-injection:inline") ? "inline" : true);
21142
+ } catch (fallbackError) {
21143
+ if (isAbortError$1(fallbackError, opts.abortSignal)) throw fallbackError;
21144
+ const message = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
21145
+ return {
21146
+ values,
21147
+ failures: structuredExtractors.map((extractor) => ({
21148
+ slug: extractor.slug,
21149
+ error: message
21150
+ }))
21151
+ };
21152
+ }
21132
21153
  for (const extractor of structuredExtractors) {
21133
21154
  const value = object[extractor.slug];
21134
21155
  if (value === void 0 || value === null || value === "") continue;
@@ -24412,6 +24433,17 @@ var TokenCounter = class TokenCounter {
24412
24433
  toolResultDelta
24413
24434
  };
24414
24435
  }
24436
+ if (invocation.state === "output-error") {
24437
+ toolResultDelta++;
24438
+ const errorText = invocation.errorText;
24439
+ const errorMessage = typeof errorText === "string" ? errorText : "Tool execution failed";
24440
+ tokens += this.readOrPersistPartEstimate(part, "tool-result-error", errorMessage);
24441
+ return {
24442
+ tokens,
24443
+ overheadDelta,
24444
+ toolResultDelta
24445
+ };
24446
+ }
24415
24447
  throw new Error(`Unhandled tool-invocation state '${part.toolInvocation?.state}' in token counting for part type '${part.type}'`);
24416
24448
  }
24417
24449
  if (typeof part.type === "string" && part.type.startsWith("data-")) return {
@@ -24633,6 +24665,7 @@ var WorkingMemoryExtractor = class extends Extractor {
24633
24665
  name: "Working Memory",
24634
24666
  includePreviousExtraction: false,
24635
24667
  metadataKeyPath: false,
24668
+ retryStructuredExtractionOnEmptyObject: true,
24636
24669
  instructions: async (context) => buildWorkingMemoryInstructions(await getWorkingMemoryDetails(context)),
24637
24670
  schema: async (context) => {
24638
24671
  return (await getWorkingMemoryDetails(context)).usesSchema ? z$2.union([z$2.record(z$2.string(), z$2.unknown()), z$2.null()]) : void 0;
@@ -26798,7 +26831,7 @@ var ObservationStrategy = class ObservationStrategy {
26798
26831
  transient: true
26799
26832
  }).catch(() => {});
26800
26833
  const markerThreadId = marker.data?.threadId ?? this.opts.threadId;
26801
- await this.persistMarkerToStorage(marker, markerThreadId, this.opts.resourceId);
26834
+ if (!await this.persistMarkerToMessage(marker, this.opts.messageList, markerThreadId, this.opts.resourceId)) await this.persistMarkerToStorage(marker, markerThreadId, this.opts.resourceId);
26802
26835
  }
26803
26836
  getObservationMarkerConfig() {
26804
26837
  return {
@@ -26926,9 +26959,13 @@ var ObservationStrategy = class ObservationStrategy {
26926
26959
  /**
26927
26960
  * Persist a marker part on the last assistant message in a MessageList
26928
26961
  * AND save the updated message to the DB.
26962
+ *
26963
+ * @returns true when a marker was placed on an assistant message, false when
26964
+ * no list was provided or the list contains no assistant message (caller
26965
+ * should fall back to `persistMarkerToStorage`).
26929
26966
  */
26930
26967
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
26931
- if (!messageList) return;
26968
+ if (!messageList) return false;
26932
26969
  const allMsgs = messageList.get.all.db();
26933
26970
  for (let i = allMsgs.length - 1; i >= 0; i--) {
26934
26971
  const msg = allMsgs[i];
@@ -26944,9 +26981,10 @@ var ObservationStrategy = class ObservationStrategy {
26944
26981
  } catch (e) {
26945
26982
  omDebug(`[OM:persistMarker] failed to save marker to DB: ${e}`);
26946
26983
  }
26947
- return;
26984
+ return true;
26948
26985
  }
26949
26986
  }
26987
+ return false;
26950
26988
  }
26951
26989
  };
26952
26990
  var SyncObservationStrategy = class extends ObservationStrategy {
@@ -27743,6 +27781,12 @@ var ObservationStep = class {
27743
27781
  stepNumber;
27744
27782
  _prepared = false;
27745
27783
  _context;
27784
+ /**
27785
+ * True when this step seeded an empty assistant response message for a step-0
27786
+ * observation. While set, the response-id rotation hook must NOT run — rotating
27787
+ * would orphan the seed (markers would sit on a message the agent never streams into).
27788
+ */
27789
+ seededResponseMessage = false;
27746
27790
  constructor(turn, stepNumber) {
27747
27791
  this.turn = turn;
27748
27792
  this.stepNumber = stepNumber;
@@ -27871,15 +27915,41 @@ var ObservationStep = class {
27871
27915
  });
27872
27916
  buffered = true;
27873
27917
  }
27874
- if (this.stepNumber > 0) {
27875
- const newInput = messageList.clear.input.db();
27876
- const newOutput = messageList.clear.response.db();
27877
- const messagesToSave = [...newInput, ...newOutput];
27878
- if (messagesToSave.length > 0) {
27879
- await om.persistMessages(messagesToSave, threadId, resourceId);
27880
- for (const msg of messagesToSave) messageList.add(msg, "memory");
27918
+ const willObserveNow = statusSnapshot.shouldObserve && !hasIncompleteToolCalls;
27919
+ /** In-flight message ids the step-0 cleanup must never remove from live context. */
27920
+ let step0PreserveIds;
27921
+ if (this.stepNumber > 0 || willObserveNow) {
27922
+ if (this.stepNumber > 0) {
27923
+ const newInput = messageList.clear.input.db();
27924
+ const newOutput = messageList.clear.response.db();
27925
+ const messagesToSave = [...newInput, ...newOutput];
27926
+ if (messagesToSave.length > 0) {
27927
+ await om.persistMessages(messagesToSave, threadId, resourceId);
27928
+ for (const msg of messagesToSave) messageList.add(msg, "memory");
27929
+ }
27930
+ } else {
27931
+ const pending = [...messageList.get.input.db(), ...messageList.get.response.db()];
27932
+ if (pending.length > 0) await om.persistMessages(pending, threadId, resourceId);
27933
+ step0PreserveIds = pending.map((msg) => msg.id);
27934
+ }
27935
+ if (this.stepNumber === 0 && willObserveNow && this.turn.responseMessageId) {
27936
+ const seed = {
27937
+ id: this.turn.responseMessageId,
27938
+ role: "assistant",
27939
+ content: {
27940
+ format: 2,
27941
+ parts: []
27942
+ },
27943
+ type: "text",
27944
+ createdAt: /* @__PURE__ */ new Date(),
27945
+ threadId,
27946
+ resourceId
27947
+ };
27948
+ messageList.add(seed, "response");
27949
+ this.seededResponseMessage = true;
27950
+ omDebug(`[OM:step0] seeded response message ${seed.id} for step-0 observation markers`);
27881
27951
  }
27882
- if (statusSnapshot.shouldObserve && !hasIncompleteToolCalls) {
27952
+ if (willObserveNow) {
27883
27953
  const preObsGeneration = this.turn.record.generationCount;
27884
27954
  const obsResult = await this.runThresholdObservation();
27885
27955
  observerExchange = obsResult.observerExchange;
@@ -27893,7 +27963,8 @@ var ObservationStep = class {
27893
27963
  resourceId,
27894
27964
  messages: messageList,
27895
27965
  observedMessageIds: observedIds,
27896
- retentionFloor: minRemaining
27966
+ retentionFloor: minRemaining,
27967
+ preserveMessageIds: step0PreserveIds
27897
27968
  });
27898
27969
  if (statusSnapshot.asyncObservationEnabled) await om.resetBufferingState({
27899
27970
  threadId,
@@ -27957,10 +28028,11 @@ var ObservationStep = class {
27957
28028
  const { threadId, resourceId, messageList } = this.turn;
27958
28029
  const om = this.turn.om;
27959
28030
  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();
27960
28032
  const freshStatus = await om.getStatus({
27961
28033
  threadId,
27962
28034
  resourceId,
27963
- messages: messageList.get.all.db()
28035
+ messages: observableMessages
27964
28036
  });
27965
28037
  if (!freshStatus.shouldObserve) return {
27966
28038
  succeeded: false,
@@ -27970,7 +28042,7 @@ var ObservationStep = class {
27970
28042
  const activation = await om.activate({
27971
28043
  threadId,
27972
28044
  resourceId,
27973
- messages: messageList.get.all.db(),
28045
+ messages: observableMessages,
27974
28046
  currentModel: this.turn.actorModelContext,
27975
28047
  writer: this.turn.writer,
27976
28048
  messageList
@@ -28003,7 +28075,8 @@ var ObservationStep = class {
28003
28075
  const obsResult = await om.observe({
28004
28076
  threadId,
28005
28077
  resourceId,
28006
- messages: messageList.get.all.db(),
28078
+ messages: observableMessages,
28079
+ messageList,
28007
28080
  trigger: "turn-sync",
28008
28081
  requestContext: this.turn.requestContext,
28009
28082
  writer: this.turn.writer,
@@ -28020,10 +28093,12 @@ var ObservationStep = class {
28020
28093
  break;
28021
28094
  }
28022
28095
  }
28023
- const messageToSeal = latestObservedIndex >= 0 ? liveMessages[latestObservedIndex] : void 0;
28096
+ let messageToSeal = latestObservedIndex >= 0 ? liveMessages[latestObservedIndex] : void 0;
28097
+ if (this.stepNumber === 0 && messageToSeal?.role !== "assistant") messageToSeal = void 0;
28024
28098
  const messagesToSeal = messageToSeal ? [messageToSeal] : [];
28025
28099
  om.sealMessagesForBuffering(messagesToSeal);
28026
- try {
28100
+ if (this.seededResponseMessage) omDebug("[OM:observe] skipping response-id rotation — step-0 seeded response message holds the active id");
28101
+ else try {
28027
28102
  await this.turn.hooks?.onSyncObservationComplete?.();
28028
28103
  } catch (error) {
28029
28104
  omDebug(`[OM:observe] onSyncObservationComplete hook failed: ${error instanceof Error ? error.message : String(error)}`);
@@ -28082,6 +28157,8 @@ var ObservationTurn = class {
28082
28157
  sendSignal;
28083
28158
  /** Current actor model for this step. Updated by the processor before prepare(). */
28084
28159
  actorModelContext;
28160
+ /** The active assistant response message ID for this step. Updated by the processor before prepare(). */
28161
+ responseMessageId;
28085
28162
  /** Processor-provided hooks for turn/step lifecycle integration. */
28086
28163
  hooks;
28087
28164
  constructor(opts) {
@@ -30742,6 +30819,7 @@ ${formattedMessages}
30742
30819
  */
30743
30820
  async getObservedMessageIdsForCleanup(opts) {
30744
30821
  const { threadId, resourceId, messages, observedMessageIds, retentionFloor } = opts;
30822
+ const preserveSet = opts.preserveMessageIds?.length ? new Set(opts.preserveMessageIds) : null;
30745
30823
  const record = await this.getOrCreateRecord(threadId, resourceId);
30746
30824
  const effectiveObservedIds = observedMessageIds && observedMessageIds.length > 0 ? observedMessageIds : Array.isArray(record.observedMessageIds) ? record.observedMessageIds : [];
30747
30825
  if (effectiveObservedIds.length === 0) return [];
@@ -30753,6 +30831,10 @@ ${formattedMessages}
30753
30831
  const retentionCounter = typeof retentionFloor === "number" ? new TokenCounter() : null;
30754
30832
  for (const msg of messages) {
30755
30833
  if (!msg?.id || msg.id === "om-continuation" || !observedSet.has(msg.id)) continue;
30834
+ if (preserveSet?.has(msg.id)) {
30835
+ skipped += 1;
30836
+ continue;
30837
+ }
30756
30838
  const unobservedParts = getUnobservedParts(msg);
30757
30839
  const totalParts = msg.content?.parts?.length ?? 0;
30758
30840
  if (unobservedParts.length > 0 && unobservedParts.length < totalParts) {
@@ -30797,7 +30879,7 @@ ${formattedMessages}
30797
30879
  */
30798
30880
  /** @internal Used by ObservationStep. */
30799
30881
  async cleanupMessages(opts) {
30800
- const { threadId, resourceId, observedMessageIds, retentionFloor } = opts;
30882
+ const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
30801
30883
  const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
30802
30884
  const allMsgs = messageList ? messageList.get.all.db() : opts.messages;
30803
30885
  let markerIdx = -1;
@@ -30818,7 +30900,8 @@ ${formattedMessages}
30818
30900
  resourceId,
30819
30901
  messages: allMsgs,
30820
30902
  observedMessageIds,
30821
- retentionFloor
30903
+ retentionFloor,
30904
+ preserveMessageIds
30822
30905
  });
30823
30906
  if (messageList) {
30824
30907
  if (idsToRemoveList.length > 0) messageList.removeByIds(idsToRemoveList);
@@ -30830,18 +30913,21 @@ ${formattedMessages}
30830
30913
  if (markerMsg && markerIdx !== -1) {
30831
30914
  const idsToRemove = [];
30832
30915
  const messagesToSave = [];
30916
+ const preserveSet = preserveMessageIds?.length ? new Set(preserveMessageIds) : null;
30833
30917
  for (let i = 0; i < markerIdx; i++) {
30834
30918
  const msg = allMsgs[i];
30835
- if (msg?.id && msg.id !== "om-continuation") {
30919
+ if (msg?.id && msg.id !== "om-continuation" && !preserveSet?.has(msg.id)) {
30836
30920
  idsToRemove.push(msg.id);
30837
30921
  messagesToSave.push(msg);
30838
30922
  }
30839
30923
  }
30840
30924
  messagesToSave.push(markerMsg);
30841
- const unobservedParts = getUnobservedParts(markerMsg);
30842
- if (unobservedParts.length === 0) {
30843
- if (markerMsg.id) idsToRemove.push(markerMsg.id);
30844
- } else if (unobservedParts.length < (markerMsg.content?.parts?.length ?? 0)) markerMsg.content.parts = unobservedParts;
30925
+ if (!Boolean(markerMsg.id && preserveSet?.has(markerMsg.id))) {
30926
+ const unobservedParts = getUnobservedParts(markerMsg);
30927
+ if (unobservedParts.length === 0) {
30928
+ if (markerMsg.id) idsToRemove.push(markerMsg.id);
30929
+ } else if (unobservedParts.length < (markerMsg.content?.parts?.length ?? 0)) markerMsg.content.parts = unobservedParts;
30930
+ }
30845
30931
  if (messageList) {
30846
30932
  if (idsToRemove.length > 0) messageList.removeByIds(idsToRemove);
30847
30933
  if (messagesToSave.length > 0) await this.persistMessages(messagesToSave, threadId, resourceId);
@@ -31628,6 +31714,7 @@ ${formattedMessages}
31628
31714
  threadId,
31629
31715
  resourceId,
31630
31716
  messages: unobservedMessages,
31717
+ messageList: opts.messageList,
31631
31718
  reflectionHooks,
31632
31719
  agent: opts.agent,
31633
31720
  requestContext,
@@ -32013,7 +32100,7 @@ var ObservationalMemoryProcessor = class {
32013
32100
  this.temporalMarkers = options?.temporalMarkers ?? false;
32014
32101
  }
32015
32102
  async processInputStep(args) {
32016
- const { messageList, requestContext, stepNumber, state: _state, writer, model, abortSignal, abort, rotateResponseMessageId } = args;
32103
+ const { messageList, requestContext, stepNumber, state: _state, writer, model, abortSignal, abort, messageId, rotateResponseMessageId } = args;
32017
32104
  const state = _state ?? {};
32018
32105
  omDebug(`[OM:processInputStep:ENTER] step=${stepNumber}, hasMastraMemory=${!!requestContext?.get("MastraMemory")}, hasMemoryInfo=${!!messageList?.serialize()?.memoryInfo?.threadId}`);
32019
32106
  const context = this.engine.getThreadContext(requestContext, messageList);
@@ -32099,6 +32186,7 @@ var ObservationalMemoryProcessor = class {
32099
32186
  state.__omObservabilityContext = observabilityContext;
32100
32187
  this.turn.observabilityContext = observabilityContext;
32101
32188
  this.turn.actorModelContext = actorModelContext;
32189
+ this.turn.responseMessageId = messageId;
32102
32190
  {
32103
32191
  const step = this.turn.step(stepNumber);
32104
32192
  let ctx;
@@ -44602,4 +44690,4 @@ const agentBuilderWorkflows = {
44602
44690
  //#endregion
44603
44691
  export { agentBuilderWorkflows };
44604
44692
 
44605
- //# sourceMappingURL=dist-DGqlUp0b.js.map
44693
+ //# sourceMappingURL=dist-IUXZtNBY.js.map