@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.
- package/CHANGELOG.md +48 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-capabilities-subagents.md +23 -5
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/processors/index.cjs +1 -1
- package/dist/processors/index.js +1 -1
- package/dist/processors/observational-memory/extraction-runner.d.ts.map +1 -1
- package/dist/processors/observational-memory/extractor.d.ts +3 -0
- package/dist/processors/observational-memory/extractor.d.ts.map +1 -1
- package/dist/processors/observational-memory/message-utils.d.ts.map +1 -1
- package/dist/processors/observational-memory/observation-strategies/base.d.ts +5 -1
- package/dist/processors/observational-memory/observation-strategies/base.d.ts.map +1 -1
- package/dist/processors/observational-memory/observation-strategies/types.d.ts +7 -1
- package/dist/processors/observational-memory/observation-strategies/types.d.ts.map +1 -1
- package/dist/processors/observational-memory/observation-turn/step.d.ts +6 -0
- package/dist/processors/observational-memory/observation-turn/step.d.ts.map +1 -1
- package/dist/processors/observational-memory/observation-turn/turn.d.ts +2 -0
- package/dist/processors/observational-memory/observation-turn/turn.d.ts.map +1 -1
- package/dist/processors/observational-memory/observational-memory.d.ts +14 -0
- package/dist/processors/observational-memory/observational-memory.d.ts.map +1 -1
- package/dist/processors/observational-memory/processor.d.ts.map +1 -1
- package/dist/processors/observational-memory/token-counter.d.ts.map +1 -1
- package/dist/processors/observational-memory/working-memory-extractor.d.ts.map +1 -1
- package/dist/{src-DvQWV6nH.js → src-Iw-V5CfD.js} +285 -67
- package/dist/src-Iw-V5CfD.js.map +1 -0
- package/dist/{src-Bz9Fg416.cjs → src-x5iu_K3X.cjs} +287 -69
- package/dist/src-x5iu_K3X.cjs.map +1 -0
- package/package.json +9 -9
- package/dist/src-Bz9Fg416.cjs.map +0 -1
- 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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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/
|
|
204
|
+
//#region ../_vendored/ai_v4/dist/index.js
|
|
205
205
|
var __create = Object.create;
|
|
206
|
-
var __defProp$
|
|
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$
|
|
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$
|
|
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-
|
|
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.
|
|
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
|
|
4418
|
+
var getFromApi$1 = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch$1() }) => {
|
|
4401
4419
|
try {
|
|
4402
|
-
const response = await
|
|
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
|
|
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
|
|
4659
|
+
fetch
|
|
4642
4660
|
});
|
|
4643
|
-
var postToApi$1 = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch
|
|
4661
|
+
var postToApi$1 = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch2$1() }) => {
|
|
4644
4662
|
try {
|
|
4645
|
-
const response = await
|
|
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.
|
|
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.
|
|
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-
|
|
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.
|
|
9347
|
+
var VERSION$3 = "4.0.41";
|
|
9310
9348
|
var getOriginalFetch = () => globalThis.fetch;
|
|
9311
|
-
var getFromApi = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch
|
|
9349
|
+
var getFromApi = async ({ url, headers = {}, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch() }) => {
|
|
9312
9350
|
try {
|
|
9313
|
-
const response = await
|
|
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
|
|
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
|
|
10551
|
+
fetch
|
|
10514
10552
|
});
|
|
10515
|
-
var postToApi = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch
|
|
10553
|
+
var postToApi = async ({ url, headers = {}, body, successfulResponseHandler, failedResponseHandler, abortSignal, fetch = getOriginalFetch2() }) => {
|
|
10516
10554
|
try {
|
|
10517
|
-
const response = await
|
|
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-
|
|
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.
|
|
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.
|
|
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 =
|
|
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
|
|
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)
|
|
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
|
-
|
|
21971
|
-
|
|
21972
|
-
|
|
21973
|
-
|
|
21974
|
-
if (
|
|
21975
|
-
|
|
21976
|
-
|
|
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 (
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24183
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24931
|
-
|
|
24932
|
-
if (
|
|
24933
|
-
|
|
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-
|
|
28788
|
+
//# sourceMappingURL=src-x5iu_K3X.cjs.map
|