@mastra/server 1.20.0 → 1.21.0-alpha.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 +96 -0
- package/dist/_types/@internal_core/dist/index.d.ts +12 -2
- package/dist/{chunk-NCCK5NVX.cjs → chunk-22YG2467.cjs} +3 -3
- package/dist/{chunk-NCCK5NVX.cjs.map → chunk-22YG2467.cjs.map} +1 -1
- package/dist/{chunk-3W54ZNYP.cjs → chunk-5IKQNFW5.cjs} +3 -3
- package/dist/{chunk-3W54ZNYP.cjs.map → chunk-5IKQNFW5.cjs.map} +1 -1
- package/dist/chunk-6MFKRF4K.cjs +176 -0
- package/dist/chunk-6MFKRF4K.cjs.map +1 -0
- package/dist/{chunk-G726SOOJ.cjs → chunk-7G44ZSFS.cjs} +3 -3
- package/dist/{chunk-G726SOOJ.cjs.map → chunk-7G44ZSFS.cjs.map} +1 -1
- package/dist/{chunk-TYYGY4H4.cjs → chunk-7HOYCW7S.cjs} +3 -3
- package/dist/{chunk-TYYGY4H4.cjs.map → chunk-7HOYCW7S.cjs.map} +1 -1
- package/dist/{chunk-MH2WUZWZ.js → chunk-7KJ4NUEH.js} +3 -3
- package/dist/{chunk-MH2WUZWZ.js.map → chunk-7KJ4NUEH.js.map} +1 -1
- package/dist/chunk-AJYJ4H7P.js +438 -0
- package/dist/chunk-AJYJ4H7P.js.map +1 -0
- package/dist/{chunk-ULLR3RN3.cjs → chunk-AYD7DM5U.cjs} +3 -3
- package/dist/{chunk-ULLR3RN3.cjs.map → chunk-AYD7DM5U.cjs.map} +1 -1
- package/dist/chunk-B6HNPO67.cjs +195 -0
- package/dist/chunk-B6HNPO67.cjs.map +1 -0
- package/dist/chunk-BQXQZPYZ.js +189 -0
- package/dist/chunk-BQXQZPYZ.js.map +1 -0
- package/dist/{chunk-DAEHQAZC.cjs → chunk-DNYJSPA5.cjs} +27 -6
- package/dist/chunk-DNYJSPA5.cjs.map +1 -0
- package/dist/{chunk-UE4FGLA3.cjs → chunk-DWXE75AZ.cjs} +38 -38
- package/dist/{chunk-UE4FGLA3.cjs.map → chunk-DWXE75AZ.cjs.map} +1 -1
- package/dist/chunk-FCCXLAOT.js +153 -0
- package/dist/chunk-FCCXLAOT.js.map +1 -0
- package/dist/{chunk-5CDCKTHB.js → chunk-FCLPA23B.js} +27 -6
- package/dist/chunk-FCLPA23B.js.map +1 -0
- package/dist/{chunk-XINNAPVH.cjs → chunk-FGXFUFWK.cjs} +29 -29
- package/dist/{chunk-XINNAPVH.cjs.map → chunk-FGXFUFWK.cjs.map} +1 -1
- package/dist/chunk-FURWD3DL.cjs +180 -0
- package/dist/chunk-FURWD3DL.cjs.map +1 -0
- package/dist/{chunk-23U24RPR.cjs → chunk-G5IQN5ZG.cjs} +3 -3
- package/dist/{chunk-23U24RPR.cjs.map → chunk-G5IQN5ZG.cjs.map} +1 -1
- package/dist/{chunk-UFK5THVP.cjs → chunk-GANMD6GP.cjs} +3 -3
- package/dist/{chunk-UFK5THVP.cjs.map → chunk-GANMD6GP.cjs.map} +1 -1
- package/dist/{chunk-OSMI5XLT.cjs → chunk-GLB2TK6A.cjs} +12 -7
- package/dist/chunk-GLB2TK6A.cjs.map +1 -0
- package/dist/chunk-GWPNQNXF.cjs +45 -0
- package/dist/chunk-GWPNQNXF.cjs.map +1 -0
- package/dist/chunk-IRRJW5EA.cjs +695 -0
- package/dist/chunk-IRRJW5EA.cjs.map +1 -0
- package/dist/{chunk-G2ZZKKQI.js → chunk-L7PDVJZD.js} +3 -3
- package/dist/{chunk-G2ZZKKQI.js.map → chunk-L7PDVJZD.js.map} +1 -1
- package/dist/{chunk-K6RNBFGH.js → chunk-M4BZ2B7D.js} +3 -3
- package/dist/{chunk-K6RNBFGH.js.map → chunk-M4BZ2B7D.js.map} +1 -1
- package/dist/{chunk-4D7KSU4X.js → chunk-MWRVCCZE.js} +3 -3
- package/dist/{chunk-4D7KSU4X.js.map → chunk-MWRVCCZE.js.map} +1 -1
- package/dist/chunk-NCW7IFFR.js +690 -0
- package/dist/chunk-NCW7IFFR.js.map +1 -0
- package/dist/{chunk-MKW43AJ3.js → chunk-NL7Y763D.js} +3 -3
- package/dist/{chunk-MKW43AJ3.js.map → chunk-NL7Y763D.js.map} +1 -1
- package/dist/{chunk-MYFV2L3T.js → chunk-OBR4SMSZ.js} +3 -3
- package/dist/{chunk-MYFV2L3T.js.map → chunk-OBR4SMSZ.js.map} +1 -1
- package/dist/chunk-OJ72T77G.cjs +452 -0
- package/dist/chunk-OJ72T77G.cjs.map +1 -0
- package/dist/{chunk-5YMAXL54.js → chunk-QSA443WV.js} +3 -3
- package/dist/{chunk-5YMAXL54.js.map → chunk-QSA443WV.js.map} +1 -1
- package/dist/{chunk-4NRXB7VI.js → chunk-SNGR4M5I.js} +3 -3
- package/dist/{chunk-4NRXB7VI.js.map → chunk-SNGR4M5I.js.map} +1 -1
- package/dist/{chunk-XDFOXO76.js → chunk-SW6IJZFQ.js} +9 -9
- package/dist/{chunk-XDFOXO76.js.map → chunk-SW6IJZFQ.js.map} +1 -1
- package/dist/{chunk-WPBRQTMO.js → chunk-VCA6BSYU.js} +3 -3
- package/dist/{chunk-WPBRQTMO.js.map → chunk-VCA6BSYU.js.map} +1 -1
- package/dist/{chunk-HHF4VF75.js → chunk-VHUB2TYN.js} +3 -3
- package/dist/{chunk-HHF4VF75.js.map → chunk-VHUB2TYN.js.map} +1 -1
- package/dist/chunk-VKIIGA2F.js +35 -0
- package/dist/chunk-VKIIGA2F.js.map +1 -0
- package/dist/{chunk-2QCTUEHS.cjs → chunk-VVWHCAF2.cjs} +3 -3
- package/dist/{chunk-2QCTUEHS.cjs.map → chunk-VVWHCAF2.cjs.map} +1 -1
- package/dist/{chunk-YFQ5JIUD.js → chunk-WO7BJJIB.js} +12 -7
- package/dist/chunk-WO7BJJIB.js.map +1 -0
- package/dist/{chunk-A5J2TY2W.cjs → chunk-XKKTZVZX.cjs} +3 -3
- package/dist/{chunk-A5J2TY2W.cjs.map → chunk-XKKTZVZX.cjs.map} +1 -1
- package/dist/chunk-ZA3NGM3L.js +174 -0
- package/dist/chunk-ZA3NGM3L.js.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-routes.md +22 -1
- package/dist/{observational-memory-B25SASRW-T76NSRNU.cjs → observational-memory-WOEVNCG4-5THJIIQE.cjs} +26 -26
- package/dist/{observational-memory-B25SASRW-T76NSRNU.cjs.map → observational-memory-WOEVNCG4-5THJIIQE.cjs.map} +1 -1
- package/dist/{observational-memory-B25SASRW-L4GYD2ZN.js → observational-memory-WOEVNCG4-DT36JHO2.js} +3 -3
- package/dist/{observational-memory-B25SASRW-L4GYD2ZN.js.map → observational-memory-WOEVNCG4-DT36JHO2.js.map} +1 -1
- package/dist/server/handlers/agent-builder.cjs +16 -16
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/conversations.cjs +24 -0
- package/dist/server/handlers/conversations.cjs.map +1 -0
- package/dist/server/handlers/conversations.d.ts +153 -0
- package/dist/server/handlers/conversations.d.ts.map +1 -0
- package/dist/server/handlers/conversations.js +3 -0
- package/dist/server/handlers/conversations.js.map +1 -0
- package/dist/server/handlers/datasets.cjs +26 -26
- package/dist/server/handlers/datasets.js +1 -1
- package/dist/server/handlers/logs.cjs +4 -4
- package/dist/server/handlers/logs.js +1 -1
- package/dist/server/handlers/observability-new-endpoints.cjs +27 -27
- package/dist/server/handlers/observability-new-endpoints.d.ts +8 -0
- package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
- package/dist/server/handlers/observability-new-endpoints.js +1 -1
- package/dist/server/handlers/observability.cjs +32 -32
- package/dist/server/handlers/observability.js +2 -2
- package/dist/server/handlers/responses.adapter.cjs +60 -0
- package/dist/server/handlers/responses.adapter.cjs.map +1 -0
- package/dist/server/handlers/responses.adapter.d.ts +98 -0
- package/dist/server/handlers/responses.adapter.d.ts.map +1 -0
- package/dist/server/handlers/responses.adapter.js +3 -0
- package/dist/server/handlers/responses.adapter.js.map +1 -0
- package/dist/server/handlers/responses.cjs +20 -0
- package/dist/server/handlers/responses.cjs.map +1 -0
- package/dist/server/handlers/responses.d.ts +387 -0
- package/dist/server/handlers/responses.d.ts.map +1 -0
- package/dist/server/handlers/responses.js +3 -0
- package/dist/server/handlers/responses.js.map +1 -0
- package/dist/server/handlers/responses.storage.cjs +28 -0
- package/dist/server/handlers/responses.storage.cjs.map +1 -0
- package/dist/server/handlers/responses.storage.d.ts +97 -0
- package/dist/server/handlers/responses.storage.d.ts.map +1 -0
- package/dist/server/handlers/responses.storage.js +3 -0
- package/dist/server/handlers/responses.storage.js.map +1 -0
- package/dist/server/handlers/scores.cjs +7 -7
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/stored-agents.cjs +7 -7
- package/dist/server/handlers/stored-agents.js +1 -1
- package/dist/server/handlers/stored-mcp-clients.cjs +6 -6
- package/dist/server/handlers/stored-mcp-clients.js +1 -1
- package/dist/server/handlers/stored-prompt-blocks.cjs +6 -6
- package/dist/server/handlers/stored-prompt-blocks.js +1 -1
- package/dist/server/handlers/stored-scorers.cjs +6 -6
- package/dist/server/handlers/stored-scorers.js +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/workflows.cjs +24 -24
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/handlers.cjs +28 -18
- package/dist/server/handlers.d.ts +2 -0
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/handlers.js +9 -7
- package/dist/server/schemas/conversations.d.ts +74 -0
- package/dist/server/schemas/conversations.d.ts.map +1 -0
- package/dist/server/schemas/index.cjs +185 -91
- package/dist/server/schemas/index.d.ts +2 -0
- package/dist/server/schemas/index.d.ts.map +1 -1
- package/dist/server/schemas/index.js +5 -3
- package/dist/server/schemas/responses.d.ts +341 -0
- package/dist/server/schemas/responses.d.ts.map +1 -0
- package/dist/server/server-adapter/index.cjs +153 -138
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.js +30 -15
- package/dist/server/server-adapter/index.js.map +1 -1
- package/dist/server/server-adapter/routes/conversations.d.ts +150 -0
- package/dist/server/server-adapter/routes/conversations.d.ts.map +1 -0
- package/dist/server/server-adapter/routes/index.d.ts +4 -0
- package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/observability.d.ts +4 -0
- package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/responses.d.ts +385 -0
- package/dist/server/server-adapter/routes/responses.d.ts.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-5CDCKTHB.js.map +0 -1
- package/dist/chunk-DAEHQAZC.cjs.map +0 -1
- package/dist/chunk-OSMI5XLT.cjs.map +0 -1
- package/dist/chunk-YFQ5JIUD.js.map +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZKMVCV4G_cjs = require('./chunk-ZKMVCV4G.cjs');
|
|
4
|
+
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
|
|
5
|
+
|
|
6
|
+
// src/server/handlers/responses.storage.ts
|
|
7
|
+
function isPlainObject(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
async function getResponseMemoryStore(mastra) {
|
|
11
|
+
const storage = mastra?.getStorage();
|
|
12
|
+
if (!storage) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const memoryStore = await storage.getStore("memory");
|
|
16
|
+
if (!memoryStore) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return memoryStore;
|
|
20
|
+
}
|
|
21
|
+
function readResponseTurnRecordMetadata(message) {
|
|
22
|
+
const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;
|
|
23
|
+
const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;
|
|
24
|
+
if (!responseMetadata || typeof responseMetadata.agentId !== "string" || typeof responseMetadata.model !== "string" || typeof responseMetadata.createdAt !== "number" || responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== "number" || responseMetadata.instructions !== void 0 && typeof responseMetadata.instructions !== "string" || responseMetadata.text !== void 0 && (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format)) || responseMetadata.previousResponseId !== void 0 && typeof responseMetadata.previousResponseId !== "string" || !Array.isArray(responseMetadata.tools) || typeof responseMetadata.store !== "boolean" || !Array.isArray(responseMetadata.messageIds)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
agentId: responseMetadata.agentId,
|
|
29
|
+
model: responseMetadata.model,
|
|
30
|
+
createdAt: responseMetadata.createdAt,
|
|
31
|
+
completedAt: responseMetadata.completedAt,
|
|
32
|
+
status: responseMetadata.status === "completed" ? "completed" : "incomplete",
|
|
33
|
+
usage: responseMetadata.usage,
|
|
34
|
+
instructions: responseMetadata.instructions,
|
|
35
|
+
text: responseMetadata.text,
|
|
36
|
+
previousResponseId: responseMetadata.previousResponseId,
|
|
37
|
+
providerOptions: responseMetadata.providerOptions,
|
|
38
|
+
tools: responseMetadata.tools,
|
|
39
|
+
store: responseMetadata.store,
|
|
40
|
+
messageIds: responseMetadata.messageIds.filter((value) => typeof value === "string")
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function writeResponseTurnRecordMetadata(message, metadata) {
|
|
44
|
+
const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};
|
|
45
|
+
const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};
|
|
46
|
+
return {
|
|
47
|
+
...message,
|
|
48
|
+
content: {
|
|
49
|
+
...message.content,
|
|
50
|
+
metadata: {
|
|
51
|
+
...contentMetadata,
|
|
52
|
+
mastra: {
|
|
53
|
+
...mastraMetadata,
|
|
54
|
+
response: metadata
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function findResponseTurnRecord({
|
|
61
|
+
mastra,
|
|
62
|
+
responseId,
|
|
63
|
+
requestContext
|
|
64
|
+
}) {
|
|
65
|
+
const memoryStore = await getResponseMemoryStore(mastra);
|
|
66
|
+
if (!memoryStore) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const effectiveResourceId = chunkZKMVCV4G_cjs.getEffectiveResourceId(requestContext, void 0);
|
|
70
|
+
const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });
|
|
71
|
+
const message = matchedMessages[0];
|
|
72
|
+
if (!message || message.role !== "assistant") {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const metadata = readResponseTurnRecordMetadata(message);
|
|
76
|
+
if (!metadata) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;
|
|
80
|
+
if (!thread) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
await chunkZKMVCV4G_cjs.validateThreadOwnership(thread, effectiveResourceId);
|
|
84
|
+
const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];
|
|
85
|
+
const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });
|
|
86
|
+
const messagesById = new Map(responseMessages.map((storedMessage) => [storedMessage.id, storedMessage]));
|
|
87
|
+
const orderedMessages = messageIds.map((messageId) => messagesById.get(messageId)).filter((storedMessage) => Boolean(storedMessage));
|
|
88
|
+
return { metadata, message, messages: orderedMessages, thread, memoryStore };
|
|
89
|
+
}
|
|
90
|
+
function createSyntheticResponseMessage({
|
|
91
|
+
responseId,
|
|
92
|
+
text,
|
|
93
|
+
threadContext
|
|
94
|
+
}) {
|
|
95
|
+
return {
|
|
96
|
+
id: responseId,
|
|
97
|
+
role: "assistant",
|
|
98
|
+
type: "text",
|
|
99
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
100
|
+
threadId: threadContext.threadId,
|
|
101
|
+
resourceId: threadContext.resourceId,
|
|
102
|
+
content: {
|
|
103
|
+
format: 2,
|
|
104
|
+
parts: text ? [{ type: "text", text }] : []
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function resolveResponseTurnMessagesForStorage({
|
|
109
|
+
result,
|
|
110
|
+
responseId,
|
|
111
|
+
text,
|
|
112
|
+
threadContext
|
|
113
|
+
}) {
|
|
114
|
+
const response = await result.response;
|
|
115
|
+
const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];
|
|
116
|
+
if (!threadContext) {
|
|
117
|
+
return responseMessages;
|
|
118
|
+
}
|
|
119
|
+
if (responseMessages.length === 0) {
|
|
120
|
+
return [createSyntheticResponseMessage({ responseId, text, threadContext })];
|
|
121
|
+
}
|
|
122
|
+
return responseMessages;
|
|
123
|
+
}
|
|
124
|
+
async function persistResponseTurnRecord({
|
|
125
|
+
mastra,
|
|
126
|
+
responseId,
|
|
127
|
+
metadata,
|
|
128
|
+
threadContext,
|
|
129
|
+
messages
|
|
130
|
+
}) {
|
|
131
|
+
const memoryStore = await getResponseMemoryStore(mastra);
|
|
132
|
+
if (!memoryStore) {
|
|
133
|
+
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Memory storage was not available while storing the response" });
|
|
134
|
+
}
|
|
135
|
+
const normalizedMessages = messages.map((message) => ({
|
|
136
|
+
...message,
|
|
137
|
+
threadId: message.threadId ?? threadContext.threadId,
|
|
138
|
+
resourceId: message.resourceId ?? threadContext.resourceId
|
|
139
|
+
}));
|
|
140
|
+
const lastAssistantIndex = [...normalizedMessages].map((message) => message.role).lastIndexOf("assistant");
|
|
141
|
+
const lastAssistantMessage = lastAssistantIndex >= 0 ? {
|
|
142
|
+
...normalizedMessages[lastAssistantIndex],
|
|
143
|
+
id: responseId
|
|
144
|
+
} : {
|
|
145
|
+
id: responseId,
|
|
146
|
+
role: "assistant",
|
|
147
|
+
type: "text",
|
|
148
|
+
createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1e3 : Date.now()),
|
|
149
|
+
threadId: threadContext.threadId,
|
|
150
|
+
resourceId: threadContext.resourceId,
|
|
151
|
+
content: {
|
|
152
|
+
format: 2,
|
|
153
|
+
parts: []
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
if (lastAssistantIndex >= 0) {
|
|
157
|
+
normalizedMessages[lastAssistantIndex] = lastAssistantMessage;
|
|
158
|
+
} else {
|
|
159
|
+
normalizedMessages.push(lastAssistantMessage);
|
|
160
|
+
}
|
|
161
|
+
const staleMessageIds = lastAssistantIndex >= 0 && messages[lastAssistantIndex]?.id && messages[lastAssistantIndex]?.id !== responseId ? [messages[lastAssistantIndex].id] : [];
|
|
162
|
+
const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {
|
|
163
|
+
...metadata,
|
|
164
|
+
messageIds: normalizedMessages.map((message) => message.id)
|
|
165
|
+
});
|
|
166
|
+
if (lastAssistantIndex >= 0) {
|
|
167
|
+
normalizedMessages[lastAssistantIndex] = storedMessage;
|
|
168
|
+
} else {
|
|
169
|
+
normalizedMessages[normalizedMessages.length - 1] = storedMessage;
|
|
170
|
+
}
|
|
171
|
+
await memoryStore.saveMessages({ messages: normalizedMessages });
|
|
172
|
+
if (staleMessageIds.length > 0) {
|
|
173
|
+
await memoryStore.deleteMessages(staleMessageIds);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function deleteResponseTurnRecord({
|
|
177
|
+
mastra,
|
|
178
|
+
responseId,
|
|
179
|
+
requestContext
|
|
180
|
+
}) {
|
|
181
|
+
const match = await findResponseTurnRecord({ mastra, responseId, requestContext });
|
|
182
|
+
if (!match) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
await match.memoryStore.deleteMessages(match.metadata.messageIds);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
exports.deleteResponseTurnRecord = deleteResponseTurnRecord;
|
|
190
|
+
exports.findResponseTurnRecord = findResponseTurnRecord;
|
|
191
|
+
exports.getResponseMemoryStore = getResponseMemoryStore;
|
|
192
|
+
exports.persistResponseTurnRecord = persistResponseTurnRecord;
|
|
193
|
+
exports.resolveResponseTurnMessagesForStorage = resolveResponseTurnMessagesForStorage;
|
|
194
|
+
//# sourceMappingURL=chunk-B6HNPO67.cjs.map
|
|
195
|
+
//# sourceMappingURL=chunk-B6HNPO67.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/responses.storage.ts"],"names":["getEffectiveResourceId","validateThreadOwnership","HTTPException"],"mappings":"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","file":"chunk-B6HNPO67.cjs","sourcesContent":["import type { MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport type { ResponseObject, ResponseTextConfig, ResponseTool, ResponseUsage } from '../schemas/responses';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nexport type ThreadExecutionContext = {\n threadId: string;\n resourceId: string;\n};\n\nexport type UsageLike = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n} | null;\n\nexport type ProviderMetadataLike = Record<string, Record<string, unknown> | undefined> | undefined;\n\nexport type ResponseTurnRecordMetadata = {\n agentId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n usage: ResponseUsage | null;\n instructions?: string;\n text?: ResponseTextConfig;\n previousResponseId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messageIds: string[];\n};\n\nexport type ResponseTurnRecord = {\n metadata: ResponseTurnRecordMetadata;\n message: MastraDBMessage;\n messages: MastraDBMessage[];\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\ntype ResponseResultLike = {\n response?:\n | Promise<{\n dbMessages?: MastraDBMessage[];\n }>\n | {\n dbMessages?: MastraDBMessage[];\n };\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Resolves the memory storage used by response-turn records.\n */\nexport async function getResponseMemoryStore(mastra: Mastra | undefined): Promise<MemoryStorage | null> {\n const storage = mastra?.getStorage();\n if (!storage) {\n return null;\n }\n\n const memoryStore = await storage.getStore('memory');\n if (!memoryStore) {\n return null;\n }\n\n return memoryStore;\n}\n\n/**\n * Reads the response-turn record metadata attached to a stored assistant message.\n */\nfunction readResponseTurnRecordMetadata(message: MastraDBMessage): ResponseTurnRecordMetadata | null {\n const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;\n const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;\n\n if (\n !responseMetadata ||\n typeof responseMetadata.agentId !== 'string' ||\n typeof responseMetadata.model !== 'string' ||\n typeof responseMetadata.createdAt !== 'number' ||\n (responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== 'number') ||\n (responseMetadata.instructions !== undefined && typeof responseMetadata.instructions !== 'string') ||\n (responseMetadata.text !== undefined &&\n (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format))) ||\n (responseMetadata.previousResponseId !== undefined && typeof responseMetadata.previousResponseId !== 'string') ||\n !Array.isArray(responseMetadata.tools) ||\n typeof responseMetadata.store !== 'boolean' ||\n !Array.isArray(responseMetadata.messageIds)\n ) {\n return null;\n }\n\n return {\n agentId: responseMetadata.agentId,\n model: responseMetadata.model,\n createdAt: responseMetadata.createdAt,\n completedAt: responseMetadata.completedAt,\n status: responseMetadata.status === 'completed' ? 'completed' : 'incomplete',\n usage: responseMetadata.usage as ResponseUsage | null,\n instructions: responseMetadata.instructions,\n text: responseMetadata.text as ResponseTextConfig | undefined,\n previousResponseId: responseMetadata.previousResponseId,\n providerOptions: responseMetadata.providerOptions as ProviderMetadataLike,\n tools: responseMetadata.tools as ResponseTool[],\n store: responseMetadata.store,\n messageIds: responseMetadata.messageIds.filter((value): value is string => typeof value === 'string'),\n };\n}\n\n/**\n * Writes response-turn record metadata onto a persisted assistant message.\n */\nfunction writeResponseTurnRecordMetadata(\n message: MastraDBMessage,\n metadata: ResponseTurnRecordMetadata,\n): MastraDBMessage {\n const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};\n const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};\n\n return {\n ...message,\n content: {\n ...message.content,\n metadata: {\n ...contentMetadata,\n mastra: {\n ...mastraMetadata,\n response: metadata,\n },\n },\n },\n };\n}\n\n/**\n * Looks up a stored response-turn record by response id.\n *\n * Response ids are assistant message ids, so this reconstructs the record by\n * loading that persisted assistant message, reading its response metadata, then\n * reloading the full set of stored turn messages referenced by the metadata.\n */\nexport async function findResponseTurnRecord({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n const memoryStore = await getResponseMemoryStore(mastra);\n if (!memoryStore) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });\n const message = matchedMessages[0];\n if (!message || message.role !== 'assistant') {\n return null;\n }\n\n const metadata = readResponseTurnRecordMetadata(message);\n if (!metadata) {\n return null;\n }\n\n const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;\n if (!thread) {\n return null;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];\n const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });\n const messagesById = new Map(responseMessages.map(storedMessage => [storedMessage.id, storedMessage] as const));\n const orderedMessages = messageIds\n .map(messageId => messagesById.get(messageId))\n .filter((storedMessage): storedMessage is MastraDBMessage => Boolean(storedMessage));\n\n return { metadata, message, messages: orderedMessages, thread, memoryStore };\n}\n\n/**\n * Creates a synthetic assistant message for responses that did not emit any\n * persisted DB messages but still need a durable response-turn record.\n */\nfunction createSyntheticResponseMessage({\n responseId,\n text,\n threadContext,\n}: {\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage {\n return {\n id: responseId,\n role: 'assistant',\n type: 'text',\n createdAt: new Date(),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: text ? [{ type: 'text', text }] : [],\n },\n };\n}\n\n/**\n * Resolves the Mastra messages that belong to the response turn being stored.\n */\nexport async function resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text,\n threadContext,\n}: {\n result: ResponseResultLike;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext | null;\n}): Promise<MastraDBMessage[]> {\n const response = await result.response;\n const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];\n\n if (!threadContext) {\n return responseMessages;\n }\n\n if (responseMessages.length === 0) {\n return [createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n return responseMessages;\n}\n\n/**\n * Persists a response-turn record by anchoring it on the final assistant\n * message in the stored turn.\n *\n * The response id becomes that assistant message id, and the response-specific\n * metadata is written onto the assistant message so later retrieval can rebuild\n * the Responses object from thread-backed storage.\n */\nexport async function persistResponseTurnRecord({\n mastra,\n responseId,\n metadata,\n threadContext,\n messages,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n metadata: ResponseTurnRecordMetadata;\n threadContext: ThreadExecutionContext;\n messages: MastraDBMessage[];\n}): Promise<void> {\n const memoryStore = await getResponseMemoryStore(mastra);\n if (!memoryStore) {\n throw new HTTPException(500, { message: 'Memory storage was not available while storing the response' });\n }\n\n const normalizedMessages: MastraDBMessage[] = messages.map(message => ({\n ...message,\n threadId: message.threadId ?? threadContext.threadId,\n resourceId: message.resourceId ?? threadContext.resourceId,\n }));\n\n const lastAssistantIndex = [...normalizedMessages].map(message => message.role).lastIndexOf('assistant');\n const lastAssistantMessage =\n lastAssistantIndex >= 0\n ? {\n ...normalizedMessages[lastAssistantIndex]!,\n id: responseId,\n }\n : ({\n id: responseId,\n role: 'assistant' as const,\n type: 'text' as const,\n createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1000 : Date.now()),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: [],\n },\n } satisfies MastraDBMessage);\n\n if (lastAssistantIndex >= 0) {\n normalizedMessages[lastAssistantIndex] = lastAssistantMessage;\n } else {\n normalizedMessages.push(lastAssistantMessage);\n }\n\n const staleMessageIds =\n lastAssistantIndex >= 0 && messages[lastAssistantIndex]?.id && messages[lastAssistantIndex]?.id !== responseId\n ? [messages[lastAssistantIndex]!.id]\n : [];\n\n const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {\n ...metadata,\n messageIds: normalizedMessages.map(message => message.id),\n });\n\n if (lastAssistantIndex >= 0) {\n normalizedMessages[lastAssistantIndex] = storedMessage;\n } else {\n normalizedMessages[normalizedMessages.length - 1] = storedMessage;\n }\n\n await memoryStore.saveMessages({ messages: normalizedMessages });\n\n if (staleMessageIds.length > 0) {\n await memoryStore.deleteMessages(staleMessageIds);\n }\n}\n\n/**\n * Removes all persisted messages for a stored response-turn record.\n */\nexport async function deleteResponseTurnRecord({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<boolean> {\n const match = await findResponseTurnRecord({ mastra, responseId, requestContext });\n if (!match) {\n return false;\n }\n\n await match.memoryStore.deleteMessages(match.metadata.messageIds);\n return true;\n}\n"]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { getEffectiveResourceId, validateThreadOwnership } from './chunk-USR6JK77.js';
|
|
2
|
+
import { HTTPException } from './chunk-6QWQZI4Q.js';
|
|
3
|
+
|
|
4
|
+
// src/server/handlers/responses.storage.ts
|
|
5
|
+
function isPlainObject(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
async function getResponseMemoryStore(mastra) {
|
|
9
|
+
const storage = mastra?.getStorage();
|
|
10
|
+
if (!storage) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const memoryStore = await storage.getStore("memory");
|
|
14
|
+
if (!memoryStore) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return memoryStore;
|
|
18
|
+
}
|
|
19
|
+
function readResponseTurnRecordMetadata(message) {
|
|
20
|
+
const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;
|
|
21
|
+
const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;
|
|
22
|
+
if (!responseMetadata || typeof responseMetadata.agentId !== "string" || typeof responseMetadata.model !== "string" || typeof responseMetadata.createdAt !== "number" || responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== "number" || responseMetadata.instructions !== void 0 && typeof responseMetadata.instructions !== "string" || responseMetadata.text !== void 0 && (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format)) || responseMetadata.previousResponseId !== void 0 && typeof responseMetadata.previousResponseId !== "string" || !Array.isArray(responseMetadata.tools) || typeof responseMetadata.store !== "boolean" || !Array.isArray(responseMetadata.messageIds)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
agentId: responseMetadata.agentId,
|
|
27
|
+
model: responseMetadata.model,
|
|
28
|
+
createdAt: responseMetadata.createdAt,
|
|
29
|
+
completedAt: responseMetadata.completedAt,
|
|
30
|
+
status: responseMetadata.status === "completed" ? "completed" : "incomplete",
|
|
31
|
+
usage: responseMetadata.usage,
|
|
32
|
+
instructions: responseMetadata.instructions,
|
|
33
|
+
text: responseMetadata.text,
|
|
34
|
+
previousResponseId: responseMetadata.previousResponseId,
|
|
35
|
+
providerOptions: responseMetadata.providerOptions,
|
|
36
|
+
tools: responseMetadata.tools,
|
|
37
|
+
store: responseMetadata.store,
|
|
38
|
+
messageIds: responseMetadata.messageIds.filter((value) => typeof value === "string")
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function writeResponseTurnRecordMetadata(message, metadata) {
|
|
42
|
+
const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};
|
|
43
|
+
const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};
|
|
44
|
+
return {
|
|
45
|
+
...message,
|
|
46
|
+
content: {
|
|
47
|
+
...message.content,
|
|
48
|
+
metadata: {
|
|
49
|
+
...contentMetadata,
|
|
50
|
+
mastra: {
|
|
51
|
+
...mastraMetadata,
|
|
52
|
+
response: metadata
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function findResponseTurnRecord({
|
|
59
|
+
mastra,
|
|
60
|
+
responseId,
|
|
61
|
+
requestContext
|
|
62
|
+
}) {
|
|
63
|
+
const memoryStore = await getResponseMemoryStore(mastra);
|
|
64
|
+
if (!memoryStore) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const effectiveResourceId = getEffectiveResourceId(requestContext, void 0);
|
|
68
|
+
const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });
|
|
69
|
+
const message = matchedMessages[0];
|
|
70
|
+
if (!message || message.role !== "assistant") {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const metadata = readResponseTurnRecordMetadata(message);
|
|
74
|
+
if (!metadata) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;
|
|
78
|
+
if (!thread) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
await validateThreadOwnership(thread, effectiveResourceId);
|
|
82
|
+
const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];
|
|
83
|
+
const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });
|
|
84
|
+
const messagesById = new Map(responseMessages.map((storedMessage) => [storedMessage.id, storedMessage]));
|
|
85
|
+
const orderedMessages = messageIds.map((messageId) => messagesById.get(messageId)).filter((storedMessage) => Boolean(storedMessage));
|
|
86
|
+
return { metadata, message, messages: orderedMessages, thread, memoryStore };
|
|
87
|
+
}
|
|
88
|
+
function createSyntheticResponseMessage({
|
|
89
|
+
responseId,
|
|
90
|
+
text,
|
|
91
|
+
threadContext
|
|
92
|
+
}) {
|
|
93
|
+
return {
|
|
94
|
+
id: responseId,
|
|
95
|
+
role: "assistant",
|
|
96
|
+
type: "text",
|
|
97
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
98
|
+
threadId: threadContext.threadId,
|
|
99
|
+
resourceId: threadContext.resourceId,
|
|
100
|
+
content: {
|
|
101
|
+
format: 2,
|
|
102
|
+
parts: text ? [{ type: "text", text }] : []
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function resolveResponseTurnMessagesForStorage({
|
|
107
|
+
result,
|
|
108
|
+
responseId,
|
|
109
|
+
text,
|
|
110
|
+
threadContext
|
|
111
|
+
}) {
|
|
112
|
+
const response = await result.response;
|
|
113
|
+
const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];
|
|
114
|
+
if (!threadContext) {
|
|
115
|
+
return responseMessages;
|
|
116
|
+
}
|
|
117
|
+
if (responseMessages.length === 0) {
|
|
118
|
+
return [createSyntheticResponseMessage({ responseId, text, threadContext })];
|
|
119
|
+
}
|
|
120
|
+
return responseMessages;
|
|
121
|
+
}
|
|
122
|
+
async function persistResponseTurnRecord({
|
|
123
|
+
mastra,
|
|
124
|
+
responseId,
|
|
125
|
+
metadata,
|
|
126
|
+
threadContext,
|
|
127
|
+
messages
|
|
128
|
+
}) {
|
|
129
|
+
const memoryStore = await getResponseMemoryStore(mastra);
|
|
130
|
+
if (!memoryStore) {
|
|
131
|
+
throw new HTTPException(500, { message: "Memory storage was not available while storing the response" });
|
|
132
|
+
}
|
|
133
|
+
const normalizedMessages = messages.map((message) => ({
|
|
134
|
+
...message,
|
|
135
|
+
threadId: message.threadId ?? threadContext.threadId,
|
|
136
|
+
resourceId: message.resourceId ?? threadContext.resourceId
|
|
137
|
+
}));
|
|
138
|
+
const lastAssistantIndex = [...normalizedMessages].map((message) => message.role).lastIndexOf("assistant");
|
|
139
|
+
const lastAssistantMessage = lastAssistantIndex >= 0 ? {
|
|
140
|
+
...normalizedMessages[lastAssistantIndex],
|
|
141
|
+
id: responseId
|
|
142
|
+
} : {
|
|
143
|
+
id: responseId,
|
|
144
|
+
role: "assistant",
|
|
145
|
+
type: "text",
|
|
146
|
+
createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1e3 : Date.now()),
|
|
147
|
+
threadId: threadContext.threadId,
|
|
148
|
+
resourceId: threadContext.resourceId,
|
|
149
|
+
content: {
|
|
150
|
+
format: 2,
|
|
151
|
+
parts: []
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
if (lastAssistantIndex >= 0) {
|
|
155
|
+
normalizedMessages[lastAssistantIndex] = lastAssistantMessage;
|
|
156
|
+
} else {
|
|
157
|
+
normalizedMessages.push(lastAssistantMessage);
|
|
158
|
+
}
|
|
159
|
+
const staleMessageIds = lastAssistantIndex >= 0 && messages[lastAssistantIndex]?.id && messages[lastAssistantIndex]?.id !== responseId ? [messages[lastAssistantIndex].id] : [];
|
|
160
|
+
const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {
|
|
161
|
+
...metadata,
|
|
162
|
+
messageIds: normalizedMessages.map((message) => message.id)
|
|
163
|
+
});
|
|
164
|
+
if (lastAssistantIndex >= 0) {
|
|
165
|
+
normalizedMessages[lastAssistantIndex] = storedMessage;
|
|
166
|
+
} else {
|
|
167
|
+
normalizedMessages[normalizedMessages.length - 1] = storedMessage;
|
|
168
|
+
}
|
|
169
|
+
await memoryStore.saveMessages({ messages: normalizedMessages });
|
|
170
|
+
if (staleMessageIds.length > 0) {
|
|
171
|
+
await memoryStore.deleteMessages(staleMessageIds);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function deleteResponseTurnRecord({
|
|
175
|
+
mastra,
|
|
176
|
+
responseId,
|
|
177
|
+
requestContext
|
|
178
|
+
}) {
|
|
179
|
+
const match = await findResponseTurnRecord({ mastra, responseId, requestContext });
|
|
180
|
+
if (!match) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
await match.memoryStore.deleteMessages(match.metadata.messageIds);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { deleteResponseTurnRecord, findResponseTurnRecord, getResponseMemoryStore, persistResponseTurnRecord, resolveResponseTurnMessagesForStorage };
|
|
188
|
+
//# sourceMappingURL=chunk-BQXQZPYZ.js.map
|
|
189
|
+
//# sourceMappingURL=chunk-BQXQZPYZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/responses.storage.ts"],"names":[],"mappings":"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","file":"chunk-BQXQZPYZ.js","sourcesContent":["import type { MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport type { ResponseObject, ResponseTextConfig, ResponseTool, ResponseUsage } from '../schemas/responses';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nexport type ThreadExecutionContext = {\n threadId: string;\n resourceId: string;\n};\n\nexport type UsageLike = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n} | null;\n\nexport type ProviderMetadataLike = Record<string, Record<string, unknown> | undefined> | undefined;\n\nexport type ResponseTurnRecordMetadata = {\n agentId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n usage: ResponseUsage | null;\n instructions?: string;\n text?: ResponseTextConfig;\n previousResponseId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messageIds: string[];\n};\n\nexport type ResponseTurnRecord = {\n metadata: ResponseTurnRecordMetadata;\n message: MastraDBMessage;\n messages: MastraDBMessage[];\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\ntype ResponseResultLike = {\n response?:\n | Promise<{\n dbMessages?: MastraDBMessage[];\n }>\n | {\n dbMessages?: MastraDBMessage[];\n };\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Resolves the memory storage used by response-turn records.\n */\nexport async function getResponseMemoryStore(mastra: Mastra | undefined): Promise<MemoryStorage | null> {\n const storage = mastra?.getStorage();\n if (!storage) {\n return null;\n }\n\n const memoryStore = await storage.getStore('memory');\n if (!memoryStore) {\n return null;\n }\n\n return memoryStore;\n}\n\n/**\n * Reads the response-turn record metadata attached to a stored assistant message.\n */\nfunction readResponseTurnRecordMetadata(message: MastraDBMessage): ResponseTurnRecordMetadata | null {\n const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;\n const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;\n\n if (\n !responseMetadata ||\n typeof responseMetadata.agentId !== 'string' ||\n typeof responseMetadata.model !== 'string' ||\n typeof responseMetadata.createdAt !== 'number' ||\n (responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== 'number') ||\n (responseMetadata.instructions !== undefined && typeof responseMetadata.instructions !== 'string') ||\n (responseMetadata.text !== undefined &&\n (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format))) ||\n (responseMetadata.previousResponseId !== undefined && typeof responseMetadata.previousResponseId !== 'string') ||\n !Array.isArray(responseMetadata.tools) ||\n typeof responseMetadata.store !== 'boolean' ||\n !Array.isArray(responseMetadata.messageIds)\n ) {\n return null;\n }\n\n return {\n agentId: responseMetadata.agentId,\n model: responseMetadata.model,\n createdAt: responseMetadata.createdAt,\n completedAt: responseMetadata.completedAt,\n status: responseMetadata.status === 'completed' ? 'completed' : 'incomplete',\n usage: responseMetadata.usage as ResponseUsage | null,\n instructions: responseMetadata.instructions,\n text: responseMetadata.text as ResponseTextConfig | undefined,\n previousResponseId: responseMetadata.previousResponseId,\n providerOptions: responseMetadata.providerOptions as ProviderMetadataLike,\n tools: responseMetadata.tools as ResponseTool[],\n store: responseMetadata.store,\n messageIds: responseMetadata.messageIds.filter((value): value is string => typeof value === 'string'),\n };\n}\n\n/**\n * Writes response-turn record metadata onto a persisted assistant message.\n */\nfunction writeResponseTurnRecordMetadata(\n message: MastraDBMessage,\n metadata: ResponseTurnRecordMetadata,\n): MastraDBMessage {\n const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};\n const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};\n\n return {\n ...message,\n content: {\n ...message.content,\n metadata: {\n ...contentMetadata,\n mastra: {\n ...mastraMetadata,\n response: metadata,\n },\n },\n },\n };\n}\n\n/**\n * Looks up a stored response-turn record by response id.\n *\n * Response ids are assistant message ids, so this reconstructs the record by\n * loading that persisted assistant message, reading its response metadata, then\n * reloading the full set of stored turn messages referenced by the metadata.\n */\nexport async function findResponseTurnRecord({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n const memoryStore = await getResponseMemoryStore(mastra);\n if (!memoryStore) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });\n const message = matchedMessages[0];\n if (!message || message.role !== 'assistant') {\n return null;\n }\n\n const metadata = readResponseTurnRecordMetadata(message);\n if (!metadata) {\n return null;\n }\n\n const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;\n if (!thread) {\n return null;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];\n const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });\n const messagesById = new Map(responseMessages.map(storedMessage => [storedMessage.id, storedMessage] as const));\n const orderedMessages = messageIds\n .map(messageId => messagesById.get(messageId))\n .filter((storedMessage): storedMessage is MastraDBMessage => Boolean(storedMessage));\n\n return { metadata, message, messages: orderedMessages, thread, memoryStore };\n}\n\n/**\n * Creates a synthetic assistant message for responses that did not emit any\n * persisted DB messages but still need a durable response-turn record.\n */\nfunction createSyntheticResponseMessage({\n responseId,\n text,\n threadContext,\n}: {\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage {\n return {\n id: responseId,\n role: 'assistant',\n type: 'text',\n createdAt: new Date(),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: text ? [{ type: 'text', text }] : [],\n },\n };\n}\n\n/**\n * Resolves the Mastra messages that belong to the response turn being stored.\n */\nexport async function resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text,\n threadContext,\n}: {\n result: ResponseResultLike;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext | null;\n}): Promise<MastraDBMessage[]> {\n const response = await result.response;\n const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];\n\n if (!threadContext) {\n return responseMessages;\n }\n\n if (responseMessages.length === 0) {\n return [createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n return responseMessages;\n}\n\n/**\n * Persists a response-turn record by anchoring it on the final assistant\n * message in the stored turn.\n *\n * The response id becomes that assistant message id, and the response-specific\n * metadata is written onto the assistant message so later retrieval can rebuild\n * the Responses object from thread-backed storage.\n */\nexport async function persistResponseTurnRecord({\n mastra,\n responseId,\n metadata,\n threadContext,\n messages,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n metadata: ResponseTurnRecordMetadata;\n threadContext: ThreadExecutionContext;\n messages: MastraDBMessage[];\n}): Promise<void> {\n const memoryStore = await getResponseMemoryStore(mastra);\n if (!memoryStore) {\n throw new HTTPException(500, { message: 'Memory storage was not available while storing the response' });\n }\n\n const normalizedMessages: MastraDBMessage[] = messages.map(message => ({\n ...message,\n threadId: message.threadId ?? threadContext.threadId,\n resourceId: message.resourceId ?? threadContext.resourceId,\n }));\n\n const lastAssistantIndex = [...normalizedMessages].map(message => message.role).lastIndexOf('assistant');\n const lastAssistantMessage =\n lastAssistantIndex >= 0\n ? {\n ...normalizedMessages[lastAssistantIndex]!,\n id: responseId,\n }\n : ({\n id: responseId,\n role: 'assistant' as const,\n type: 'text' as const,\n createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1000 : Date.now()),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: [],\n },\n } satisfies MastraDBMessage);\n\n if (lastAssistantIndex >= 0) {\n normalizedMessages[lastAssistantIndex] = lastAssistantMessage;\n } else {\n normalizedMessages.push(lastAssistantMessage);\n }\n\n const staleMessageIds =\n lastAssistantIndex >= 0 && messages[lastAssistantIndex]?.id && messages[lastAssistantIndex]?.id !== responseId\n ? [messages[lastAssistantIndex]!.id]\n : [];\n\n const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {\n ...metadata,\n messageIds: normalizedMessages.map(message => message.id),\n });\n\n if (lastAssistantIndex >= 0) {\n normalizedMessages[lastAssistantIndex] = storedMessage;\n } else {\n normalizedMessages[normalizedMessages.length - 1] = storedMessage;\n }\n\n await memoryStore.saveMessages({ messages: normalizedMessages });\n\n if (staleMessageIds.length > 0) {\n await memoryStore.deleteMessages(staleMessageIds);\n }\n}\n\n/**\n * Removes all persisted messages for a stored response-turn record.\n */\nexport async function deleteResponseTurnRecord({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<boolean> {\n const match = await findResponseTurnRecord({ mastra, responseId, requestContext });\n if (!match) {\n return false;\n }\n\n await match.memoryStore.deleteMessages(match.metadata.messageIds);\n return true;\n}\n"]}
|
|
@@ -7701,7 +7701,7 @@ ${suggestedResponse}
|
|
|
7701
7701
|
* In resource scope mode, loads messages for the entire resource (all threads).
|
|
7702
7702
|
* In thread scope mode, loads messages for just the current thread.
|
|
7703
7703
|
*/
|
|
7704
|
-
async
|
|
7704
|
+
async loadMessagesFromStorage(threadId, resourceId, lastObservedAt) {
|
|
7705
7705
|
const startDate = lastObservedAt ? new Date(lastObservedAt.getTime() + 1) : void 0;
|
|
7706
7706
|
let result;
|
|
7707
7707
|
if (this.scope === "resource" && resourceId) {
|
|
@@ -8389,7 +8389,7 @@ ${grouped}` : grouped;
|
|
|
8389
8389
|
if (opts.messages) {
|
|
8390
8390
|
unobservedMessages = this.getUnobservedMessages(opts.messages, record);
|
|
8391
8391
|
} else {
|
|
8392
|
-
const rawMessages = await this.
|
|
8392
|
+
const rawMessages = await this.loadMessagesFromStorage(
|
|
8393
8393
|
threadId,
|
|
8394
8394
|
resourceId,
|
|
8395
8395
|
record.lastObservedAt ? new Date(record.lastObservedAt) : void 0
|
|
@@ -8502,6 +8502,27 @@ ${grouped}` : grouped;
|
|
|
8502
8502
|
const record = await this.getOrCreateRecord(threadId, resourceId);
|
|
8503
8503
|
return this.getUnobservedMessages(messages, record);
|
|
8504
8504
|
}
|
|
8505
|
+
/**
|
|
8506
|
+
* Load unobserved messages from storage for a thread/resource.
|
|
8507
|
+
*
|
|
8508
|
+
* Fetches the OM record, queries storage for messages after the
|
|
8509
|
+
* lastObservedAt cursor, then applies part-level filtering so
|
|
8510
|
+
* partially-observed messages only include their unobserved parts.
|
|
8511
|
+
*
|
|
8512
|
+
* Use this when you need to load stored conversation history that
|
|
8513
|
+
* hasn't been observed yet (e.g. in a stateless gateway proxy that
|
|
8514
|
+
* only receives the latest message from the HTTP request).
|
|
8515
|
+
*/
|
|
8516
|
+
async loadUnobservedMessages(opts) {
|
|
8517
|
+
const { threadId, resourceId } = opts;
|
|
8518
|
+
const record = await this.getOrCreateRecord(threadId, resourceId);
|
|
8519
|
+
const rawMessages = await this.loadMessagesFromStorage(
|
|
8520
|
+
threadId,
|
|
8521
|
+
resourceId,
|
|
8522
|
+
record.lastObservedAt ? new Date(record.lastObservedAt) : void 0
|
|
8523
|
+
);
|
|
8524
|
+
return this.getUnobservedMessages(rawMessages, record);
|
|
8525
|
+
}
|
|
8505
8526
|
/**
|
|
8506
8527
|
* Create a buffered observation chunk without merging into active observations.
|
|
8507
8528
|
*
|
|
@@ -8563,7 +8584,7 @@ ${grouped}` : grouped;
|
|
|
8563
8584
|
if (opts.messages) {
|
|
8564
8585
|
candidateMessages = this.getUnobservedMessages(opts.messages, record, { excludeBuffered: true });
|
|
8565
8586
|
} else {
|
|
8566
|
-
const rawMessages = await this.
|
|
8587
|
+
const rawMessages = await this.loadMessagesFromStorage(
|
|
8567
8588
|
threadId,
|
|
8568
8589
|
resourceId,
|
|
8569
8590
|
record.lastObservedAt ? new Date(record.lastObservedAt) : void 0
|
|
@@ -8805,7 +8826,7 @@ ${grouped}` : grouped;
|
|
|
8805
8826
|
await this.withLock(lockKey, async () => {
|
|
8806
8827
|
const freshRecord = await this.getOrCreateRecord(threadId, resourceId);
|
|
8807
8828
|
generationBefore = freshRecord.generationCount;
|
|
8808
|
-
const unobservedMessages = messages ? this.getUnobservedMessages(messages, freshRecord) : await this.
|
|
8829
|
+
const unobservedMessages = messages ? this.getUnobservedMessages(messages, freshRecord) : await this.loadMessagesFromStorage(
|
|
8809
8830
|
threadId,
|
|
8810
8831
|
resourceId,
|
|
8811
8832
|
freshRecord.lastObservedAt ? new Date(freshRecord.lastObservedAt) : void 0
|
|
@@ -9459,5 +9480,5 @@ exports.stripEphemeralAnchorIds = stripEphemeralAnchorIds;
|
|
|
9459
9480
|
exports.stripObservationGroups = stripObservationGroups;
|
|
9460
9481
|
exports.truncateStringByTokens = truncateStringByTokens;
|
|
9461
9482
|
exports.wrapInObservationGroup = wrapInObservationGroup;
|
|
9462
|
-
//# sourceMappingURL=chunk-
|
|
9463
|
-
//# sourceMappingURL=chunk-
|
|
9483
|
+
//# sourceMappingURL=chunk-DNYJSPA5.cjs.map
|
|
9484
|
+
//# sourceMappingURL=chunk-DNYJSPA5.cjs.map
|