@mastra/server 1.75.0 → 1.76.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 (235) hide show
  1. package/dist/_types/@internal_voice/dist/routes/index.d.ts +15 -0
  2. package/dist/{agent-builder-BlD120ac.js → agent-builder-B8kc4OBs.js} +2 -2
  3. package/dist/{agent-builder-BlD120ac.js.map → agent-builder-B8kc4OBs.js.map} +1 -1
  4. package/dist/{agent-builder-CvwtAD7k.cjs → agent-builder-DDYdQvlQ.cjs} +2 -2
  5. package/dist/{agent-builder-CvwtAD7k.cjs.map → agent-builder-DDYdQvlQ.cjs.map} +1 -1
  6. package/dist/{agent-versions-CivkX9fT.cjs → agent-versions-CzXJWn1T.cjs} +3 -3
  7. package/dist/{agent-versions-CivkX9fT.cjs.map → agent-versions-CzXJWn1T.cjs.map} +1 -1
  8. package/dist/{agent-versions-oCebJ7rc.js → agent-versions-W600H1ME.js} +3 -3
  9. package/dist/{agent-versions-oCebJ7rc.js.map → agent-versions-W600H1ME.js.map} +1 -1
  10. package/dist/{agents-COAEoXsc.cjs → agents-CKSEPpk1.cjs} +3 -3
  11. package/dist/{agents-COAEoXsc.cjs.map → agents-CKSEPpk1.cjs.map} +1 -1
  12. package/dist/{agents-BuKPiseS.js → agents-CW_JJZOf.js} +3 -3
  13. package/dist/{agents-BuKPiseS.js.map → agents-CW_JJZOf.js.map} +1 -1
  14. package/dist/{api-schema-manifest-D_esmkjG.cjs → api-schema-manifest-BzyUr2nd.cjs} +2 -2
  15. package/dist/{api-schema-manifest-D_esmkjG.cjs.map → api-schema-manifest-BzyUr2nd.cjs.map} +1 -1
  16. package/dist/{api-schema-manifest-I5zotQbd.js → api-schema-manifest-DktVob9z.js} +2 -2
  17. package/dist/{api-schema-manifest-I5zotQbd.js.map → api-schema-manifest-DktVob9z.js.map} +1 -1
  18. package/dist/{background-tasks-DJ9Qd7tc.cjs → background-tasks-CIp3Ltam.cjs} +2 -2
  19. package/dist/{background-tasks-DJ9Qd7tc.cjs.map → background-tasks-CIp3Ltam.cjs.map} +1 -1
  20. package/dist/{background-tasks-DcyjA57t.js → background-tasks-DgskLon8.js} +2 -2
  21. package/dist/{background-tasks-DcyjA57t.js.map → background-tasks-DgskLon8.js.map} +1 -1
  22. package/dist/{common-BkgcoK-2.cjs → common-DhKNoXGp.cjs} +2 -1
  23. package/dist/common-DhKNoXGp.cjs.map +1 -0
  24. package/dist/{common-tSamNYpt.js → common-Y30XtCyr.js} +2 -1
  25. package/dist/common-Y30XtCyr.js.map +1 -0
  26. package/dist/{conversations-DX7ATgEB.cjs → conversations-Bj5TLNqF.cjs} +2 -2
  27. package/dist/{conversations-DX7ATgEB.cjs.map → conversations-Bj5TLNqF.cjs.map} +1 -1
  28. package/dist/{conversations-U3fod5tw.js → conversations-BzBHVFYe.js} +2 -2
  29. package/dist/{conversations-U3fod5tw.js.map → conversations-BzBHVFYe.js.map} +1 -1
  30. package/dist/{datasets-Bz7SKu-q.cjs → datasets-C2aXB8At.cjs} +2 -2
  31. package/dist/{datasets-Bz7SKu-q.cjs.map → datasets-C2aXB8At.cjs.map} +1 -1
  32. package/dist/{datasets-CgNMo16l.js → datasets-CDQDQxos.js} +2 -2
  33. package/dist/{datasets-CgNMo16l.js.map → datasets-CDQDQxos.js.map} +1 -1
  34. package/dist/{dist-DpUNsgQx.cjs → dist-Ce_1oIl2.cjs} +105 -15
  35. package/dist/{dist-DpUNsgQx.cjs.map → dist-Ce_1oIl2.cjs.map} +1 -1
  36. package/dist/{dist-DMtuYRLk.js → dist-CtNeEn6M.js} +105 -15
  37. package/dist/{dist-DMtuYRLk.js.map → dist-CtNeEn6M.js.map} +1 -1
  38. package/dist/docs/SKILL.md +1 -1
  39. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  40. package/dist/docs/references/reference-observability-tracing-trace-query.md +46 -20
  41. package/dist/{editor-builder-DJl5x_Kj.cjs → editor-builder-BtcTQbAC.cjs} +2 -2
  42. package/dist/{editor-builder-DJl5x_Kj.cjs.map → editor-builder-BtcTQbAC.cjs.map} +1 -1
  43. package/dist/{editor-builder-CdLGv1Ka.js → editor-builder-CYkaYf6-.js} +2 -2
  44. package/dist/{editor-builder-CdLGv1Ka.js.map → editor-builder-CYkaYf6-.js.map} +1 -1
  45. package/dist/{editor-builder-DRlsFCN0.cjs → editor-builder-CmUsqdZq.cjs} +2 -2
  46. package/dist/{editor-builder-DRlsFCN0.cjs.map → editor-builder-CmUsqdZq.cjs.map} +1 -1
  47. package/dist/{editor-builder-DU3y5Ant.js → editor-builder-DHXbVwxu.js} +2 -2
  48. package/dist/{editor-builder-DU3y5Ant.js.map → editor-builder-DHXbVwxu.js.map} +1 -1
  49. package/dist/{logs-B2Nd15Oe.js → logs-Bd_xpsYw.js} +2 -2
  50. package/dist/{logs-B2Nd15Oe.js.map → logs-Bd_xpsYw.js.map} +1 -1
  51. package/dist/{logs-B0037Tlj.cjs → logs-CY8AGOCO.cjs} +2 -2
  52. package/dist/{logs-B0037Tlj.cjs.map → logs-CY8AGOCO.cjs.map} +1 -1
  53. package/dist/{mcp-BK6cmwww.js → mcp-DzpwLXEY.js} +2 -2
  54. package/dist/{mcp-BK6cmwww.js.map → mcp-DzpwLXEY.js.map} +1 -1
  55. package/dist/{mcp-Jus386Vq.cjs → mcp-ShaKO7gA.cjs} +2 -2
  56. package/dist/{mcp-Jus386Vq.cjs.map → mcp-ShaKO7gA.cjs.map} +1 -1
  57. package/dist/{mcp-client-versions-Zkez3ruO.cjs → mcp-client-versions-Cq97zXiK.cjs} +2 -2
  58. package/dist/{mcp-client-versions-Zkez3ruO.cjs.map → mcp-client-versions-Cq97zXiK.cjs.map} +1 -1
  59. package/dist/{mcp-client-versions-Df5bgWm1.js → mcp-client-versions-DxBkzcYH.js} +2 -2
  60. package/dist/{mcp-client-versions-Df5bgWm1.js.map → mcp-client-versions-DxBkzcYH.js.map} +1 -1
  61. package/dist/{memory-BxApjlTN.js → memory-B58Q2LgU.js} +20 -3
  62. package/dist/{memory-BxApjlTN.js.map → memory-B58Q2LgU.js.map} +1 -1
  63. package/dist/{memory-C3j3i6iS.cjs → memory-CizEIbl1.cjs} +20 -3
  64. package/dist/memory-CizEIbl1.cjs.map +1 -0
  65. package/dist/{prompt-block-versions-D9IPtjxs.cjs → prompt-block-versions-Cl3Lh4H-.cjs} +2 -2
  66. package/dist/{prompt-block-versions-D9IPtjxs.cjs.map → prompt-block-versions-Cl3Lh4H-.cjs.map} +1 -1
  67. package/dist/{prompt-block-versions-D3Ds9pXt.js → prompt-block-versions-cfq_e1Zi.js} +2 -2
  68. package/dist/{prompt-block-versions-D3Ds9pXt.js.map → prompt-block-versions-cfq_e1Zi.js.map} +1 -1
  69. package/dist/{routes-CjpyDJjY.cjs → routes-BHFCAczU.cjs} +4 -4
  70. package/dist/{routes-CjpyDJjY.cjs.map → routes-BHFCAczU.cjs.map} +1 -1
  71. package/dist/{routes-BKUF5ZHA.cjs → routes-BULZI-PU.cjs} +8 -4
  72. package/dist/routes-BULZI-PU.cjs.map +1 -0
  73. package/dist/{routes-CdEBhq8U.js → routes-DVec5dwl.js} +4 -4
  74. package/dist/{routes-CdEBhq8U.js.map → routes-DVec5dwl.js.map} +1 -1
  75. package/dist/{routes-zHhMx-9S.js → routes-Dl6_kWm7.js} +8 -4
  76. package/dist/routes-Dl6_kWm7.js.map +1 -0
  77. package/dist/{scorer-versions-DGLHODqM.js → scorer-versions-CX8RM9a6.js} +3 -3
  78. package/dist/{scorer-versions-DGLHODqM.js.map → scorer-versions-CX8RM9a6.js.map} +1 -1
  79. package/dist/{scorer-versions-B8q9-oF2.cjs → scorer-versions-DeCS12ym.cjs} +3 -3
  80. package/dist/{scorer-versions-B8q9-oF2.cjs.map → scorer-versions-DeCS12ym.cjs.map} +1 -1
  81. package/dist/{scores-BQ9vlUSU.js → scores-BbqFfKcy.js} +2 -2
  82. package/dist/{scores-BQ9vlUSU.js.map → scores-BbqFfKcy.js.map} +1 -1
  83. package/dist/{scores-COSdG-wz.cjs → scores-CetVKM4g.cjs} +2 -2
  84. package/dist/{scores-COSdG-wz.cjs.map → scores-CetVKM4g.cjs.map} +1 -1
  85. package/dist/server/handlers/agent-builder.cjs +5 -5
  86. package/dist/server/handlers/agent-builder.d.ts +16 -0
  87. package/dist/server/handlers/agent-builder.d.ts.map +1 -1
  88. package/dist/server/handlers/agent-builder.js +5 -5
  89. package/dist/server/handlers/agent-controller.cjs +1 -1
  90. package/dist/server/handlers/agent-controller.js +1 -1
  91. package/dist/server/handlers/agent-versions.cjs +2 -2
  92. package/dist/server/handlers/agent-versions.js +2 -2
  93. package/dist/server/handlers/agents.cjs +2 -2
  94. package/dist/server/handlers/agents.d.ts +30 -0
  95. package/dist/server/handlers/agents.d.ts.map +1 -1
  96. package/dist/server/handlers/agents.js +2 -2
  97. package/dist/server/handlers/background-tasks.cjs +1 -1
  98. package/dist/server/handlers/background-tasks.js +1 -1
  99. package/dist/server/handlers/conversations.cjs +2 -1
  100. package/dist/server/handlers/conversations.cjs.map +1 -1
  101. package/dist/server/handlers/conversations.d.ts.map +1 -1
  102. package/dist/server/handlers/conversations.js +3 -2
  103. package/dist/server/handlers/conversations.js.map +1 -1
  104. package/dist/server/handlers/datasets.cjs +2 -2
  105. package/dist/server/handlers/datasets.js +2 -2
  106. package/dist/server/handlers/editor-builder.cjs +1 -1
  107. package/dist/server/handlers/editor-builder.js +1 -1
  108. package/dist/server/handlers/favorites-enrichment.cjs +1 -1
  109. package/dist/server/handlers/favorites-enrichment.js +1 -1
  110. package/dist/server/handlers/logs.cjs +2 -2
  111. package/dist/server/handlers/logs.js +2 -2
  112. package/dist/server/handlers/mcp-client-versions.cjs +1 -1
  113. package/dist/server/handlers/mcp-client-versions.js +1 -1
  114. package/dist/server/handlers/mcp.cjs +1 -1
  115. package/dist/server/handlers/mcp.js +1 -1
  116. package/dist/server/handlers/memory.cjs +43 -15
  117. package/dist/server/handlers/memory.cjs.map +1 -1
  118. package/dist/server/handlers/memory.d.ts +5 -0
  119. package/dist/server/handlers/memory.d.ts.map +1 -1
  120. package/dist/server/handlers/memory.js +43 -15
  121. package/dist/server/handlers/memory.js.map +1 -1
  122. package/dist/server/handlers/observability-new-endpoints.d.ts +3 -1
  123. package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
  124. package/dist/server/handlers/plans.cjs +1 -1
  125. package/dist/server/handlers/plans.js +1 -1
  126. package/dist/server/handlers/prompt-block-versions.cjs +1 -1
  127. package/dist/server/handlers/prompt-block-versions.js +1 -1
  128. package/dist/server/handlers/scorer-versions.cjs +1 -1
  129. package/dist/server/handlers/scorer-versions.js +1 -1
  130. package/dist/server/handlers/scores.cjs +2 -2
  131. package/dist/server/handlers/scores.js +2 -2
  132. package/dist/server/handlers/stored-agent-favorites.cjs +2 -2
  133. package/dist/server/handlers/stored-agent-favorites.js +2 -2
  134. package/dist/server/handlers/stored-agents.cjs +3 -3
  135. package/dist/server/handlers/stored-agents.js +3 -3
  136. package/dist/server/handlers/stored-mcp-clients.cjs +2 -2
  137. package/dist/server/handlers/stored-mcp-clients.js +2 -2
  138. package/dist/server/handlers/stored-prompt-blocks.cjs +2 -2
  139. package/dist/server/handlers/stored-prompt-blocks.js +2 -2
  140. package/dist/server/handlers/stored-scorers.cjs +2 -2
  141. package/dist/server/handlers/stored-scorers.js +2 -2
  142. package/dist/server/handlers/stored-skill-favorites.cjs +2 -2
  143. package/dist/server/handlers/stored-skill-favorites.js +2 -2
  144. package/dist/server/handlers/stored-skills.cjs +2 -2
  145. package/dist/server/handlers/stored-skills.js +2 -2
  146. package/dist/server/handlers/stored-workspaces.cjs +1 -1
  147. package/dist/server/handlers/stored-workspaces.js +1 -1
  148. package/dist/server/handlers/system.cjs +1 -1
  149. package/dist/server/handlers/system.js +1 -1
  150. package/dist/server/handlers/tools.cjs +2 -2
  151. package/dist/server/handlers/tools.js +2 -2
  152. package/dist/server/handlers/vector.cjs +1 -1
  153. package/dist/server/handlers/vector.js +1 -1
  154. package/dist/server/handlers/voice.cjs +1 -1
  155. package/dist/server/handlers/voice.js +1 -1
  156. package/dist/server/handlers/workflow-builder.cjs +1 -1
  157. package/dist/server/handlers/workflow-builder.d.ts +2 -0
  158. package/dist/server/handlers/workflow-builder.d.ts.map +1 -1
  159. package/dist/server/handlers/workflow-builder.js +1 -1
  160. package/dist/server/handlers/workflows.cjs +3 -3
  161. package/dist/server/handlers/workflows.d.ts +26 -0
  162. package/dist/server/handlers/workflows.d.ts.map +1 -1
  163. package/dist/server/handlers/workflows.js +3 -3
  164. package/dist/server/schemas/agent-builder.d.ts +4 -0
  165. package/dist/server/schemas/agent-builder.d.ts.map +1 -1
  166. package/dist/server/schemas/agents.d.ts +8 -0
  167. package/dist/server/schemas/agents.d.ts.map +1 -1
  168. package/dist/server/schemas/common.d.ts +1 -0
  169. package/dist/server/schemas/common.d.ts.map +1 -1
  170. package/dist/server/schemas/index.cjs +24 -24
  171. package/dist/server/schemas/index.js +24 -24
  172. package/dist/server/schemas/memory.d.ts +4 -3
  173. package/dist/server/schemas/memory.d.ts.map +1 -1
  174. package/dist/server/schemas/workflows.d.ts +6 -0
  175. package/dist/server/schemas/workflows.d.ts.map +1 -1
  176. package/dist/server/server-adapter/index.cjs +1 -1
  177. package/dist/server/server-adapter/index.js +1 -1
  178. package/dist/server/server-adapter/routes/agent-builder.d.ts +16 -0
  179. package/dist/server/server-adapter/routes/agent-builder.d.ts.map +1 -1
  180. package/dist/server/server-adapter/routes/editor-builder.d.ts +2 -0
  181. package/dist/server/server-adapter/routes/editor-builder.d.ts.map +1 -1
  182. package/dist/server/server-adapter/routes/legacy.d.ts +6 -0
  183. package/dist/server/server-adapter/routes/legacy.d.ts.map +1 -1
  184. package/dist/server/server-adapter/routes/memory.d.ts +5 -0
  185. package/dist/server/server-adapter/routes/memory.d.ts.map +1 -1
  186. package/dist/server/server-adapter/routes/observability.d.ts +3 -1
  187. package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
  188. package/dist/server/server-adapter/routes/workflows.d.ts +24 -0
  189. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  190. package/dist/{stored-agents-DpY3ssfx.cjs → stored-agents-BTL-o6aM.cjs} +3 -3
  191. package/dist/{stored-agents-DpY3ssfx.cjs.map → stored-agents-BTL-o6aM.cjs.map} +1 -1
  192. package/dist/{stored-agents-BzIvRgtz.js → stored-agents-BtaEzKfr.js} +3 -3
  193. package/dist/{stored-agents-BzIvRgtz.js.map → stored-agents-BtaEzKfr.js.map} +1 -1
  194. package/dist/{stored-mcp-clients-Sb1QjyP-.cjs → stored-mcp-clients-D7bNkmTM.cjs} +2 -2
  195. package/dist/{stored-mcp-clients-Sb1QjyP-.cjs.map → stored-mcp-clients-D7bNkmTM.cjs.map} +1 -1
  196. package/dist/{stored-mcp-clients-BRa_eINm.js → stored-mcp-clients-DMR6NvCp.js} +2 -2
  197. package/dist/{stored-mcp-clients-BRa_eINm.js.map → stored-mcp-clients-DMR6NvCp.js.map} +1 -1
  198. package/dist/{stored-prompt-blocks-CNvL1cde.cjs → stored-prompt-blocks-BjHxMCuC.cjs} +2 -2
  199. package/dist/{stored-prompt-blocks-CNvL1cde.cjs.map → stored-prompt-blocks-BjHxMCuC.cjs.map} +1 -1
  200. package/dist/{stored-prompt-blocks-C0cMS4_F.js → stored-prompt-blocks-C7qmiWSB.js} +2 -2
  201. package/dist/{stored-prompt-blocks-C0cMS4_F.js.map → stored-prompt-blocks-C7qmiWSB.js.map} +1 -1
  202. package/dist/{stored-scorers-CAt8hFj2.js → stored-scorers-BSxh7JZX.js} +3 -3
  203. package/dist/{stored-scorers-CAt8hFj2.js.map → stored-scorers-BSxh7JZX.js.map} +1 -1
  204. package/dist/{stored-scorers-DyeqU2Rj.cjs → stored-scorers-I8L1-bAI.cjs} +3 -3
  205. package/dist/{stored-scorers-DyeqU2Rj.cjs.map → stored-scorers-I8L1-bAI.cjs.map} +1 -1
  206. package/dist/{stored-skills-DizSy0Pb.cjs → stored-skills-C1e8kf2k.cjs} +2 -2
  207. package/dist/{stored-skills-DizSy0Pb.cjs.map → stored-skills-C1e8kf2k.cjs.map} +1 -1
  208. package/dist/{stored-skills-BSwEeGJ9.js → stored-skills-DzW8hLnI.js} +2 -2
  209. package/dist/{stored-skills-BSwEeGJ9.js.map → stored-skills-DzW8hLnI.js.map} +1 -1
  210. package/dist/{stored-workspaces-egfwpAQ-.js → stored-workspaces-AkC68rSw.js} +2 -2
  211. package/dist/{stored-workspaces-egfwpAQ-.js.map → stored-workspaces-AkC68rSw.js.map} +1 -1
  212. package/dist/{stored-workspaces-CAWowZ9Q.cjs → stored-workspaces-DSfChCJ0.cjs} +2 -2
  213. package/dist/{stored-workspaces-CAWowZ9Q.cjs.map → stored-workspaces-DSfChCJ0.cjs.map} +1 -1
  214. package/dist/{vectors-CwJAkyIh.js → vectors-CJtupgIF.js} +2 -2
  215. package/dist/{vectors-CwJAkyIh.js.map → vectors-CJtupgIF.js.map} +1 -1
  216. package/dist/{vectors-D7DfmbS1.cjs → vectors-LFI1jch0.cjs} +2 -2
  217. package/dist/{vectors-D7DfmbS1.cjs.map → vectors-LFI1jch0.cjs.map} +1 -1
  218. package/dist/{version-common-Co-USxDX.js → version-common-4xFzvCS5.js} +2 -2
  219. package/dist/{version-common-Co-USxDX.js.map → version-common-4xFzvCS5.js.map} +1 -1
  220. package/dist/{version-common-Bu42Y2QN.cjs → version-common-DrzXq7Ct.cjs} +2 -2
  221. package/dist/{version-common-Bu42Y2QN.cjs.map → version-common-DrzXq7Ct.cjs.map} +1 -1
  222. package/dist/{workflow-builder-DxQMzsT9.js → workflow-builder-D2DgSt6L.js} +3 -3
  223. package/dist/{workflow-builder-DxQMzsT9.js.map → workflow-builder-D2DgSt6L.js.map} +1 -1
  224. package/dist/{workflow-builder-DYfgyaeB.cjs → workflow-builder-pBSrWWIp.cjs} +3 -3
  225. package/dist/{workflow-builder-DYfgyaeB.cjs.map → workflow-builder-pBSrWWIp.cjs.map} +1 -1
  226. package/dist/{workflows-BdoErlkd.cjs → workflows-C8rDpHyY.cjs} +2 -2
  227. package/dist/{workflows-BdoErlkd.cjs.map → workflows-C8rDpHyY.cjs.map} +1 -1
  228. package/dist/{workflows-BEdLrZQZ.js → workflows-Dcx4Ib0t.js} +2 -2
  229. package/dist/{workflows-BEdLrZQZ.js.map → workflows-Dcx4Ib0t.js.map} +1 -1
  230. package/package.json +5 -5
  231. package/dist/common-BkgcoK-2.cjs.map +0 -1
  232. package/dist/common-tSamNYpt.js.map +0 -1
  233. package/dist/memory-C3j3i6iS.cjs.map +0 -1
  234. package/dist/routes-BKUF5ZHA.cjs.map +0 -1
  235. package/dist/routes-zHhMx-9S.js.map +0 -1
