@mastra/server 1.20.0 → 1.21.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/dist/{chunk-NCCK5NVX.cjs → chunk-22YG2467.cjs} +3 -3
  3. package/dist/{chunk-NCCK5NVX.cjs.map → chunk-22YG2467.cjs.map} +1 -1
  4. package/dist/chunk-3VVDBDS5.cjs +694 -0
  5. package/dist/chunk-3VVDBDS5.cjs.map +1 -0
  6. package/dist/{chunk-3W54ZNYP.cjs → chunk-5IKQNFW5.cjs} +3 -3
  7. package/dist/{chunk-3W54ZNYP.cjs.map → chunk-5IKQNFW5.cjs.map} +1 -1
  8. package/dist/chunk-6MFKRF4K.cjs +176 -0
  9. package/dist/chunk-6MFKRF4K.cjs.map +1 -0
  10. package/dist/{chunk-G726SOOJ.cjs → chunk-7G44ZSFS.cjs} +3 -3
  11. package/dist/{chunk-G726SOOJ.cjs.map → chunk-7G44ZSFS.cjs.map} +1 -1
  12. package/dist/{chunk-TYYGY4H4.cjs → chunk-7HOYCW7S.cjs} +3 -3
  13. package/dist/{chunk-TYYGY4H4.cjs.map → chunk-7HOYCW7S.cjs.map} +1 -1
  14. package/dist/{chunk-MH2WUZWZ.js → chunk-7KJ4NUEH.js} +3 -3
  15. package/dist/{chunk-MH2WUZWZ.js.map → chunk-7KJ4NUEH.js.map} +1 -1
  16. package/dist/chunk-AJYJ4H7P.js +438 -0
  17. package/dist/chunk-AJYJ4H7P.js.map +1 -0
  18. package/dist/{chunk-ULLR3RN3.cjs → chunk-AYD7DM5U.cjs} +3 -3
  19. package/dist/{chunk-ULLR3RN3.cjs.map → chunk-AYD7DM5U.cjs.map} +1 -1
  20. package/dist/chunk-B6HNPO67.cjs +195 -0
  21. package/dist/chunk-B6HNPO67.cjs.map +1 -0
  22. package/dist/chunk-BQXQZPYZ.js +189 -0
  23. package/dist/chunk-BQXQZPYZ.js.map +1 -0
  24. package/dist/{chunk-UE4FGLA3.cjs → chunk-EDP2Y6XD.cjs} +21 -21
  25. package/dist/{chunk-UE4FGLA3.cjs.map → chunk-EDP2Y6XD.cjs.map} +1 -1
  26. package/dist/chunk-FCCXLAOT.js +153 -0
  27. package/dist/chunk-FCCXLAOT.js.map +1 -0
  28. package/dist/chunk-FURWD3DL.cjs +180 -0
  29. package/dist/chunk-FURWD3DL.cjs.map +1 -0
  30. package/dist/{chunk-23U24RPR.cjs → chunk-G5IQN5ZG.cjs} +3 -3
  31. package/dist/{chunk-23U24RPR.cjs.map → chunk-G5IQN5ZG.cjs.map} +1 -1
  32. package/dist/{chunk-UFK5THVP.cjs → chunk-GANMD6GP.cjs} +3 -3
  33. package/dist/{chunk-UFK5THVP.cjs.map → chunk-GANMD6GP.cjs.map} +1 -1
  34. package/dist/chunk-GWPNQNXF.cjs +45 -0
  35. package/dist/chunk-GWPNQNXF.cjs.map +1 -0
  36. package/dist/{chunk-G2ZZKKQI.js → chunk-L7PDVJZD.js} +3 -3
  37. package/dist/{chunk-G2ZZKKQI.js.map → chunk-L7PDVJZD.js.map} +1 -1
  38. package/dist/{chunk-K6RNBFGH.js → chunk-M4BZ2B7D.js} +3 -3
  39. package/dist/{chunk-K6RNBFGH.js.map → chunk-M4BZ2B7D.js.map} +1 -1
  40. package/dist/{chunk-4D7KSU4X.js → chunk-MWRVCCZE.js} +3 -3
  41. package/dist/{chunk-4D7KSU4X.js.map → chunk-MWRVCCZE.js.map} +1 -1
  42. package/dist/{chunk-MKW43AJ3.js → chunk-NL7Y763D.js} +3 -3
  43. package/dist/{chunk-MKW43AJ3.js.map → chunk-NL7Y763D.js.map} +1 -1
  44. package/dist/{chunk-XDFOXO76.js → chunk-O7CC4J2Y.js} +6 -6
  45. package/dist/{chunk-XDFOXO76.js.map → chunk-O7CC4J2Y.js.map} +1 -1
  46. package/dist/chunk-OJ72T77G.cjs +452 -0
  47. package/dist/chunk-OJ72T77G.cjs.map +1 -0
  48. package/dist/{chunk-5YMAXL54.js → chunk-QSA443WV.js} +3 -3
  49. package/dist/{chunk-5YMAXL54.js.map → chunk-QSA443WV.js.map} +1 -1
  50. package/dist/{chunk-4NRXB7VI.js → chunk-SNGR4M5I.js} +3 -3
  51. package/dist/{chunk-4NRXB7VI.js.map → chunk-SNGR4M5I.js.map} +1 -1
  52. package/dist/{chunk-WPBRQTMO.js → chunk-VCA6BSYU.js} +3 -3
  53. package/dist/{chunk-WPBRQTMO.js.map → chunk-VCA6BSYU.js.map} +1 -1
  54. package/dist/chunk-VGHQI3X3.js +689 -0
  55. package/dist/chunk-VGHQI3X3.js.map +1 -0
  56. package/dist/{chunk-HHF4VF75.js → chunk-VHUB2TYN.js} +3 -3
  57. package/dist/{chunk-HHF4VF75.js.map → chunk-VHUB2TYN.js.map} +1 -1
  58. package/dist/chunk-VKIIGA2F.js +35 -0
  59. package/dist/chunk-VKIIGA2F.js.map +1 -0
  60. package/dist/{chunk-2QCTUEHS.cjs → chunk-VVWHCAF2.cjs} +3 -3
  61. package/dist/{chunk-2QCTUEHS.cjs.map → chunk-VVWHCAF2.cjs.map} +1 -1
  62. package/dist/{chunk-A5J2TY2W.cjs → chunk-XKKTZVZX.cjs} +3 -3
  63. package/dist/{chunk-A5J2TY2W.cjs.map → chunk-XKKTZVZX.cjs.map} +1 -1
  64. package/dist/chunk-ZA3NGM3L.js +174 -0
  65. package/dist/chunk-ZA3NGM3L.js.map +1 -0
  66. package/dist/docs/SKILL.md +1 -1
  67. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  68. package/dist/docs/references/reference-server-routes.md +22 -1
  69. package/dist/server/handlers/agent-builder.cjs +16 -16
  70. package/dist/server/handlers/agent-builder.js +1 -1
  71. package/dist/server/handlers/conversations.cjs +24 -0
  72. package/dist/server/handlers/conversations.cjs.map +1 -0
  73. package/dist/server/handlers/conversations.d.ts +153 -0
  74. package/dist/server/handlers/conversations.d.ts.map +1 -0
  75. package/dist/server/handlers/conversations.js +3 -0
  76. package/dist/server/handlers/conversations.js.map +1 -0
  77. package/dist/server/handlers/datasets.cjs +26 -26
  78. package/dist/server/handlers/datasets.js +1 -1
  79. package/dist/server/handlers/logs.cjs +4 -4
  80. package/dist/server/handlers/logs.js +1 -1
  81. package/dist/server/handlers/responses.adapter.cjs +60 -0
  82. package/dist/server/handlers/responses.adapter.cjs.map +1 -0
  83. package/dist/server/handlers/responses.adapter.d.ts +98 -0
  84. package/dist/server/handlers/responses.adapter.d.ts.map +1 -0
  85. package/dist/server/handlers/responses.adapter.js +3 -0
  86. package/dist/server/handlers/responses.adapter.js.map +1 -0
  87. package/dist/server/handlers/responses.cjs +20 -0
  88. package/dist/server/handlers/responses.cjs.map +1 -0
  89. package/dist/server/handlers/responses.d.ts +387 -0
  90. package/dist/server/handlers/responses.d.ts.map +1 -0
  91. package/dist/server/handlers/responses.js +3 -0
  92. package/dist/server/handlers/responses.js.map +1 -0
  93. package/dist/server/handlers/responses.storage.cjs +28 -0
  94. package/dist/server/handlers/responses.storage.cjs.map +1 -0
  95. package/dist/server/handlers/responses.storage.d.ts +97 -0
  96. package/dist/server/handlers/responses.storage.d.ts.map +1 -0
  97. package/dist/server/handlers/responses.storage.js +3 -0
  98. package/dist/server/handlers/responses.storage.js.map +1 -0
  99. package/dist/server/handlers/scores.cjs +7 -7
  100. package/dist/server/handlers/scores.js +1 -1
  101. package/dist/server/handlers/stored-agents.cjs +7 -7
  102. package/dist/server/handlers/stored-agents.js +1 -1
  103. package/dist/server/handlers/stored-mcp-clients.cjs +6 -6
  104. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  105. package/dist/server/handlers/stored-prompt-blocks.cjs +6 -6
  106. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  107. package/dist/server/handlers/stored-scorers.cjs +6 -6
  108. package/dist/server/handlers/stored-scorers.js +1 -1
  109. package/dist/server/handlers/tools.cjs +6 -6
  110. package/dist/server/handlers/tools.js +1 -1
  111. package/dist/server/handlers/workflows.cjs +24 -24
  112. package/dist/server/handlers/workflows.js +1 -1
  113. package/dist/server/handlers.cjs +26 -16
  114. package/dist/server/handlers.d.ts +2 -0
  115. package/dist/server/handlers.d.ts.map +1 -1
  116. package/dist/server/handlers.js +8 -6
  117. package/dist/server/schemas/conversations.d.ts +74 -0
  118. package/dist/server/schemas/conversations.d.ts.map +1 -0
  119. package/dist/server/schemas/index.cjs +185 -91
  120. package/dist/server/schemas/index.d.ts +2 -0
  121. package/dist/server/schemas/index.d.ts.map +1 -1
  122. package/dist/server/schemas/index.js +5 -3
  123. package/dist/server/schemas/responses.d.ts +341 -0
  124. package/dist/server/schemas/responses.d.ts.map +1 -0
  125. package/dist/server/server-adapter/index.cjs +123 -108
  126. package/dist/server/server-adapter/index.cjs.map +1 -1
  127. package/dist/server/server-adapter/index.js +29 -14
  128. package/dist/server/server-adapter/index.js.map +1 -1
  129. package/dist/server/server-adapter/routes/conversations.d.ts +150 -0
  130. package/dist/server/server-adapter/routes/conversations.d.ts.map +1 -0
  131. package/dist/server/server-adapter/routes/index.d.ts +4 -0
  132. package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
  133. package/dist/server/server-adapter/routes/responses.d.ts +385 -0
  134. package/dist/server/server-adapter/routes/responses.d.ts.map +1 -0
  135. package/package.json +5 -5
