@mastra/memory 1.18.0 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +25 -0
- package/dist/{chunk-LPMZNXSF.js → chunk-KGYJHNI6.js} +29 -2
- package/dist/chunk-KGYJHNI6.js.map +1 -0
- package/dist/{chunk-NRYX4QWV.cjs → chunk-LCRYFBV3.cjs} +29 -2
- package/dist/chunk-LCRYFBV3.cjs.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +39 -39
- package/dist/docs/references/docs-memory-observational-memory.md +34 -0
- package/dist/index.cjs +14 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/{observational-memory-TZ67ZA32.cjs → observational-memory-5UNUGOE5.cjs} +26 -26
- package/dist/{observational-memory-TZ67ZA32.cjs.map → observational-memory-5UNUGOE5.cjs.map} +1 -1
- package/dist/{observational-memory-NL7AQHZV.js → observational-memory-7PMPJCPD.js} +3 -3
- package/dist/{observational-memory-NL7AQHZV.js.map → observational-memory-7PMPJCPD.js.map} +1 -1
- package/dist/processors/index.cjs +24 -24
- package/dist/processors/index.js +1 -1
- package/dist/processors/observational-memory/token-counter.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-LPMZNXSF.js.map +0 -1
- package/dist/chunk-NRYX4QWV.cjs.map +0 -1
package/dist/docs/SKILL.md
CHANGED
|
@@ -1,119 +1,119 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.18.
|
|
2
|
+
"version": "1.18.1",
|
|
3
3
|
"package": "@mastra/memory",
|
|
4
4
|
"exports": {
|
|
5
5
|
"ModelByInputTokens": {
|
|
6
6
|
"types": "dist/processors/index.d.ts",
|
|
7
|
-
"implementation": "dist/chunk-
|
|
7
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
8
8
|
"line": 745
|
|
9
9
|
},
|
|
10
10
|
"OBSERVER_SYSTEM_PROMPT": {
|
|
11
11
|
"types": "dist/processors/index.d.ts",
|
|
12
|
-
"implementation": "dist/chunk-
|
|
12
|
+
"implementation": "dist/chunk-KGYJHNI6.js"
|
|
13
13
|
},
|
|
14
14
|
"ObservationalMemory": {
|
|
15
15
|
"types": "dist/processors/index.d.ts",
|
|
16
|
-
"implementation": "dist/chunk-
|
|
17
|
-
"line":
|
|
16
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
17
|
+
"line": 6854
|
|
18
18
|
},
|
|
19
19
|
"ObservationalMemoryProcessor": {
|
|
20
20
|
"types": "dist/processors/index.d.ts",
|
|
21
|
-
"implementation": "dist/chunk-
|
|
22
|
-
"line":
|
|
21
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
22
|
+
"line": 9428
|
|
23
23
|
},
|
|
24
24
|
"TokenCounter": {
|
|
25
25
|
"types": "dist/processors/index.d.ts",
|
|
26
|
-
"implementation": "dist/chunk-
|
|
27
|
-
"line":
|
|
26
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
27
|
+
"line": 6312
|
|
28
28
|
},
|
|
29
29
|
"buildObserverPrompt": {
|
|
30
30
|
"types": "dist/processors/index.d.ts",
|
|
31
|
-
"implementation": "dist/chunk-
|
|
32
|
-
"line":
|
|
31
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
32
|
+
"line": 3659
|
|
33
33
|
},
|
|
34
34
|
"buildObserverSystemPrompt": {
|
|
35
35
|
"types": "dist/processors/index.d.ts",
|
|
36
|
-
"implementation": "dist/chunk-
|
|
37
|
-
"line":
|
|
36
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
37
|
+
"line": 2967
|
|
38
38
|
},
|
|
39
39
|
"combineObservationGroupRanges": {
|
|
40
40
|
"types": "dist/processors/index.d.ts",
|
|
41
|
-
"implementation": "dist/chunk-
|
|
41
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
42
42
|
"line": 837
|
|
43
43
|
},
|
|
44
44
|
"deriveObservationGroupProvenance": {
|
|
45
45
|
"types": "dist/processors/index.d.ts",
|
|
46
|
-
"implementation": "dist/chunk-
|
|
46
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
47
47
|
"line": 871
|
|
48
48
|
},
|
|
49
49
|
"extractCurrentTask": {
|
|
50
50
|
"types": "dist/processors/index.d.ts",
|
|
51
|
-
"implementation": "dist/chunk-
|
|
52
|
-
"line":
|
|
51
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
52
|
+
"line": 3773
|
|
53
53
|
},
|
|
54
54
|
"formatMessagesForObserver": {
|
|
55
55
|
"types": "dist/processors/index.d.ts",
|
|
56
|
-
"implementation": "dist/chunk-
|
|
57
|
-
"line":
|
|
56
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
57
|
+
"line": 3385
|
|
58
58
|
},
|
|
59
59
|
"getObservationsAsOf": {
|
|
60
60
|
"types": "dist/processors/index.d.ts",
|
|
61
|
-
"implementation": "dist/chunk-
|
|
62
|
-
"line":
|
|
61
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
62
|
+
"line": 9640
|
|
63
63
|
},
|
|
64
64
|
"hasCurrentTaskSection": {
|
|
65
65
|
"types": "dist/processors/index.d.ts",
|
|
66
|
-
"implementation": "dist/chunk-
|
|
67
|
-
"line":
|
|
66
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
67
|
+
"line": 3761
|
|
68
68
|
},
|
|
69
69
|
"injectAnchorIds": {
|
|
70
70
|
"types": "dist/processors/index.d.ts",
|
|
71
|
-
"implementation": "dist/chunk-
|
|
72
|
-
"line":
|
|
71
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
72
|
+
"line": 2515
|
|
73
73
|
},
|
|
74
74
|
"optimizeObservationsForContext": {
|
|
75
75
|
"types": "dist/processors/index.d.ts",
|
|
76
|
-
"implementation": "dist/chunk-
|
|
77
|
-
"line":
|
|
76
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
77
|
+
"line": 3784
|
|
78
78
|
},
|
|
79
79
|
"parseAnchorId": {
|
|
80
80
|
"types": "dist/processors/index.d.ts",
|
|
81
|
-
"implementation": "dist/chunk-
|
|
82
|
-
"line":
|
|
81
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
82
|
+
"line": 2488
|
|
83
83
|
},
|
|
84
84
|
"parseObservationGroups": {
|
|
85
85
|
"types": "dist/processors/index.d.ts",
|
|
86
|
-
"implementation": "dist/chunk-
|
|
86
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
87
87
|
"line": 806
|
|
88
88
|
},
|
|
89
89
|
"parseObserverOutput": {
|
|
90
90
|
"types": "dist/processors/index.d.ts",
|
|
91
|
-
"implementation": "dist/chunk-
|
|
92
|
-
"line":
|
|
91
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
92
|
+
"line": 3669
|
|
93
93
|
},
|
|
94
94
|
"reconcileObservationGroupsFromReflection": {
|
|
95
95
|
"types": "dist/processors/index.d.ts",
|
|
96
|
-
"implementation": "dist/chunk-
|
|
96
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
97
97
|
"line": 895
|
|
98
98
|
},
|
|
99
99
|
"renderObservationGroupsForReflection": {
|
|
100
100
|
"types": "dist/processors/index.d.ts",
|
|
101
|
-
"implementation": "dist/chunk-
|
|
101
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
102
102
|
"line": 851
|
|
103
103
|
},
|
|
104
104
|
"stripEphemeralAnchorIds": {
|
|
105
105
|
"types": "dist/processors/index.d.ts",
|
|
106
|
-
"implementation": "dist/chunk-
|
|
107
|
-
"line":
|
|
106
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
107
|
+
"line": 2545
|
|
108
108
|
},
|
|
109
109
|
"stripObservationGroups": {
|
|
110
110
|
"types": "dist/processors/index.d.ts",
|
|
111
|
-
"implementation": "dist/chunk-
|
|
111
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
112
112
|
"line": 828
|
|
113
113
|
},
|
|
114
114
|
"wrapInObservationGroup": {
|
|
115
115
|
"types": "dist/processors/index.d.ts",
|
|
116
|
-
"implementation": "dist/chunk-
|
|
116
|
+
"implementation": "dist/chunk-KGYJHNI6.js",
|
|
117
117
|
"line": 799
|
|
118
118
|
},
|
|
119
119
|
"OBSERVATIONAL_MEMORY_DEFAULTS": {
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
"processors": {
|
|
150
150
|
"index": "dist/processors/index.js",
|
|
151
151
|
"chunks": [
|
|
152
|
-
"chunk-
|
|
152
|
+
"chunk-KGYJHNI6.js",
|
|
153
153
|
"chunk-LSJJAJAF.js"
|
|
154
154
|
]
|
|
155
155
|
}
|
|
@@ -392,6 +392,40 @@ OM caches token estimates in message metadata to reduce repeat counting work dur
|
|
|
392
392
|
- Message and conversation overhead are still recalculated on every pass. The cache only stores payload estimates, so counting semantics stay the same.
|
|
393
393
|
- `data-*` and `reasoning` parts are still skipped and aren't cached.
|
|
394
394
|
|
|
395
|
+
### Caller-supplied token estimates for file parts
|
|
396
|
+
|
|
397
|
+
You can attach a token estimate directly to an `image` or `file` part using `providerMetadata.mastra.tokenEstimate`. The Token Counter honors this value verbatim and skips its own estimator:
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
const filePart = {
|
|
401
|
+
type: 'file',
|
|
402
|
+
data: 'storage://bucket/large-report.pdf',
|
|
403
|
+
mimeType: 'application/pdf',
|
|
404
|
+
filename: 'large-report.pdf',
|
|
405
|
+
providerMetadata: {
|
|
406
|
+
mastra: {
|
|
407
|
+
tokenEstimate: {
|
|
408
|
+
v: 0,
|
|
409
|
+
source: 'client',
|
|
410
|
+
key: 'client',
|
|
411
|
+
tokens: 100_000,
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
The `tokenEstimate` object follows the same shape the Token Counter uses internally for cached estimates:
|
|
419
|
+
|
|
420
|
+
- `v` — cache schema version. Set to `0`. Caller-supplied entries are exempt from the framework's version check, so the value isn't read.
|
|
421
|
+
- `source` — cache lineage marker. Must be `'client'`. This is what tells the Token Counter the entry is authoritative and should be honored verbatim instead of being recomputed or overwritten.
|
|
422
|
+
- `key` — content fingerprint slot. Set to `'client'`. Framework entries use a content hash here so they invalidate when the payload changes; the `'client'` sentinel keeps caller estimates stable across writes.
|
|
423
|
+
- `tokens` — the token count to use. Must be a finite non-negative number.
|
|
424
|
+
|
|
425
|
+
Additional notes:
|
|
426
|
+
|
|
427
|
+
- The estimate is only honored on `image` and `file` parts. `text` and `tool-invocation` parts are always counted normally, even if they carry a `tokenEstimate`.
|
|
428
|
+
|
|
395
429
|
## Async buffering
|
|
396
430
|
|
|
397
431
|
Without async buffering, the Observer runs synchronously when the message threshold is reached — the agent pauses mid-conversation while the Observer LLM call completes. With async buffering (enabled by default), observations are pre-computed in the background as the conversation grows. When the threshold is hit, buffered observations activate instantly with no pause.
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkLCRYFBV3_cjs = require('./chunk-LCRYFBV3.cjs');
|
|
4
4
|
var v3 = require('zod/v3');
|
|
5
5
|
var zod = require('zod');
|
|
6
6
|
var z4 = require('zod/v4');
|
|
@@ -67,7 +67,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
67
67
|
mod
|
|
68
68
|
));
|
|
69
69
|
var require_secure_json_parse = __commonJS({
|
|
70
|
-
"../../../node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js"(exports
|
|
70
|
+
"../../../node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js"(exports, module) {
|
|
71
71
|
var hasBuffer = typeof Buffer !== "undefined";
|
|
72
72
|
var suspectProtoRx3 = /"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/;
|
|
73
73
|
var suspectConstructorRx3 = /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/;
|
|
@@ -16056,7 +16056,7 @@ function formatTimestamp(date) {
|
|
|
16056
16056
|
}
|
|
16057
16057
|
function truncateByTokens(text4, maxTokens, hint) {
|
|
16058
16058
|
if (tokenx.estimateTokenCount(text4) <= maxTokens) return { text: text4, wasTruncated: false };
|
|
16059
|
-
const truncated =
|
|
16059
|
+
const truncated = chunkLCRYFBV3_cjs.truncateStringByTokens(text4, maxTokens);
|
|
16060
16060
|
const suffix = hint ? ` [${hint} for more]` : "";
|
|
16061
16061
|
return { text: truncated + suffix, wasTruncated: true };
|
|
16062
16062
|
}
|
|
@@ -16108,11 +16108,11 @@ ${JSON.stringify(inv.args, null, 2)}`;
|
|
|
16108
16108
|
});
|
|
16109
16109
|
}
|
|
16110
16110
|
if (inv.state === "result") {
|
|
16111
|
-
const { value: resultValue } =
|
|
16111
|
+
const { value: resultValue } = chunkLCRYFBV3_cjs.resolveToolResultValue(
|
|
16112
16112
|
part,
|
|
16113
16113
|
inv.result
|
|
16114
16114
|
);
|
|
16115
|
-
const resultStr =
|
|
16115
|
+
const resultStr = chunkLCRYFBV3_cjs.formatToolResultForObserver(resultValue, { maxTokens: HIGH_DETAIL_TOOL_RESULT_TOKENS });
|
|
16116
16116
|
const fullText = `[Tool Result: ${inv.toolName}]
|
|
16117
16117
|
${resultStr}`;
|
|
16118
16118
|
parts.push(makePart(msg, i, "tool-result", fullText, detail, inv.toolName));
|
|
@@ -16139,7 +16139,7 @@ ${typeof rawArgs === "string" ? rawArgs : JSON.stringify(rawArgs, null, 2)}`;
|
|
|
16139
16139
|
const toolName = part.toolName;
|
|
16140
16140
|
if (toolName) {
|
|
16141
16141
|
const rawResult = part.output ?? part.result;
|
|
16142
|
-
const resultStr =
|
|
16142
|
+
const resultStr = chunkLCRYFBV3_cjs.formatToolResultForObserver(rawResult, { maxTokens: HIGH_DETAIL_TOOL_RESULT_TOKENS });
|
|
16143
16143
|
const fullText = `[Tool Result: ${toolName}]
|
|
16144
16144
|
${resultStr}`;
|
|
16145
16145
|
parts.push(makePart(msg, i, "tool-result", fullText, detail, toolName));
|
|
@@ -16218,7 +16218,7 @@ function renderFormattedParts(parts, timestamps, options) {
|
|
|
16218
16218
|
const text4 = buildRenderedText(parts, timestamps);
|
|
16219
16219
|
let totalTokens = tokenx.estimateTokenCount(text4);
|
|
16220
16220
|
if (totalTokens > options.maxTokens) {
|
|
16221
|
-
const truncated =
|
|
16221
|
+
const truncated = chunkLCRYFBV3_cjs.truncateStringByTokens(text4, options.maxTokens);
|
|
16222
16222
|
return { text: truncated, truncated: true, tokenOffset: totalTokens - options.maxTokens };
|
|
16223
16223
|
}
|
|
16224
16224
|
const truncatedIndices = parts.map((p, i) => ({ part: p, index: i })).filter(({ part }) => part.text !== part.fullText).sort((a, b) => expandPriority(a.part) - expandPriority(b.part));
|
|
@@ -16251,7 +16251,7 @@ function renderFormattedParts(parts, timestamps, options) {
|
|
|
16251
16251
|
if (expandedTokens <= options.maxTokens) {
|
|
16252
16252
|
return { text: expanded, truncated: false, tokenOffset: 0 };
|
|
16253
16253
|
}
|
|
16254
|
-
const hardTruncated =
|
|
16254
|
+
const hardTruncated = chunkLCRYFBV3_cjs.truncateStringByTokens(expanded, options.maxTokens);
|
|
16255
16255
|
return { text: hardTruncated, truncated: true, tokenOffset: expandedTokens - options.maxTokens };
|
|
16256
16256
|
}
|
|
16257
16257
|
async function recallPart({
|
|
@@ -16302,7 +16302,7 @@ async function recallPart({
|
|
|
16302
16302
|
|
|
16303
16303
|
`;
|
|
16304
16304
|
const fallbackText = `${fallbackNote}${firstNextPart.text}`;
|
|
16305
|
-
const truncatedText2 =
|
|
16305
|
+
const truncatedText2 = chunkLCRYFBV3_cjs.truncateStringByTokens(fallbackText, maxTokens);
|
|
16306
16306
|
const wasTruncated2 = truncatedText2 !== fallbackText;
|
|
16307
16307
|
return {
|
|
16308
16308
|
text: truncatedText2,
|
|
@@ -16317,7 +16317,7 @@ async function recallPart({
|
|
|
16317
16317
|
}
|
|
16318
16318
|
throw new Error(`Part index ${partIndex} not found in message ${cursor}. Available indices: ${availableIndices}`);
|
|
16319
16319
|
}
|
|
16320
|
-
const truncatedText =
|
|
16320
|
+
const truncatedText = chunkLCRYFBV3_cjs.truncateStringByTokens(target.text, maxTokens);
|
|
16321
16321
|
const wasTruncated = truncatedText !== target.text;
|
|
16322
16322
|
return {
|
|
16323
16323
|
text: truncatedText,
|
|
@@ -18075,7 +18075,7 @@ ${workingMemory}`;
|
|
|
18075
18075
|
"Observational memory requires @mastra/core support for request-response-id-rotation. Please bump @mastra/core to a newer version."
|
|
18076
18076
|
);
|
|
18077
18077
|
}
|
|
18078
|
-
const { ObservationalMemory: OMClass } = await import('./observational-memory-
|
|
18078
|
+
const { ObservationalMemory: OMClass } = await import('./observational-memory-5UNUGOE5.cjs');
|
|
18079
18079
|
const onIndexObservations = this.hasRetrievalSearch(omConfig.retrieval) ? async (observation) => {
|
|
18080
18080
|
await this.indexObservation(observation);
|
|
18081
18081
|
} : void 0;
|
|
@@ -19001,7 +19001,7 @@ Notes:
|
|
|
19001
19001
|
if (!effectiveConfig) return null;
|
|
19002
19002
|
const engine = await this.omEngine;
|
|
19003
19003
|
if (!engine) return null;
|
|
19004
|
-
const { ObservationalMemoryProcessor } = await import('./observational-memory-
|
|
19004
|
+
const { ObservationalMemoryProcessor } = await import('./observational-memory-5UNUGOE5.cjs');
|
|
19005
19005
|
return new ObservationalMemoryProcessor(engine, this, {
|
|
19006
19006
|
temporalMarkers: effectiveConfig.temporalMarkers
|
|
19007
19007
|
});
|
|
@@ -19010,11 +19010,11 @@ Notes:
|
|
|
19010
19010
|
|
|
19011
19011
|
Object.defineProperty(exports, "ModelByInputTokens", {
|
|
19012
19012
|
enumerable: true,
|
|
19013
|
-
get: function () { return
|
|
19013
|
+
get: function () { return chunkLCRYFBV3_cjs.ModelByInputTokens; }
|
|
19014
19014
|
});
|
|
19015
19015
|
Object.defineProperty(exports, "getObservationsAsOf", {
|
|
19016
19016
|
enumerable: true,
|
|
19017
|
-
get: function () { return
|
|
19017
|
+
get: function () { return chunkLCRYFBV3_cjs.getObservationsAsOf; }
|
|
19018
19018
|
});
|
|
19019
19019
|
Object.defineProperty(exports, "MessageHistory", {
|
|
19020
19020
|
enumerable: true,
|