@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.
Files changed (164) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/dist/_types/@internal_core/dist/index.d.ts +12 -2
  3. package/dist/{chunk-NCCK5NVX.cjs → chunk-22YG2467.cjs} +3 -3
  4. package/dist/{chunk-NCCK5NVX.cjs.map → chunk-22YG2467.cjs.map} +1 -1
  5. package/dist/{chunk-3W54ZNYP.cjs → chunk-5IKQNFW5.cjs} +3 -3
  6. package/dist/{chunk-3W54ZNYP.cjs.map → chunk-5IKQNFW5.cjs.map} +1 -1
  7. package/dist/chunk-6MFKRF4K.cjs +176 -0
  8. package/dist/chunk-6MFKRF4K.cjs.map +1 -0
  9. package/dist/{chunk-G726SOOJ.cjs → chunk-7G44ZSFS.cjs} +3 -3
  10. package/dist/{chunk-G726SOOJ.cjs.map → chunk-7G44ZSFS.cjs.map} +1 -1
  11. package/dist/{chunk-TYYGY4H4.cjs → chunk-7HOYCW7S.cjs} +3 -3
  12. package/dist/{chunk-TYYGY4H4.cjs.map → chunk-7HOYCW7S.cjs.map} +1 -1
  13. package/dist/{chunk-MH2WUZWZ.js → chunk-7KJ4NUEH.js} +3 -3
  14. package/dist/{chunk-MH2WUZWZ.js.map → chunk-7KJ4NUEH.js.map} +1 -1
  15. package/dist/chunk-AJYJ4H7P.js +438 -0
  16. package/dist/chunk-AJYJ4H7P.js.map +1 -0
  17. package/dist/{chunk-ULLR3RN3.cjs → chunk-AYD7DM5U.cjs} +3 -3
  18. package/dist/{chunk-ULLR3RN3.cjs.map → chunk-AYD7DM5U.cjs.map} +1 -1
  19. package/dist/chunk-B6HNPO67.cjs +195 -0
  20. package/dist/chunk-B6HNPO67.cjs.map +1 -0
  21. package/dist/chunk-BQXQZPYZ.js +189 -0
  22. package/dist/chunk-BQXQZPYZ.js.map +1 -0
  23. package/dist/{chunk-DAEHQAZC.cjs → chunk-DNYJSPA5.cjs} +27 -6
  24. package/dist/chunk-DNYJSPA5.cjs.map +1 -0
  25. package/dist/{chunk-UE4FGLA3.cjs → chunk-DWXE75AZ.cjs} +38 -38
  26. package/dist/{chunk-UE4FGLA3.cjs.map → chunk-DWXE75AZ.cjs.map} +1 -1
  27. package/dist/chunk-FCCXLAOT.js +153 -0
  28. package/dist/chunk-FCCXLAOT.js.map +1 -0
  29. package/dist/{chunk-5CDCKTHB.js → chunk-FCLPA23B.js} +27 -6
  30. package/dist/chunk-FCLPA23B.js.map +1 -0
  31. package/dist/{chunk-XINNAPVH.cjs → chunk-FGXFUFWK.cjs} +29 -29
  32. package/dist/{chunk-XINNAPVH.cjs.map → chunk-FGXFUFWK.cjs.map} +1 -1
  33. package/dist/chunk-FURWD3DL.cjs +180 -0
  34. package/dist/chunk-FURWD3DL.cjs.map +1 -0
  35. package/dist/{chunk-23U24RPR.cjs → chunk-G5IQN5ZG.cjs} +3 -3
  36. package/dist/{chunk-23U24RPR.cjs.map → chunk-G5IQN5ZG.cjs.map} +1 -1
  37. package/dist/{chunk-UFK5THVP.cjs → chunk-GANMD6GP.cjs} +3 -3
  38. package/dist/{chunk-UFK5THVP.cjs.map → chunk-GANMD6GP.cjs.map} +1 -1
  39. package/dist/{chunk-OSMI5XLT.cjs → chunk-GLB2TK6A.cjs} +12 -7
  40. package/dist/chunk-GLB2TK6A.cjs.map +1 -0
  41. package/dist/chunk-GWPNQNXF.cjs +45 -0
  42. package/dist/chunk-GWPNQNXF.cjs.map +1 -0
  43. package/dist/chunk-IRRJW5EA.cjs +695 -0
  44. package/dist/chunk-IRRJW5EA.cjs.map +1 -0
  45. package/dist/{chunk-G2ZZKKQI.js → chunk-L7PDVJZD.js} +3 -3
  46. package/dist/{chunk-G2ZZKKQI.js.map → chunk-L7PDVJZD.js.map} +1 -1
  47. package/dist/{chunk-K6RNBFGH.js → chunk-M4BZ2B7D.js} +3 -3
  48. package/dist/{chunk-K6RNBFGH.js.map → chunk-M4BZ2B7D.js.map} +1 -1
  49. package/dist/{chunk-4D7KSU4X.js → chunk-MWRVCCZE.js} +3 -3
  50. package/dist/{chunk-4D7KSU4X.js.map → chunk-MWRVCCZE.js.map} +1 -1
  51. package/dist/chunk-NCW7IFFR.js +690 -0
  52. package/dist/chunk-NCW7IFFR.js.map +1 -0
  53. package/dist/{chunk-MKW43AJ3.js → chunk-NL7Y763D.js} +3 -3
  54. package/dist/{chunk-MKW43AJ3.js.map → chunk-NL7Y763D.js.map} +1 -1
  55. package/dist/{chunk-MYFV2L3T.js → chunk-OBR4SMSZ.js} +3 -3
  56. package/dist/{chunk-MYFV2L3T.js.map → chunk-OBR4SMSZ.js.map} +1 -1
  57. package/dist/chunk-OJ72T77G.cjs +452 -0
  58. package/dist/chunk-OJ72T77G.cjs.map +1 -0
  59. package/dist/{chunk-5YMAXL54.js → chunk-QSA443WV.js} +3 -3
  60. package/dist/{chunk-5YMAXL54.js.map → chunk-QSA443WV.js.map} +1 -1
  61. package/dist/{chunk-4NRXB7VI.js → chunk-SNGR4M5I.js} +3 -3
  62. package/dist/{chunk-4NRXB7VI.js.map → chunk-SNGR4M5I.js.map} +1 -1
  63. package/dist/{chunk-XDFOXO76.js → chunk-SW6IJZFQ.js} +9 -9
  64. package/dist/{chunk-XDFOXO76.js.map → chunk-SW6IJZFQ.js.map} +1 -1
  65. package/dist/{chunk-WPBRQTMO.js → chunk-VCA6BSYU.js} +3 -3
  66. package/dist/{chunk-WPBRQTMO.js.map → chunk-VCA6BSYU.js.map} +1 -1
  67. package/dist/{chunk-HHF4VF75.js → chunk-VHUB2TYN.js} +3 -3
  68. package/dist/{chunk-HHF4VF75.js.map → chunk-VHUB2TYN.js.map} +1 -1
  69. package/dist/chunk-VKIIGA2F.js +35 -0
  70. package/dist/chunk-VKIIGA2F.js.map +1 -0
  71. package/dist/{chunk-2QCTUEHS.cjs → chunk-VVWHCAF2.cjs} +3 -3
  72. package/dist/{chunk-2QCTUEHS.cjs.map → chunk-VVWHCAF2.cjs.map} +1 -1
  73. package/dist/{chunk-YFQ5JIUD.js → chunk-WO7BJJIB.js} +12 -7
  74. package/dist/chunk-WO7BJJIB.js.map +1 -0
  75. package/dist/{chunk-A5J2TY2W.cjs → chunk-XKKTZVZX.cjs} +3 -3
  76. package/dist/{chunk-A5J2TY2W.cjs.map → chunk-XKKTZVZX.cjs.map} +1 -1
  77. package/dist/chunk-ZA3NGM3L.js +174 -0
  78. package/dist/chunk-ZA3NGM3L.js.map +1 -0
  79. package/dist/docs/SKILL.md +1 -1
  80. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  81. package/dist/docs/references/reference-server-routes.md +22 -1
  82. package/dist/{observational-memory-B25SASRW-T76NSRNU.cjs → observational-memory-WOEVNCG4-5THJIIQE.cjs} +26 -26
  83. package/dist/{observational-memory-B25SASRW-T76NSRNU.cjs.map → observational-memory-WOEVNCG4-5THJIIQE.cjs.map} +1 -1
  84. package/dist/{observational-memory-B25SASRW-L4GYD2ZN.js → observational-memory-WOEVNCG4-DT36JHO2.js} +3 -3
  85. package/dist/{observational-memory-B25SASRW-L4GYD2ZN.js.map → observational-memory-WOEVNCG4-DT36JHO2.js.map} +1 -1
  86. package/dist/server/handlers/agent-builder.cjs +16 -16
  87. package/dist/server/handlers/agent-builder.js +1 -1
  88. package/dist/server/handlers/conversations.cjs +24 -0
  89. package/dist/server/handlers/conversations.cjs.map +1 -0
  90. package/dist/server/handlers/conversations.d.ts +153 -0
  91. package/dist/server/handlers/conversations.d.ts.map +1 -0
  92. package/dist/server/handlers/conversations.js +3 -0
  93. package/dist/server/handlers/conversations.js.map +1 -0
  94. package/dist/server/handlers/datasets.cjs +26 -26
  95. package/dist/server/handlers/datasets.js +1 -1
  96. package/dist/server/handlers/logs.cjs +4 -4
  97. package/dist/server/handlers/logs.js +1 -1
  98. package/dist/server/handlers/observability-new-endpoints.cjs +27 -27
  99. package/dist/server/handlers/observability-new-endpoints.d.ts +8 -0
  100. package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
  101. package/dist/server/handlers/observability-new-endpoints.js +1 -1
  102. package/dist/server/handlers/observability.cjs +32 -32
  103. package/dist/server/handlers/observability.js +2 -2
  104. package/dist/server/handlers/responses.adapter.cjs +60 -0
  105. package/dist/server/handlers/responses.adapter.cjs.map +1 -0
  106. package/dist/server/handlers/responses.adapter.d.ts +98 -0
  107. package/dist/server/handlers/responses.adapter.d.ts.map +1 -0
  108. package/dist/server/handlers/responses.adapter.js +3 -0
  109. package/dist/server/handlers/responses.adapter.js.map +1 -0
  110. package/dist/server/handlers/responses.cjs +20 -0
  111. package/dist/server/handlers/responses.cjs.map +1 -0
  112. package/dist/server/handlers/responses.d.ts +387 -0
  113. package/dist/server/handlers/responses.d.ts.map +1 -0
  114. package/dist/server/handlers/responses.js +3 -0
  115. package/dist/server/handlers/responses.js.map +1 -0
  116. package/dist/server/handlers/responses.storage.cjs +28 -0
  117. package/dist/server/handlers/responses.storage.cjs.map +1 -0
  118. package/dist/server/handlers/responses.storage.d.ts +97 -0
  119. package/dist/server/handlers/responses.storage.d.ts.map +1 -0
  120. package/dist/server/handlers/responses.storage.js +3 -0
  121. package/dist/server/handlers/responses.storage.js.map +1 -0
  122. package/dist/server/handlers/scores.cjs +7 -7
  123. package/dist/server/handlers/scores.js +1 -1
  124. package/dist/server/handlers/stored-agents.cjs +7 -7
  125. package/dist/server/handlers/stored-agents.js +1 -1
  126. package/dist/server/handlers/stored-mcp-clients.cjs +6 -6
  127. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  128. package/dist/server/handlers/stored-prompt-blocks.cjs +6 -6
  129. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  130. package/dist/server/handlers/stored-scorers.cjs +6 -6
  131. package/dist/server/handlers/stored-scorers.js +1 -1
  132. package/dist/server/handlers/tools.cjs +6 -6
  133. package/dist/server/handlers/tools.js +1 -1
  134. package/dist/server/handlers/workflows.cjs +24 -24
  135. package/dist/server/handlers/workflows.js +1 -1
  136. package/dist/server/handlers.cjs +28 -18
  137. package/dist/server/handlers.d.ts +2 -0
  138. package/dist/server/handlers.d.ts.map +1 -1
  139. package/dist/server/handlers.js +9 -7
  140. package/dist/server/schemas/conversations.d.ts +74 -0
  141. package/dist/server/schemas/conversations.d.ts.map +1 -0
  142. package/dist/server/schemas/index.cjs +185 -91
  143. package/dist/server/schemas/index.d.ts +2 -0
  144. package/dist/server/schemas/index.d.ts.map +1 -1
  145. package/dist/server/schemas/index.js +5 -3
  146. package/dist/server/schemas/responses.d.ts +341 -0
  147. package/dist/server/schemas/responses.d.ts.map +1 -0
  148. package/dist/server/server-adapter/index.cjs +153 -138
  149. package/dist/server/server-adapter/index.cjs.map +1 -1
  150. package/dist/server/server-adapter/index.js +30 -15
  151. package/dist/server/server-adapter/index.js.map +1 -1
  152. package/dist/server/server-adapter/routes/conversations.d.ts +150 -0
  153. package/dist/server/server-adapter/routes/conversations.d.ts.map +1 -0
  154. package/dist/server/server-adapter/routes/index.d.ts +4 -0
  155. package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
  156. package/dist/server/server-adapter/routes/observability.d.ts +4 -0
  157. package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
  158. package/dist/server/server-adapter/routes/responses.d.ts +385 -0
  159. package/dist/server/server-adapter/routes/responses.d.ts.map +1 -0
  160. package/package.json +4 -4
  161. package/dist/chunk-5CDCKTHB.js.map +0 -1
  162. package/dist/chunk-DAEHQAZC.cjs.map +0 -1
  163. package/dist/chunk-OSMI5XLT.cjs.map +0 -1
  164. 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 loadUnobservedMessages(threadId, resourceId, lastObservedAt) {
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.loadUnobservedMessages(
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.loadUnobservedMessages(
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.loadUnobservedMessages(
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-DAEHQAZC.cjs.map
9463
- //# sourceMappingURL=chunk-DAEHQAZC.cjs.map
9483
+ //# sourceMappingURL=chunk-DNYJSPA5.cjs.map
9484
+ //# sourceMappingURL=chunk-DNYJSPA5.cjs.map