@mastra/server 1.58.0-alpha.1 → 1.58.0-alpha.3
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 +63 -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 +1 -1
- package/dist/server/server-adapter/index.js +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 +7 -7
- 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
|
@@ -5959,7 +5959,7 @@ function splitLines(text) {
|
|
|
5959
5959
|
return result;
|
|
5960
5960
|
}
|
|
5961
5961
|
//#endregion
|
|
5962
|
-
//#region ../memory/dist/src-
|
|
5962
|
+
//#region ../memory/dist/src-CdqJP57F.js
|
|
5963
5963
|
var __defProp$3 = Object.defineProperty;
|
|
5964
5964
|
var __exportAll = (all, no_symbols) => {
|
|
5965
5965
|
let target = {};
|
|
@@ -24812,9 +24812,10 @@ async function listThreadsForResource({ memory, resourceId, currentThreadId, pag
|
|
|
24812
24812
|
hasMore
|
|
24813
24813
|
};
|
|
24814
24814
|
}
|
|
24815
|
+
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.";
|
|
24815
24816
|
async function searchMessagesForResource({ memory, resourceId, currentThreadId, query, topK = 10, maxTokens = DEFAULT_MAX_RESULT_TOKENS, before, after, threadScope }) {
|
|
24816
24817
|
if (!memory.searchMessages) return {
|
|
24817
|
-
results:
|
|
24818
|
+
results: SEARCH_NOT_CONFIGURED_MESSAGE,
|
|
24818
24819
|
count: 0
|
|
24819
24820
|
};
|
|
24820
24821
|
const MAX_TOPK = 20;
|
|
@@ -25360,9 +25361,16 @@ async function recallThreadFromStart({ memory, threadId, resourceId, page = 1, l
|
|
|
25360
25361
|
}
|
|
25361
25362
|
const recallTool = (_memoryConfig, options) => {
|
|
25362
25363
|
const isResourceScope = (options?.retrievalScope ?? "thread") === "resource";
|
|
25364
|
+
const searchEnabled = options?.searchEnabled ?? true;
|
|
25365
|
+
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.`;
|
|
25366
|
+
const modeEnum = searchEnabled ? [
|
|
25367
|
+
"messages",
|
|
25368
|
+
"threads",
|
|
25369
|
+
"search"
|
|
25370
|
+
] : ["messages", "threads"];
|
|
25363
25371
|
return createTool({
|
|
25364
25372
|
id: "recall",
|
|
25365
|
-
description
|
|
25373
|
+
description,
|
|
25366
25374
|
inputSchema: {
|
|
25367
25375
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
25368
25376
|
type: "object",
|
|
@@ -25370,12 +25378,8 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25370
25378
|
...isResourceScope ? {
|
|
25371
25379
|
mode: {
|
|
25372
25380
|
type: "string",
|
|
25373
|
-
enum:
|
|
25374
|
-
|
|
25375
|
-
"threads",
|
|
25376
|
-
"search"
|
|
25377
|
-
],
|
|
25378
|
-
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."
|
|
25381
|
+
enum: modeEnum,
|
|
25382
|
+
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." : ""}`
|
|
25379
25383
|
},
|
|
25380
25384
|
threadId: {
|
|
25381
25385
|
type: "string",
|
|
@@ -25392,18 +25396,14 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25392
25396
|
}
|
|
25393
25397
|
} : { mode: {
|
|
25394
25398
|
type: "string",
|
|
25395
|
-
enum:
|
|
25396
|
-
|
|
25397
|
-
"threads",
|
|
25398
|
-
"search"
|
|
25399
|
-
],
|
|
25400
|
-
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."
|
|
25399
|
+
enum: modeEnum,
|
|
25400
|
+
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." : ""}`
|
|
25401
25401
|
} },
|
|
25402
|
-
query: {
|
|
25402
|
+
...searchEnabled ? { query: {
|
|
25403
25403
|
type: "string",
|
|
25404
25404
|
minLength: 1,
|
|
25405
25405
|
description: "Search query for mode=\"search\". Finds messages semantically similar to this text."
|
|
25406
|
-
},
|
|
25406
|
+
} } : {},
|
|
25407
25407
|
cursor: {
|
|
25408
25408
|
type: "string",
|
|
25409
25409
|
minLength: 1,
|
|
@@ -25464,6 +25464,10 @@ const recallTool = (_memoryConfig, options) => {
|
|
|
25464
25464
|
if (!memory) throw new Error("Memory instance is required for recall");
|
|
25465
25465
|
if (explicitThreadId === "current" && !currentThreadId) throw new Error("Could not resolve current thread.");
|
|
25466
25466
|
if (mode === "search") {
|
|
25467
|
+
if (!searchEnabled) return {
|
|
25468
|
+
results: SEARCH_NOT_CONFIGURED_MESSAGE,
|
|
25469
|
+
count: 0
|
|
25470
|
+
};
|
|
25467
25471
|
if (!query) throw new Error("query is required for mode=\"search\"");
|
|
25468
25472
|
if (!resourceId) throw new Error("Resource ID is required for recall");
|
|
25469
25473
|
return searchMessagesForResource({
|
|
@@ -26407,6 +26411,24 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
|
|
|
26407
26411
|
return preservedCalls.length > 0 ? [...preservedCalls, ...unobservedParts] : unobservedParts;
|
|
26408
26412
|
}
|
|
26409
26413
|
/**
|
|
26414
|
+
* Get the messages Observational Memory is allowed to work with.
|
|
26415
|
+
*
|
|
26416
|
+
* Messages supplied through the `context` option are per-run ephemeral input. Core's
|
|
26417
|
+
* persistence contract already treats them as never-persist: `MessageStateManager` routes
|
|
26418
|
+
* them into `userContextMessages`, and `drainUnsavedMessages` only drains input/response.
|
|
26419
|
+
*
|
|
26420
|
+
* OM builds its windows from `get.all.db()`, which includes context messages, and then
|
|
26421
|
+
* seals and persists candidates directly — turning ephemeral context into durable user
|
|
26422
|
+
* messages. Excluding them here keeps OM's window, sealing, persistence and token
|
|
26423
|
+
* accounting consistent with that contract.
|
|
26424
|
+
*/
|
|
26425
|
+
function getObservableMessages(messageList) {
|
|
26426
|
+
const allMessages = messageList.get.all.db();
|
|
26427
|
+
const contextMessageIds = messageList.makeMessageSourceChecker().context;
|
|
26428
|
+
if (contextMessageIds.size === 0) return allMessages;
|
|
26429
|
+
return allMessages.filter((message) => !contextMessageIds.has(message.id));
|
|
26430
|
+
}
|
|
26431
|
+
/**
|
|
26410
26432
|
* Safely extract buffered observation chunks from a record.
|
|
26411
26433
|
* Handles both array and JSON-string formats, returning empty array if malformed.
|
|
26412
26434
|
*/
|
|
@@ -26419,7 +26441,7 @@ function getUnobservedPartsPreservingToolCallPairs(message) {
|
|
|
26419
26441
|
*/
|
|
26420
26442
|
function filterObservedMessages(opts) {
|
|
26421
26443
|
const { messageList, record } = opts;
|
|
26422
|
-
const allMessages = messageList
|
|
26444
|
+
const allMessages = getObservableMessages(messageList);
|
|
26423
26445
|
const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;
|
|
26424
26446
|
const preserveMessageIds = opts.preserveMessageIds ?? /* @__PURE__ */ new Set();
|
|
26425
26447
|
const observedIds = new Set(Array.isArray(record?.observedMessageIds) ? record.observedMessageIds : []);
|
|
@@ -26966,7 +26988,7 @@ var ObservationStrategy = class ObservationStrategy {
|
|
|
26966
26988
|
*/
|
|
26967
26989
|
async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
|
|
26968
26990
|
if (!messageList) return false;
|
|
26969
|
-
const allMsgs = messageList
|
|
26991
|
+
const allMsgs = getObservableMessages(messageList);
|
|
26970
26992
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
26971
26993
|
const msg = allMsgs[i];
|
|
26972
26994
|
if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
|
|
@@ -27833,7 +27855,7 @@ var ObservationStep = class {
|
|
|
27833
27855
|
let didThresholdCleanup = false;
|
|
27834
27856
|
let observerExchange;
|
|
27835
27857
|
if (this.stepNumber === 0) {
|
|
27836
|
-
const step0Messages = messageList
|
|
27858
|
+
const step0Messages = getObservableMessages(messageList);
|
|
27837
27859
|
const activation = await om.activate({
|
|
27838
27860
|
threadId,
|
|
27839
27861
|
resourceId,
|
|
@@ -27865,7 +27887,7 @@ var ObservationStep = class {
|
|
|
27865
27887
|
currentModel: this.turn.actorModelContext,
|
|
27866
27888
|
requestContext: this.turn.requestContext,
|
|
27867
27889
|
observabilityContext: this.turn.observabilityContext,
|
|
27868
|
-
lastActivityAt: getLastActivityFromMessages(messageList
|
|
27890
|
+
lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
|
|
27869
27891
|
reflectionHooks: om.composeHooks(void 0, {
|
|
27870
27892
|
threadId,
|
|
27871
27893
|
resourceId,
|
|
@@ -27875,7 +27897,7 @@ var ObservationStep = class {
|
|
|
27875
27897
|
await this.turn.refreshRecord();
|
|
27876
27898
|
if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
|
|
27877
27899
|
}
|
|
27878
|
-
const allMsgsForToolCheck = messageList
|
|
27900
|
+
const allMsgsForToolCheck = getObservableMessages(messageList);
|
|
27879
27901
|
const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];
|
|
27880
27902
|
const pendingStepMessages = [...messageList.get.input.db(), ...messageList.get.response.db()];
|
|
27881
27903
|
const latestStepParts = [...getLatestStepParts(lastMessage?.content?.parts ?? []), ...pendingStepMessages.flatMap((msg) => getLatestStepParts(msg.content?.parts ?? []))];
|
|
@@ -27884,10 +27906,10 @@ var ObservationStep = class {
|
|
|
27884
27906
|
let statusSnapshot = await om.getStatus({
|
|
27885
27907
|
threadId,
|
|
27886
27908
|
resourceId,
|
|
27887
|
-
messages: messageList
|
|
27909
|
+
messages: getObservableMessages(messageList)
|
|
27888
27910
|
});
|
|
27889
27911
|
if (statusSnapshot.shouldBuffer && !hasIncompleteToolCalls) {
|
|
27890
|
-
const allMessages = messageList
|
|
27912
|
+
const allMessages = getObservableMessages(messageList);
|
|
27891
27913
|
const unobservedMessages = om.getUnobservedMessages(allMessages, statusSnapshot.record);
|
|
27892
27914
|
const candidates = om.getUnobservedMessages(unobservedMessages, statusSnapshot.record, { excludeBuffered: true });
|
|
27893
27915
|
if (candidates.length > 0) {
|
|
@@ -27979,7 +28001,7 @@ var ObservationStep = class {
|
|
|
27979
28001
|
statusSnapshot = await om.getStatus({
|
|
27980
28002
|
threadId,
|
|
27981
28003
|
resourceId,
|
|
27982
|
-
messages: messageList
|
|
28004
|
+
messages: getObservableMessages(messageList)
|
|
27983
28005
|
});
|
|
27984
28006
|
}
|
|
27985
28007
|
const otherThreadsContext = await this.turn.refreshOtherThreadsContext();
|
|
@@ -28028,7 +28050,7 @@ var ObservationStep = class {
|
|
|
28028
28050
|
const { threadId, resourceId, messageList } = this.turn;
|
|
28029
28051
|
const om = this.turn.om;
|
|
28030
28052
|
await om.waitForBuffering(threadId, resourceId);
|
|
28031
|
-
const observableMessages = this.seededResponseMessage ? messageList
|
|
28053
|
+
const observableMessages = this.seededResponseMessage ? getObservableMessages(messageList).filter((msg) => msg.id !== this.turn.responseMessageId) : getObservableMessages(messageList);
|
|
28032
28054
|
const freshStatus = await om.getStatus({
|
|
28033
28055
|
threadId,
|
|
28034
28056
|
resourceId,
|
|
@@ -28058,7 +28080,7 @@ var ObservationStep = class {
|
|
|
28058
28080
|
currentModel: this.turn.actorModelContext,
|
|
28059
28081
|
requestContext: this.turn.requestContext,
|
|
28060
28082
|
observabilityContext: this.turn.observabilityContext,
|
|
28061
|
-
lastActivityAt: getLastActivityFromMessages(messageList
|
|
28083
|
+
lastActivityAt: getLastActivityFromMessages(getObservableMessages(messageList)),
|
|
28062
28084
|
reflectionHooks: om.composeHooks(void 0, {
|
|
28063
28085
|
threadId,
|
|
28064
28086
|
resourceId,
|
|
@@ -28084,7 +28106,7 @@ var ObservationStep = class {
|
|
|
28084
28106
|
});
|
|
28085
28107
|
if (obsResult.observed) {
|
|
28086
28108
|
const observedMessageIds = new Set(obsResult.record.observedMessageIds ?? []);
|
|
28087
|
-
const liveMessages = messageList
|
|
28109
|
+
const liveMessages = getObservableMessages(messageList);
|
|
28088
28110
|
let latestObservedIndex = -1;
|
|
28089
28111
|
for (let i = liveMessages.length - 1; i >= 0; i--) {
|
|
28090
28112
|
const message = liveMessages[i];
|
|
@@ -28257,7 +28279,7 @@ var ObservationTurn = class {
|
|
|
28257
28279
|
const asyncObservationEnabled = this.om.buffering.isAsyncObservationEnabled();
|
|
28258
28280
|
const bufferOnIdle = this.om.getObservationConfig().bufferOnIdle;
|
|
28259
28281
|
if (asyncObservationEnabled && bufferOnIdle) {
|
|
28260
|
-
const allMessages = this.messageList
|
|
28282
|
+
const allMessages = getObservableMessages(this.messageList);
|
|
28261
28283
|
const record = this._record;
|
|
28262
28284
|
const unobservedMessages = this.om.getUnobservedMessages(allMessages, record);
|
|
28263
28285
|
if (unobservedMessages.length > 0) this.om.buffer({
|
|
@@ -28623,7 +28645,7 @@ function getCurrentModel$1(model) {
|
|
|
28623
28645
|
return formatModelContext$1(model?.provider, model?.modelId);
|
|
28624
28646
|
}
|
|
28625
28647
|
function getLastModelFromMessageList(messageList) {
|
|
28626
|
-
const messages = messageList
|
|
28648
|
+
const messages = messageList ? getObservableMessages(messageList) : void 0;
|
|
28627
28649
|
if (!messages) return void 0;
|
|
28628
28650
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
28629
28651
|
const message = messages[i];
|
|
@@ -30203,7 +30225,7 @@ var ObservationalMemory = class ObservationalMemory {
|
|
|
30203
30225
|
*/
|
|
30204
30226
|
async persistMarkerToMessage(marker, messageList, threadId, resourceId) {
|
|
30205
30227
|
if (!messageList) return;
|
|
30206
|
-
const allMsgs = messageList
|
|
30228
|
+
const allMsgs = getObservableMessages(messageList);
|
|
30207
30229
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
30208
30230
|
const msg = allMsgs[i];
|
|
30209
30231
|
if (msg?.role === "assistant" && msg.content?.parts && Array.isArray(msg.content.parts)) {
|
|
@@ -30881,7 +30903,7 @@ ${formattedMessages}
|
|
|
30881
30903
|
async cleanupMessages(opts) {
|
|
30882
30904
|
const { threadId, resourceId, observedMessageIds, retentionFloor, preserveMessageIds } = opts;
|
|
30883
30905
|
const messageList = this.isMessageList(opts.messages) ? opts.messages : void 0;
|
|
30884
|
-
const allMsgs = messageList ? messageList
|
|
30906
|
+
const allMsgs = messageList ? getObservableMessages(messageList) : opts.messages;
|
|
30885
30907
|
let markerIdx = -1;
|
|
30886
30908
|
let markerMsg = null;
|
|
30887
30909
|
for (let i = allMsgs.length - 1; i >= 0; i--) {
|
|
@@ -31995,7 +32017,7 @@ function isTemporalGapMarkerForMessage(message, targetMessageId) {
|
|
|
31995
32017
|
async function insertTemporalGapMarkers({ messageList, sendSignal }) {
|
|
31996
32018
|
const latestInputMessage = messageList.get.input.db().filter((message) => Boolean(message)).at(-1);
|
|
31997
32019
|
if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) return;
|
|
31998
|
-
const allMessages = messageList
|
|
32020
|
+
const allMessages = getObservableMessages(messageList).filter((message) => Boolean(message));
|
|
31999
32021
|
const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
|
|
32000
32022
|
if (latestInputIndex <= 0) return;
|
|
32001
32023
|
if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) return;
|
|
@@ -32217,7 +32239,7 @@ var ObservationalMemoryProcessor = class {
|
|
|
32217
32239
|
threadId,
|
|
32218
32240
|
resourceId
|
|
32219
32241
|
});
|
|
32220
|
-
const allDbMsgs = messageList
|
|
32242
|
+
const allDbMsgs = getObservableMessages(messageList);
|
|
32221
32243
|
const tokenCounter = this.engine.getTokenCounter();
|
|
32222
32244
|
const contextTokens = await tokenCounter.countMessagesAsync(allDbMsgs);
|
|
32223
32245
|
const otherThreadsContext = this.turn.context.otherThreadsContext;
|
|
@@ -32564,6 +32586,18 @@ var Memory = class extends MastraMemory {
|
|
|
32564
32586
|
_omEngine;
|
|
32565
32587
|
_omEngineInstance;
|
|
32566
32588
|
_mastraInstance;
|
|
32589
|
+
/**
|
|
32590
|
+
* Every vector cleanup that deleteThread or deleteMessages started in the background.
|
|
32591
|
+
* Callers do not wait for the cleanup, so this handle is the only join point.
|
|
32592
|
+
*/
|
|
32593
|
+
pendingVectorCleanup = Promise.resolve();
|
|
32594
|
+
/**
|
|
32595
|
+
* Adds a background vector cleanup to the join handle.
|
|
32596
|
+
* The handle keeps the earlier cleanups, so it settles only after all of them end.
|
|
32597
|
+
*/
|
|
32598
|
+
trackVectorCleanup(cleanup) {
|
|
32599
|
+
this.pendingVectorCleanup = Promise.allSettled([this.pendingVectorCleanup, cleanup]).then(() => void 0);
|
|
32600
|
+
}
|
|
32567
32601
|
/** The shared ObservationalMemory engine. Lazily created on first access. */
|
|
32568
32602
|
get omEngine() {
|
|
32569
32603
|
if (!this._omEngine) this._omEngine = this._initOMEngine().then((engine) => {
|
|
@@ -32828,26 +32862,40 @@ var Memory = class extends MastraMemory {
|
|
|
32828
32862
|
const thread = await memoryStore.getThreadById({ threadId });
|
|
32829
32863
|
await memoryStore.deleteThread({ threadId });
|
|
32830
32864
|
if (thread?.resourceId && memoryStore.supportsObservationalMemory) await memoryStore.clearObservationalMemory(threadId, thread.resourceId);
|
|
32831
|
-
if (this.vector) this.deleteThreadVectors(threadId);
|
|
32865
|
+
if (this.vector) this.trackVectorCleanup(this.deleteThreadVectors(threadId));
|
|
32832
32866
|
}
|
|
32833
32867
|
/**
|
|
32834
|
-
*
|
|
32835
|
-
*
|
|
32868
|
+
* Prefix shared by every message index. The index for the default embedding
|
|
32869
|
+
* dimension is named with the bare prefix; other dimensions add a suffix.
|
|
32836
32870
|
*/
|
|
32837
|
-
|
|
32871
|
+
get messageIndexPrefix() {
|
|
32872
|
+
return this.getEmbeddingIndexName();
|
|
32873
|
+
}
|
|
32874
|
+
/**
|
|
32875
|
+
* Prefix shared by every observation index. Each observation index adds a dimension suffix.
|
|
32876
|
+
*/
|
|
32877
|
+
get observationIndexPrefix() {
|
|
32878
|
+
return `memory${this.vector?.indexSeparator ?? "_"}observations`;
|
|
32879
|
+
}
|
|
32880
|
+
/**
|
|
32881
|
+
* Lists the vector indexes whose name starts with one of the given prefixes.
|
|
32882
|
+
* Index names can carry a dimension suffix, so discovery matches on the prefix.
|
|
32883
|
+
*/
|
|
32884
|
+
async getMemoryVectorIndexes(prefixes) {
|
|
32838
32885
|
if (!this.vector) return [];
|
|
32839
|
-
|
|
32840
|
-
return (await this.vector.listIndexes()).filter((name) => name.startsWith(prefix));
|
|
32886
|
+
return (await this.vector.listIndexes()).filter((name) => prefixes.some((prefix) => name.startsWith(prefix)));
|
|
32841
32887
|
}
|
|
32842
32888
|
/**
|
|
32843
32889
|
* Deletes all vector embeddings associated with a thread.
|
|
32844
32890
|
* This is called internally by deleteThread to clean up orphaned vectors.
|
|
32891
|
+
* Both message and observation vectors are removed, so no text of the deleted
|
|
32892
|
+
* thread stays reachable through resource-scoped retrieval.
|
|
32845
32893
|
*
|
|
32846
32894
|
* @param threadId - The ID of the thread whose vectors should be deleted
|
|
32847
32895
|
*/
|
|
32848
32896
|
async deleteThreadVectors(threadId) {
|
|
32849
32897
|
try {
|
|
32850
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
32898
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix, this.observationIndexPrefix]);
|
|
32851
32899
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
32852
32900
|
try {
|
|
32853
32901
|
await this.vector.deleteVectors({
|
|
@@ -32855,14 +32903,14 @@ var Memory = class extends MastraMemory {
|
|
|
32855
32903
|
filter: { thread_id: threadId }
|
|
32856
32904
|
});
|
|
32857
32905
|
} catch {
|
|
32858
|
-
this.logger.
|
|
32906
|
+
this.logger.warn("Failed to delete vectors of the deleted thread from index", {
|
|
32859
32907
|
threadId,
|
|
32860
32908
|
indexName
|
|
32861
32909
|
});
|
|
32862
32910
|
}
|
|
32863
32911
|
}));
|
|
32864
32912
|
} catch {
|
|
32865
|
-
this.logger.
|
|
32913
|
+
this.logger.warn("Failed to clean up vectors of the deleted thread", { threadId });
|
|
32866
32914
|
}
|
|
32867
32915
|
}
|
|
32868
32916
|
async updateWorkingMemory({ threadId, resourceId, workingMemory, memoryConfig, observabilityContext }) {
|
|
@@ -33535,7 +33583,7 @@ Notes:
|
|
|
33535
33583
|
getObservationEmbeddingIndexName(dimensions) {
|
|
33536
33584
|
const usedDimensions = dimensions ?? 384;
|
|
33537
33585
|
const separator = this.vector?.indexSeparator ?? "_";
|
|
33538
|
-
return
|
|
33586
|
+
return `${this.observationIndexPrefix}${separator}${usedDimensions}`;
|
|
33539
33587
|
}
|
|
33540
33588
|
async createObservationEmbeddingIndex(dimensions) {
|
|
33541
33589
|
const usedDimensions = dimensions ?? 384;
|
|
@@ -33781,7 +33829,10 @@ Notes:
|
|
|
33781
33829
|
tools[name] = tool;
|
|
33782
33830
|
}
|
|
33783
33831
|
const omConfig = normalizeObservationalMemoryConfig(mergedConfig.observationalMemory);
|
|
33784
|
-
if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
|
|
33832
|
+
if (omConfig?.retrieval) tools.recall = recallTool(mergedConfig, {
|
|
33833
|
+
retrievalScope: typeof omConfig.retrieval === "object" ? omConfig.retrieval.scope ?? "resource" : "resource",
|
|
33834
|
+
searchEnabled: this.hasRetrievalSearch(omConfig.retrieval)
|
|
33835
|
+
});
|
|
33785
33836
|
return tools;
|
|
33786
33837
|
}
|
|
33787
33838
|
/**
|
|
@@ -33837,7 +33888,7 @@ Notes:
|
|
|
33837
33888
|
}));
|
|
33838
33889
|
const messageIdsNeedingDeletion = /* @__PURE__ */ new Set([...messageIdsWithClearedContent, ...messageIdsWithNewEmbeddings]);
|
|
33839
33890
|
if (messageIdsNeedingDeletion.size > 0) try {
|
|
33840
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
33891
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
|
|
33841
33892
|
const idsToDelete = [...messageIdsNeedingDeletion];
|
|
33842
33893
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
33843
33894
|
for (let i = 0; i < idsToDelete.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
@@ -33896,7 +33947,7 @@ Notes:
|
|
|
33896
33947
|
const span = this.createMemorySpan("delete", observabilityContext, void 0, { messageCount: messageIds.length });
|
|
33897
33948
|
try {
|
|
33898
33949
|
await (await this.getMemoryStore()).deleteMessages(messageIds);
|
|
33899
|
-
if (this.vector) this.deleteMessageVectors(messageIds);
|
|
33950
|
+
if (this.vector) this.trackVectorCleanup(this.deleteMessageVectors(messageIds));
|
|
33900
33951
|
span?.end({
|
|
33901
33952
|
output: { success: true },
|
|
33902
33953
|
attributes: { messageCount: messageIds.length }
|
|
@@ -33912,12 +33963,14 @@ Notes:
|
|
|
33912
33963
|
/**
|
|
33913
33964
|
* Deletes vector embeddings for specific messages.
|
|
33914
33965
|
* This is called internally by deleteMessages to clean up orphaned vectors.
|
|
33966
|
+
* Only the message indexes are touched, because observation vectors can hold
|
|
33967
|
+
* text of other messages of the thread.
|
|
33915
33968
|
*
|
|
33916
33969
|
* @param messageIds - The IDs of the messages whose vectors should be deleted
|
|
33917
33970
|
*/
|
|
33918
33971
|
async deleteMessageVectors(messageIds) {
|
|
33919
33972
|
try {
|
|
33920
|
-
const memoryIndexes = await this.getMemoryVectorIndexes();
|
|
33973
|
+
const memoryIndexes = await this.getMemoryVectorIndexes([this.messageIndexPrefix]);
|
|
33921
33974
|
await Promise.all(memoryIndexes.map(async (indexName) => {
|
|
33922
33975
|
for (let i = 0; i < messageIds.length; i += VECTOR_DELETE_BATCH_SIZE) {
|
|
33923
33976
|
const batch = messageIds.slice(i, i + VECTOR_DELETE_BATCH_SIZE);
|
|
@@ -44690,4 +44743,4 @@ const agentBuilderWorkflows = {
|
|
|
44690
44743
|
//#endregion
|
|
44691
44744
|
export { agentBuilderWorkflows };
|
|
44692
44745
|
|
|
44693
|
-
//# sourceMappingURL=dist-
|
|
44746
|
+
//# sourceMappingURL=dist-BKRMiJcn.js.map
|