@@ -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"]}
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkR2ODPDKE_cjs = require('./chunk-R2ODPDKE.cjs');
4
3
  var chunk5N66PU3H_cjs = require('./chunk-5N66PU3H.cjs');
5
- var chunkEXKS4QPI_cjs = require('./chunk-EXKS4QPI.cjs');
6
4
  var chunkFPURK3UW_cjs = require('./chunk-FPURK3UW.cjs');
7
5
  var chunkDAEHQAZC_cjs = require('./chunk-DAEHQAZC.cjs');
8
- var chunk3W54ZNYP_cjs = require('./chunk-3W54ZNYP.cjs');
6
+ var chunkR2ODPDKE_cjs = require('./chunk-R2ODPDKE.cjs');
7
+ var chunk5IKQNFW5_cjs = require('./chunk-5IKQNFW5.cjs');
9
8
  var chunkDOHUOYZS_cjs = require('./chunk-DOHUOYZS.cjs');
10
9
  var chunkHITLRKIU_cjs = require('./chunk-HITLRKIU.cjs');
10
+ var chunkEXKS4QPI_cjs = require('./chunk-EXKS4QPI.cjs');
11
11
  var chunkVTPTMQFA_cjs = require('./chunk-VTPTMQFA.cjs');
12
12
  var chunkWC4OPIB4_cjs = require('./chunk-WC4OPIB4.cjs');
