@mastra/server 1.9.0 → 1.10.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 +32 -0
- package/dist/{chunk-YMHD5QN4.cjs → chunk-4IA52F5N.cjs} +6 -6
- package/dist/{chunk-YMHD5QN4.cjs.map → chunk-4IA52F5N.cjs.map} +1 -1
- package/dist/{chunk-IXA4YZMV.js → chunk-4WMV5R64.js} +59 -11
- package/dist/chunk-4WMV5R64.js.map +1 -0
- package/dist/{chunk-ICZV5UXL.js → chunk-7Z23EFVZ.js} +248 -59
- package/dist/chunk-7Z23EFVZ.js.map +1 -0
- package/dist/{chunk-NZGPG5ZI.js → chunk-AC5X66E2.js} +3 -3
- package/dist/{chunk-NZGPG5ZI.js.map → chunk-AC5X66E2.js.map} +1 -1
- package/dist/{chunk-AAZLFKSD.js → chunk-B5GSYU7J.js} +9 -2
- package/dist/chunk-B5GSYU7J.js.map +1 -0
- package/dist/{chunk-4DEUEWUP.cjs → chunk-BF34CMII.cjs} +5 -5
- package/dist/{chunk-4DEUEWUP.cjs.map → chunk-BF34CMII.cjs.map} +1 -1
- package/dist/{chunk-QVQKUSBW.cjs → chunk-BZO7NV5A.cjs} +6 -6
- package/dist/{chunk-QVQKUSBW.cjs.map → chunk-BZO7NV5A.cjs.map} +1 -1
- package/dist/{chunk-EGWACN4Q.cjs → chunk-CARPBU5W.cjs} +9 -2
- package/dist/chunk-CARPBU5W.cjs.map +1 -0
- package/dist/{chunk-TXC7QU6O.cjs → chunk-E5I4COAV.cjs} +248 -59
- package/dist/chunk-E5I4COAV.cjs.map +1 -0
- package/dist/{chunk-HLFFDNMA.js → chunk-G4F3KPUR.js} +3 -3
- package/dist/{chunk-HLFFDNMA.js.map → chunk-G4F3KPUR.js.map} +1 -1
- package/dist/{chunk-P6HZ2B4Z.cjs → chunk-MHB5LKA4.cjs} +4 -4
- package/dist/{chunk-P6HZ2B4Z.cjs.map → chunk-MHB5LKA4.cjs.map} +1 -1
- package/dist/{chunk-QUZKXCTG.js → chunk-QITXZQID.js} +3 -3
- package/dist/{chunk-QUZKXCTG.js.map → chunk-QITXZQID.js.map} +1 -1
- package/dist/{chunk-PKBWZ2N5.js → chunk-QJ7ZMX7Y.js} +3 -3
- package/dist/{chunk-PKBWZ2N5.js.map → chunk-QJ7ZMX7Y.js.map} +1 -1
- package/dist/{chunk-OMLZSETB.cjs → chunk-TVJYM7U2.cjs} +59 -11
- package/dist/chunk-TVJYM7U2.cjs.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-server-create-route.md +14 -14
- package/dist/docs/references/reference-server-mastra-server.md +10 -10
- package/dist/{observational-memory-SR6G4HN5-G66HNVG4.cjs → observational-memory-QFQUF5EY-5VPKVXKI.cjs} +653 -532
- package/dist/observational-memory-QFQUF5EY-5VPKVXKI.cjs.map +1 -0
- package/dist/{observational-memory-SR6G4HN5-PSFX73LD.js → observational-memory-QFQUF5EY-GQK2OWVA.js} +653 -532
- package/dist/observational-memory-QFQUF5EY-GQK2OWVA.js.map +1 -0
- package/dist/server/handlers/a2a.cjs +9 -9
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +16 -16
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agents.cjs +33 -33
- package/dist/server/handlers/agents.d.ts +3 -2
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/auth.cjs +9 -9
- package/dist/server/handlers/auth.d.ts.map +1 -1
- package/dist/server/handlers/auth.js +1 -1
- package/dist/server/handlers/mcp.d.ts +1 -1
- package/dist/server/handlers/scores.cjs +7 -7
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/voice.cjs +8 -8
- package/dist/server/handlers/voice.js +1 -1
- package/dist/server/handlers.cjs +12 -12
- package/dist/server/handlers.js +6 -6
- package/dist/server/schemas/mcp.d.ts +2 -2
- package/dist/server/server-adapter/index.cjs +66 -66
- package/dist/server/server-adapter/index.js +7 -7
- package/package.json +6 -6
- package/dist/chunk-AAZLFKSD.js.map +0 -1
- package/dist/chunk-EGWACN4Q.cjs.map +0 -1
- package/dist/chunk-ICZV5UXL.js.map +0 -1
- package/dist/chunk-IXA4YZMV.js.map +0 -1
- package/dist/chunk-OMLZSETB.cjs.map +0 -1
- package/dist/chunk-TXC7QU6O.cjs.map +0 -1
- package/dist/observational-memory-SR6G4HN5-G66HNVG4.cjs.map +0 -1
- package/dist/observational-memory-SR6G4HN5-PSFX73LD.js.map +0 -1
|
@@ -22472,7 +22472,7 @@ function withUserAgentSuffix2(headers, ...userAgentSuffixParts) {
|
|
|
22472
22472
|
);
|
|
22473
22473
|
return Object.fromEntries(normalizedHeaders.entries());
|
|
22474
22474
|
}
|
|
22475
|
-
var VERSION4 = "4.0.
|
|
22475
|
+
var VERSION4 = "4.0.19";
|
|
22476
22476
|
var getOriginalFetch3 = () => globalThis.fetch;
|
|
22477
22477
|
var getFromApi2 = async ({
|
|
22478
22478
|
url,
|
|
@@ -22557,8 +22557,8 @@ function loadOptionalSetting2({
|
|
|
22557
22557
|
}
|
|
22558
22558
|
return settingValue;
|
|
22559
22559
|
}
|
|
22560
|
-
var suspectProtoRx2 = /"
|
|
22561
|
-
var suspectConstructorRx2 = /"
|
|
22560
|
+
var suspectProtoRx2 = /"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/;
|
|
22561
|
+
var suspectConstructorRx2 = /"(?: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*:/;
|
|
22562
22562
|
function _parse2(text42) {
|
|
22563
22563
|
const obj = JSON.parse(text42);
|
|
22564
22564
|
if (obj === null || typeof obj !== "object") {
|
|
@@ -22578,7 +22578,7 @@ function filter2(obj) {
|
|
|
22578
22578
|
if (Object.prototype.hasOwnProperty.call(node, "__proto__")) {
|
|
22579
22579
|
throw new SyntaxError("Object contains forbidden prototype property");
|
|
22580
22580
|
}
|
|
22581
|
-
if (Object.prototype.hasOwnProperty.call(node, "constructor") && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
|
|
22581
|
+
if (Object.prototype.hasOwnProperty.call(node, "constructor") && node.constructor !== null && typeof node.constructor === "object" && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
|
|
22582
22582
|
throw new SyntaxError("Object contains forbidden prototype property");
|
|
22583
22583
|
}
|
|
22584
22584
|
for (const key in node) {
|
|
@@ -25142,16 +25142,14 @@ var GatewayVideoModel = class {
|
|
|
25142
25142
|
var _a932;
|
|
25143
25143
|
const resolvedHeaders = await resolve2(this.config.headers());
|
|
25144
25144
|
try {
|
|
25145
|
-
const {
|
|
25146
|
-
responseHeaders,
|
|
25147
|
-
value: responseBody
|
|
25148
|
-
} = await postJsonToApi2({
|
|
25145
|
+
const { responseHeaders, value: responseBody } = await postJsonToApi2({
|
|
25149
25146
|
url: this.getUrl(),
|
|
25150
25147
|
headers: combineHeaders2(
|
|
25151
25148
|
resolvedHeaders,
|
|
25152
25149
|
headers != null ? headers : {},
|
|
25153
25150
|
this.getModelConfigHeaders(),
|
|
25154
|
-
await resolve2(this.config.o11yHeaders)
|
|
25151
|
+
await resolve2(this.config.o11yHeaders),
|
|
25152
|
+
{ accept: "text/event-stream" }
|
|
25155
25153
|
),
|
|
25156
25154
|
body: {
|
|
25157
25155
|
prompt,
|
|
@@ -25164,9 +25162,70 @@ var GatewayVideoModel = class {
|
|
|
25164
25162
|
...providerOptions && { providerOptions },
|
|
25165
25163
|
...image && { image: maybeEncodeVideoFile(image) }
|
|
25166
25164
|
},
|
|
25167
|
-
successfulResponseHandler:
|
|
25168
|
-
|
|
25169
|
-
|
|
25165
|
+
successfulResponseHandler: async ({
|
|
25166
|
+
response,
|
|
25167
|
+
url,
|
|
25168
|
+
requestBodyValues
|
|
25169
|
+
}) => {
|
|
25170
|
+
if (response.body == null) {
|
|
25171
|
+
throw new APICallError3({
|
|
25172
|
+
message: "SSE response body is empty",
|
|
25173
|
+
url,
|
|
25174
|
+
requestBodyValues,
|
|
25175
|
+
statusCode: response.status
|
|
25176
|
+
});
|
|
25177
|
+
}
|
|
25178
|
+
const eventStream = parseJsonEventStream2({
|
|
25179
|
+
stream: response.body,
|
|
25180
|
+
schema: gatewayVideoEventSchema
|
|
25181
|
+
});
|
|
25182
|
+
const reader = eventStream.getReader();
|
|
25183
|
+
const { done, value: parseResult } = await reader.read();
|
|
25184
|
+
reader.releaseLock();
|
|
25185
|
+
if (done || !parseResult) {
|
|
25186
|
+
throw new APICallError3({
|
|
25187
|
+
message: "SSE stream ended without a data event",
|
|
25188
|
+
url,
|
|
25189
|
+
requestBodyValues,
|
|
25190
|
+
statusCode: response.status
|
|
25191
|
+
});
|
|
25192
|
+
}
|
|
25193
|
+
if (!parseResult.success) {
|
|
25194
|
+
throw new APICallError3({
|
|
25195
|
+
message: "Failed to parse video SSE event",
|
|
25196
|
+
cause: parseResult.error,
|
|
25197
|
+
url,
|
|
25198
|
+
requestBodyValues,
|
|
25199
|
+
statusCode: response.status
|
|
25200
|
+
});
|
|
25201
|
+
}
|
|
25202
|
+
const event = parseResult.value;
|
|
25203
|
+
if (event.type === "error") {
|
|
25204
|
+
throw new APICallError3({
|
|
25205
|
+
message: event.message,
|
|
25206
|
+
statusCode: event.statusCode,
|
|
25207
|
+
url,
|
|
25208
|
+
requestBodyValues,
|
|
25209
|
+
responseHeaders: Object.fromEntries([...response.headers]),
|
|
25210
|
+
responseBody: JSON.stringify(event),
|
|
25211
|
+
data: {
|
|
25212
|
+
error: {
|
|
25213
|
+
message: event.message,
|
|
25214
|
+
type: event.errorType,
|
|
25215
|
+
param: event.param
|
|
25216
|
+
}
|
|
25217
|
+
}
|
|
25218
|
+
});
|
|
25219
|
+
}
|
|
25220
|
+
return {
|
|
25221
|
+
value: {
|
|
25222
|
+
videos: event.videos,
|
|
25223
|
+
warnings: event.warnings,
|
|
25224
|
+
providerMetadata: event.providerMetadata
|
|
25225
|
+
},
|
|
25226
|
+
responseHeaders: Object.fromEntries([...response.headers])
|
|
25227
|
+
};
|
|
25228
|
+
},
|
|
25170
25229
|
failedResponseHandler: createJsonErrorResponseHandler2({
|
|
25171
25230
|
errorSchema: z$1.any(),
|
|
25172
25231
|
errorToMessage: (data) => data
|
|
@@ -25238,11 +25297,21 @@ var gatewayVideoWarningSchema = z$1.discriminatedUnion("type", [
|
|
|
25238
25297
|
message: z$1.string()
|
|
25239
25298
|
})
|
|
25240
25299
|
]);
|
|
25241
|
-
var
|
|
25242
|
-
|
|
25243
|
-
|
|
25244
|
-
|
|
25245
|
-
|
|
25300
|
+
var gatewayVideoEventSchema = z$1.discriminatedUnion("type", [
|
|
25301
|
+
z$1.object({
|
|
25302
|
+
type: z$1.literal("result"),
|
|
25303
|
+
videos: z$1.array(gatewayVideoDataSchema),
|
|
25304
|
+
warnings: z$1.array(gatewayVideoWarningSchema).optional(),
|
|
25305
|
+
providerMetadata: z$1.record(z$1.string(), providerMetadataEntrySchema22).optional()
|
|
25306
|
+
}),
|
|
25307
|
+
z$1.object({
|
|
25308
|
+
type: z$1.literal("error"),
|
|
25309
|
+
message: z$1.string(),
|
|
25310
|
+
errorType: z$1.string(),
|
|
25311
|
+
statusCode: z$1.number(),
|
|
25312
|
+
param: z$1.unknown().nullable()
|
|
25313
|
+
})
|
|
25314
|
+
]);
|
|
25246
25315
|
var parallelSearchInputSchema = lazySchema(
|
|
25247
25316
|
() => zodSchema3(
|
|
25248
25317
|
z.object({
|
|
@@ -25419,7 +25488,7 @@ async function getVercelRequestId2() {
|
|
|
25419
25488
|
var _a932;
|
|
25420
25489
|
return (_a932 = (0, import_oidc3.getContext)().headers) == null ? void 0 : _a932["x-vercel-id"];
|
|
25421
25490
|
}
|
|
25422
|
-
var VERSION5 = "3.0.
|
|
25491
|
+
var VERSION5 = "3.0.66";
|
|
25423
25492
|
var AI_GATEWAY_PROTOCOL_VERSION2 = "0.0.1";
|
|
25424
25493
|
function createGatewayProvider2(options = {}) {
|
|
25425
25494
|
var _a932, _b92;
|
|
@@ -25462,13 +25531,18 @@ function createGatewayProvider2(options = {}) {
|
|
|
25462
25531
|
settingValue: void 0,
|
|
25463
25532
|
environmentVariableName: "VERCEL_REGION"
|
|
25464
25533
|
});
|
|
25534
|
+
const projectId = loadOptionalSetting2({
|
|
25535
|
+
settingValue: void 0,
|
|
25536
|
+
environmentVariableName: "VERCEL_PROJECT_ID"
|
|
25537
|
+
});
|
|
25465
25538
|
return async () => {
|
|
25466
25539
|
const requestId = await getVercelRequestId2();
|
|
25467
25540
|
return {
|
|
25468
25541
|
...deploymentId && { "ai-o11y-deployment-id": deploymentId },
|
|
25469
25542
|
...environment && { "ai-o11y-environment": environment },
|
|
25470
25543
|
...region && { "ai-o11y-region": region },
|
|
25471
|
-
...requestId && { "ai-o11y-request-id": requestId }
|
|
25544
|
+
...requestId && { "ai-o11y-request-id": requestId },
|
|
25545
|
+
...projectId && { "ai-o11y-project-id": projectId }
|
|
25472
25546
|
};
|
|
25473
25547
|
};
|
|
25474
25548
|
};
|
|
@@ -26487,7 +26561,7 @@ function getTotalTimeoutMs(timeout) {
|
|
|
26487
26561
|
}
|
|
26488
26562
|
return timeout.totalMs;
|
|
26489
26563
|
}
|
|
26490
|
-
var VERSION33 = "6.0.
|
|
26564
|
+
var VERSION33 = "6.0.116";
|
|
26491
26565
|
var dataContentSchema3 = z$1.union([
|
|
26492
26566
|
z$1.string(),
|
|
26493
26567
|
z$1.instanceof(Uint8Array),
|
|
@@ -28037,6 +28111,25 @@ var updateWorkingMemoryTool = (memoryConfig) => {
|
|
|
28037
28111
|
workingMemory = JSON.stringify(mergedData);
|
|
28038
28112
|
} else {
|
|
28039
28113
|
workingMemory = typeof inputData.memory === "string" ? inputData.memory : JSON.stringify(inputData.memory);
|
|
28114
|
+
const existingRaw = await memory.getWorkingMemory({
|
|
28115
|
+
threadId,
|
|
28116
|
+
resourceId,
|
|
28117
|
+
memoryConfig
|
|
28118
|
+
});
|
|
28119
|
+
if (existingRaw) {
|
|
28120
|
+
const template = await memory.getWorkingMemoryTemplate({ memoryConfig });
|
|
28121
|
+
if (template?.content) {
|
|
28122
|
+
const normalizedNew = workingMemory.replace(/\s+/g, " ").trim();
|
|
28123
|
+
const normalizedTemplate = template.content.replace(/\s+/g, " ").trim();
|
|
28124
|
+
const normalizedExisting = existingRaw.replace(/\s+/g, " ").trim();
|
|
28125
|
+
if (normalizedNew === normalizedTemplate && normalizedExisting !== normalizedTemplate) {
|
|
28126
|
+
return {
|
|
28127
|
+
success: false,
|
|
28128
|
+
message: "Attempted to replace existing working memory with empty template. Update skipped to prevent data loss."
|
|
28129
|
+
};
|
|
28130
|
+
}
|
|
28131
|
+
}
|
|
28132
|
+
}
|
|
28040
28133
|
}
|
|
28041
28134
|
await memory.updateWorkingMemory({
|
|
28042
28135
|
threadId,
|
|
@@ -28127,6 +28220,7 @@ function normalizeObservationalMemoryConfig(config) {
|
|
|
28127
28220
|
var CHARS_PER_TOKEN = 4;
|
|
28128
28221
|
var DEFAULT_MESSAGE_RANGE = { before: 1, after: 1 };
|
|
28129
28222
|
var DEFAULT_TOP_K = 4;
|
|
28223
|
+
var VECTOR_DELETE_BATCH_SIZE = 100;
|
|
28130
28224
|
var isZodObject = (v) => v instanceof ZodObject;
|
|
28131
28225
|
var Memory = class extends MastraMemory {
|
|
28132
28226
|
constructor(config = {}) {
|
|
@@ -28316,6 +28410,45 @@ var Memory = class extends MastraMemory {
|
|
|
28316
28410
|
async deleteThread(threadId) {
|
|
28317
28411
|
const memoryStore = await this.getMemoryStore();
|
|
28318
28412
|
await memoryStore.deleteThread({ threadId });
|
|
28413
|
+
if (this.vector) {
|
|
28414
|
+
void this.deleteThreadVectors(threadId);
|
|
28415
|
+
}
|
|
28416
|
+
}
|
|
28417
|
+
/**
|
|
28418
|
+
* Lists all vector indexes that match the memory messages prefix.
|
|
28419
|
+
* Handles separator differences across vector store backends (e.g. '_' vs '-').
|
|
28420
|
+
*/
|
|
28421
|
+
async getMemoryVectorIndexes() {
|
|
28422
|
+
if (!this.vector) return [];
|
|
28423
|
+
const separator = this.vector.indexSeparator ?? "_";
|
|
28424
|
+
const prefix = `memory${separator}messages`;
|
|
28425
|
+
const indexes = await this.vector.listIndexes();
|
|
28426
|
+
return indexes.filter((name21) => name21.startsWith(prefix));
|
|
28427
|
+
}
|
|
28428
|
+
/**
|
|
28429
|
+
* Deletes all vector embeddings associated with a thread.
|
|
28430
|
+
* This is called internally by deleteThread to clean up orphaned vectors.
|
|
28431
|
+
*
|
|
28432
|
+
* @param threadId - The ID of the thread whose vectors should be deleted
|
|
28433
|
+
*/
|
|
28434
|
+
async deleteThreadVectors(threadId) {
|
|
28435
|
+
try {
|
|
28436
|
+
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
28437
|
+
await Promise.all(
|
|
28438
|
+
memoryIndexes.map(async (indexName) => {
|
|
28439
|
+
try {
|
|
28440
|
+
await this.vector.deleteVectors({
|
|
28441
|
+
indexName,
|
|
28442
|
+
filter: { thread_id: threadId }
|
|
28443
|
+
});
|
|
28444
|
+
} catch {
|
|
28445
|
+
this.logger.debug(`Failed to delete vectors for thread ${threadId} in ${indexName}, skipping`);
|
|
28446
|
+
}
|
|
28447
|
+
})
|
|
28448
|
+
);
|
|
28449
|
+
} catch {
|
|
28450
|
+
this.logger.debug(`Failed to clean up vectors for thread ${threadId}`);
|
|
28451
|
+
}
|
|
28319
28452
|
}
|
|
28320
28453
|
async updateWorkingMemory({
|
|
28321
28454
|
threadId,
|
|
@@ -28333,25 +28466,33 @@ var Memory = class extends MastraMemory {
|
|
|
28333
28466
|
`Memory error: Resource-scoped working memory is enabled but no resourceId was provided. Either provide a resourceId or explicitly set workingMemory.scope to 'thread'.`
|
|
28334
28467
|
);
|
|
28335
28468
|
}
|
|
28336
|
-
const
|
|
28337
|
-
|
|
28338
|
-
|
|
28339
|
-
|
|
28340
|
-
|
|
28341
|
-
|
|
28342
|
-
|
|
28343
|
-
|
|
28344
|
-
|
|
28345
|
-
throw new Error(`Thread ${threadId} not found`);
|
|
28346
|
-
}
|
|
28347
|
-
await memoryStore.updateThread({
|
|
28348
|
-
id: threadId,
|
|
28349
|
-
title: thread.title || "",
|
|
28350
|
-
metadata: {
|
|
28351
|
-
...thread.metadata,
|
|
28469
|
+
const mutexKey = scope === "resource" ? `resource-${resourceId}` : `thread-${threadId}`;
|
|
28470
|
+
const mutex = this.updateWorkingMemoryMutexes.has(mutexKey) ? this.updateWorkingMemoryMutexes.get(mutexKey) : new Mutex();
|
|
28471
|
+
this.updateWorkingMemoryMutexes.set(mutexKey, mutex);
|
|
28472
|
+
const release = await mutex.acquire();
|
|
28473
|
+
try {
|
|
28474
|
+
const memoryStore = await this.getMemoryStore();
|
|
28475
|
+
if (scope === "resource" && resourceId) {
|
|
28476
|
+
await memoryStore.updateResource({
|
|
28477
|
+
resourceId,
|
|
28352
28478
|
workingMemory
|
|
28479
|
+
});
|
|
28480
|
+
} else {
|
|
28481
|
+
const thread = await this.getThreadById({ threadId });
|
|
28482
|
+
if (!thread) {
|
|
28483
|
+
throw new Error(`Thread ${threadId} not found`);
|
|
28353
28484
|
}
|
|
28354
|
-
|
|
28485
|
+
await memoryStore.updateThread({
|
|
28486
|
+
id: threadId,
|
|
28487
|
+
title: thread.title || "",
|
|
28488
|
+
metadata: {
|
|
28489
|
+
...thread.metadata,
|
|
28490
|
+
workingMemory
|
|
28491
|
+
}
|
|
28492
|
+
});
|
|
28493
|
+
}
|
|
28494
|
+
} finally {
|
|
28495
|
+
release();
|
|
28355
28496
|
}
|
|
28356
28497
|
}
|
|
28357
28498
|
updateWorkingMemoryMutexes = /* @__PURE__ */ new Map();
|
|
@@ -28377,16 +28518,26 @@ var Memory = class extends MastraMemory {
|
|
|
28377
28518
|
const existingWorkingMemory = await this.getWorkingMemory({ threadId, resourceId, memoryConfig }) || "";
|
|
28378
28519
|
const template = await this.getWorkingMemoryTemplate({ memoryConfig });
|
|
28379
28520
|
let reason = "";
|
|
28521
|
+
const normalizeForComparison = (str) => str.replace(/\s+/g, " ").trim();
|
|
28522
|
+
const normalizedNewMemory = normalizeForComparison(workingMemory);
|
|
28523
|
+
const normalizedTemplate = template?.content ? normalizeForComparison(template.content) : "";
|
|
28380
28524
|
if (existingWorkingMemory) {
|
|
28381
28525
|
if (searchString && existingWorkingMemory?.includes(searchString)) {
|
|
28382
28526
|
workingMemory = existingWorkingMemory.replace(searchString, workingMemory);
|
|
28383
28527
|
reason = `found and replaced searchString with newMemory`;
|
|
28384
|
-
} else if (existingWorkingMemory.includes(workingMemory) || template?.content?.trim() === workingMemory.trim()
|
|
28528
|
+
} else if (existingWorkingMemory.includes(workingMemory) || template?.content?.trim() === workingMemory.trim() || // Also check normalized versions to catch template variations with different whitespace
|
|
28529
|
+
normalizedNewMemory === normalizedTemplate) {
|
|
28385
28530
|
return {
|
|
28386
28531
|
success: false,
|
|
28387
28532
|
reason: `attempted to insert duplicate data into working memory. this entry was skipped`
|
|
28388
28533
|
};
|
|
28389
28534
|
} else {
|
|
28535
|
+
if (normalizedNewMemory === normalizedTemplate) {
|
|
28536
|
+
return {
|
|
28537
|
+
success: false,
|
|
28538
|
+
reason: `attempted to append empty template to working memory. this entry was skipped`
|
|
28539
|
+
};
|
|
28540
|
+
}
|
|
28390
28541
|
if (searchString) {
|
|
28391
28542
|
reason = `attempted to replace working memory string that doesn't exist. Appending to working memory instead.`;
|
|
28392
28543
|
} else {
|
|
@@ -28395,7 +28546,7 @@ var Memory = class extends MastraMemory {
|
|
|
28395
28546
|
workingMemory = existingWorkingMemory + `
|
|
28396
28547
|
${workingMemory}`;
|
|
28397
28548
|
}
|
|
28398
|
-
} else if (workingMemory === template?.content) {
|
|
28549
|
+
} else if (workingMemory === template?.content || normalizedNewMemory === normalizedTemplate) {
|
|
28399
28550
|
return {
|
|
28400
28551
|
success: false,
|
|
28401
28552
|
reason: `try again when you have data to add. newMemory was equal to the working memory template`
|
|
@@ -28403,7 +28554,13 @@ ${workingMemory}`;
|
|
|
28403
28554
|
} else {
|
|
28404
28555
|
reason = `started new working memory`;
|
|
28405
28556
|
}
|
|
28406
|
-
|
|
28557
|
+
if (template?.content) {
|
|
28558
|
+
workingMemory = workingMemory.replaceAll(template.content, "");
|
|
28559
|
+
const templateWithUnixLineEndings = template.content.replace(/\r\n/g, "\n");
|
|
28560
|
+
const templateWithWindowsLineEndings = template.content.replace(/\n/g, "\r\n");
|
|
28561
|
+
workingMemory = workingMemory.replaceAll(templateWithUnixLineEndings, "");
|
|
28562
|
+
workingMemory = workingMemory.replaceAll(templateWithWindowsLineEndings, "");
|
|
28563
|
+
}
|
|
28407
28564
|
const scope = config.workingMemory.scope || "resource";
|
|
28408
28565
|
if (scope === "resource" && !resourceId) {
|
|
28409
28566
|
throw new Error(
|
|
@@ -28879,24 +29036,25 @@ Notes:
|
|
|
28879
29036
|
const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
|
|
28880
29037
|
if (messageIdsNeedingDeletion.size > 0) {
|
|
28881
29038
|
try {
|
|
28882
|
-
const
|
|
28883
|
-
const
|
|
28884
|
-
|
|
28885
|
-
|
|
28886
|
-
|
|
28887
|
-
|
|
28888
|
-
|
|
28889
|
-
|
|
28890
|
-
|
|
28891
|
-
|
|
28892
|
-
|
|
28893
|
-
|
|
28894
|
-
|
|
29039
|
+
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
29040
|
+
const idsToDelete = [...messageIdsNeedingDeletion];
|
|
29041
|
+
await Promise.all(
|
|
29042
|
+
memoryIndexes.map(async (indexName) => {
|
|
29043
|
+
for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
29044
|
+
const batch = idsToDelete.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
|
|
29045
|
+
try {
|
|
29046
|
+
await this.vector.deleteVectors({
|
|
29047
|
+
indexName,
|
|
29048
|
+
filter: { message_id: { $in: batch } }
|
|
29049
|
+
});
|
|
29050
|
+
} catch {
|
|
29051
|
+
this.logger.debug(`Failed to delete vector batch in ${indexName} (batch offset ${i}), skipping`);
|
|
29052
|
+
}
|
|
28895
29053
|
}
|
|
28896
|
-
}
|
|
28897
|
-
|
|
29054
|
+
})
|
|
29055
|
+
);
|
|
28898
29056
|
} catch {
|
|
28899
|
-
this.logger.debug(`
|
|
29057
|
+
this.logger.debug(`Failed to clean up old vectors during message update`);
|
|
28900
29058
|
}
|
|
28901
29059
|
}
|
|
28902
29060
|
if (embeddingData.length > 0 && dimension !== void 0) {
|
|
@@ -28947,6 +29105,37 @@ Notes:
|
|
|
28947
29105
|
}
|
|
28948
29106
|
const memoryStore = await this.getMemoryStore();
|
|
28949
29107
|
await memoryStore.deleteMessages(messageIds);
|
|
29108
|
+
if (this.vector) {
|
|
29109
|
+
void this.deleteMessageVectors(messageIds);
|
|
29110
|
+
}
|
|
29111
|
+
}
|
|
29112
|
+
/**
|
|
29113
|
+
* Deletes vector embeddings for specific messages.
|
|
29114
|
+
* This is called internally by deleteMessages to clean up orphaned vectors.
|
|
29115
|
+
*
|
|
29116
|
+
* @param messageIds - The IDs of the messages whose vectors should be deleted
|
|
29117
|
+
*/
|
|
29118
|
+
async deleteMessageVectors(messageIds) {
|
|
29119
|
+
try {
|
|
29120
|
+
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
29121
|
+
await Promise.all(
|
|
29122
|
+
memoryIndexes.map(async (indexName) => {
|
|
29123
|
+
for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
29124
|
+
const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
|
|
29125
|
+
try {
|
|
29126
|
+
await this.vector.deleteVectors({
|
|
29127
|
+
indexName,
|
|
29128
|
+
filter: { message_id: { $in: batch } }
|
|
29129
|
+
});
|
|
29130
|
+
} catch {
|
|
29131
|
+
this.logger.debug(`Failed to delete vector batch in ${indexName} (batch offset ${i}), skipping`);
|
|
29132
|
+
}
|
|
29133
|
+
}
|
|
29134
|
+
})
|
|
29135
|
+
);
|
|
29136
|
+
} catch {
|
|
29137
|
+
this.logger.debug(`Failed to clean up vectors for deleted messages`);
|
|
29138
|
+
}
|
|
28950
29139
|
}
|
|
28951
29140
|
/**
|
|
28952
29141
|
* Clone a thread and its messages to create a new independent thread.
|
|
@@ -29361,7 +29550,7 @@ Notes:
|
|
|
29361
29550
|
"Observational memory async buffering is enabled by default but the installed version of @mastra/core does not support it. Either upgrade @mastra/core, @mastra/memory, and your storage adapter (@mastra/libsql, @mastra/pg, or @mastra/mongodb) to the latest version, or explicitly disable async buffering by setting `observation: { bufferTokens: false }` in your observationalMemory config."
|
|
29362
29551
|
);
|
|
29363
29552
|
}
|
|
29364
|
-
const { ObservationalMemory } = await import('./observational-memory-
|
|
29553
|
+
const { ObservationalMemory } = await import('./observational-memory-QFQUF5EY-GQK2OWVA.js');
|
|
29365
29554
|
return new ObservationalMemory({
|
|
29366
29555
|
storage: memoryStore,
|
|
29367
29556
|
scope: omConfig.scope,
|
|
@@ -40264,5 +40453,5 @@ var OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE = createRoute({
|
|
|
40264
40453
|
});
|
|
40265
40454
|
|
|
40266
40455
|
export { CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE, CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE, GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE, GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE, LIST_AGENT_BUILDER_ACTIONS_ROUTE, LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE, OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE, OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, RESUME_AGENT_BUILDER_ACTION_ROUTE, RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE, RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE, START_AGENT_BUILDER_ACTION_RUN_ROUTE, START_ASYNC_AGENT_BUILDER_ACTION_ROUTE, STREAM_AGENT_BUILDER_ACTION_ROUTE, STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, agent_builder_exports };
|
|
40267
|
-
//# sourceMappingURL=chunk-
|
|
40268
|
-
//# sourceMappingURL=chunk-
|
|
40456
|
+
//# sourceMappingURL=chunk-7Z23EFVZ.js.map
|
|
40457
|
+
//# sourceMappingURL=chunk-7Z23EFVZ.js.map
|