@@ -5,7 +5,7 @@ const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
6
  const require_utils = require("../../utils-HqDZJwRc.cjs");
7
7
  const require_server_handlers_agents = require("./agents.cjs");
8
- const require_conversations = require("../../conversations-DX7ATgEB.cjs");
8
+ const require_conversations = require("../../conversations-Bj5TLNqF.cjs");
9
9
  const require_server_handlers_responses_adapter = require("./responses.adapter.cjs");
10
10
  const require_server_handlers_responses_storage = require("./responses.storage.cjs");
11
11
  //#region src/server/handlers/conversations.ts
@@ -64,6 +64,7 @@ const CREATE_CONVERSATION_ROUTE = require_route_builder.createRoute({
64
64
  })) throw new require_http_exception.HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
65
65
  const threadId = conversation_id ?? globalThis.crypto.randomUUID();
66
66
  const resourceId = require_utils.getEffectiveResourceId(requestContext, resource_id) ?? threadId;
67
+ if (conversation_id) await require_utils.validateThreadOwnership(await memory.getThreadById({ threadId }), require_utils.getEffectiveResourceId(requestContext, void 0));
67
68
  return buildConversationObject({ thread: await memory.createThread({
68
69
  threadId,
69
70
  resourceId,
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.cjs","names":["createRoute","createConversationBodySchema","conversationObjectSchema","MastraFGAPermissions","HTTPException","getAgentFromSystem","getAgentMemoryStore","getEffectiveResourceId","handleError","conversationIdPathParams","findConversationThreadAcrossAgents","conversationItemsListSchema","mapMastraMessagesToConversationItems","conversationDeletedSchema"],"sources":["../../../src/server/handlers/conversations.ts"],"sourcesContent":["import { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? globalThis.crypto.randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversations.cjs","names":["createRoute","createConversationBodySchema","conversationObjectSchema","MastraFGAPermissions","HTTPException","getAgentFromSystem","getAgentMemoryStore","getEffectiveResourceId","validateThreadOwnership","handleError","conversationIdPathParams","findConversationThreadAcrossAgents","conversationItemsListSchema","mapMastraMessagesToConversationItems","conversationDeletedSchema"],"sources":["../../../src/server/handlers/conversations.ts"],"sourcesContent":["import { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? globalThis.crypto.randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n\n // Creating with an existing id upserts the thread, so validate ownership of any existing thread first\n if (conversation_id) {\n const existing = await memory.getThreadById({ threadId });\n await validateThreadOwnership(existing, getEffectiveResourceId(requestContext, undefined));\n }\n\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/conversations.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCpC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpC,CAAC"}
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/conversations.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CpC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpC,CAAC"}
@@ -2,9 +2,9 @@ import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
2
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
3
3
  import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
4
4
  import { handleError } from "./error.js";
5
- import { m as MastraFGAPermissions, r as getEffectiveResourceId } from "../../utils-KcHk7C0D.js";
5
+ import { m as MastraFGAPermissions, p as validateThreadOwnership, r as getEffectiveResourceId } from "../../utils-KcHk7C0D.js";
6
6
  import { getAgentFromSystem } from "./agents.js";
7
- import { a as createConversationBodySchema, i as conversationObjectSchema, n as conversationIdPathParams, r as conversationItemsListSchema, t as conversationDeletedSchema } from "../../conversations-U3fod5tw.js";
7
+ import { a as createConversationBodySchema, i as conversationObjectSchema, n as conversationIdPathParams, r as conversationItemsListSchema, t as conversationDeletedSchema } from "../../conversations-BzBHVFYe.js";
8
8
  import { mapMastraMessagesToConversationItems } from "./responses.adapter.js";
9
9
  import { findConversationThreadAcrossAgents, getAgentMemoryStore } from "./responses.storage.js";
10
10
  //#region src/server/handlers/conversations.ts
@@ -63,6 +63,7 @@ const CREATE_CONVERSATION_ROUTE = createRoute({
63
63
  })) throw new HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
64
64
  const threadId = conversation_id ?? globalThis.crypto.randomUUID();
65
65
  const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;
66
+ if (conversation_id) await validateThreadOwnership(await memory.getThreadById({ threadId }), getEffectiveResourceId(requestContext, void 0));
66
67
  return buildConversationObject({ thread: await memory.createThread({
67
68
  threadId,
68
69
  resourceId,
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.js","names":[],"sources":["../../../src/server/handlers/conversations.ts"],"sourcesContent":["import { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? globalThis.crypto.randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversations.js","names":[],"sources":["../../../src/server/handlers/conversations.ts"],"sourcesContent":["import { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? globalThis.crypto.randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n\n // Creating with an existing id upserts the thread, so validate ownership of any existing thread first\n if (conversation_id) {\n const existing = await memory.getThreadById({ threadId });\n await validateThreadOwnership(existing, getEffectiveResourceId(requestContext, undefined));\n }\n\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
- const require_common = require("../../common-BkgcoK-2.cjs");
4
+ const require_common = require("../../common-DhKNoXGp.cjs");
5
5
  const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
6
6
  const require_constants = require("../../constants-4IJp_uzj.cjs");
7
7
  const require_server_handlers_error = require("./error.cjs");
8
- const require_datasets = require("../../datasets-Bz7SKu-q.cjs");
8
+ const require_datasets = require("../../datasets-C2aXB8At.cjs");
9
9
  let zod = require("zod");
10
10
  let _mastra_core_agent = require("@mastra/core/agent");
11
11
  let _mastra_core_error = require("@mastra/core/error");
@@ -1,9 +1,9 @@
1
1
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
2
- import { f as successResponseSchema } from "../../common-tSamNYpt.js";
2
+ import { f as successResponseSchema } from "../../common-Y30XtCyr.js";
3
3
  import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
4
4
  import { p as isReservedRequestContextKey } from "../../constants-0jFCWoex.js";
5
5
  import { handleError } from "./error.js";
6
- import { A as listDatasetsQuerySchema, B as reviewSummaryResponseSchema, E as generateItemsResponseSchema, F as listExperimentsResponseSchema, G as tenancyQuerySchema, H as runExperimentItemResponseSchema, I as listItemVersionsResponseSchema, J as updateExperimentBodySchema, K as triggerExperimentBodySchema, L as listItemsQuerySchema, M as listExperimentResultsQuerySchema, N as listExperimentResultsResponseSchema, P as listExperimentsQuerySchema, R as listItemsResponseSchema, S as experimentResultResponseSchema, T as generateItemsBodySchema, V as runExperimentItemBodySchema, W as submitExperimentResultBodySchema, X as updateItemBodySchema, Y as updateExperimentResultBodySchema, _ as datasetResponseSchema, a as batchInsertItemsResponseSchema, b as experimentResponseSchema, c as compareExperimentsBodySchema, d as datasetAndExperimentIdPathParams, f as datasetAndItemIdPathParams, g as datasetItemVersionPathParams, h as datasetItemResponseSchema, i as batchInsertItemsBodySchema, j as listDatasetsResponseSchema, k as listDatasetVersionsResponseSchema, l as comparisonResponseSchema, m as datasetIdPathParams, n as batchDeleteItemsBodySchema, o as clusterFailuresBodySchema, p as datasetExperimentAndItemIdPathParams, q as updateDatasetBodySchema, r as batchDeleteItemsResponseSchema, s as clusterFailuresResponseSchema, t as addItemBodySchema, u as createDatasetBodySchema, w as experimentSummaryResponseSchema, x as experimentResultIdPathParams, y as experimentIdPathParams, z as paginationQuerySchema } from "../../datasets-CgNMo16l.js";
6
+ import { A as listDatasetsQuerySchema, B as reviewSummaryResponseSchema, E as generateItemsResponseSchema, F as listExperimentsResponseSchema, G as tenancyQuerySchema, H as runExperimentItemResponseSchema, I as listItemVersionsResponseSchema, J as updateExperimentBodySchema, K as triggerExperimentBodySchema, L as listItemsQuerySchema, M as listExperimentResultsQuerySchema, N as listExperimentResultsResponseSchema, P as listExperimentsQuerySchema, R as listItemsResponseSchema, S as experimentResultResponseSchema, T as generateItemsBodySchema, V as runExperimentItemBodySchema, W as submitExperimentResultBodySchema, X as updateItemBodySchema, Y as updateExperimentResultBodySchema, _ as datasetResponseSchema, a as batchInsertItemsResponseSchema, b as experimentResponseSchema, c as compareExperimentsBodySchema, d as datasetAndExperimentIdPathParams, f as datasetAndItemIdPathParams, g as datasetItemVersionPathParams, h as datasetItemResponseSchema, i as batchInsertItemsBodySchema, j as listDatasetsResponseSchema, k as listDatasetVersionsResponseSchema, l as comparisonResponseSchema, m as datasetIdPathParams, n as batchDeleteItemsBodySchema, o as clusterFailuresBodySchema, p as datasetExperimentAndItemIdPathParams, q as updateDatasetBodySchema, r as batchDeleteItemsResponseSchema, s as clusterFailuresResponseSchema, t as addItemBodySchema, u as createDatasetBodySchema, w as experimentSummaryResponseSchema, x as experimentResultIdPathParams, y as experimentIdPathParams, z as paginationQuerySchema } from "../../datasets-CDQDQxos.js";
7
7
  import { z as z$1 } from "zod";
8
8
  import { Agent } from "@mastra/core/agent";
9
9
  import { MastraError } from "@mastra/core/error";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
- const require_editor_builder = require("../../editor-builder-DRlsFCN0.cjs");
3
+ const require_editor_builder = require("../../editor-builder-CmUsqdZq.cjs");
4
4
  exports.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = require_editor_builder.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE;
5
5
  exports.GET_EDITOR_BUILDER_SETTINGS_ROUTE = require_editor_builder.GET_EDITOR_BUILDER_SETTINGS_ROUTE;
6
6
  exports.GET_INFRASTRUCTURE_STATUS_ROUTE = require_editor_builder.GET_INFRASTRUCTURE_STATUS_ROUTE;
@@ -1,2 +1,2 @@
1
- import { a as requireBuilderFeature, i as isBuilderFeatureEnabled, n as GET_EDITOR_BUILDER_SETTINGS_ROUTE, r as GET_INFRASTRUCTURE_STATUS_ROUTE, t as GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE } from "../../editor-builder-DU3y5Ant.js";
1
+ import { a as requireBuilderFeature, i as isBuilderFeatureEnabled, n as GET_EDITOR_BUILDER_SETTINGS_ROUTE, r as GET_INFRASTRUCTURE_STATUS_ROUTE, t as GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE } from "../../editor-builder-DHXbVwxu.js";
2
2
  export { GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE, isBuilderFeatureEnabled, requireBuilderFeature };
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_server_handlers_authorship = require("./authorship.cjs");
4
- const require_editor_builder = require("../../editor-builder-DRlsFCN0.cjs");
4
+ const require_editor_builder = require("../../editor-builder-CmUsqdZq.cjs");
5
5
  //#region src/server/handlers/favorites-enrichment.ts
6
6
  /**
7
7
  * Resolve the EE feature flag plus the caller's favorited set for a list of
@@ -1,5 +1,5 @@
1
1
  import { getCallerAuthorId } from "./authorship.js";
2
- import { i as isBuilderFeatureEnabled } from "../../editor-builder-DU3y5Ant.js";
2
+ import { i as isBuilderFeatureEnabled } from "../../editor-builder-DHXbVwxu.js";
3
3
  //#region src/server/handlers/favorites-enrichment.ts
4
4
  /**
5
5
  * Resolve the EE feature flag plus the caller's favorited set for a list of
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
- const require_common = require("../../common-BkgcoK-2.cjs");
3
+ const require_common = require("../../common-DhKNoXGp.cjs");
4
4
  const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
6
  const require_utils = require("../../utils-HqDZJwRc.cjs");
7
- const require_logs = require("../../logs-B0037Tlj.cjs");
7
+ const require_logs = require("../../logs-CY8AGOCO.cjs");
8
8
  //#region src/server/handlers/logs.ts
9
9
  var logs_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
10
10
  LIST_LOGS_BY_RUN_ID_ROUTE: () => LIST_LOGS_BY_RUN_ID_ROUTE,
@@ -1,9 +1,9 @@
1
1
  import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
- import { u as runIdSchema } from "../../common-tSamNYpt.js";
2
+ import { u as runIdSchema } from "../../common-Y30XtCyr.js";
3
3
  import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
4
4
  import { handleError } from "./error.js";
5
5
  import { d as validateBody, o as parseFilters } from "../../utils-KcHk7C0D.js";
6
- import { n as listLogsQuerySchema, r as listLogsResponseSchema, t as listLogTransportsResponseSchema } from "../../logs-B2Nd15Oe.js";
6
+ import { n as listLogsQuerySchema, r as listLogsResponseSchema, t as listLogTransportsResponseSchema } from "../../logs-Bd_xpsYw.js";
7
7
  //#region src/server/handlers/logs.ts
8
8
  var logs_exports = /* @__PURE__ */ __exportAll({
9
9
  LIST_LOGS_BY_RUN_ID_ROUTE: () => LIST_LOGS_BY_RUN_ID_ROUTE,
@@ -5,7 +5,7 @@ const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
5
5
  const require_utils = require("../../utils-DFQixxkO.cjs");
6
6
  const require_server_handlers_error = require("./error.cjs");
7
7
  const require_server_handlers_version_helpers = require("./version-helpers.cjs");
8
- const require_mcp_client_versions = require("../../mcp-client-versions-Zkez3ruO.cjs");
8
+ const require_mcp_client_versions = require("../../mcp-client-versions-Cq97zXiK.cjs");
9
9
  //#region src/server/handlers/mcp-client-versions.ts
10
10
  /**
11
11
  * GET /stored/mcp-clients/:mcpClientId/versions - List all versions for an MCP client
@@ -3,7 +3,7 @@ import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
3
3
  import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-BJm0ZYnM.js";
4
4
  import { handleError } from "./error.js";
5
5
  import { MCP_CLIENT_SNAPSHOT_CONFIG_FIELDS, calculateChangedFields, computeVersionDiffs, createVersionWithRetry, enforceRetentionLimit, extractConfigFromVersion } from "./version-helpers.js";
6
- import { a as createMCPClientVersionResponseSchema, c as listMCPClientVersionsQuerySchema, d as mcpClientVersionPathParams, i as createMCPClientVersionBodySchema, l as listMCPClientVersionsResponseSchema, n as compareMCPClientVersionsQuerySchema, o as deleteMCPClientVersionResponseSchema, p as restoreMCPClientVersionResponseSchema, r as compareMCPClientVersionsResponseSchema, s as getMCPClientVersionResponseSchema, t as activateMCPClientVersionResponseSchema, u as mcpClientVersionIdPathParams } from "../../mcp-client-versions-Df5bgWm1.js";
6
+ import { a as createMCPClientVersionResponseSchema, c as listMCPClientVersionsQuerySchema, d as mcpClientVersionPathParams, i as createMCPClientVersionBodySchema, l as listMCPClientVersionsResponseSchema, n as compareMCPClientVersionsQuerySchema, o as deleteMCPClientVersionResponseSchema, p as restoreMCPClientVersionResponseSchema, r as compareMCPClientVersionsResponseSchema, s as getMCPClientVersionResponseSchema, t as activateMCPClientVersionResponseSchema, u as mcpClientVersionIdPathParams } from "../../mcp-client-versions-DxBkzcYH.js";
7
7
  //#region src/server/handlers/mcp-client-versions.ts
8
8
  /**
9
9
  * GET /stored/mcp-clients/:mcpClientId/versions - List all versions for an MCP client
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
3
3
  const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
4
  const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
5
- const require_mcp = require("../../mcp-Jus386Vq.cjs");
5
+ const require_mcp = require("../../mcp-ShaKO7gA.cjs");
6
6
  let _mastra_core_error = require("@mastra/core/error");
7
7
  //#region src/server/handlers/mcp.ts
8
8
  var mcp_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
@@ -1,7 +1,7 @@
1
1
  import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
2
2
  import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
3
3
  import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
4
- import { a as listMcpServerToolsResponseSchema, c as listResourcesResponseSchema, d as mcpServerResourcePathParams, f as mcpServerToolPathParams, g as serverDetailSchema, h as readResourceResponseSchema, l as mcpServerDetailPathParams, m as readResourceBodySchema, n as executeToolResponseSchema, o as listMcpServersQuerySchema, p as mcpToolInfoSchema, r as getMcpServerDetailQuerySchema, s as listMcpServersResponseSchema, t as executeToolBodySchema, u as mcpServerIdPathParams } from "../../mcp-BK6cmwww.js";
4
+ import { a as listMcpServerToolsResponseSchema, c as listResourcesResponseSchema, d as mcpServerResourcePathParams, f as mcpServerToolPathParams, g as serverDetailSchema, h as readResourceResponseSchema, l as mcpServerDetailPathParams, m as readResourceBodySchema, n as executeToolResponseSchema, o as listMcpServersQuerySchema, p as mcpToolInfoSchema, r as getMcpServerDetailQuerySchema, s as listMcpServersResponseSchema, t as executeToolBodySchema, u as mcpServerIdPathParams } from "../../mcp-DzpwLXEY.js";
5
5
  import { MastraError } from "@mastra/core/error";
6
6
  //#region src/server/handlers/mcp.ts
7
7
  var mcp_exports = /* @__PURE__ */ __exportAll({
@@ -4,9 +4,10 @@ const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
4
4
  const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
5
5
  const require_server_handlers_error = require("./error.cjs");
6
6
  const require_utils = require("../../utils-HqDZJwRc.cjs");
7
- const require_memory = require("../../memory-C3j3i6iS.cjs");
7
+ const require_memory = require("../../memory-CizEIbl1.cjs");
8
8
  const require_server_handlers_gateway_memory_client = require("./gateway-memory-client.cjs");
9
9
  let _mastra_core_agent = require("@mastra/core/agent");
10
+ let _mastra_core_error = require("@mastra/core/error");
10
11
  let _mastra_core_utils = require("@mastra/core/utils");
11
12
  //#region src/server/handlers/memory.ts
12
13
  var memory_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
@@ -993,13 +994,6 @@ const CREATE_THREAD_ROUTE = require_route_builder.createRoute({
993
994
  const effectiveResourceId = require_utils.getEffectiveResourceId(requestContext, resourceId);
994
995
  const effectiveThreadId = threadId ?? mastra.generateId();
995
996
  require_utils.validateBody({ resourceId: effectiveResourceId });
996
- await require_utils.enforceThreadAccess({
997
- mastra,
998
- requestContext,
999
- threadId: effectiveThreadId,
1000
- effectiveResourceId,
1001
- permission: require_utils.MastraFGAPermissions.MEMORY_WRITE
1002
- });
1003
997
  const agent = await getAgentFromContext({
1004
998
  mastra,
1005
999
  agentId,
@@ -1007,12 +1001,23 @@ const CREATE_THREAD_ROUTE = require_route_builder.createRoute({
1007
1001
  });
1008
1002
  if (agent && await require_server_handlers_gateway_memory_client.isGatewayAgentAsync(agent)) {
1009
1003
  const gwClient = require_server_handlers_gateway_memory_client.getGatewayClient();
1010
- if (gwClient) return require_server_handlers_gateway_memory_client.toLocalThread((await gwClient.createThread({
1011
- id: effectiveThreadId,
1012
- resourceId: effectiveResourceId,
1013
- title,
1014
- metadata
1015
- })).thread);
1004
+ if (gwClient) {
1005
+ const existing = threadId ? await gwClient.getThread(effectiveThreadId) : null;
1006
+ await require_utils.enforceThreadAccess({
1007
+ mastra,
1008
+ requestContext,
1009
+ threadId: effectiveThreadId,
1010
+ thread: existing ? require_server_handlers_gateway_memory_client.toLocalThread(existing.thread) : null,
1011
+ effectiveResourceId,
1012
+ permission: require_utils.MastraFGAPermissions.MEMORY_WRITE
1013
+ });
1014
+ return require_server_handlers_gateway_memory_client.toLocalThread((await gwClient.createThread({
1015
+ id: effectiveThreadId,
1016
+ resourceId: effectiveResourceId,
1017
+ title,
1018
+ metadata
1019
+ })).thread);
1020
+ }
1016
1021
  }
1017
1022
  const memory = await getMemoryFromContext({
1018
1023
  mastra,
@@ -1020,6 +1025,14 @@ const CREATE_THREAD_ROUTE = require_route_builder.createRoute({
1020
1025
  requestContext
1021
1026
  });
1022
1027
  if (!memory) throw new require_http_exception.HTTPException(400, { message: "Memory is not initialized" });
1028
+ await require_utils.enforceThreadAccess({
1029
+ mastra,
1030
+ requestContext,
1031
+ threadId: effectiveThreadId,
1032
+ thread: threadId ? await memory.getThreadById({ threadId: effectiveThreadId }) : null,
1033
+ effectiveResourceId,
1034
+ permission: require_utils.MastraFGAPermissions.MEMORY_WRITE
1035
+ });
1023
1036
  return await memory.createThread({
1024
1037
  resourceId: effectiveResourceId,
1025
1038
  title,
@@ -1293,7 +1306,7 @@ const UPDATE_WORKING_MEMORY_ROUTE = require_route_builder.createRoute({
1293
1306
  description: "Updates the working memory state for a thread",
1294
1307
  tags: ["Memory"],
1295
1308
  requiresAuth: true,
1296
- handler: async ({ mastra, agentId, threadId, resourceId, memoryConfig, workingMemory, requestContext }) => {
1309
+ handler: async ({ mastra, agentId, threadId, resourceId, memoryConfig, workingMemory, mode, requestContext }) => {
1297
1310
  try {
1298
1311
  const effectiveThreadId = require_utils.getEffectiveThreadId(requestContext, threadId);
1299
1312
  const effectiveResourceId = require_utils.getEffectiveResourceId(requestContext, resourceId);
@@ -1323,6 +1336,21 @@ const UPDATE_WORKING_MEMORY_ROUTE = require_route_builder.createRoute({
1323
1336
  effectiveResourceId,
1324
1337
  permission: require_utils.MastraFGAPermissions.MEMORY_WRITE
1325
1338
  });
1339
+ if (mode === "merge") {
1340
+ if (!await memory.supportsAtomicWorkingMemoryMerge()) throw new require_http_exception.HTTPException(400, { message: "Working memory merge is not supported by the configured storage adapter" });
1341
+ try {
1342
+ await memory.mergeWorkingMemory({
1343
+ threadId: effectiveThreadId,
1344
+ resourceId: effectiveResourceId,
1345
+ workingMemory,
1346
+ memoryConfig
1347
+ });
1348
+ } catch (error) {
1349
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw new require_http_exception.HTTPException(400, { message: error.message });
1350
+ throw error;
1351
+ }
1352
+ return { success: true };
1353
+ }
1326
1354
  await memory.updateWorkingMemory({
1327
1355
  threadId: effectiveThreadId,
1328
1356
  resourceId: effectiveResourceId,