@mastra/server 1.58.0-alpha.1 → 1.58.0-alpha.4
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 +87 -0
- package/dist/_types/@mastra_schema-compat/dist/provider-compats/anthropic.d.ts +1 -1
- package/dist/{a2a-CnU9zaGR.js → a2a-8C4O2dVJ.js} +41 -5
- package/dist/a2a-8C4O2dVJ.js.map +1 -0
- package/dist/{a2a-D3ZYeXIx.cjs → a2a-B6YkZ2i9.cjs} +277 -52
- package/dist/a2a-B6YkZ2i9.cjs.map +1 -0
- package/dist/{a2a-oM7aqLz4.cjs → a2a-MPoM5lzS.cjs} +41 -5
- package/dist/a2a-MPoM5lzS.cjs.map +1 -0
- package/dist/{a2a-CHi9AJ0n.js → a2a-_D2EA4oa.js} +266 -53
- package/dist/a2a-_D2EA4oa.js.map +1 -0
- package/dist/{agent-builder-BDYN3r89.cjs → agent-builder-DAiJH1u2.cjs} +2 -2
- package/dist/{agent-builder-BDYN3r89.cjs.map → agent-builder-DAiJH1u2.cjs.map} +1 -1
- package/dist/{agent-builder-Dqy_qumV.js → agent-builder-gGFywDVq.js} +2 -2
- package/dist/{agent-builder-Dqy_qumV.js.map → agent-builder-gGFywDVq.js.map} +1 -1
- package/dist/{api-schema-manifest-J5hfk5ZZ.cjs → api-schema-manifest-B3bC-D98.cjs} +2 -2
- package/dist/{api-schema-manifest-J5hfk5ZZ.cjs.map → api-schema-manifest-B3bC-D98.cjs.map} +1 -1
- package/dist/{api-schema-manifest-R8CsF6RX.js → api-schema-manifest-B4J_QYOr.js} +2 -2
- package/dist/{api-schema-manifest-R8CsF6RX.js.map → api-schema-manifest-B4J_QYOr.js.map} +1 -1
- package/dist/{dist-IUXZtNBY.js → dist-BKRMiJcn.js} +102 -49
- package/dist/dist-BKRMiJcn.js.map +1 -0
- package/dist/{dist-DgY0llRv.cjs → dist-C2-SedDQ.cjs} +102 -49
- package/dist/dist-C2-SedDQ.cjs.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-agents-a2a.md +39 -0
- package/dist/docs/references/reference-server-routes.md +25 -11
- package/dist/route-builder-CIk5k35M.js.map +1 -1
- package/dist/route-builder-CgLVYL1c.cjs.map +1 -1
- package/dist/{routes-BzR8iVj4.cjs → routes-CZwPlO3-.cjs} +3 -2
- package/dist/routes-CZwPlO3-.cjs.map +1 -0
- package/dist/{routes-C7iRCN_l.js → routes-HUaCyUb7.js} +4 -3
- package/dist/{routes-C7iRCN_l.js.map → routes-HUaCyUb7.js.map} +1 -1
- package/dist/server/a2a/store.cjs +4 -0
- package/dist/server/a2a/store.cjs.map +1 -1
- package/dist/server/a2a/store.d.ts +3 -0
- package/dist/server/a2a/store.d.ts.map +1 -1
- package/dist/server/a2a/store.js +4 -0
- package/dist/server/a2a/store.js.map +1 -1
- package/dist/server/handlers/a2a.cjs +3 -1
- package/dist/server/handlers/a2a.d.ts +152 -10
- package/dist/server/handlers/a2a.d.ts.map +1 -1
- package/dist/server/handlers/a2a.js +2 -2
- package/dist/server/handlers/agent-builder.cjs +3 -3
- package/dist/server/handlers/agent-builder.js +3 -3
- package/dist/server/handlers/agent-controller.cjs +25 -6
- package/dist/server/handlers/agent-controller.cjs.map +1 -1
- package/dist/server/handlers/agent-controller.d.ts +4 -3
- package/dist/server/handlers/agent-controller.d.ts.map +1 -1
- package/dist/server/handlers/agent-controller.js +25 -6
- package/dist/server/handlers/agent-controller.js.map +1 -1
- package/dist/server/handlers/mcp-client-versions.cjs +1 -1
- package/dist/server/handlers/mcp-client-versions.js +1 -1
- package/dist/server/handlers/prompt-block-versions.cjs +1 -1
- package/dist/server/handlers/prompt-block-versions.js +1 -1
- package/dist/server/handlers/scorer-versions.cjs +1 -1
- package/dist/server/handlers/scorer-versions.js +1 -1
- package/dist/server/handlers/stored-mcp-clients.cjs +1 -1
- package/dist/server/handlers/stored-mcp-clients.js +1 -1
- package/dist/server/handlers/stored-prompt-blocks.cjs +1 -1
- package/dist/server/handlers/stored-prompt-blocks.js +1 -1
- package/dist/server/handlers/stored-scorers.cjs +1 -1
- package/dist/server/handlers/stored-scorers.js +1 -1
- package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
- package/dist/server/handlers/stored-skill-favorites.js +1 -1
- package/dist/server/handlers/stored-skills.cjs +1 -1
- package/dist/server/handlers/stored-skills.js +1 -1
- package/dist/server/handlers/system.cjs +1 -1
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/workflows.cjs +93 -2
- package/dist/server/handlers/workflows.cjs.map +1 -1
- package/dist/server/handlers/workflows.d.ts +9 -0
- package/dist/server/handlers/workflows.d.ts.map +1 -1
- package/dist/server/handlers/workflows.js +92 -3
- package/dist/server/handlers/workflows.js.map +1 -1
- package/dist/server/handlers.cjs +1 -1
- package/dist/server/handlers.js +1 -1
- package/dist/server/schemas/a2a.d.ts +70 -6
- package/dist/server/schemas/a2a.d.ts.map +1 -1
- package/dist/server/schemas/index.cjs +4 -4
- package/dist/server/schemas/index.js +4 -4
- package/dist/server/schemas/workflows.d.ts +8 -0
- package/dist/server/schemas/workflows.d.ts.map +1 -1
- package/dist/server/server-adapter/index.cjs +42 -1
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.d.ts +37 -0
- package/dist/server/server-adapter/index.d.ts.map +1 -1
- package/dist/server/server-adapter/index.js +43 -3
- package/dist/server/server-adapter/index.js.map +1 -1
- package/dist/server/server-adapter/routes/a2a.d.ts +116 -8
- package/dist/server/server-adapter/routes/a2a.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/workflows.d.ts +7 -1
- package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
- package/dist/{workflows-DPW6FrY0.js → workflows-CMU5dz_4.js} +7 -2
- package/dist/workflows-CMU5dz_4.js.map +1 -0
- package/dist/{workflows-XfiENvkF.cjs → workflows-Dzxr6cmf.cjs} +12 -1
- package/dist/workflows-Dzxr6cmf.cjs.map +1 -0
- package/package.json +6 -6
- package/dist/a2a-CHi9AJ0n.js.map +0 -1
- package/dist/a2a-CnU9zaGR.js.map +0 -1
- package/dist/a2a-D3ZYeXIx.cjs.map +0 -1
- package/dist/a2a-oM7aqLz4.cjs.map +0 -1
- package/dist/dist-DgY0llRv.cjs.map +0 -1
- package/dist/dist-IUXZtNBY.js.map +0 -1
- package/dist/routes-BzR8iVj4.cjs.map +0 -1
- package/dist/workflows-DPW6FrY0.js.map +0 -1
- package/dist/workflows-XfiENvkF.cjs.map +0 -1
|
@@ -5962,7 +5962,7 @@ function splitLines(text) {
|
|
|
5962
5962
|
return result;
|
|
5963
5963
|
}
|
|
5964
5964
|
//#endregion
|
|
5965
|
-
//#region ../memory/dist/src-
|
|
5965
|
+
//#region ../memory/dist/src-CdqJP57F.js
|
|
5966
5966
|
var __defProp$3 = Object.defineProperty;
|
|
5967
5967
|
var __exportAll = (all, no_symbols) => {
|
|
5968
5968
|
let target = {};
|
|
@@ -24815,9 +24815,10 @@ async function listThreadsForResource({ memory, resourceId, currentThreadId, pag
|
|
|
24815
24815
|
hasMore
|
|
24816
24816
|
};
|
|
24817
24817
|
}
|
|
24818
|
+
const SEARCH_NOT_CONFIGURED_MESSAGE = "Search is not configured. Enable it with `retrieval: { vector: true }` and configure a vector store and embedder on your Memory instance.";
|
|
24818
24819
|
async function searchMessagesForResource({ memory, resourceId, currentThreadId, query, topK = 10, maxTokens = DEFAULT_MAX_RESULT_TOKENS, before, after, threadScope }) {
|
|
24819
24820
|
if (!memory.searchMessages) return {
|
|
24820
|
-
results:
|
|
24821
|
+
results: SEARCH_NOT_CONFIGURED_MESSAGE,
|
|
24821
24822
|
count: 0
|
|
24822
24823
|
};
|
|
24823
24824
|
const MAX_TOPK = 20;
|
|
@@ -25363,9 +25364,16 @@ async function recallThreadFromStart({ memory, threadId, resourceId, page = 1, l
|
|
|
25363
25364
|
}
|
|
25364
25365
|
const recallTool = (_memoryConfig, options) => {
|
|
25365
25366
|
const isResourceScope = (options?.retrievalScope ?? "thread") === "resource";
|
|
25367
|
+
const searchEnabled = options?.searchEnabled ?? true;
|
|
25368
|
+
const description = isResourceScope ? `Browse conversation history. Use mode="threads" to list all threads for the current user. Use mode="messages" (default) to browse messages in the current thread or pass threadId to browse another thread in the active resource. When mode="messages" has no cursor or threadId, it defaults to the current thread and says so at the top of the result. If you pass only a cursor, it must belong to the current thread.${searchEnabled ? " Use mode=\"search\" to find messages by content across all threads." : ""}` : `Browse conversation history in the current thread. Use mode="messages" (default) to page through messages near a cursor.${searchEnabled ? " Use mode=\"search\" to find messages by content in this thread." : ""} Use mode="threads" to get the current thread's ID and title.`;
|
|
25369
|
+
const modeEnum = searchEnabled ? [
|
|
25370
|
+
"messages",
|
|
25371
|
+
"threads",
|
|
25372
|
+
"search"
|
|
25373
|
+
] : ["messages", "threads"];
|
|
25366
25374
|
return (0, _mastra_core_tools.createTool)({
|
|
25367
25375
|
id: "recall",
|
|
25368
|
-
description
|
|
25376
|
+
description,
|
|
25369
25377
|
inputSchema: {
|
|
25370
25378
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
25371
25379
|
type: "object",
|
|
@@ -25373,12 +25381,8 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25373
25381
|
...isResourceScope ? {
|
|
25374
25382
|
mode: {
|
|
25375
25383
|
type: "string",
|
|
25376
|
-
enum:
|
|
25377
|
-
|
|
25378
|
-
"threads",
|
|
25379
|
-
"search"
|
|
25380
|
-
],
|
|
25381
|
-
description: "What to retrieve. \"messages\" (default) pages through message history. \"threads\" lists all threads for the current user. \"search\" finds messages by semantic similarity across all threads."
|
|
25384
|
+
enum: modeEnum,
|
|
25385
|
+
description: `What to retrieve. "messages" (default) pages through message history. "threads" lists all threads for the current user.${searchEnabled ? " \"search\" finds messages by semantic similarity across all threads." : ""}`
|
|
25382
25386
|
},
|
|
25383
25387
|
threadId: {
|
|
25384
25388
|
type: "string",
|
|
@@ -25395,18 +25399,14 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25395
25399
|
}
|
|
25396
25400
|
} : { mode: {
|
|
25397
25401
|
type: "string",
|
|
25398
|
-
enum:
|
|
25399
|
-
|
|
25400
|
-
"threads",
|
|
25401
|
-
"search"
|
|
25402
|
-
],
|
|
25403
|
-
description: "What to retrieve. \"messages\" (default) pages through message history. \"threads\" returns info about the current thread. \"search\" finds messages by semantic similarity in this thread."
|
|
25402
|
+
enum: modeEnum,
|
|
25403
|
+
description: `What to retrieve. "messages" (default) pages through message history. "threads" returns info about the current thread.${searchEnabled ? " \"search\" finds messages by semantic similarity in this thread." : ""}`
|
|
25404
25404
|
} },
|
|
25405
|
-
query: {
|
|
25405
|
+
...searchEnabled ? { query: {
|
|
25406
25406
|
type: "string",
|
|
25407
25407
|
minLength: 1,
|
|
25408
25408
|
description: "Search query for mode=\"search\". Finds messages semantically similar to this text."
|
|
25409
|
-
},
|
|
25409
|
+
} } : {},
|
|
25410
25410
|
cursor: {
|
|
25411
25411
|
type: "string",
|
|
25412
25412
|
minLength: 1,
|
|
@@ -25467,6 +25467,10 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25467
25467
|
if (!memory) throw new Error("Memory instance is required for recall");
|
|
25468
25468
|
if (explicitThreadId === "current" && !currentThreadId) throw new Error("Could not resolve current thread.");
|
|
25469
25469
|
if (mode === "search") {
|
|
25470
|
+
if (!searchEnabled) return {
|
|
25471
|
+
results: SEARCH_NOT_CONFIGURED_MESSAGE,
|
|
25472
|
+
count: 0
|
|
25473
|
+
};
|
|
25470
25474
|
if (!query) throw new Error("query is required for mode=\"search\"");
|
|
25471
25475
|
if (!resourceId) throw new Error("Resource ID is required for recall");
|
|
25472
25476
|
return searchMessagesForResource({
|
|
@@ -26410,6 +26414,24 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
|
|
|
26410
26414
|
return preservedCalls.length > 0 ? [...preservedCalls, ...unobservedParts] : unobservedParts;
|
|
26411
26415
|
}
|
|
26412
26416
|
/**
|
|
26417
|
+
* Get the messages Observational Memory is allowed to work with.
|
|
26418
|
+
*
|
|
26419
|
+
* Messages supplied through the `context` option are per-run ephemeral input. Core's
|
|
26420
|
+
* persistence contract already treats them as never-persist: `MessageStateManager` routes
|
|
26421
|
+
* them into `userContextMessages`, and `drainUnsavedMessages` only drains input/response.
|
|
26422
|
+
*
|
|
26423
|
+
* OM builds its windows from `get.all.db()`, which includes context messages, and then
|
|
26424
|
+
* seals and persists candidates directly — turning ephemeral context into durable user
|
|
26425
|
+
* messages. Excluding them here keeps OM's window, sealing, persistence and token
|
|
26426
|
+
* accounting consistent with that contract.
|
|
26427
|
+
*/
|
|
26428
|
+
function getObservableMessages(messageList) {
|
|
26429
|
+
const allMessages = messageList.get.all.db();
|
|
26430
|
+
const contextMessageIds = messageList.makeMessageSourceChecker().context;
|
|
26431
|
+
if (contextMessageIds.size === 0) return allMessages;
|
|
26432
|
+
return allMessages.filter((message) => !contextMessageIds.has(message.id));
|
|
26433
|
+
}
|
|
26434
|
+
/**
|
|
26413
26435
|
* Safely extract buffered observation chunks from a record.
|
|
26414
26436
|
* Handles both array and JSON-string formats, returning empty array if malformed.
|
|
26415
26437
|
*/
|
|
@@ -26422,7 +26444,7 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
|
|
|
26422
26444
|
*/
|
|
26423
26445
|
function filterObservedMessages(opts) {
|
|
26424
26446
|
const { messageList, record } = opts;
|
|
26425
|
-
const allMessages = messageList
|
|
26447
|
+
const allMessages = getObservableMessages(messageList);
|
|
26426
26448
|
const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;
|
|
26427
26449
|
const preserveMessageIds = opts.preserveMessageIds ?? /* @__PURE__ */ new Set();
|
|
26428
26450
|
const observedIds = new Set(Array.isArray(record?.observedMessageIds) ? record.observedMessageIds : []);
|
|
@@ -26969,7 +26991,7 @@ var ObservationStrategy = class ObservationStrategy {
|
|
|
26969
26991
|
*/
|
|
26970
26992
|
async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
|
|
26971
26993
|
if (!messageList) return false;
|
|
26972
|
-
const allMsgs = messageList
|
|
26994
|
+
const allMsgs = getObservableMessages(messageList);
|
|
26973
26995
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
26974
26996
|
const msg = allMsgs[i];
|
|
26975
26997
|
if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
|
|
@@ -27836,7 +27858,7 @@ var ObservationStep = class {
|
|
|
27836
27858
|
let didThresholdCleanup = false;
|
|
27837
27859
|
let observerExchange;
|
|
27838
27860
|
if (this.stepNumber === 0) {
|
|
27839
|
-
const step0Messages = messageList
|
|
27861
|
+
const step0Messages = getObservableMessages(messageList);
|
|
27840
27862
|
const activation = await om.activate({
|
|
27841
27863
|
threadId,
|
|
27842
27864
|
resourceId,
|
|
@@ -27868,7 +27890,7 @@ var ObservationStep = class {
|
|
|
27868
27890
|
currentModel: this.turn.actorModelContext,
|
|
27869
27891
|
requestContext: this.turn.requestContext,
|
|
27870
27892
|
observabilityContext: this.turn.observabilityContext,
|
|
27871
|
-
lastActivityAt: getLastActivityFromMessages(messageList
|
|
27893
|
+
lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
|
|
27872
27894
|
reflectionHooks: om.composeHooks(void 0, {
|
|
27873
27895
|
threadId,
|
|
27874
27896
|
resourceId,
|
|
@@ -27878,7 +27900,7 @@ var ObservationStep = class {
|
|
|
27878
27900
|
await this.turn.refreshRecord();
|
|
27879
27901
|
if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
|
|
27880
27902
|
}
|
|
27881
|
-
const allMsgsForToolCheck = messageList
|
|
27903
|
+
const allMsgsForToolCheck = getObservableMessages(messageList);
|
|
27882
27904
|
const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];
|
|
27883
27905
|
const pendingStepMessages = [...messageList.get.input.db(), ...messageList.get.response.db()];
|
|
27884
27906
|
const latestStepParts = [...getLatestStepParts(lastMessage?.content?.parts ?? []), ...pendingStepMessages.flatMap((msg) => getLatestStepParts(msg.content?.parts ?? []))];
|
|
@@ -27887,10 +27909,10 @@ var ObservationStep = class {
|
|
|
27887
27909
|
let statusSnapshot = await om.getStatus({
|
|
27888
27910
|
threadId,
|
|
27889
27911
|
resourceId,
|
|
27890
|
-
messages: messageList
|
|
27912
|
+
messages: getObservableMessages(messageList)
|
|
27891
27913
|
});
|
|
27892
27914
|
if (statusSnapshot.shouldBuffer && !hasIncompleteToolCalls) {
|
|
27893
|
-
const allMessages = messageList
|
|
27915
|
+
const allMessages = getObservableMessages(messageList);
|
|
27894
27916
|
const unobservedMessages = om.getUnobservedMessages(allMessages, statusSnapshot.record);
|
|
27895
27917
|
const candidates = om.getUnobservedMessages(unobservedMessages, statusSnapshot.record, { excludeBuffered: true });
|
|
27896
27918
|
if (candidates.length > 0) {
|
|
@@ -27982,7 +28004,7 @@ var ObservationStep = class {
|
|
|
27982
28004
|
statusSnapshot = await om.getStatus({
|
|
27983
28005
|
threadId,
|
|
27984
28006
|
resourceId,
|
|
27985
|
-
messages: messageList
|
|
28007
|
+
messages: getObservableMessages(messageList)
|
|
27986
28008
|
});
|
|
27987
28009
|
}
|
|
27988
28010
|
const otherThreadsContext = await this.turn.refreshOtherThreadsContext();
|
|
@@ -28031,7 +28053,7 @@ var ObservationStep = class {
|
|
|
28031
28053
|
const { threadId, resourceId, messageList } = this.turn;
|
|
28032
28054
|
const om = this.turn.om;
|
|
28033
28055
|
await om.waitForBuffering(threadId, resourceId);
|
|
28034
|
-
const observableMessages = this.seededResponseMessage ? messageList
|
|
28056
|
+
const observableMessages = this.seededResponseMessage ? getObservableMessages(messageList).filter((msg) => msg.id !== this.turn.responseMessageId) : getObservableMessages(messageList);
|
|
28035
28057
|
const freshStatus = await om.getStatus({
|
|
28036
28058
|
threadId,
|
|
28037
28059
|
resourceId,
|
|
@@ -28061,7 +28083,7 @@ var ObservationStep = class {
|
|
|
28061
28083
|
currentModel: this.turn.actorModelContext,
|
|
28062
28084
|
requestContext: this.turn.requestContext,
|
|
28063
28085
|
observabilityContext: this.turn.observabilityContext,
|
|
28064
|
-
lastActivityAt: getLastActivityFromMessages(messageList
|
|
28086
|
+
lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
|
|
28065
28087
|
reflectionHooks: om.composeHooks(void 0, {
|
|
28066
28088
|
threadId,
|
|
28067
28089
|
resourceId,
|
|
@@ -28087,7 +28109,7 @@ var ObservationStep = class {
|
|
|
28087
28109
|
});
|
|
28088
28110
|
if (obsResult.observed) {
|
|
28089
28111
|
const observedMessageIds = new Set(obsResult.record.observedMessageIds ?? []);
|
|
28090
|
-
const liveMessages = messageList
|
|
28112
|
+
const liveMessages = getObservableMessages(messageList);
|
|
28091
28113
|
let latestObservedIndex = -1;
|
|
28092
28114
|
for (let i = liveMessages.length - 1; i >= 0; i--) {
|
|
28093
28115
|
const message = liveMessages[i];
|
|
@@ -28260,7 +28282,7 @@ var ObservationTurn = class {
|
|
|
28260
28282
|
const asyncObservationEnabled = this.om.buffering.isAsyncObservationEnabled();
|
|
28261
28283
|
const bufferOnIdle = this.om.getObservationConfig().bufferOnIdle;
|
|
28262
28284
|
if (asyncObservationEnabled && bufferOnIdle) {
|
|
28263
|
-
const allMessages = this.messageList
|
|
28285
|
+
const allMessages = getObservableMessages(this.messageList);
|
|
28264
28286
|
const record = this._record;
|
|
28265
28287
|
const unobservedMessages = this.om.getUnobservedMessages(allMessages, record);
|
|
28266
28288
|
if (unobservedMessages.length > 0) this.om.buffer({
|
|
@@ -28626,7 +28648,7 @@ function getCurrentModel$1(model) {
|
|
|
28626
28648
|
return formatModelContext$1(model?.provider, model?.modelId);
|
|
28627
28649
|
}
|
|
28628
28650
|
function getLastModelFromMessageList(messageList) {
|
|
28629
|
-
const messages = messageList
|
|
28651
|
+
const messages = messageList ? getObservableMessages(messageList) : void 0;
|
|
28630
28652
|
if (!messages) return void 0;
|
|
28631
28653
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
28632
28654
|
const message = messages[i];
|
|
@@ -30206,7 +30228,7 @@ var ObservationalMemory = class ObservationalMemory {
|
|
|
30206
30228
|
*/
|
|
30207
30229
|
async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
|
|
30208
30230
|
if (!messageList) return;
|
|
30209
|
-
const allMsgs = messageList
|
|
30231
|
+
const allMsgs = getObservableMessages(messageList);
|
|
30210
30232
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
30211
30233
|
const msg = allMsgs[i];
|
|
30212
30234
|
if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
|
|
@@ -30884,7 +30906,7 @@ ${formattedMessages}
|
|
|
30884
30906
|
async cleanupMessages(opts) {
|
|
30885
30907
|
const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
|
|
30886
30908
|
const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
|
|
30887
|
-
const allMsgs = messageList ? messageList
|
|
30909
|
+
const allMsgs = messageList ? getObservableMessages(messageList) : opts.messages;
|
|
30888
30910
|
let markerIdx = -1;
|
|
30889
30911
|
let markerMsg = null;
|
|
30890
30912
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
@@ -31998,7 +32020,7 @@ function isTemporalGapMarkerForMessage(message, targetMessageId) {
|
|
|
31998
32020
|
async function insertTemporalGapMarkers({ messageList, sendSignal }) {
|
|
31999
32021
|
const latestInputMessage = messageList.get.input.db().filter((message) => Boolean(message)).at(-1);
|
|
32000
32022
|
if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) return;
|
|
32001
|
-
const allMessages = messageList
|
|
32023
|
+
const allMessages = getObservableMessages(messageList).filter((message) => Boolean(message));
|
|
32002
32024
|
const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
|
|
32003
32025
|
if (latestInputIndex <= 0) return;
|
|
32004
32026
|
if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) return;
|
|
@@ -32220,7 +32242,7 @@ var ObservationalMemoryProcessor = class {
|
|
|
32220
32242
|
threadId,
|
|
32221
32243
|
resourceId
|
|
32222
32244
|
});
|
|
32223
|
-
const allDbMsgs = messageList
|
|
32245
|
+
const allDbMsgs = getObservableMessages(messageList);
|
|
32224
32246
|
const tokenCounter = this.engine.getTokenCounter();
|
|
32225
32247
|
const contextTokens = await tokenCounter.countMessagesAsync(allDbMsgs);
|
|
32226
32248
|
const otherThreadsContext = this.turn.context.otherThreadsContext;
|
|
@@ -32567,6 +32589,18 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
|
|
|
32567
32589
|
_omEngine;
|
|
32568
32590
|
_omEngineInstance;
|
|
32569
32591
|
_mastraInstance;
|
|
32592
|
+
/**
|
|
32593
|
+
* Every vector cleanup that deleteThread or deleteMessages started in the background.
|
|
32594
|
+
* Callers do not wait for the cleanup, so this handle is the only join point.
|
|
32595
|
+
*/
|
|
32596
|
+
pendingVectorCleanup = Promise.resolve();
|
|
32597
|
+
/**
|
|
32598
|
+
* Adds a background vector cleanup to the join handle.
|
|
32599
|
+
* The handle keeps the earlier cleanups, so it settles only after all of them end.
|
|
32600
|
+
*/
|
|
32601
|
+
trackVectorCleanup(cleanup) {
|
|
32602
|
+
this.pendingVectorCleanup = Promise.allSettled([this.pendingVectorCleanup, cleanup]).then(() => void 0);
|
|
32603
|
+
}
|
|
32570
32604
|
/** The shared ObservationalMemory engine. Lazily created on first access. */
|
|
32571
32605
|
get omEngine() {
|
|
32572
32606
|
if (!this._omEngine) this._omEngine = this._initOMEngine().then((engine) => {
|
|
@@ -32831,26 +32865,40 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
|
|
|
32831
32865
|
const thread = await memoryStore.getThreadById({ threadId });
|
|
32832
32866
|
await memoryStore.deleteThread({ threadId });
|
|
32833
32867
|
if (thread?.resourceId && memoryStore.supportsObservationalMemory) await memoryStore.clearObservationalMemory(threadId, thread.resourceId);
|
|
32834
|
-
if (this.vector) this.deleteThreadVectors(threadId);
|
|
32868
|
+
if (this.vector) this.trackVectorCleanup(this.deleteThreadVectors(threadId));
|
|
32835
32869
|
}
|
|
32836
32870
|
/**
|
|
32837
|
-
*
|
|
32838
|
-
*
|
|
32871
|
+
* Prefix shared by every message index. The index for the default embedding
|
|
32872
|
+
* dimension is named with the bare prefix; other dimensions add a suffix.
|
|
32839
32873
|
*/
|
|
32840
|
-
|
|
32874
|
+
get messageIndexPrefix() {
|
|
32875
|
+
return this.getEmbeddingIndexName();
|
|
32876
|
+
}
|
|
32877
|
+
/**
|
|
32878
|
+
* Prefix shared by every observation index. Each observation index adds a dimension suffix.
|
|
32879
|
+
*/
|
|
32880
|
+
get observationIndexPrefix() {
|
|
32881
|
+
return `memory${this.vector?.indexSeparator ?? "_"}observations`;
|
|
32882
|
+
}
|
|
32883
|
+
/**
|
|
32884
|
+
* Lists the vector indexes whose name starts with one of the given prefixes.
|
|
32885
|
+
* Index names can carry a dimension suffix, so discovery matches on the prefix.
|
|
32886
|
+
*/
|
|
32887
|
+
async getMemoryVectorIndexes(prefixes) {
|
|
32841
32888
|
if (!this.vector) return [];
|
|
32842
|
-
|
|
32843
|
-
return (await this.vector.listIndexes()).filter((name) => name.startsWith(prefix));
|
|
32889
|
+
return (await this.vector.listIndexes()).filter((name) => prefixes.some((prefix) => name.startsWith(prefix)));
|
|
32844
32890
|
}
|
|
32845
32891
|
/**
|
|
32846
32892
|
* Deletes all vector embeddings associated with a thread.
|
|
32847
32893
|
* This is called internally by deleteThread to clean up orphaned vectors.
|
|
32894
|
+
* Both message and observation vectors are removed, so no text of the deleted
|
|
32895
|
+
* thread stays reachable through resource-scoped retrieval.
|
|
32848
32896
|
*
|
|
32849
32897
|
* @param threadId - The ID of the thread whose vectors should be deleted
|
|
32850
32898
|
*/
|
|
32851
32899
|
async deleteThreadVectors(threadId) {
|
|
32852
32900
|
try {
|
|
32853
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
32901
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix, this.observationIndexPrefix]);
|
|
32854
32902
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
32855
32903
|
try {
|
|
32856
32904
|
await this.vector.deleteVectors({
|
|
@@ -32858,14 +32906,14 @@ var Memory = class extends _mastra_core_memory.MastraMemory {
|
|
|
32858
32906
|
filter: { thread_id: threadId }
|
|
32859
32907
|
});
|
|
32860
32908
|
} catch {
|
|
32861
|
-
this.logger.
|
|
32909
|
+
this.logger.warn("Failed to delete vectors of the deleted thread from index", {
|
|
32862
32910
|
threadId,
|
|
32863
32911
|
indexName
|
|
32864
32912
|
});
|
|
32865
32913
|
}
|
|
32866
32914
|
}));
|
|
32867
32915
|
} catch {
|
|
32868
|
-
this.logger.
|
|
32916
|
+
this.logger.warn("Failed to clean up vectors of the deleted thread", { threadId });
|
|
32869
32917
|
}
|
|
32870
32918
|
}
|
|
32871
32919
|
async updateWorkingMemory({ threadId, resourceId, workingMemory, memoryConfig, observabilityContext }) {
|
|
@@ -33538,7 +33586,7 @@ Notes:
|
|
|
33538
33586
|
getObservationEmbeddingIndexName(dimensions) {
|
|
33539
33587
|
const usedDimensions = dimensions ?? 384;
|
|
33540
33588
|
const separator = this.vector?.indexSeparator ?? "_";
|
|
33541
|
-
return
|
|
33589
|
+
return `${this.observationIndexPrefix}${separator}${usedDimensions}`;
|
|
33542
33590
|
}
|
|
33543
33591
|
async createObservationEmbeddingIndex(dimensions) {
|
|
33544
33592
|
const usedDimensions = dimensions ?? 384;
|
|
@@ -33784,7 +33832,10 @@ Notes:
|
|
|
33784
33832
|
tools[name] = tool;
|
|
33785
33833
|
}
|
|
33786
33834
|
const omConfig = normalizeObservationalMemoryConfig(mergedConfig.observationalMemory);
|
|
33787
|
-
if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
|
|
33835
|
+
if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
|
|
33836
|
+
retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource",
|
|
33837
|
+
searchEnabled: this.hasRetrievalSearch(omConfig.retrieval)
|
|
33838
|
+
});
|
|
33788
33839
|
return tools;
|
|
33789
33840
|
}
|
|
33790
33841
|
/**
|
|
@@ -33840,7 +33891,7 @@ Notes:
|
|
|
33840
33891
|
}));
|
|
33841
33892
|
const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
|
|
33842
33893
|
if (messageIdsNeedingDeletion.size > 0) try {
|
|
33843
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
33894
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
|
|
33844
33895
|
const idsToDelete = [...messageIdsNeedingDeletion];
|
|
33845
33896
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
33846
33897
|
for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
@@ -33899,7 +33950,7 @@ Notes:
|
|
|
33899
33950
|
const span = this.createMemorySpan("delete", observabilityContext, void 0, { messageCount: messageIds.length });
|
|
33900
33951
|
try {
|
|
33901
33952
|
await (await this.getMemoryStore()).deleteMessages(messageIds);
|
|
33902
|
-
if (this.vector) this.deleteMessageVectors(messageIds);
|
|
33953
|
+
if (this.vector) this.trackVectorCleanup(this.deleteMessageVectors(messageIds));
|
|
33903
33954
|
span?.end({
|
|
33904
33955
|
output: { success: true },
|
|
33905
33956
|
attributes: { messageCount: messageIds.length }
|
|
@@ -33915,12 +33966,14 @@ Notes:
|
|
|
33915
33966
|
/**
|
|
33916
33967
|
* Deletes vector embeddings for specific messages.
|
|
33917
33968
|
* This is called internally by deleteMessages to clean up orphaned vectors.
|
|
33969
|
+
* Only the message indexes are touched, because observation vectors can hold
|
|
33970
|
+
* text of other messages of the thread.
|
|
33918
33971
|
*
|
|
33919
33972
|
* @param messageIds - The IDs of the messages whose vectors should be deleted
|
|
33920
33973
|
*/
|
|
33921
33974
|
async deleteMessageVectors(messageIds) {
|
|
33922
33975
|
try {
|
|
33923
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
33976
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
|
|
33924
33977
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
33925
33978
|
for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
33926
33979
|
const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
|
|
@@ -44696,4 +44749,4 @@ const agentBuilderWorkflows = {
|
|
|
44696
44749
|
//#endregion
|
|
44697
44750
|
exports.agentBuilderWorkflows = agentBuilderWorkflows;
|
|
44698
44751
|
|
|
44699
|
-
//# sourceMappingURL=dist-
|
|
44752
|
+
//# sourceMappingURL=dist-C2-SedDQ.cjs.map
|