13
- var chunkEES2ZZGL_cjs = require('./chunk-EES2ZZGL.cjs');
14
13
  var chunkB34S64RC_cjs = require('./chunk-B34S64RC.cjs');
14
+ var chunkEES2ZZGL_cjs = require('./chunk-EES2ZZGL.cjs');
15
15
  var chunkEGSCXVMR_cjs = require('./chunk-EGSCXVMR.cjs');
16
16
  var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
17
17
  var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
@@ -29681,7 +29681,7 @@ var LIST_AGENT_BUILDER_ACTIONS_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29681
29681
  try {
29682
29682
  chunkWC4OPIB4_cjs.WorkflowRegistry.registerTemporaryWorkflows(agentBuilderWorkflows, mastra);
29683
29683
  logger.info("Listing agent builder actions");
29684
- return await chunk3W54ZNYP_cjs.LIST_WORKFLOWS_ROUTE.handler(ctx);
29684
+ return await chunk5IKQNFW5_cjs.LIST_WORKFLOWS_ROUTE.handler(ctx);
29685
29685
  } catch (error) {
29686
29686
  logger.error("Error listing agent builder actions", { error });
29687
29687
  return chunkB34S64RC_cjs.handleError(error, "Error getting agent builder workflows");
@@ -29711,7 +29711,7 @@ var GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29711
29711
  });
