@mastra/memory 1.25.1-alpha.0 → 1.26.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/docs/SKILL.md +1 -1
  3. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  4. package/dist/docs/references/docs-capabilities-subagents.md +23 -5
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/processors/index.cjs +1 -1
  9. package/dist/processors/index.js +1 -1
  10. package/dist/processors/observational-memory/extraction-runner.d.ts.map +1 -1
  11. package/dist/processors/observational-memory/extractor.d.ts +3 -0
  12. package/dist/processors/observational-memory/extractor.d.ts.map +1 -1
  13. package/dist/processors/observational-memory/message-utils.d.ts.map +1 -1
  14. package/dist/processors/observational-memory/observation-strategies/base.d.ts +5 -1
  15. package/dist/processors/observational-memory/observation-strategies/base.d.ts.map +1 -1
  16. package/dist/processors/observational-memory/observation-strategies/types.d.ts +7 -1
  17. package/dist/processors/observational-memory/observation-strategies/types.d.ts.map +1 -1
  18. package/dist/processors/observational-memory/observation-turn/step.d.ts +6 -0
  19. package/dist/processors/observational-memory/observation-turn/step.d.ts.map +1 -1
  20. package/dist/processors/observational-memory/observation-turn/turn.d.ts +2 -0
  21. package/dist/processors/observational-memory/observation-turn/turn.d.ts.map +1 -1
  22. package/dist/processors/observational-memory/observational-memory.d.ts +14 -0
  23. package/dist/processors/observational-memory/observational-memory.d.ts.map +1 -1
  24. package/dist/processors/observational-memory/processor.d.ts.map +1 -1
  25. package/dist/processors/observational-memory/token-counter.d.ts.map +1 -1
  26. package/dist/processors/observational-memory/working-memory-extractor.d.ts.map +1 -1
  27. package/dist/{src-DvQWV6nH.js → src-Iw-V5CfD.js} +285 -67
  28. package/dist/src-Iw-V5CfD.js.map +1 -0
  29. package/dist/{src-Bz9Fg416.cjs → src-x5iu_K3X.cjs} +287 -69
  30. package/dist/src-x5iu_K3X.cjs.map +1 -0
  31. package/package.json +9 -9
  32. package/dist/src-Bz9Fg416.cjs.map +0 -1
  33. package/dist/src-DvQWV6nH.js.map +0 -1
@@ -1,30 +1,30 @@
1
1
  //#region \0rolldown/runtime.js
2
2
  var __create$1 = Object.create;
3
- var __defProp$4 = Object.defineProperty;
3
+ var __defProp$3 = Object.defineProperty;
4
4
  var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames$1 = Object.getOwnPropertyNames;
6
6
  var __getProtoOf$1 = Object.getPrototypeOf;
7
7
  var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
8
8
  var __exportAll = (all, no_symbols) => {
9
9
  let target = {};
10
- for (var name in all) __defProp$4(target, name, {
10
+ for (var name in all) __defProp$3(target, name, {
11
11
  get: all[name],
12
12
  enumerable: true
13
13
  });
14
- if (!no_symbols) __defProp$4(target, Symbol.toStringTag, { value: "Module" });
14
+ if (!no_symbols) __defProp$3(target, Symbol.toStringTag, { value: "Module" });
15
15
  return target;
16
16
  };
17
17
  var __copyProps$1 = (to, from, except, desc) => {
18
18
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames$1(from), i = 0, n = keys.length, key; i < n; i++) {
19
19
  key = keys[i];
20
- if (!__hasOwnProp$1.call(to, key) && key !== except) __defProp$4(to, key, {
20
+ if (!__hasOwnProp$1.call(to, key) && key !== except) __defProp$3(to, key, {
21
21
  get: ((k) => from[k]).bind(null, key),
22
22
  enumerable: !(desc = __getOwnPropDesc$1(from, key)) || desc.enumerable
23
23
  });
24
24
  }
25
25
  return to;
26
26
  };
27
- var __toESM$1 = (mod, isNodeMode, target) => (target = mod != null ? __create$1(__getProtoOf$1(mod)) : {}, __copyProps$1(isNodeMode || !mod || !mod.__esModule ? __defProp$4(target, "default", {
27
+ var __toESM$1 = (mod, isNodeMode, target) => (target = mod != null ? __create$1(__getProtoOf$1(mod)) : {}, __copyProps$1(isNodeMode || !mod || !mod.__esModule ? __defProp$3(target, "default", {
28
28
  value: mod,
29
29
  enumerable: true
30
30
  }) : target, mod));
@@ -201,9 +201,9 @@ Error message: ${getErrorMessage$4(cause)}`,
201
201
  _a13$5 = symbol13$5;
202
202
  var TypeValidationError$2 = _TypeValidationError;
203
203
  //#endregion
204
- //#region ../_vendored/ai_v4/dist/dist-e6zV1w-k.js
204
+ //#region ../_vendored/ai_v4/dist/index.js
205
205
  var __create = Object.create;
206
- var __defProp$3 = Object.defineProperty;
206
+ var __defProp$1$1 = Object.defineProperty;
207
207
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
208
208
  var __getOwnPropNames = Object.getOwnPropertyNames;
209
209
  var __getProtoOf = Object.getPrototypeOf;
@@ -212,14 +212,14 @@ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).expor
212
212
  var __copyProps = (to, from, except, desc) => {
213
213
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
214
214
  key = keys[i];
215
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp$3(to, key, {
215
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp$1$1(to, key, {
216
216
  get: ((k) => from[k]).bind(null, key),
217
217
  enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
218
218
  });
219
219
  }
220
220
  return to;
221
221
  };
222
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp$3(target, "default", {
222
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp$1$1(target, "default", {
223
223
  value: mod,
224
224
  enumerable: true
225
225
  }) : target, mod));
@@ -433,8 +433,6 @@ function safeParseJSON$2({ text, schema }) {
433
433
  }
434
434
  }
435
435
  var { btoa: btoa$2, atob: atob$2 } = globalThis;
436
- //#endregion
437
- //#region ../_vendored/ai_v4/dist/index.js
438
436
  const ignoreOverride$2 = Symbol("Let zodToJsonSchema decide on which parser to use");
439
437
  const defaultOptions$2 = {
440
438
  name: void 0,
@@ -3736,7 +3734,7 @@ function trimStartOfStream() {
3736
3734
  };
3737
3735
  }
3738
3736
  //#endregion
3739
- //#region ../_vendored/ai_v5/dist/dist-Qv-F35RT.js
3737
+ //#region ../_vendored/ai_v5/dist/dist-BuEMdYEn.js
3740
3738
  var marker$1$4 = "vercel.ai.error";
3741
3739
  var symbol$1$3 = Symbol.for(marker$1$4);
3742
3740
  var _a$1$3;
@@ -4286,6 +4284,26 @@ async function cancelResponseBody$1(response) {
4286
4284
  await ((_a2 = response.body) == null ? void 0 : _a2.cancel());
4287
4285
  } catch (e) {}
4288
4286
  }
4287
+ var initialGlobalFetch$1 = globalThis.fetch;
4288
+ isNodeDefaultFetch$1(initialGlobalFetch$1);
4289
+ function isNodeDefaultFetch$1(fetch) {
4290
+ const source = Function.prototype.toString.call(fetch);
4291
+ return source.includes("internal/deps/undici") || source.includes("lazy loading of undici");
4292
+ }
4293
+ function getCurrentModulePath$1() {
4294
+ const originalPrepareStackTrace = Error.prepareStackTrace;
4295
+ try {
4296
+ Error.prepareStackTrace = (_error, callSites) => callSites;
4297
+ const error = /* @__PURE__ */ new Error("Capture current module path");
4298
+ Error.captureStackTrace(error, getCurrentModulePath$1);
4299
+ const [caller] = error.stack;
4300
+ const fileName = caller == null ? void 0 : caller.getFileName();
4301
+ if (fileName == null) throw new Error("Unable to determine the current module path");
4302
+ return fileName;
4303
+ } finally {
4304
+ Error.prepareStackTrace = originalPrepareStackTrace;
4305
+ }
4306
+ }
4289
4307
  var DEFAULT_MAX_DOWNLOAD_SIZE$1 = 2 * 1024 * 1024 * 1024;
4290
4308
  async function readResponseWithSizeLimit$1({ response, url, maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE$1 }) {
4291
4309
  const contentLength = response.headers.get("content-length");
@@ -4395,11 +4413,11 @@ function withUserAgentSuffix$1(headers, ...userAgentSuffixParts) {
4395
4413
  normalizedHeaders.set("user-agent", [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(" "));
4396
4414
  return Object.fromEntries(normalizedHeaders.entries());
4397
4415
  }
4398
- var VERSION$4 = "3.0.30";
4416
+ var VERSION$4 = "3.0.31";
4399
4417
  var getOriginalFetch$1 = () => globalThis.fetch;
4400
- var getFromApi$1 = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch: fetch2 = getOriginalFetch$1() }) => {
4418
+ var getFromApi$1 = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch$1() }) => {
4401
4419
  try {
4402
- const response = await fetch2(url, {
4420
+ const response = await fetch(url, {
4403
4421
  method: "GET",
4404
4422
  headers: withUserAgentSuffix$1(headers, `ai-sdk/provider-utils/${VERSION$4}`, getRuntimeEnvironmentUserAgent$1()),
4405
4423
  signal: abortSignal
@@ -4625,7 +4643,7 @@ function parseJsonEventStream$1({ stream, schema }) {
4625
4643
  } }));
4626
4644
  }
4627
4645
  var getOriginalFetch2$1 = () => globalThis.fetch;
4628
- var postJsonToApi$1 = async ({ url, headers, body, failedResponseHandler, successfulResponseHandler, abortSignal, fetch: fetch2 }) => postToApi$1({
4646
+ var postJsonToApi$1 = async ({ url, headers, body, failedResponseHandler, successfulResponseHandler, abortSignal, fetch }) => postToApi$1({
4629
4647
  url,
4630
4648
  headers: {
4631
4649
  "Content-Type": "application/json",
@@ -4638,11 +4656,11 @@ var postJsonToApi$1 = async ({ url, headers, body, failedResponseHandler, succes
4638
4656
  failedResponseHandler,
4639
4657
  successfulResponseHandler,
4640
4658
  abortSignal,
4641
- fetch: fetch2
4659
+ fetch
4642
4660
  });
4643
- var postToApi$1 = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch: fetch2 = getOriginalFetch2$1() }) => {
4661
+ var postToApi$1 = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch2$1() }) => {
4644
4662
  try {
4645
- const response = await fetch2(url, {
4663
+ const response = await fetch(url, {
4646
4664
  method: "POST",
4647
4665
  headers: withUserAgentSuffix$1(headers, `ai-sdk/provider-utils/${VERSION$4}`, getRuntimeEnvironmentUserAgent$1()),
4648
4666
  body: body.content,
@@ -6704,7 +6722,7 @@ async function getVercelRequestId$1() {
6704
6722
  var _a10;
6705
6723
  return (_a10 = getContext$1().headers) == null ? void 0 : _a10["x-vercel-id"];
6706
6724
  }
6707
- var VERSION$2$2 = "2.0.115";
6725
+ var VERSION$2$2 = "2.0.125";
6708
6726
  var AI_GATEWAY_PROTOCOL_VERSION$1 = "0.0.1";
6709
6727
  function createGatewayProvider$1(options = {}) {
6710
6728
  var _a10, _b10;
@@ -7738,7 +7756,7 @@ function getGlobalProvider$1() {
7738
7756
  var _a16;
7739
7757
  return (_a16 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a16 : gateway$1;
7740
7758
  }
7741
- var VERSION$5 = "5.0.216";
7759
+ var VERSION$5 = "5.0.226";
7742
7760
  var dataContentSchema$1 = zod_v4.z.union([
7743
7761
  zod_v4.z.string(),
7744
7762
  zod_v4.z.instanceof(Uint8Array),
@@ -8604,7 +8622,7 @@ var object$1 = ({ schema: inputSchema }) => {
8604
8622
  };
8605
8623
  };
8606
8624
  //#endregion
8607
- //#region ../_vendored/ai_v6/dist/dist-BomuqvJJ.js
8625
+ //#region ../_vendored/ai_v6/dist/dist-BTWHzT8H.js
8608
8626
  var marker$1 = "vercel.ai.error";
8609
8627
  var symbol$1$1 = Symbol.for(marker$1);
8610
8628
  var _a$1$1;
@@ -9175,6 +9193,26 @@ var DownloadError = class extends (_b$2 = AISDKError, _a$2 = symbol$2, _b$2) {
9175
9193
  return AISDKError.hasMarker(error, marker$2);
9176
9194
  }
9177
9195
  };
9196
+ var initialGlobalFetch = globalThis.fetch;
9197
+ isNodeDefaultFetch(initialGlobalFetch);
9198
+ function isNodeDefaultFetch(fetch) {
9199
+ const source = Function.prototype.toString.call(fetch);
9200
+ return source.includes("internal/deps/undici") || source.includes("lazy loading of undici");
9201
+ }
9202
+ function getCurrentModulePath() {
9203
+ const originalPrepareStackTrace = Error.prepareStackTrace;
9204
+ try {
9205
+ Error.prepareStackTrace = (_error, callSites) => callSites;
9206
+ const error = /* @__PURE__ */ new Error("Capture current module path");
9207
+ Error.captureStackTrace(error, getCurrentModulePath);
9208
+ const [caller] = error.stack;
9209
+ const fileName = caller == null ? void 0 : caller.getFileName();
9210
+ if (fileName == null) throw new Error("Unable to determine the current module path");
9211
+ return fileName;
9212
+ } finally {
9213
+ Error.prepareStackTrace = originalPrepareStackTrace;
9214
+ }
9215
+ }
9178
9216
  var DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;
9179
9217
  async function readResponseWithSizeLimit({ response, url, maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE }) {
9180
9218
  const contentLength = response.headers.get("content-length");
@@ -9306,11 +9344,11 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
9306
9344
  normalizedHeaders.set("user-agent", [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(" "));
9307
9345
  return Object.fromEntries(normalizedHeaders.entries());
9308
9346
  }
9309
- var VERSION$3 = "4.0.40";
9347
+ var VERSION$3 = "4.0.41";
9310
9348
  var getOriginalFetch = () => globalThis.fetch;
9311
- var getFromApi = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch: fetch2 = getOriginalFetch() }) => {
9349
+ var getFromApi = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch() }) => {
9312
9350
  try {
9313
- const response = await fetch2(url, {
9351
+ const response = await fetch(url, {
9314
9352
  method: "GET",
9315
9353
  headers: withUserAgentSuffix(headers, `ai-sdk/provider-utils/${VERSION$3}`, getRuntimeEnvironmentUserAgent()),
9316
9354
  signal: abortSignal
@@ -10497,7 +10535,7 @@ function parseJsonEventStream({ stream, schema }) {
10497
10535
  } }));
10498
10536
  }
10499
10537
  var getOriginalFetch2 = () => globalThis.fetch;
10500
- var postJsonToApi = async ({ url, headers, body, failedResponseHandler, successfulResponseHandler, abortSignal, fetch: fetch2 }) => postToApi({
10538
+ var postJsonToApi = async ({ url, headers, body, failedResponseHandler, successfulResponseHandler, abortSignal, fetch }) => postToApi({
10501
10539
  url,
10502
10540
  headers: {
10503
10541
  "Content-Type": "application/json",
@@ -10510,11 +10548,11 @@ var postJsonToApi = async ({ url, headers, body, failedResponseHandler, successf
10510
10548
  failedResponseHandler,
10511
10549
  successfulResponseHandler,
10512
10550
  abortSignal,
10513
- fetch: fetch2
10551
+ fetch
10514
10552
  });
10515
- var postToApi = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch: fetch2 = getOriginalFetch2() }) => {
10553
+ var postToApi = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch2() }) => {
10516
10554
  try {
10517
- const response = await fetch2(url, {
10555
+ const response = await fetch(url, {
10518
10556
  method: "POST",
10519
10557
  headers: withUserAgentSuffix(headers, `ai-sdk/provider-utils/${VERSION$3}`, getRuntimeEnvironmentUserAgent()),
10520
10558
  body: body.content,
@@ -10736,7 +10774,7 @@ function withoutTrailingSlash(url) {
10736
10774
  return url == null ? void 0 : url.replace(/\/$/, "");
10737
10775
  }
10738
10776
  //#endregion
10739
- //#region ../_vendored/ai_v6/dist/dist-iiYCn57Q.js
10777
+ //#region ../_vendored/ai_v6/dist/dist-3jq9sPhA.js
10740
10778
  function getContext() {
10741
10779
  return { headers: {} };
10742
10780
  }
@@ -12295,7 +12333,7 @@ async function getVercelRequestId() {
12295
12333
  var _a11;
12296
12334
  return (_a11 = getContext().headers) == null ? void 0 : _a11["x-vercel-id"];
12297
12335
  }
12298
- var VERSION$2 = "3.0.153";
12336
+ var VERSION$2 = "3.0.163";
12299
12337
  var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
12300
12338
  function createGatewayProvider(options = {}) {
12301
12339
  var _a11, _b11;
@@ -13454,7 +13492,7 @@ function getTotalTimeoutMs(timeout) {
13454
13492
  if (typeof timeout === "number") return timeout;
13455
13493
  return timeout.totalMs;
13456
13494
  }
13457
- var VERSION = "6.0.230";
13495
+ var VERSION = "6.0.241";
13458
13496
  var dataContentSchema = zod_v4.z.union([
13459
13497
  zod_v4.z.string(),
13460
13498
  zod_v4.z.instanceof(Uint8Array),
@@ -14818,6 +14856,7 @@ var Extractor = class Extractor {
14818
14856
  includePreviousExtraction;
14819
14857
  metadataKeyPath;
14820
14858
  onExtracted;
14859
+ retryStructuredExtractionOnEmptyObject;
14821
14860
  /** @internal */
14822
14861
  internal;
14823
14862
  instructionsConfig;
@@ -14840,6 +14879,7 @@ var Extractor = class Extractor {
14840
14879
  this.includePreviousExtraction = config.includePreviousExtraction ?? true;
14841
14880
  this.metadataKeyPath = config.metadataKeyPath ?? `extracted.${slug}`;
14842
14881
  this.onExtracted = config.onExtracted;
14882
+ this.retryStructuredExtractionOnEmptyObject = config.retryStructuredExtractionOnEmptyObject ?? false;
14843
14883
  this.internal = internal;
14844
14884
  }
14845
14885
  async resolve(context) {
@@ -14852,7 +14892,8 @@ var Extractor = class Extractor {
14852
14892
  ...schema ? { schema } : {},
14853
14893
  includePreviousExtraction: this.includePreviousExtraction,
14854
14894
  metadataKeyPath: this.metadataKeyPath,
14855
- onExtracted: this.onExtracted
14895
+ onExtracted: this.onExtracted,
14896
+ retryStructuredExtractionOnEmptyObject: this.retryStructuredExtractionOnEmptyObject
14856
14897
  }, this.internal);
14857
14898
  }
14858
14899
  };
@@ -15177,6 +15218,9 @@ if (OM_DEBUG_LOG) {
15177
15218
  function isAbortError$1(error, abortSignal) {
15178
15219
  return abortSignal?.aborted === true || error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
15179
15220
  }
15221
+ function shouldRetryEmptyStructuredObject(object, extractors) {
15222
+ return Object.keys(object).length === 0 && extractors.some((extractor) => extractor.retryStructuredExtractionOnEmptyObject);
15223
+ }
15180
15224
  async function extractStructuredValues(opts) {
15181
15225
  const structuredExtractors = (opts.extractors ?? []).filter((extractor) => extractor.mode === "structured");
15182
15226
  if (structuredExtractors.length === 0) return {
@@ -15213,8 +15257,10 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
15213
15257
  return output.object;
15214
15258
  };
15215
15259
  let object;
15260
+ let retryEmptyObject = false;
15216
15261
  try {
15217
15262
  object = await generateWithStructuredOutput();
15263
+ retryEmptyObject = shouldRetryEmptyStructuredObject(object, structuredExtractors);
15218
15264
  } catch (error) {
15219
15265
  if (isAbortError$1(error, opts.abortSignal)) throw error;
15220
15266
  try {
@@ -15231,6 +15277,19 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
15231
15277
  };
15232
15278
  }
15233
15279
  }
15280
+ if (retryEmptyObject) try {
15281
+ object = await generateWithStructuredOutput(_mastra_core_features.coreFeatures.has("json-prompt-injection:inline") ? "inline" : true);
15282
+ } catch (fallbackError) {
15283
+ if (isAbortError$1(fallbackError, opts.abortSignal)) throw fallbackError;
15284
+ const message = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
15285
+ return {
15286
+ values,
15287
+ failures: structuredExtractors.map((extractor) => ({
15288
+ slug: extractor.slug,
15289
+ error: message
15290
+ }))
15291
+ };
15292
+ }
15234
15293
  for (const extractor of structuredExtractors) {
15235
15294
  const value = object[extractor.slug];
15236
15295
  if (value === void 0 || value === null || value === "") continue;
@@ -18536,6 +18595,17 @@ var TokenCounter = class TokenCounter {
18536
18595
  toolResultDelta
18537
18596
  };
18538
18597
  }
18598
+ if (invocation.state === "output-error") {
18599
+ toolResultDelta++;
18600
+ const errorText = invocation.errorText;
18601
+ const errorMessage = typeof errorText === "string" ? errorText : "Tool execution failed";
18602
+ tokens += this.readOrPersistPartEstimate(part, "tool-result-error", errorMessage);
18603
+ return {
18604
+ tokens,
18605
+ overheadDelta,
18606
+ toolResultDelta
18607
+ };
18608
+ }
18539
18609
  throw new Error(`Unhandled tool-invocation state '${part.toolInvocation?.state}' in token counting for part type '${part.type}'`);
18540
18610
  }
18541
18611
  if (typeof part.type === "string" && part.type.startsWith("data-")) return {
@@ -18761,6 +18831,7 @@ var WorkingMemoryExtractor = class extends Extractor {
18761
18831
  name: "Working Memory",
18762
18832
  includePreviousExtraction: false,
18763
18833
  metadataKeyPath: false,
18834
+ retryStructuredExtractionOnEmptyObject: true,
18764
18835
  instructions: async (context) => buildWorkingMemoryInstructions(await getWorkingMemoryDetails(context)),
18765
18836
  schema: async (context) => {
18766
18837
  return (await getWorkingMemoryDetails(context)).usesSchema ? zod.z.union([zod.z.record(zod.z.string(), zod.z.unknown()), zod.z.null()]) : void 0;
@@ -20460,6 +20531,68 @@ function isMessageAtOrBeforeCursor(msg, cursor) {
20460
20531
  return false;
20461
20532
  }
20462
20533
  /**
20534
+ * Return the toolCallId of a tool-invocation part in the given state, or undefined.
20535
+ */
20536
+ function getToolInvocationId(part, state) {
20537
+ if (part?.type !== "tool-invocation") return void 0;
20538
+ if (part.toolInvocation.state !== state) return void 0;
20539
+ return part.toolInvocation.toolCallId || void 0;
20540
+ }
20541
+ function collectPendingToolResultIds(allMessages, observedIds) {
20542
+ const pendingToolResultIds = /* @__PURE__ */ new Set();
20543
+ for (const msg of allMessages) {
20544
+ if (!msg?.id) continue;
20545
+ if (observedIds?.has(msg.id)) continue;
20546
+ const parts = msg.content?.parts;
20547
+ if (!parts || !Array.isArray(parts)) continue;
20548
+ for (const part of parts) {
20549
+ const id = getToolInvocationId(part, "result");
20550
+ if (id) pendingToolResultIds.add(id);
20551
+ }
20552
+ }
20553
+ return pendingToolResultIds;
20554
+ }
20555
+ function hasPendingToolResultPair(message, pendingToolResultIds) {
20556
+ if (pendingToolResultIds.size === 0) return false;
20557
+ const parts = message.content?.parts;
20558
+ if (!parts || !Array.isArray(parts)) return false;
20559
+ return parts.some((part) => {
20560
+ const id = getToolInvocationId(part, "call");
20561
+ return id !== void 0 && pendingToolResultIds.has(id);
20562
+ });
20563
+ }
20564
+ function collectPendingToolResultIdsAfterMarker(allMessages, markerMessageIndex, markerMessage) {
20565
+ const pendingToolResultIds = /* @__PURE__ */ new Set();
20566
+ const unobservedMarkerParts = getUnobservedParts(markerMessage);
20567
+ if (unobservedMarkerParts.length > 0) collectPendingToolResultIds([{
20568
+ ...markerMessage,
20569
+ content: {
20570
+ ...markerMessage.content,
20571
+ parts: unobservedMarkerParts
20572
+ }
20573
+ }], void 0).forEach((id) => pendingToolResultIds.add(id));
20574
+ collectPendingToolResultIds(allMessages.slice(markerMessageIndex + 1), void 0).forEach((id) => pendingToolResultIds.add(id));
20575
+ return pendingToolResultIds;
20576
+ }
20577
+ function getUnobservedPartsPreservingToolCallPairs(message) {
20578
+ const parts = message.content?.parts;
20579
+ if (!parts || !Array.isArray(parts)) return [];
20580
+ const endMarkerIndex = findLastCompletedObservationBoundary(message);
20581
+ if (endMarkerIndex === -1) return getUnobservedParts(message);
20582
+ const unobservedParts = getUnobservedParts(message);
20583
+ const unobservedResultIds = /* @__PURE__ */ new Set();
20584
+ for (const part of unobservedParts) {
20585
+ const id = getToolInvocationId(part, "result");
20586
+ if (id) unobservedResultIds.add(id);
20587
+ }
20588
+ if (unobservedResultIds.size === 0) return unobservedParts;
20589
+ const preservedCalls = parts.slice(0, endMarkerIndex).filter((part) => {
20590
+ const id = getToolInvocationId(part, "call");
20591
+ return id !== void 0 && unobservedResultIds.has(id);
20592
+ });
20593
+ return preservedCalls.length > 0 ? [...preservedCalls, ...unobservedParts] : unobservedParts;
20594
+ }
20595
+ /**
20463
20596
  * Safely extract buffered observation chunks from a record.
20464
20597
  * Handles both array and JSON-string formats, returning empty array if malformed.
20465
20598
  */
@@ -20475,6 +20608,7 @@ function filterObservedMessages(opts) {
20475
20608
  const allMessages = messageList.get.all.db();
20476
20609
  const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;
20477
20610
  const preserveMessageIds = opts.preserveMessageIds ?? /* @__PURE__ */ new Set();
20611
+ const observedIds = new Set(Array.isArray(record?.observedMessageIds) ? record.observedMessageIds : []);
20478
20612
  let markerMessageIndex = -1;
20479
20613
  let markerMessage = null;
20480
20614
  for (let i = allMessages.length - 1; i >= 0; i--) {
@@ -20487,33 +20621,40 @@ function filterObservedMessages(opts) {
20487
20621
  }
20488
20622
  }
20489
20623
  if (useMarkerBoundaryPruning && markerMessage && markerMessageIndex !== -1) {
20624
+ const pendingToolResultIds = collectPendingToolResultIdsAfterMarker(allMessages, markerMessageIndex, markerMessage);
20490
20625
  const messagesToRemove = [];
20491
20626
  for (let i = 0; i < markerMessageIndex; i++) {
20492
20627
  const msg = allMessages[i];
20493
- if (msg?.id && msg.id !== "om-continuation" && !preserveMessageIds.has(msg.id)) messagesToRemove.push(msg.id);
20628
+ if (msg?.id && msg.id !== "om-continuation" && !preserveMessageIds.has(msg.id) && !hasPendingToolResultPair(msg, pendingToolResultIds)) messagesToRemove.push(msg.id);
20494
20629
  }
20495
20630
  if (messagesToRemove.length > 0) messageList.removeByIds(messagesToRemove);
20496
- const unobserved = getUnobservedParts(markerMessage);
20631
+ const unobserved = getUnobservedPartsPreservingToolCallPairs(markerMessage);
20497
20632
  if (unobserved.length === 0) {
20498
20633
  if (markerMessage.id) messageList.removeByIds([markerMessage.id]);
20499
20634
  } else if (unobserved.length < (markerMessage.content?.parts?.length ?? 0)) markerMessage.content.parts = unobserved;
20500
20635
  } else if (record) {
20501
- const observedIds = new Set(Array.isArray(record.observedMessageIds) ? record.observedMessageIds : []);
20636
+ const pendingToolResultIds = collectPendingToolResultIds(allMessages, observedIds);
20502
20637
  const derivedCursor = opts.fallbackCursor ?? getLastObservedMessageCursor(allMessages.filter((msg) => !!msg?.id && observedIds.has(msg.id) && !!msg.createdAt));
20503
20638
  const lastObservedAt = record.lastObservedAt;
20504
20639
  const messagesToRemove = [];
20505
20640
  for (const msg of allMessages) {
20506
20641
  if (!msg?.id || msg.id === "om-continuation" || preserveMessageIds.has(msg.id)) continue;
20642
+ const hasPendingPair = hasPendingToolResultPair(msg, pendingToolResultIds);
20507
20643
  if (observedIds.has(msg.id)) {
20644
+ if (hasPendingPair) continue;
20508
20645
  messagesToRemove.push(msg.id);
20509
20646
  continue;
20510
20647
  }
20511
20648
  if (derivedCursor && isMessageAtOrBeforeCursor(msg, derivedCursor)) {
20649
+ if (hasPendingPair) continue;
20512
20650
  messagesToRemove.push(msg.id);
20513
20651
  continue;
20514
20652
  }
20515
20653
  if (lastObservedAt && msg.createdAt) {
20516
- if (new Date(msg.createdAt) <= lastObservedAt) messagesToRemove.push(msg.id);
20654
+ if (new Date(msg.createdAt) <= lastObservedAt) {
20655
+ if (hasPendingPair) continue;
20656
+ messagesToRemove.push(msg.id);
20657
+ }
20517
20658
  }
20518
20659
  }
20519
20660
  if (messagesToRemove.length > 0) messageList.removeByIds(messagesToRemove);
@@ -20882,7 +21023,7 @@ var ObservationStrategy = class ObservationStrategy {
20882
21023
  transient: true
20883
21024
  }).catch(() => {});
20884
21025
  const markerThreadId = marker.data?.threadId ?? this.opts.threadId;
20885
- await this.persistMarkerToStorage(marker, markerThreadId, this.opts.resourceId);
21026
+ if (!await this.persistMarkerToMessage(marker, this.opts.messageList, markerThreadId, this.opts.resourceId)) await this.persistMarkerToStorage(marker, markerThreadId, this.opts.resourceId);
20886
21027
  }
20887
21028
  getObservationMarkerConfig() {
20888
21029
  return {
@@ -21010,9 +21151,13 @@ var ObservationStrategy = class ObservationStrategy {
21010
21151
  /**
21011
21152
  * Persist a marker part on the last assistant message in a MessageList
21012
21153
  * AND save the updated message to the DB.
21154
+ *
21155
+ * @returns true when a marker was placed on an assistant message, false when
21156
+ * no list was provided or the list contains no assistant message (caller
21157
+ * should fall back to `persistMarkerToStorage`).
21013
21158
  */
21014
21159
  async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
21015
- if (!messageList) return;
21160
+ if (!messageList) return false;
21016
21161
  const allMsgs = messageList.get.all.db();
21017
21162
  for (let i = allMsgs.length - 1; i >= 0; i--) {
21018
21163
  const msg = allMsgs[i];
@@ -21028,9 +21173,10 @@ var ObservationStrategy = class ObservationStrategy {
21028
21173
  } catch (e) {
21029
21174
  omDebug(`[OM:persistMarker] failed to save marker to DB: ${e}`);
21030
21175
  }
21031
- return;
21176
+ return true;
21032
21177
  }
21033
21178
  }
21179
+ return false;
21034
21180
  }
21035
21181
  };
21036
21182
  //#endregion
@@ -21839,6 +21985,12 @@ var ObservationStep = class {
21839
21985
  stepNumber;
21840
21986
  _prepared = false;
21841
21987
  _context;
21988
+ /**
21989
+ * True when this step seeded an empty assistant response message for a step-0
21990
+ * observation. While set, the response-id rotation hook must NOT run — rotating
21991
+ * would orphan the seed (markers would sit on a message the agent never streams into).
21992
+ */
21993
+ seededResponseMessage = false;
21842
21994
  constructor(turn, stepNumber) {
21843
21995
  this.turn = turn;
21844
21996
  this.stepNumber = stepNumber;
@@ -21967,15 +22119,41 @@ var ObservationStep = class {
21967
22119
  });
21968
22120
  buffered = true;
21969
22121
  }
21970
- if (this.stepNumber > 0) {
21971
- const newInput = messageList.clear.input.db();
21972
- const newOutput = messageList.clear.response.db();
21973
- const messagesToSave = [...newInput, ...newOutput];
21974
- if (messagesToSave.length > 0) {
21975
- await om.persistMessages(messagesToSave, threadId, resourceId);
21976
- for (const msg of messagesToSave) messageList.add(msg, "memory");
22122
+ const willObserveNow = statusSnapshot.shouldObserve && !hasIncompleteToolCalls;
22123
+ /** In-flight message ids the step-0 cleanup must never remove from live context. */
22124
+ let step0PreserveIds;
22125
+ if (this.stepNumber > 0 || willObserveNow) {
22126
+ if (this.stepNumber > 0) {
22127
+ const newInput = messageList.clear.input.db();
22128
+ const newOutput = messageList.clear.response.db();
22129
+ const messagesToSave = [...newInput, ...newOutput];
22130
+ if (messagesToSave.length > 0) {
22131
+ await om.persistMessages(messagesToSave, threadId, resourceId);
22132
+ for (const msg of messagesToSave) messageList.add(msg, "memory");
22133
+ }
22134
+ } else {
22135
+ const pending = [...messageList.get.input.db(), ...messageList.get.response.db()];
22136
+ if (pending.length > 0) await om.persistMessages(pending, threadId, resourceId);
22137
+ step0PreserveIds = pending.map((msg) => msg.id);
21977
22138
  }
21978
- if (statusSnapshot.shouldObserve && !hasIncompleteToolCalls) {
22139
+ if (this.stepNumber === 0 && willObserveNow && this.turn.responseMessageId) {
22140
+ const seed = {
22141
+ id: this.turn.responseMessageId,
22142
+ role: "assistant",
22143
+ content: {
22144
+ format: 2,
22145
+ parts: []
22146
+ },
22147
+ type: "text",
22148
+ createdAt: /* @__PURE__ */ new Date(),
22149
+ threadId,
22150
+ resourceId
22151
+ };
22152
+ messageList.add(seed, "response");
22153
+ this.seededResponseMessage = true;
22154
+ omDebug(`[OM:step0] seeded response message ${seed.id} for step-0 observation markers`);
22155
+ }
22156
+ if (willObserveNow) {
21979
22157
  const preObsGeneration = this.turn.record.generationCount;
21980
22158
  const obsResult = await this.runThresholdObservation();
21981
22159
  observerExchange = obsResult.observerExchange;
@@ -21989,7 +22167,8 @@ var ObservationStep = class {
21989
22167
  resourceId,
21990
22168
  messages: messageList,
21991
22169
  observedMessageIds: observedIds,
21992
- retentionFloor: minRemaining
22170
+ retentionFloor: minRemaining,
22171
+ preserveMessageIds: step0PreserveIds
21993
22172
  });
21994
22173
  if (statusSnapshot.asyncObservationEnabled) await om.resetBufferingState({
21995
22174
  threadId,
@@ -22053,10 +22232,11 @@ var ObservationStep = class {
22053
22232
  const { threadId, resourceId, messageList } = this.turn;
22054
22233
  const om = this.turn.om;
22055
22234
  await om.waitForBuffering(threadId, resourceId);
22235
+ const observableMessages = this.seededResponseMessage ? messageList.get.all.db().filter((msg) => msg.id !== this.turn.responseMessageId) : messageList.get.all.db();
22056
22236
  const freshStatus = await om.getStatus({
22057
22237
  threadId,
22058
22238
  resourceId,
22059
- messages: messageList.get.all.db()
22239
+ messages: observableMessages
22060
22240
  });
22061
22241
  if (!freshStatus.shouldObserve) return {
22062
22242
  succeeded: false,
@@ -22066,7 +22246,7 @@ var ObservationStep = class {
22066
22246
  const activation = await om.activate({
22067
22247
  threadId,
22068
22248
  resourceId,
22069
- messages: messageList.get.all.db(),
22249
+ messages: observableMessages,
22070
22250
  currentModel: this.turn.actorModelContext,
22071
22251
  writer: this.turn.writer,
22072
22252
  messageList
@@ -22099,7 +22279,8 @@ var ObservationStep = class {
22099
22279
  const obsResult = await om.observe({
22100
22280
  threadId,
22101
22281
  resourceId,
22102
- messages: messageList.get.all.db(),
22282
+ messages: observableMessages,
22283
+ messageList,
22103
22284
  trigger: "turn-sync",
22104
22285
  requestContext: this.turn.requestContext,
22105
22286
  writer: this.turn.writer,
@@ -22116,10 +22297,12 @@ var ObservationStep = class {
22116
22297
  break;
22117
22298
  }
22118
22299
  }
22119
- const messageToSeal = latestObservedIndex >= 0 ? liveMessages[latestObservedIndex] : void 0;
22300
+ let messageToSeal = latestObservedIndex >= 0 ? liveMessages[latestObservedIndex] : void 0;
22301
+ if (this.stepNumber === 0 && messageToSeal?.role !== "assistant") messageToSeal = void 0;
22120
22302
  const messagesToSeal = messageToSeal ? [messageToSeal] : [];
22121
22303
  om.sealMessagesForBuffering(messagesToSeal);
22122
- try {
22304
+ if (this.seededResponseMessage) omDebug("[OM:observe] skipping response-id rotation — step-0 seeded response message holds the active id");
22305
+ else try {
22123
22306
  await this.turn.hooks?.onSyncObservationComplete?.();
22124
22307
  } catch (error) {
22125
22308
  omDebug(`[OM:observe] onSyncObservationComplete hook failed: ${error instanceof Error ? error.message : String(error)}`);
@@ -22180,6 +22363,8 @@ var ObservationTurn = class {
22180
22363
  sendSignal;
22181
22364
  /** Current actor model for this step. Updated by the processor before prepare(). */
22182
22365
  actorModelContext;
22366
+ /** The active assistant response message ID for this step. Updated by the processor before prepare(). */
22367
+ responseMessageId;
22183
22368
  /** Processor-provided hooks for turn/step lifecycle integration. */
22184
22369
  hooks;
22185
22370
  constructor(opts) {
@@ -23819,6 +24004,14 @@ var ObservationalMemory = class ObservationalMemory {
23819
24004
  */
23820
24005
  locks = /* @__PURE__ */ new Map();
23821
24006
  /**
24007
+ * Initial record lookup/creation promises keyed by the effective storage scope.
24008
+ * Concurrent callers share the full read-or-create operation so a stale read
24009
+ * cannot create another generation-zero record after the first insert finishes.
24010
+ * Entries are removed after both success and failure so later calls always
24011
+ * re-read storage and transient failures can be retried.
24012
+ */
24013
+ recordInitializations = /* @__PURE__ */ new Map();
24014
+ /**
23822
24015
  * Acquire a lock for the given key, execute the callback, then release.
23823
24016
  * If a lock is already held, waits for it to be released before acquiring.
23824
24017
  */
@@ -24179,10 +24372,14 @@ var ObservationalMemory = class ObservationalMemory {
24179
24372
  */
24180
24373
  async getOrCreateRecord(threadId, resourceId) {
24181
24374
  const ids = this.getStorageIds(threadId, resourceId);
24182
- let record = await this.storage.getObservationalMemory(ids.threadId, ids.resourceId);
24183
- if (!record) {
24375
+ const initializationKey = ids.threadId === null ? `resource:${ids.resourceId}` : `thread:${ids.threadId}`;
24376
+ const pendingInitialization = this.recordInitializations.get(initializationKey);
24377
+ if (pendingInitialization) return pendingInitialization;
24378
+ const initialization = Promise.resolve().then(async () => {
24379
+ const record = await this.storage.getObservationalMemory(ids.threadId, ids.resourceId);
24380
+ if (record) return record;
24184
24381
  const observedTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
24185
- record = await this.storage.initializeObservationalMemory({
24382
+ return this.storage.initializeObservationalMemory({
24186
24383
  threadId: ids.threadId,
24187
24384
  resourceId: ids.resourceId,
24188
24385
  scope: this.scope,
@@ -24193,8 +24390,13 @@ var ObservationalMemory = class ObservationalMemory {
24193
24390
  },
24194
24391
  observedTimezone
24195
24392
  });
24393
+ });
24394
+ this.recordInitializations.set(initializationKey, initialization);
24395
+ try {
24396
+ return await initialization;
24397
+ } finally {
24398
+ if (this.recordInitializations.get(initializationKey) === initialization) this.recordInitializations.delete(initializationKey);
24196
24399
  }
24197
- return record;
24198
24400
  }
24199
24401
  /**
24200
24402
  * Get current config snapshot for observation markers.
@@ -24831,6 +25033,7 @@ ${formattedMessages}
24831
25033
  */
24832
25034
  async getObservedMessageIdsForCleanup(opts) {
24833
25035
  const { threadId, resourceId, messages, observedMessageIds, retentionFloor } = opts;
25036
+ const preserveSet = opts.preserveMessageIds?.length ? new Set(opts.preserveMessageIds) : null;
24834
25037
  const record = await this.getOrCreateRecord(threadId, resourceId);
24835
25038
  const effectiveObservedIds = observedMessageIds && observedMessageIds.length > 0 ? observedMessageIds : Array.isArray(record.observedMessageIds) ? record.observedMessageIds : [];
24836
25039
  if (effectiveObservedIds.length === 0) return [];
@@ -24842,6 +25045,10 @@ ${formattedMessages}
24842
25045
  const retentionCounter = typeof retentionFloor === "number" ? new TokenCounter() : null;
24843
25046
  for (const msg of messages) {
24844
25047
  if (!msg?.id || msg.id === "om-continuation" || !observedSet.has(msg.id)) continue;
25048
+ if (preserveSet?.has(msg.id)) {
25049
+ skipped += 1;
25050
+ continue;
25051
+ }
24845
25052
  const unobservedParts = getUnobservedParts(msg);
24846
25053
  const totalParts = msg.content?.parts?.length ?? 0;
24847
25054
  if (unobservedParts.length > 0 && unobservedParts.length < totalParts) {
@@ -24886,7 +25093,7 @@ ${formattedMessages}
24886
25093
  */
24887
25094
  /** @internal Used by ObservationStep. */
24888
25095
  async cleanupMessages(opts) {
24889
- const { threadId, resourceId, observedMessageIds, retentionFloor } = opts;
25096
+ const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
24890
25097
  const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
24891
25098
  const allMsgs = messageList ? messageList.get.all.db() : opts.messages;
24892
25099
  let markerIdx = -1;
@@ -24907,7 +25114,8 @@ ${formattedMessages}
24907
25114
  resourceId,
24908
25115
  messages: allMsgs,
24909
25116
  observedMessageIds,
24910
- retentionFloor
25117
+ retentionFloor,
25118
+ preserveMessageIds
24911
25119
  });
24912
25120
  if (messageList) {
24913
25121
  if (idsToRemoveList.length > 0) messageList.removeByIds(idsToRemoveList);
@@ -24919,18 +25127,21 @@ ${formattedMessages}
24919
25127
  if (markerMsg && markerIdx !== -1) {
24920
25128
  const idsToRemove = [];
24921
25129
  const messagesToSave = [];
25130
+ const preserveSet = preserveMessageIds?.length ? new Set(preserveMessageIds) : null;
24922
25131
  for (let i = 0; i < markerIdx; i++) {
24923
25132
  const msg = allMsgs[i];
24924
- if (msg?.id && msg.id !== "om-continuation") {
25133
+ if (msg?.id && msg.id !== "om-continuation" && !preserveSet?.has(msg.id)) {
24925
25134
  idsToRemove.push(msg.id);
24926
25135
  messagesToSave.push(msg);
24927
25136
  }
24928
25137
  }
24929
25138
  messagesToSave.push(markerMsg);
24930
- const unobservedParts = getUnobservedParts(markerMsg);
24931
- if (unobservedParts.length === 0) {
24932
- if (markerMsg.id) idsToRemove.push(markerMsg.id);
24933
- } else if (unobservedParts.length < (markerMsg.content?.parts?.length ?? 0)) markerMsg.content.parts = unobservedParts;
25139
+ if (!Boolean(markerMsg.id && preserveSet?.has(markerMsg.id))) {
25140
+ const unobservedParts = getUnobservedParts(markerMsg);
25141
+ if (unobservedParts.length === 0) {
25142
+ if (markerMsg.id) idsToRemove.push(markerMsg.id);
25143
+ } else if (unobservedParts.length < (markerMsg.content?.parts?.length ?? 0)) markerMsg.content.parts = unobservedParts;
25144
+ }
24934
25145
  if (messageList) {
24935
25146
  if (idsToRemove.length > 0) messageList.removeByIds(idsToRemove);
24936
25147
  if (messagesToSave.length > 0) await this.persistMessages(messagesToSave, threadId, resourceId);
@@ -25717,6 +25928,7 @@ ${formattedMessages}
25717
25928
  threadId,
25718
25929
  resourceId,
25719
25930
  messages: unobservedMessages,
25931
+ messageList: opts.messageList,
25720
25932
  reflectionHooks,
25721
25933
  agent: opts.agent,
25722
25934
  requestContext,
@@ -26106,7 +26318,7 @@ var ObservationalMemoryProcessor = class {
26106
26318
  this.temporalMarkers = options?.temporalMarkers ?? false;
26107
26319
  }
26108
26320
  async processInputStep(args) {
26109
- const { messageList, requestContext, stepNumber, state: _state, writer, model, abortSignal, abort, rotateResponseMessageId } = args;
26321
+ const { messageList, requestContext, stepNumber, state: _state, writer, model, abortSignal, abort, messageId, rotateResponseMessageId } = args;
26110
26322
  const state = _state ?? {};
26111
26323
  omDebug(`[OM:processInputStep:ENTER] step=${stepNumber}, hasMastraMemory=${!!requestContext?.get("MastraMemory")}, hasMemoryInfo=${!!messageList?.serialize()?.memoryInfo?.threadId}`);
26112
26324
  const context = this.engine.getThreadContext(requestContext, messageList);
@@ -26192,6 +26404,7 @@ var ObservationalMemoryProcessor = class {
26192
26404
  state.__omObservabilityContext = observabilityContext;
26193
26405
  this.turn.observabilityContext = observabilityContext;
26194
26406
  this.turn.actorModelContext = actorModelContext;
26407
+ this.turn.responseMessageId = messageId;
26195
26408
  {
26196
26409
  const step = this.turn.step(stepNumber);
26197
26410
  let ctx;
@@ -26562,6 +26775,11 @@ function filterSystemReminderMessages(messages, includeSystemReminders) {
26562
26775
  if (includeSystemReminders) return messages;
26563
26776
  return messages.filter((message) => !isSystemReminderMessage(message));
26564
26777
  }
26778
+ function isTransientSignalMessage(message) {
26779
+ if (message.role !== "signal" || !isRecord(message.content)) return false;
26780
+ const metadata = message.content.metadata;
26781
+ return isRecord(metadata) && isRecord(metadata.signal) && !Array.isArray(metadata.signal) && metadata.signal.transient === true;
26782
+ }
26565
26783
  function normalizeObservationalMemoryConfig(config) {
26566
26784
  if (config === true) return { model: "google/gemini-2.5-flash" };
26567
26785
  if (config === false || config === void 0) return void 0;
@@ -27095,7 +27313,7 @@ ${workingMemory}`;
27095
27313
  async saveMessages({ messages, memoryConfig, observabilityContext }) {
27096
27314
  const span = this.createMemorySpan("save", observabilityContext, void 0, { messageCount: messages.length });
27097
27315
  try {
27098
- const updatedMessages = messages.filter((m) => m.role !== "system").map((m) => {
27316
+ const updatedMessages = messages.filter((m) => m.role !== "system" && !isTransientSignalMessage(m)).map((m) => {
27099
27317
  return this.updateMessageToHideWorkingMemoryV2(m);
27100
27318
  }).filter((m) => Boolean(m));
27101
27319
  const config = this.getMergedThreadConfig(memoryConfig);
@@ -27387,7 +27605,7 @@ ${workingMemory}`;
27387
27605
  */
27388
27606
  async persistMessages(messages) {
27389
27607
  if (messages.length === 0) return;
27390
- const persistableMessages = messages.filter((m) => m.role !== "system");
27608
+ const persistableMessages = messages.filter((m) => m.role !== "system" && !isTransientSignalMessage(m));
27391
27609
  if (persistableMessages.length === 0) return;
27392
27610
  await (await this.getMemoryStore()).saveMessages({ messages: persistableMessages });
27393
27611
  }
@@ -28567,4 +28785,4 @@ Object.defineProperty(exports, "wrapInObservationGroup", {
28567
28785
  }
28568
28786
  });
28569
28787
 
28570
- //# sourceMappingURL=src-Bz9Fg416.cjs.map
28788
+ //# sourceMappingURL=src-x5iu_K3X.cjs.map