29712
29712
  }
29713
29713
  logger.info("Getting agent builder action by ID", { actionId });
29714
- return await chunk3W54ZNYP_cjs.GET_WORKFLOW_BY_ID_ROUTE.handler({ ...ctx, workflowId: actionId });
29714
+ return await chunk5IKQNFW5_cjs.GET_WORKFLOW_BY_ID_ROUTE.handler({ ...ctx, workflowId: actionId });
29715
29715
  } catch (error) {
29716
29716
  logger.error("Error getting agent builder action by ID", { error, actionId });
29717
29717
  return chunkB34S64RC_cjs.handleError(error, "Error getting agent builder action");
@@ -29740,7 +29740,7 @@ var LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29740
29740
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29741
29741
  }
29742
29742
  logger.info("Listing agent builder action runs", { actionId });
29743
- return await chunk3W54ZNYP_cjs.LIST_WORKFLOW_RUNS_ROUTE.handler({
29743
+ return await chunk5IKQNFW5_cjs.LIST_WORKFLOW_RUNS_ROUTE.handler({
29744
29744
  ...ctx,
29745
29745
  workflowId: actionId
29746
29746
  });
@@ -29772,7 +29772,7 @@ var GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29772
29772
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29773
29773
  }
29774
29774
  logger.info("Getting agent builder action run by ID", { actionId, runId });
29775
- return await chunk3W54ZNYP_cjs.GET_WORKFLOW_RUN_BY_ID_ROUTE.handler({
29775
+ return await chunk5IKQNFW5_cjs.GET_WORKFLOW_RUN_BY_ID_ROUTE.handler({
29776
29776
  ...ctx,
29777
29777
  workflowId: actionId
29778
29778
  });
@@ -29804,7 +29804,7 @@ var CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29804
29804
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29805
29805
  }
29806
29806
  logger.info("Creating agent builder action run", { actionId, runId });
29807
- return await chunk3W54ZNYP_cjs.CREATE_WORKFLOW_RUN_ROUTE.handler({
29807
+ return await chunk5IKQNFW5_cjs.CREATE_WORKFLOW_RUN_ROUTE.handler({
29808
29808
  ...ctx,
29809
29809
  workflowId: actionId
29810
29810
  });
@@ -29837,7 +29837,7 @@ var STREAM_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29837
29837
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29838
29838
  }
29839
29839
  logger.info("Streaming agent builder action", { actionId, runId });
29840
- return await chunk3W54ZNYP_cjs.STREAM_WORKFLOW_ROUTE.handler({
29840
+ return await chunk5IKQNFW5_cjs.STREAM_WORKFLOW_ROUTE.handler({
29841
29841
  ...ctx,
29842
29842
  workflowId: actionId,
29843
29843
  requestContext
@@ -29871,7 +29871,7 @@ var START_ASYNC_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29871
29871
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29872
29872
  }
29873
29873
  logger.info("Starting agent builder action asynchronously", { actionId, runId });
29874
- return await chunk3W54ZNYP_cjs.START_ASYNC_WORKFLOW_ROUTE.handler({
29874
+ return await chunk5IKQNFW5_cjs.START_ASYNC_WORKFLOW_ROUTE.handler({
29875
29875
  ...ctx,
29876
29876
  workflowId: actionId,
29877
29877
  requestContext
@@ -29905,7 +29905,7 @@ var START_AGENT_BUILDER_ACTION_RUN_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29905
29905
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29906
29906
  }
29907
29907
  logger.info("Starting specific agent builder action run", { actionId, runId });
29908
- return await chunk3W54ZNYP_cjs.START_WORKFLOW_RUN_ROUTE.handler({
29908
+ return await chunk5IKQNFW5_cjs.START_WORKFLOW_RUN_ROUTE.handler({
29909
29909
  ...ctx,
29910
29910
  workflowId: actionId,
29911
29911
  requestContext
@@ -29938,7 +29938,7 @@ var OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29938
29938
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29939
29939
  }
29940
29940
  logger.info("Observing agent builder action stream", { actionId, runId });
29941
- return await chunk3W54ZNYP_cjs.OBSERVE_STREAM_WORKFLOW_ROUTE.handler({
29941
+ return await chunk5IKQNFW5_cjs.OBSERVE_STREAM_WORKFLOW_ROUTE.handler({
29942
29942
  ...ctx,
29943
29943
  workflowId: actionId
29944
29944
  });
@@ -29971,7 +29971,7 @@ var RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
29971
29971
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
29972
29972
  }
29973
29973
  logger.info("Resuming agent builder action asynchronously", { actionId, runId, step });
29974
- return await chunk3W54ZNYP_cjs.RESUME_ASYNC_WORKFLOW_ROUTE.handler({
29974
+ return await chunk5IKQNFW5_cjs.RESUME_ASYNC_WORKFLOW_ROUTE.handler({
29975
29975
  ...ctx,
29976
29976
  workflowId: actionId,
29977
29977
  requestContext
@@ -30005,7 +30005,7 @@ var RESUME_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
30005
30005
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
30006
30006
  }
30007
30007
  logger.info("Resuming agent builder action", { actionId, runId, step });
30008
- return await chunk3W54ZNYP_cjs.RESUME_WORKFLOW_ROUTE.handler({
30008
+ return await chunk5IKQNFW5_cjs.RESUME_WORKFLOW_ROUTE.handler({
30009
30009
  ...ctx,
30010
30010
  workflowId: actionId,
30011
30011
  requestContext
@@ -30039,7 +30039,7 @@ var RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
30039
30039
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
30040
30040
  }
30041
30041
  logger.info("Resuming agent builder action stream", { actionId, runId, step });
30042
- return await chunk3W54ZNYP_cjs.RESUME_STREAM_WORKFLOW_ROUTE.handler({
30042
+ return await chunk5IKQNFW5_cjs.RESUME_STREAM_WORKFLOW_ROUTE.handler({
30043
30043
  ...ctx,
30044
30044
  workflowId: actionId,
30045
30045
  requestContext
@@ -30071,7 +30071,7 @@ var CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE = chunkEGSCXVMR_cjs.createRoute({
30071
30071
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
30072
30072
  }
30073
30073
  logger.info("Cancelling agent builder action run", { actionId, runId });
30074
- return await chunk3W54ZNYP_cjs.CANCEL_WORKFLOW_RUN_ROUTE.handler({
30074
+ return await chunk5IKQNFW5_cjs.CANCEL_WORKFLOW_RUN_ROUTE.handler({
30075
30075
  ...ctx,
30076
30076
  workflowId: actionId
30077
30077
  });
@@ -30104,7 +30104,7 @@ var STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createRoute({
30104
30104
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
30105
30105
  }
30106
30106
  logger.info("Streaming agent builder action (legacy)", { actionId, runId });
30107
- return await chunk3W54ZNYP_cjs.STREAM_LEGACY_WORKFLOW_ROUTE.handler({
30107
+ return await chunk5IKQNFW5_cjs.STREAM_LEGACY_WORKFLOW_ROUTE.handler({
30108
30108
  ...ctx,
30109
30109
  workflowId: actionId,
30110
30110
  requestContext
@@ -30137,7 +30137,7 @@ var OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE = chunkEGSCXVMR_cjs.createR
30137
30137
  throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Invalid agent-builder action: ${actionId}` });
30138
30138
  }
30139
30139
  logger.info("Observing agent builder action stream (legacy)", { actionId, runId });
30140
- return await chunk3W54ZNYP_cjs.OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE.handler({
30140
+ return await chunk5IKQNFW5_cjs.OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE.handler({
30141
30141
  ...ctx,
30142
30142
  workflowId: actionId
30143
30143
  });
@@ -30166,5 +30166,5 @@ exports.START_ASYNC_AGENT_BUILDER_ACTION_ROUTE = START_ASYNC_AGENT_BUILDER_ACTIO
30166
30166
  exports.STREAM_AGENT_BUILDER_ACTION_ROUTE = STREAM_AGENT_BUILDER_ACTION_ROUTE;
30167
30167
  exports.STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE = STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE;
30168
30168
  exports.agent_builder_exports = agent_builder_exports;
30169
- //# sourceMappingURL=chunk-UE4FGLA3.cjs.map
30170
- //# sourceMappingURL=chunk-UE4FGLA3.cjs.map
30169
+ //# sourceMappingURL=chunk-EDP2Y6XD.cjs.map
30170
+ //# sourceMappingURL=chunk-EDP2Y6XD.cjs.map